From efe359d61303b2148199c009abab34e44b0ab04f Mon Sep 17 00:00:00 2001 From: chriscamacho Date: Tue, 24 Mar 2020 13:27:14 +0000 Subject: [PATCH] as per request spotlight example (#1146) Co-authored-by: codifies --- examples/Makefile | 3 +- examples/shaders/resources/raysan.png | Bin 0 -> 15064 bytes .../resources/shaders/glsl100/spotlight.fs | 52 ++++ .../resources/shaders/glsl330/spotlight.fs | 53 +++++ examples/shaders/shaders_spotlight.c | 225 ++++++++++++++++++ 5 files changed, 332 insertions(+), 1 deletion(-) create mode 100644 examples/shaders/resources/raysan.png create mode 100644 examples/shaders/resources/shaders/glsl100/spotlight.fs create mode 100644 examples/shaders/resources/shaders/glsl330/spotlight.fs create mode 100644 examples/shaders/shaders_spotlight.c diff --git a/examples/Makefile b/examples/Makefile index 3ae76baff..ecd4344a6 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -456,7 +456,8 @@ SHADERS = \ shaders/shaders_eratosthenes \ shaders/shaders_basic_lighting \ shaders/shaders_fog \ - shaders/shaders_simple_mask + shaders/shaders_simple_mask \ + shaders/shaders_spotlight AUDIO = \ audio/audio_module_playing \ diff --git a/examples/shaders/resources/raysan.png b/examples/shaders/resources/raysan.png new file mode 100644 index 0000000000000000000000000000000000000000..3d4e70fe41f3f2046d1c4c8895b40f0fbfc1b7d6 GIT binary patch literal 15064 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 K&t;ucLK6UBchrCY literal 0 HcmV?d00001 diff --git a/examples/shaders/resources/shaders/glsl100/spotlight.fs b/examples/shaders/resources/shaders/glsl100/spotlight.fs new file mode 100644 index 000000000..204b89a72 --- /dev/null +++ b/examples/shaders/resources/shaders/glsl100/spotlight.fs @@ -0,0 +1,52 @@ +#version 100 + +precision mediump float; + +#define MAX_SPOTS 4 +#define RADIUS 256.0 +#define INNER 200.0 + +// Inputs +// array of spotlight positions +uniform vec2 spots[MAX_SPOTS]; + +uniform float screenWidth; // width of the screen + +void main() +{ + + float alpha; + // get the position of the current fragment (screen coordinates!) + vec2 pos = vec2(gl_FragCoord.x, gl_FragCoord.y); + + + // find out which spotlight is nearest + float d = 65000.0; // some high value + float di = 0.0; + + for (int i = 0; i < MAX_SPOTS; i++) + { + di = distance(pos, spots[i]); + if (d > di) d = di; + } + + // d now equals distance to nearest spot... + if (d > RADIUS) { + alpha = 1.0; + } else { + if (d < INNER) { + alpha = 0.0; + } else { + alpha = (d - INNER) / (RADIUS - INNER); + } + } + + // right hand side of screen is dimly lit, could make the + // threshold value user definable. + if (pos.x > screenWidth/2.0 && alpha > 0.9) { + alpha = 0.9; + } + + // could make the black out colour user definable... + gl_FragColor = vec4( 0, 0, 0, alpha); +} diff --git a/examples/shaders/resources/shaders/glsl330/spotlight.fs b/examples/shaders/resources/shaders/glsl330/spotlight.fs new file mode 100644 index 000000000..f97722c6c --- /dev/null +++ b/examples/shaders/resources/shaders/glsl330/spotlight.fs @@ -0,0 +1,53 @@ +#version 330 + +// Output fragment color +out vec4 finalColor; + +#define MAX_SPOTS 4 +#define RADIUS 256 +#define INNER 200 + +// Inputs +// array of spotlight positions +uniform vec2 spots[MAX_SPOTS]; + +uniform float screenWidth; // width of the screen + +void main() +{ + + float alpha; + // get the position of the current fragment (screen coordinates!) + vec2 pos = vec2(gl_FragCoord.x, gl_FragCoord.y); + + + // find out which spotlight is nearest + float d = 65000; // some high value + float di = 0; + + for (int i = 0; i < MAX_SPOTS; i++) + { + di = distance(pos, spots[i]); + if (d > di) d = di; + } + + // d now equals distance to nearest spot... + if (d > RADIUS) { + alpha = 1.0; + } else { + if (d < INNER) { + alpha = 0.0; + } else { + alpha = (d - INNER) / (RADIUS - INNER); + } + } + + // right hand side of screen is dimly lit, could make the + // threshold value user definable. + if (pos.x>screenWidth/2.0 && alpha >0.9) { + alpha = 0.9; + } + + // could make the black out colour user definable... + finalColor = vec4( 0, 0, 0, alpha); +} diff --git a/examples/shaders/shaders_spotlight.c b/examples/shaders/shaders_spotlight.c new file mode 100644 index 000000000..ccd91fdcc --- /dev/null +++ b/examples/shaders/shaders_spotlight.c @@ -0,0 +1,225 @@ +/* + * Copyright (c) 2019 Chris Camacho (codifies - http://bedroomcoders.co.uk/) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +/* The shader makes alpha holes in the forground to give the apearance of a top + * down look at a spotlight casting a pool of light... + * + * The right hand side of the screen there is just enough light to see whats + * going on without the spot light, great for a stealth type game where you + * have to avoid the spotlights. + * + * The left hand side of the screen is in pitch dark except for where the spotlights + * are. + * + * Although this example doesn't scale like the letterbox example, you could integrate + * the two techniques, but by scaling the actual colour of the render texture rather + * than using alpha as a mask. + */ + +#include +#include + +#include "raylib.h" +#include "raymath.h" + +#if defined(PLATFORM_DESKTOP) + #define GLSL_VERSION 330 +#else // PLATFORM_RPI, PLATFORM_ANDROID, PLATFORM_WEB + #define GLSL_VERSION 100 +#endif + +// single digit only! +#define MAXSPOT 4 + +#define numStars 400 + +#define screenWidth 1280 +#define screenHeight 720 + +// the stars in the star field have a position and velocity +typedef struct star { + Vector2 pos; + Vector2 vel; +} star; + + +void updateStar(star *s); +void resetStar(star *s); + +int main(void) +{ + // Initialization + //-------------------------------------------------------------------------------------- + star stars[numStars]; + + for (int n=0; n < numStars; n++) { + resetStar(&stars[n]); + } + + // progress all the stars on, so they don't all start in the centre + for (int m=0; m < screenWidth / 2.0; m++) { + for (int n=0; n screenWidth-128) spotVel[i].x = -spotVel[i].x; + if (spotPos[i].y < 128) spotVel[i].y = -spotVel[i].y; + if (spotPos[i].y > screenHeight-128) spotVel[i].y = -spotVel[i].y; + + SetShaderValue(spotShader, spotLoc[i], &spotPos[i].x, UNIFORM_VEC2); + } + + // Draw + //---------------------------------------------------------------------------------- + BeginDrawing(); + + ClearBackground((Color){0,32,128,255}); + + // stars and bobs + for (int n=0; n1)); + (*s).pos = Vector2Add( (*s).pos, + Vector2MultiplyV((*s).vel,(Vector2){8,8} )); +} + +void updateStar(star *s) +{ + (*s).pos = Vector2Add((*s).pos, (*s).vel); + if ((*s).pos.x < 0 || (*s).pos.x > screenWidth || + (*s).pos.y < 0 || (*s).pos.y > screenHeight) { + resetStar(s); + } +} + +