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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 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); + } +} + +