aboutsummaryrefslogtreecommitdiff
path: root/deps/raylib/examples/shaders/resources/shaders
diff options
context:
space:
mode:
Diffstat (limited to 'deps/raylib/examples/shaders/resources/shaders')
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/base.fs23
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/base.vs26
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/bloom.fs39
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/blur.fs34
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/color_mix.fs26
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/cross_hatching.fs47
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/cross_stitching.fs57
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/cubes_panning.fs60
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/depth.fs26
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/distortion.fs54
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/dream_vision.fs37
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/eratosthenes.fs60
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/fisheye.fs43
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/fog.fs94
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/grayscale.fs25
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/hybrid_raster.fs16
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/hybrid_raymarch.fs288
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/julia_set.fs85
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/lighting.fs77
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/lighting.vs59
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/lighting_instancing.vs36
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/lightmap.fs22
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/lightmap.vs31
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/mask.fs24
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/outline.fs34
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/palette_switch.fs43
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/pbr.fs156
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/pbr.vs75
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/pixelizer.fs32
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/posterization.fs29
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/predator.fs31
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/raymarching.fs431
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/reload.fs39
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/scanlines.fs44
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/sobel.fs40
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/spotlight.fs77
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/swirl.fs46
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/tiling.fs21
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/vertex_displacement.fs18
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/vertex_displacement.vs45
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/wave.fs36
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl100/write_depth.fs17
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl120/base.fs22
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl120/base.vs26
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl120/bloom.fs37
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl120/blur.fs32
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl120/cross_hatching.fs45
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl120/cross_stitching.fs55
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl120/distortion.fs52
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl120/dream_vision.fs35
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl120/fisheye.fs41
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl120/fog.fs92
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl120/grayscale.fs23
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl120/lighting.fs75
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl120/lighting.vs59
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl120/lightmap.fs20
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl120/lightmap.vs31
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl120/palette_switch.fs27
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl120/pbr.fs154
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl120/pbr.vs75
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl120/pixelizer.fs30
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl120/posterization.fs27
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl120/predator.fs29
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl120/raymarching.fs427
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl120/scanlines.fs42
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl120/shadowmap.fs84
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl120/shadowmap.vs32
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl120/sobel.fs38
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl120/swirl.fs44
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/base.fs28
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/base.vs26
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/bloom.fs40
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/blur.fs35
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/color_mix.fs27
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/cross_hatching.fs48
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/cross_stitching.fs59
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/cubes_panning.fs61
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/deferred_shading.fs55
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/deferred_shading.vs11
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/depth.fs27
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/distortion.fs56
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/dream_vision.fs34
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/eratosthenes.fs59
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/fisheye.fs40
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/fog.fs95
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/gbuffer.fs22
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/gbuffer.vs24
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/grayscale.fs26
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/hybrid_raster.fs14
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/hybrid_raymarch.fs284
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/julia_set.fs83
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/lighting.fs78
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/lighting.vs32
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/lighting_instancing.vs33
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/lightmap.fs23
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/lightmap.vs29
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/mask.fs22
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/outline.fs35
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/overdraw.fs26
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/palette_switch.fs33
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/pbr.fs162
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/pbr.vs48
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/pixelizer.fs33
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/posterization.fs31
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/predator.fs32
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/raymarching.fs430
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/reload.fs40
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/scanlines.fs49
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/shadowmap.fs86
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/shadowmap.vs32
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/sobel.fs41
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/spotlight.fs65
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/swirl.fs47
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/tiling.fs14
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/vertex_displacement.fs16
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/vertex_displacement.vs46
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/wave.fs37
-rw-r--r--deps/raylib/examples/shaders/resources/shaders/glsl330/write_depth.fs20
118 files changed, 6851 insertions, 0 deletions
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/base.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/base.fs
new file mode 100644
index 0000000..6a8d44e
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/base.fs
@@ -0,0 +1,23 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture2D(texture0, fragTexCoord);
+
+ // NOTE: Implement here your fragment shader code
+
+ gl_FragColor = texelColor*colDiffuse;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/base.vs b/deps/raylib/examples/shaders/resources/shaders/glsl100/base.vs
new file mode 100644
index 0000000..32e8399
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/base.vs
@@ -0,0 +1,26 @@
+#version 100
+
+// Input vertex attributes
+attribute vec3 vertexPosition;
+attribute vec2 vertexTexCoord;
+attribute vec3 vertexNormal;
+attribute vec4 vertexColor;
+
+// Input uniform values
+uniform mat4 mvp;
+
+// Output vertex attributes (to fragment shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ // Send vertex attributes to fragment shader
+ fragTexCoord = vertexTexCoord;
+ fragColor = vertexColor;
+
+ // Calculate final vertex position
+ gl_Position = mvp*vec4(vertexPosition, 1.0);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/bloom.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/bloom.fs
new file mode 100644
index 0000000..673e011
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/bloom.fs
@@ -0,0 +1,39 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+const vec2 size = vec2(800, 450); // render size
+const float samples = 5.0; // pixels per axis; higher = bigger glow, worse performance
+const float quality = 2.5; // lower = smaller glow, better quality
+
+void main()
+{
+ vec4 sum = vec4(0);
+ vec2 sizeFactor = vec2(1)/size*quality;
+
+ // Texel color fetching from texture sampler
+ vec4 source = texture2D(texture0, fragTexCoord);
+
+ const int range = 2; // should be = (samples - 1)/2;
+
+ for (int x = -range; x <= range; x++)
+ {
+ for (int y = -range; y <= range; y++)
+ {
+ sum += texture2D(texture0, fragTexCoord + vec2(x, y)*sizeFactor);
+ }
+ }
+
+ // Calculate final fragment color
+ gl_FragColor = ((sum/(samples*samples)) + source)*colDiffuse;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/blur.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/blur.fs
new file mode 100644
index 0000000..2fef571
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/blur.fs
@@ -0,0 +1,34 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+// NOTE: Render size values must be passed from code
+const float renderWidth = 800.0;
+const float renderHeight = 450.0;
+
+vec3 offset = vec3(0.0, 1.3846153846, 3.2307692308);
+vec3 weight = vec3(0.2270270270, 0.3162162162, 0.0702702703);
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec3 tc = texture2D(texture0, fragTexCoord).rgb*weight.x;
+
+ tc += texture2D(texture0, fragTexCoord + vec2(offset.y)/renderWidth, 0.0).rgb*weight.y;
+ tc += texture2D(texture0, fragTexCoord - vec2(offset.y)/renderWidth, 0.0).rgb*weight.y;
+
+ tc += texture2D(texture0, fragTexCoord + vec2(offset.z)/renderWidth, 0.0).rgb*weight.z;
+ tc += texture2D(texture0, fragTexCoord - vec2(offset.z)/renderWidth, 0.0).rgb*weight.z;
+
+ gl_FragColor = vec4(tc, 1.0);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/color_mix.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/color_mix.fs
new file mode 100644
index 0000000..a163a8a
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/color_mix.fs
@@ -0,0 +1,26 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform sampler2D texture1;
+uniform vec4 colDiffuse;
+
+uniform float divider;
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor0 = texture2D(texture0, fragTexCoord);
+ vec4 texelColor1 = texture2D(texture1, fragTexCoord);
+
+ float x = fract(fragTexCoord.s);
+ float final = smoothstep(divider - 0.1, divider + 0.1, x);
+
+ gl_FragColor = mix(texelColor0, texelColor1, final);
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/cross_hatching.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/cross_hatching.fs
new file mode 100644
index 0000000..d978de8
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/cross_hatching.fs
@@ -0,0 +1,47 @@
+# version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+float hatchOffsetY = 5.0;
+float lumThreshold01 = 0.9;
+float lumThreshold02 = 0.7;
+float lumThreshold03 = 0.5;
+float lumThreshold04 = 0.3;
+
+void main()
+{
+ vec3 tc = vec3(1.0, 1.0, 1.0);
+ float lum = length(texture2D(texture0, fragTexCoord).rgb);
+
+ if (lum < lumThreshold01)
+ {
+ if (mod(gl_FragCoord.x + gl_FragCoord.y, 10.0) == 0.0) tc = vec3(0.0, 0.0, 0.0);
+ }
+
+ if (lum < lumThreshold02)
+ {
+ if (mod(gl_FragCoord .x - gl_FragCoord .y, 10.0) == 0.0) tc = vec3(0.0, 0.0, 0.0);
+ }
+
+ if (lum < lumThreshold03)
+ {
+ if (mod(gl_FragCoord .x + gl_FragCoord .y - hatchOffsetY, 10.0) == 0.0) tc = vec3(0.0, 0.0, 0.0);
+ }
+
+ if (lum < lumThreshold04)
+ {
+ if (mod(gl_FragCoord .x - gl_FragCoord .y - hatchOffsetY, 10.0) == 0.0) tc = vec3(0.0, 0.0, 0.0);
+ }
+
+ gl_FragColor = vec4(tc, 1.0);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/cross_stitching.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/cross_stitching.fs
new file mode 100644
index 0000000..a7a348d
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/cross_stitching.fs
@@ -0,0 +1,57 @@
+# version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+// NOTE: Render size values must be passed from code
+const float renderWidth = 800.0;
+const float renderHeight = 450.0;
+
+float stitchingSize = 6.0;
+int invert = 0;
+
+vec4 PostFX(sampler2D tex, vec2 uv)
+{
+ vec4 c = vec4(0.0);
+ float size = stitchingSize;
+ vec2 cPos = uv * vec2(renderWidth, renderHeight);
+ vec2 tlPos = floor(cPos / vec2(size, size));
+ tlPos *= size;
+
+ int remX = int(mod(cPos.x, size));
+ int remY = int(mod(cPos.y, size));
+
+ if (remX == 0 && remY == 0) tlPos = cPos;
+
+ vec2 blPos = tlPos;
+ blPos.y += (size - 1.0);
+
+ if ((remX == remY) || (((int(cPos.x) - int(blPos.x)) == (int(blPos.y) - int(cPos.y)))))
+ {
+ if (invert == 1) c = vec4(0.2, 0.15, 0.05, 1.0);
+ else c = texture2D(tex, tlPos * vec2(1.0/renderWidth, 1.0/renderHeight)) * 1.4;
+ }
+ else
+ {
+ if (invert == 1) c = texture2D(tex, tlPos * vec2(1.0/renderWidth, 1.0/renderHeight)) * 1.4;
+ else c = vec4(0.0, 0.0, 0.0, 1.0);
+ }
+
+ return c;
+}
+
+void main()
+{
+ vec3 tc = PostFX(texture0, fragTexCoord).rgb;
+
+ gl_FragColor = vec4(tc, 1.0);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/cubes_panning.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/cubes_panning.fs
new file mode 100644
index 0000000..9e5eab0
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/cubes_panning.fs
@@ -0,0 +1,60 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Custom variables
+const float PI = 3.14159265358979323846;
+uniform float uTime;
+
+float divisions = 5.0;
+float angle = 0.0;
+
+vec2 VectorRotateTime(vec2 v, float speed)
+{
+ float time = uTime*speed;
+ float localTime = fract(time); // The time domain this works on is 1 sec.
+
+ if ((localTime >= 0.0) && (localTime < 0.25)) angle = 0.0;
+ else if ((localTime >= 0.25) && (localTime < 0.50)) angle = PI/4.0*sin(2.0*PI*localTime - PI/2.0);
+ else if ((localTime >= 0.50) && (localTime < 0.75)) angle = PI*0.25;
+ else if ((localTime >= 0.75) && (localTime < 1.00)) angle = PI/4.0*sin(2.0*PI*localTime);
+
+ // Rotate vector by angle
+ v -= 0.5;
+ v = mat2(cos(angle), -sin(angle), sin(angle), cos(angle))*v;
+ v += 0.5;
+
+ return v;
+}
+
+float Rectangle(in vec2 st, in float size, in float fill)
+{
+ float roundSize = 0.5 - size/2.0;
+ float left = step(roundSize, st.x);
+ float top = step(roundSize, st.y);
+ float bottom = step(roundSize, 1.0 - st.y);
+ float right = step(roundSize, 1.0 - st.x);
+
+ return (left*bottom*right*top)*fill;
+}
+
+void main()
+{
+ vec2 fragPos = fragTexCoord;
+ fragPos.xy += uTime/9.0;
+
+ fragPos *= divisions;
+ vec2 ipos = floor(fragPos); // Get the integer coords
+ vec2 fpos = fract(fragPos); // Get the fractional coords
+
+ fpos = VectorRotateTime(fpos, 0.2);
+
+ float alpha = Rectangle(fpos, 0.216, 1.0);
+ vec3 color = vec3(0.3, 0.3, 0.3);
+
+ gl_FragColor = vec4(color, alpha);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/depth.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/depth.fs
new file mode 100644
index 0000000..7809927
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/depth.fs
@@ -0,0 +1,26 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0; // Depth texture
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ float zNear = 0.01; // camera z near
+ float zFar = 10.0; // camera z far
+ float z = texture2D(texture0, fragTexCoord).x;
+
+ // Linearize depth value
+ float depth = (2.0*zNear)/(zFar + zNear - z*(zFar - zNear));
+
+ // Calculate final fragment color
+ gl_FragColor = vec4(depth, depth, depth, 1.0f);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/distortion.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/distortion.fs
new file mode 100644
index 0000000..c232be2
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/distortion.fs
@@ -0,0 +1,54 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+
+// Input uniform values
+uniform sampler2D texture0;
+
+// NOTE: Default parameters for Oculus Rift DK2 device
+const vec2 LeftLensCenter = vec2(0.2863248, 0.5);
+const vec2 RightLensCenter = vec2(0.7136753, 0.5);
+const vec2 LeftScreenCenter = vec2(0.25, 0.5);
+const vec2 RightScreenCenter = vec2(0.75, 0.5);
+const vec2 Scale = vec2(0.25, 0.45);
+const vec2 ScaleIn = vec2(4.0, 2.5);
+const vec4 HmdWarpParam = vec4(1.0, 0.22, 0.24, 0.0);
+const vec4 ChromaAbParam = vec4(0.996, -0.004, 1.014, 0.0);
+
+void main()
+{
+ // The following two variables need to be set per eye
+ vec2 LensCenter = fragTexCoord.x < 0.5 ? LeftLensCenter : RightLensCenter;
+ vec2 ScreenCenter = fragTexCoord.x < 0.5 ? LeftScreenCenter : RightScreenCenter;
+
+ // Scales input texture coordinates for distortion: vec2 HmdWarp(vec2 fragTexCoord, vec2 LensCenter)
+ vec2 theta = (fragTexCoord - LensCenter)*ScaleIn; // Scales to [-1, 1]
+ float rSq = theta.x*theta.x + theta.y*theta.y;
+ vec2 theta1 = theta*(HmdWarpParam.x + HmdWarpParam.y*rSq + HmdWarpParam.z*rSq*rSq + HmdWarpParam.w*rSq*rSq*rSq);
+ //vec2 tc = LensCenter + Scale*theta1;
+
+ // Detect whether blue texture coordinates are out of range since these will scaled out the furthest
+ vec2 thetaBlue = theta1*(ChromaAbParam.z + ChromaAbParam.w*rSq);
+ vec2 tcBlue = LensCenter + Scale*thetaBlue;
+
+ if (any(bvec2(clamp(tcBlue, ScreenCenter - vec2(0.25, 0.5), ScreenCenter + vec2(0.25, 0.5)) - tcBlue))) gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
+ else
+ {
+ // Do blue texture lookup
+ float blue = texture2D(texture0, tcBlue).b;
+
+ // Do green lookup (no scaling)
+ vec2 tcGreen = LensCenter + Scale*theta1;
+ float green = texture2D(texture0, tcGreen).g;
+
+ // Do red scale and lookup
+ vec2 thetaRed = theta1*(ChromaAbParam.x + ChromaAbParam.y*rSq);
+ vec2 tcRed = LensCenter + Scale*thetaRed;
+ float red = texture2D(texture0, tcRed).r;
+
+ gl_FragColor = vec4(red, green, blue, 1.0);
+ }
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/dream_vision.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/dream_vision.fs
new file mode 100644
index 0000000..7014b59
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/dream_vision.fs
@@ -0,0 +1,37 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ vec4 color = texture2D(texture0, fragTexCoord);
+
+ color += texture2D(texture0, fragTexCoord + 0.001);
+ color += texture2D(texture0, fragTexCoord + 0.003);
+ color += texture2D(texture0, fragTexCoord + 0.005);
+ color += texture2D(texture0, fragTexCoord + 0.007);
+ color += texture2D(texture0, fragTexCoord + 0.009);
+ color += texture2D(texture0, fragTexCoord + 0.011);
+
+ color += texture2D(texture0, fragTexCoord - 0.001);
+ color += texture2D(texture0, fragTexCoord - 0.003);
+ color += texture2D(texture0, fragTexCoord - 0.005);
+ color += texture2D(texture0, fragTexCoord - 0.007);
+ color += texture2D(texture0, fragTexCoord - 0.009);
+ color += texture2D(texture0, fragTexCoord - 0.011);
+
+ color.rgb = vec3((color.r + color.g + color.b)/3.0);
+ color = color/9.5;
+
+ gl_FragColor = color;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/eratosthenes.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/eratosthenes.fs
new file mode 100644
index 0000000..0d5fcc5
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/eratosthenes.fs
@@ -0,0 +1,60 @@
+#version 100
+
+precision mediump float;
+
+/*************************************************************************************
+
+ The Sieve of Eratosthenes -- a simple shader by ProfJski
+ An early prime number sieve: https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
+
+ The screen is divided into a square grid of boxes, each representing an integer value.
+ Each integer is tested to see if it is a prime number. Primes are colored white.
+ Non-primes are colored with a color that indicates the smallest factor which evenly divdes our integer.
+
+ You can change the scale variable to make a larger or smaller grid.
+ Total number of integers displayed = scale squared, so scale = 100 tests the first 10,000 integers.
+
+ WARNING: If you make scale too large, your GPU may bog down!
+
+***************************************************************************************/
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Make a nice spectrum of colors based on counter and maxSize
+vec4 Colorizer(float counter, float maxSize)
+{
+ float red = 0.0, green = 0.0, blue = 0.0;
+ float normsize = counter/maxSize;
+
+ red = smoothstep(0.3, 0.7, normsize);
+ green = sin(3.14159*normsize);
+ blue = 1.0 - smoothstep(0.0, 0.4, normsize);
+
+ return vec4(0.8*red, 0.8*green, 0.8*blue, 1.0);
+}
+
+void main()
+{
+ vec4 color = vec4(1.0);
+ float scale = 1000.0; // Makes 100x100 square grid. Change this variable to make a smaller or larger grid.
+ float value = scale*floor(fragTexCoord.y*scale) + floor(fragTexCoord.x*scale); // Group pixels into boxes representing integer values
+ int valuei = int(value);
+
+ //if ((valuei == 0) || (valuei == 1) || (valuei == 2)) gl_FragColor = vec4(1.0);
+ //else
+ {
+ //for (int i = 2; (i < int(max(2.0, sqrt(value) + 1.0))); i++)
+ // NOTE: On GLSL 100 for loops are restricted and loop condition must be a constant
+ // Tested on RPI, it seems loops are limited around 60 iteractions
+ for (int i = 2; i < 48; i++)
+ {
+ if ((value - float(i)*floor(value/float(i))) <= 0.0)
+ {
+ gl_FragColor = Colorizer(float(i), scale);
+ //break; // Uncomment to color by the largest factor instead
+ }
+ }
+ }
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/fisheye.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/fisheye.fs
new file mode 100644
index 0000000..c8ca0bb
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/fisheye.fs
@@ -0,0 +1,43 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+const float PI = 3.1415926535;
+
+void main()
+{
+ float aperture = 178.0;
+ float apertureHalf = 0.5 * aperture * (PI / 180.0);
+ float maxFactor = sin(apertureHalf);
+
+ vec2 uv = vec2(0.0);
+ vec2 xy = 2.0 * fragTexCoord.xy - 1.0;
+ float d = length(xy);
+
+ if (d < (2.0 - maxFactor))
+ {
+ d = length(xy * maxFactor);
+ float z = sqrt(1.0 - d * d);
+ float r = atan(d, z) / PI;
+ float phi = atan(xy.y, xy.x);
+
+ uv.x = r * cos(phi) + 0.5;
+ uv.y = r * sin(phi) + 0.5;
+ }
+ else
+ {
+ uv = fragTexCoord.xy;
+ }
+
+ gl_FragColor = texture2D(texture0, uv);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/fog.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/fog.fs
new file mode 100644
index 0000000..c3d0e17
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/fog.fs
@@ -0,0 +1,94 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec3 fragPosition;
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+varying vec3 fragNormal;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+#define MAX_LIGHTS 4
+#define LIGHT_DIRECTIONAL 0
+#define LIGHT_POINT 1
+
+struct MaterialProperty {
+ vec3 color;
+ int useSampler;
+ sampler2D sampler;
+};
+
+struct Light {
+ int enabled;
+ int type;
+ vec3 position;
+ vec3 target;
+ vec4 color;
+};
+
+// Input lighting values
+uniform Light lights[MAX_LIGHTS];
+uniform vec4 ambient;
+uniform vec3 viewPos;
+uniform float fogDensity;
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture2D(texture0, fragTexCoord);
+ vec3 lightDot = vec3(0.0);
+ vec3 normal = normalize(fragNormal);
+ vec3 viewD = normalize(viewPos - fragPosition);
+ vec3 specular = vec3(0.0);
+
+ // NOTE: Implement here your fragment shader code
+
+ for (int i = 0; i < MAX_LIGHTS; i++)
+ {
+ if (lights[i].enabled == 1)
+ {
+ vec3 light = vec3(0.0);
+
+ if (lights[i].type == LIGHT_DIRECTIONAL) light = -normalize(lights[i].target - lights[i].position);
+ if (lights[i].type == LIGHT_POINT) light = normalize(lights[i].position - fragPosition);
+
+ float NdotL = max(dot(normal, light), 0.0);
+ lightDot += lights[i].color.rgb*NdotL;
+
+ float specCo = 0.0;
+ if (NdotL > 0.0) specCo = pow(max(0.0, dot(viewD, reflect(-(light), normal))), 16.0); // Shine: 16.0
+ specular += specCo;
+ }
+ }
+
+ vec4 finalColor = (texelColor*((colDiffuse + vec4(specular,1))*vec4(lightDot, 1.0)));
+ finalColor += texelColor*(ambient/10.0);
+
+ // Gamma correction
+ finalColor = pow(finalColor, vec4(1.0/2.2));
+
+ // Fog calculation
+ float dist = length(viewPos - fragPosition);
+
+ // these could be parameters...
+ const vec4 fogColor = vec4(0.5, 0.5, 0.5, 1.0);
+ //const float fogDensity = 0.16;
+
+ // Exponential fog
+ float fogFactor = 1.0/exp((dist*fogDensity)*(dist*fogDensity));
+
+ // Linear fog (less nice)
+ //const float fogStart = 2.0;
+ //const float fogEnd = 10.0;
+ //float fogFactor = (fogEnd - dist)/(fogEnd - fogStart);
+
+ fogFactor = clamp(fogFactor, 0.0, 1.0);
+
+ gl_FragColor = mix(fogColor, finalColor, fogFactor);
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/grayscale.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/grayscale.fs
new file mode 100644
index 0000000..0c01fc5
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/grayscale.fs
@@ -0,0 +1,25 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture2D(texture0, fragTexCoord)*colDiffuse*fragColor;
+
+ // Convert texel color to grayscale using NTSC conversion weights
+ float gray = dot(texelColor.rgb, vec3(0.299, 0.587, 0.114));
+
+ // Calculate final fragment color
+ gl_FragColor = vec4(gray, gray, gray, texelColor.a);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/hybrid_raster.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/hybrid_raster.fs
new file mode 100644
index 0000000..28188a4
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/hybrid_raster.fs
@@ -0,0 +1,16 @@
+#version 100
+#extension GL_EXT_frag_depth : enable // Extension required for writing depth
+precision mediump float; // Precision required for OpenGL ES2 (WebGL)
+
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+void main()
+{
+ vec4 texelColor = texture2D(texture0, fragTexCoord);
+ gl_FragColor = texelColor*colDiffuse*fragColor;
+ gl_FragDepthEXT = gl_FragCoord.z;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/hybrid_raymarch.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/hybrid_raymarch.fs
new file mode 100644
index 0000000..6241186
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/hybrid_raymarch.fs
@@ -0,0 +1,288 @@
+#version 100
+#extension GL_EXT_frag_depth : enable //Extension required for writing depth
+#extension GL_OES_standard_derivatives : enable //Extension used for fwidth()
+precision mediump float; // Precision required for OpenGL ES2 (WebGL)
+
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Custom Input Uniform
+uniform vec3 camPos;
+uniform vec3 camDir;
+uniform vec2 screenCenter;
+
+#define ZERO 0
+
+// https://learnopengl.com/Advanced-OpenGL/Depth-testing
+float CalcDepth(in vec3 rd, in float Idist){
+ float local_z = dot(normalize(camDir),rd)*Idist;
+ return (1.0/(local_z) - 1.0/0.01)/(1.0/1000.0 -1.0/0.01);
+}
+
+// https://iquilezles.org/articles/distfunctions/
+float sdHorseshoe( in vec3 p, in vec2 c, in float r, in float le, vec2 w )
+{
+ p.x = abs(p.x);
+ float l = length(p.xy);
+ p.xy = mat2(-c.x, c.y,
+ c.y, c.x)*p.xy;
+ p.xy = vec2((p.y>0.0 || p.x>0.0)?p.x:l*sign(-c.x),
+ (p.x>0.0)?p.y:l );
+ p.xy = vec2(p.x,abs(p.y-r))-vec2(le,0.0);
+
+ vec2 q = vec2(length(max(p.xy,0.0)) + min(0.0,max(p.x,p.y)),p.z);
+ vec2 d = abs(q) - w;
+ return min(max(d.x,d.y),0.0) + length(max(d,0.0));
+}
+
+// r = sphere's radius
+// h = cutting's plane's position
+// t = thickness
+float sdSixWayCutHollowSphere( vec3 p, float r, float h, float t )
+{
+ // Six way symetry Transformation
+ vec3 ap = abs(p);
+ if(ap.x < max(ap.y, ap.z)){
+ if(ap.y < ap.z) ap.xz = ap.zx;
+ else ap.xy = ap.yx;
+ }
+
+ vec2 q = vec2( length(ap.yz), ap.x );
+
+ float w = sqrt(r*r-h*h);
+
+ return ((h*q.x<w*q.y) ? length(q-vec2(w,h)) :
+ abs(length(q)-r) ) - t;
+}
+
+// https://iquilezles.org/articles/boxfunctions
+vec2 iBox( in vec3 ro, in vec3 rd, in vec3 rad )
+{
+ vec3 m = 1.0/rd;
+ vec3 n = m*ro;
+ vec3 k = abs(m)*rad;
+ vec3 t1 = -n - k;
+ vec3 t2 = -n + k;
+ return vec2( max( max( t1.x, t1.y ), t1.z ),
+ min( min( t2.x, t2.y ), t2.z ) );
+}
+
+vec2 opU( vec2 d1, vec2 d2 )
+{
+ return (d1.x<d2.x) ? d1 : d2;
+}
+
+vec2 map( in vec3 pos ){
+ vec2 res = vec2( sdHorseshoe( pos-vec3(-1.0,0.08, 1.0), vec2(cos(1.3),sin(1.3)), 0.2, 0.3, vec2(0.03,0.5) ), 11.5 ) ;
+ res = opU(res, vec2( sdSixWayCutHollowSphere( pos-vec3(0.0, 1.0, 0.0), 4.0, 3.5, 0.5 ), 4.5 )) ;
+ return res;
+}
+
+// https://www.shadertoy.com/view/Xds3zN
+vec2 raycast( in vec3 ro, in vec3 rd ){
+ vec2 res = vec2(-1.0,-1.0);
+
+ float tmin = 1.0;
+ float tmax = 20.0;
+
+ // raytrace floor plane
+ float tp1 = (-ro.y)/rd.y;
+ if( tp1>0.0 )
+ {
+ tmax = min( tmax, tp1 );
+ res = vec2( tp1, 1.0 );
+ }
+
+ float t = tmin;
+ for( int i=0; i<70 ; i++ )
+ {
+ if(t>tmax) break;
+ vec2 h = map( ro+rd*t );
+ if( abs(h.x)<(0.0001*t) )
+ {
+ res = vec2(t,h.y);
+ break;
+ }
+ t += h.x;
+ }
+
+ return res;
+}
+
+
+// https://iquilezles.org/articles/rmshadows
+float calcSoftshadow( in vec3 ro, in vec3 rd, in float mint, in float tmax )
+{
+ // bounding volume
+ float tp = (0.8-ro.y)/rd.y; if( tp>0.0 ) tmax = min( tmax, tp );
+
+ float res = 1.0;
+ float t = mint;
+ for( int i=ZERO; i<24; i++ )
+ {
+ float h = map( ro + rd*t ).x;
+ float s = clamp(8.0*h/t,0.0,1.0);
+ res = min( res, s );
+ t += clamp( h, 0.01, 0.2 );
+ if( res<0.004 || t>tmax ) break;
+ }
+ res = clamp( res, 0.0, 1.0 );
+ return res*res*(3.0-2.0*res);
+}
+
+
+// https://iquilezles.org/articles/normalsSDF
+vec3 calcNormal( in vec3 pos )
+{
+ vec2 e = vec2(1.0,-1.0)*0.5773*0.0005;
+ return normalize( e.xyy*map( pos + e.xyy ).x +
+ e.yyx*map( pos + e.yyx ).x +
+ e.yxy*map( pos + e.yxy ).x +
+ e.xxx*map( pos + e.xxx ).x );
+}
+
+// https://iquilezles.org/articles/nvscene2008/rwwtt.pdf
+float calcAO( in vec3 pos, in vec3 nor )
+{
+ float occ = 0.0;
+ float sca = 1.0;
+ for( int i=ZERO; i<5; i++ )
+ {
+ float h = 0.01 + 0.12*float(i)/4.0;
+ float d = map( pos + h*nor ).x;
+ occ += (h-d)*sca;
+ sca *= 0.95;
+ if( occ>0.35 ) break;
+ }
+ return clamp( 1.0 - 3.0*occ, 0.0, 1.0 ) * (0.5+0.5*nor.y);
+}
+
+// https://iquilezles.org/articles/checkerfiltering
+float checkersGradBox( in vec2 p )
+{
+ // filter kernel
+ vec2 w = fwidth(p) + 0.001;
+ // analytical integral (box filter)
+ vec2 i = 2.0*(abs(fract((p-0.5*w)*0.5)-0.5)-abs(fract((p+0.5*w)*0.5)-0.5))/w;
+ // xor pattern
+ return 0.5 - 0.5*i.x*i.y;
+}
+
+// https://www.shadertoy.com/view/tdS3DG
+vec4 render( in vec3 ro, in vec3 rd)
+{
+ // background
+ vec3 col = vec3(0.7, 0.7, 0.9) - max(rd.y,0.0)*0.3;
+
+ // raycast scene
+ vec2 res = raycast(ro,rd);
+ float t = res.x;
+ float m = res.y;
+ if( m>-0.5 )
+ {
+ vec3 pos = ro + t*rd;
+ vec3 nor = (m<1.5) ? vec3(0.0,1.0,0.0) : calcNormal( pos );
+ vec3 ref = reflect( rd, nor );
+
+ // material
+ col = 0.2 + 0.2*sin( m*2.0 + vec3(0.0,1.0,2.0) );
+ float ks = 1.0;
+
+ if( m<1.5 )
+ {
+ float f = checkersGradBox( 3.0*pos.xz);
+ col = 0.15 + f*vec3(0.05);
+ ks = 0.4;
+ }
+
+ // lighting
+ float occ = calcAO( pos, nor );
+
+ vec3 lin = vec3(0.0);
+
+ // sun
+ {
+ vec3 lig = normalize( vec3(-0.5, 0.4, -0.6) );
+ vec3 hal = normalize( lig-rd );
+ float dif = clamp( dot( nor, lig ), 0.0, 1.0 );
+ //if( dif>0.0001 )
+ dif *= calcSoftshadow( pos, lig, 0.02, 2.5 );
+ float spe = pow( clamp( dot( nor, hal ), 0.0, 1.0 ),16.0);
+ spe *= dif;
+ spe *= 0.04+0.96*pow(clamp(1.0-dot(hal,lig),0.0,1.0),5.0);
+ //spe *= 0.04+0.96*pow(clamp(1.0-sqrt(0.5*(1.0-dot(rd,lig))),0.0,1.0),5.0);
+ lin += col*2.20*dif*vec3(1.30,1.00,0.70);
+ lin += 5.00*spe*vec3(1.30,1.00,0.70)*ks;
+ }
+ // sky
+ {
+ float dif = sqrt(clamp( 0.5+0.5*nor.y, 0.0, 1.0 ));
+ dif *= occ;
+ float spe = smoothstep( -0.2, 0.2, ref.y );
+ spe *= dif;
+ spe *= 0.04+0.96*pow(clamp(1.0+dot(nor,rd),0.0,1.0), 5.0 );
+ //if( spe>0.001 )
+ spe *= calcSoftshadow( pos, ref, 0.02, 2.5 );
+ lin += col*0.60*dif*vec3(0.40,0.60,1.15);
+ lin += 2.00*spe*vec3(0.40,0.60,1.30)*ks;
+ }
+ // back
+ {
+ float dif = clamp( dot( nor, normalize(vec3(0.5,0.0,0.6))), 0.0, 1.0 )*clamp( 1.0-pos.y,0.0,1.0);
+ dif *= occ;
+ lin += col*0.55*dif*vec3(0.25,0.25,0.25);
+ }
+ // sss
+ {
+ float dif = pow(clamp(1.0+dot(nor,rd),0.0,1.0),2.0);
+ dif *= occ;
+ lin += col*0.25*dif*vec3(1.00,1.00,1.00);
+ }
+
+ col = lin;
+
+ col = mix( col, vec3(0.7,0.7,0.9), 1.0-exp( -0.0001*t*t*t ) );
+ }
+
+ return vec4(vec3( clamp(col,0.0,1.0) ),t);
+}
+
+vec3 CalcRayDir(vec2 nCoord){
+ vec3 horizontal = normalize(cross(camDir,vec3(.0 , 1.0, .0)));
+ vec3 vertical = normalize(cross(horizontal,camDir));
+ return normalize(camDir + horizontal*nCoord.x + vertical*nCoord.y);
+}
+
+mat3 setCamera()
+{
+ vec3 cw = normalize(camDir);
+ vec3 cp = vec3(0.0, 1.0 ,0.0);
+ vec3 cu = normalize( cross(cw,cp) );
+ vec3 cv = ( cross(cu,cw) );
+ return mat3( cu, cv, cw );
+}
+
+void main()
+{
+ vec2 nCoord = (gl_FragCoord.xy - screenCenter.xy)/screenCenter.y;
+ mat3 ca = setCamera();
+
+ // focal length
+ float fl = length(camDir);
+ vec3 rd = ca * normalize( vec3(nCoord,fl) );
+ vec3 color = vec3(nCoord/2.0 + 0.5, 0.0);
+ float depth = gl_FragCoord.z;
+ {
+ vec4 res = render( camPos - vec3(0.0, 0.0, 0.0) , rd );
+ color = res.xyz;
+ depth = CalcDepth(rd,res.w);
+ }
+ gl_FragColor = vec4(color , 1.0);
+ gl_FragDepthEXT = depth;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/julia_set.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/julia_set.fs
new file mode 100644
index 0000000..82d0a75
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/julia_set.fs
@@ -0,0 +1,85 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+uniform vec2 c; // c.x = real, c.y = imaginary component. Equation done is z^2 + c
+uniform vec2 offset; // Offset of the scale.
+uniform float zoom; // Zoom of the scale.
+
+// NOTE: Maximum number of shader for-loop iterations depend on GPU,
+// for example, on RasperryPi for this examply only supports up to 60
+const int maxIterations = 48; // Max iterations to do.
+const float colorCycles = 1.0f; // Number of times the color palette repeats.
+
+// Square a complex number
+vec2 ComplexSquare(vec2 z)
+{
+ return vec2(
+ z.x*z.x - z.y*z.y,
+ z.x*z.y*2.0f
+ );
+}
+
+// Convert Hue Saturation Value (HSV) color into RGB
+vec3 Hsv2rgb(vec3 c)
+{
+ vec4 K = vec4(1.0f, 2.0f/3.0f, 1.0f/3.0f, 3.0f);
+ vec3 p = abs(fract(c.xxx + K.xyz)*6.0f - K.www);
+ return c.z*mix(K.xxx, clamp(p - K.xxx, 0.0f, 1.0f), c.y);
+}
+
+void main()
+{
+ /**********************************************************************************************
+ Julia sets use a function z^2 + c, where c is a constant.
+ This function is iterated until the nature of the point is determined.
+
+ If the magnitude of the number becomes greater than 2, then from that point onward
+ the number will get bigger and bigger, and will never get smaller (tends towards infinity).
+ 2^2 = 4, 4^2 = 8 and so on.
+ So at 2 we stop iterating.
+
+ If the number is below 2, we keep iterating.
+ But when do we stop iterating if the number is always below 2 (it converges)?
+ That is what maxIterations is for.
+ Then we can divide the iterations by the maxIterations value to get a normalized value that we can
+ then map to a color.
+
+ We use dot product (z.x * z.x + z.y * z.y) to determine the magnitude (length) squared.
+ And once the magnitude squared is > 4, then magnitude > 2 is also true (saves computational power).
+ *************************************************************************************************/
+
+ // The pixel coordinates are scaled so they are on the mandelbrot scale
+ // NOTE: fragTexCoord already comes as normalized screen coordinates but offset must be normalized before scaling and zoom
+ vec2 z = vec2((fragTexCoord.x - 0.5f)*2.5f, (fragTexCoord.y - 0.5f)*1.5f)/zoom;
+ z.x += offset.x;
+ z.y += offset.y;
+
+ int iter = 0;
+ for (int iterations = 0; iterations < 60; iterations++)
+ {
+ z = ComplexSquare(z) + c; // Iterate function
+ if (dot(z, z) > 4.0f) break;
+
+ iter = iterations;
+ }
+
+ // Another few iterations decreases errors in the smoothing calculation.
+ // See http://linas.org/art-gallery/escape/escape.html for more information.
+ z = ComplexSquare(z) + c;
+ z = ComplexSquare(z) + c;
+
+ // This last part smooths the color (again see link above).
+ float smoothVal = float(iter) + 1.0f - (log(log(length(z)))/log(2.0f));
+
+ // Normalize the value so it is between 0 and 1.
+ float norm = smoothVal/float(maxIterations);
+
+ // If in set, color black. 0.999 allows for some float accuracy error.
+ if (norm > 0.999f) gl_FragColor = vec4(0.0f, 0.0f, 0.0f, 1.0f);
+ else gl_FragColor = vec4(Hsv2rgb(vec3(norm*colorCycles, 1.0f, 1.0f)), 1.0f);
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/lighting.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/lighting.fs
new file mode 100644
index 0000000..f9b0bd3
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/lighting.fs
@@ -0,0 +1,77 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec3 fragPosition;
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+varying vec3 fragNormal;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+#define MAX_LIGHTS 4
+#define LIGHT_DIRECTIONAL 0
+#define LIGHT_POINT 1
+
+struct Light {
+ int enabled;
+ int type;
+ vec3 position;
+ vec3 target;
+ vec4 color;
+};
+
+// Input lighting values
+uniform Light lights[MAX_LIGHTS];
+uniform vec4 ambient;
+uniform vec3 viewPos;
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture2D(texture0, fragTexCoord);
+ vec3 lightDot = vec3(0.0);
+ vec3 normal = normalize(fragNormal);
+ vec3 viewD = normalize(viewPos - fragPosition);
+ vec3 specular = vec3(0.0);
+
+ vec4 tint = colDiffuse * fragColor;
+
+ // NOTE: Implement here your fragment shader code
+
+ for (int i = 0; i < MAX_LIGHTS; i++)
+ {
+ if (lights[i].enabled == 1)
+ {
+ vec3 light = vec3(0.0);
+
+ if (lights[i].type == LIGHT_DIRECTIONAL)
+ {
+ light = -normalize(lights[i].target - lights[i].position);
+ }
+
+ if (lights[i].type == LIGHT_POINT)
+ {
+ light = normalize(lights[i].position - fragPosition);
+ }
+
+ float NdotL = max(dot(normal, light), 0.0);
+ lightDot += lights[i].color.rgb*NdotL;
+
+ float specCo = 0.0;
+ if (NdotL > 0.0) specCo = pow(max(0.0, dot(viewD, reflect(-(light), normal))), 16.0); // 16 refers to shine
+ specular += specCo;
+ }
+ }
+
+ vec4 finalColor = (texelColor*((tint + vec4(specular, 1.0))*vec4(lightDot, 1.0)));
+ finalColor += texelColor*(ambient/10.0);
+
+ // Gamma correction
+ gl_FragColor = pow(finalColor, vec4(1.0/2.2));
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/lighting.vs b/deps/raylib/examples/shaders/resources/shaders/glsl100/lighting.vs
new file mode 100644
index 0000000..5245c61
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/lighting.vs
@@ -0,0 +1,59 @@
+#version 100
+
+// Input vertex attributes
+attribute vec3 vertexPosition;
+attribute vec2 vertexTexCoord;
+attribute vec3 vertexNormal;
+attribute vec4 vertexColor;
+
+// Input uniform values
+uniform mat4 mvp;
+uniform mat4 matModel;
+
+// Output vertex attributes (to fragment shader)
+varying vec3 fragPosition;
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+varying vec3 fragNormal;
+
+// NOTE: Add here your custom variables
+
+// https://github.com/glslify/glsl-inverse
+mat3 inverse(mat3 m)
+{
+ float a00 = m[0][0], a01 = m[0][1], a02 = m[0][2];
+ float a10 = m[1][0], a11 = m[1][1], a12 = m[1][2];
+ float a20 = m[2][0], a21 = m[2][1], a22 = m[2][2];
+
+ float b01 = a22*a11 - a12*a21;
+ float b11 = -a22*a10 + a12*a20;
+ float b21 = a21*a10 - a11*a20;
+
+ float det = a00*b01 + a01*b11 + a02*b21;
+
+ return mat3(b01, (-a22*a01 + a02*a21), (a12*a01 - a02*a11),
+ b11, (a22*a00 - a02*a20), (-a12*a00 + a02*a10),
+ b21, (-a21*a00 + a01*a20), (a11*a00 - a01*a10))/det;
+}
+
+// https://github.com/glslify/glsl-transpose
+mat3 transpose(mat3 m)
+{
+ return mat3(m[0][0], m[1][0], m[2][0],
+ m[0][1], m[1][1], m[2][1],
+ m[0][2], m[1][2], m[2][2]);
+}
+
+void main()
+{
+ // Send vertex attributes to fragment shader
+ fragPosition = vec3(matModel*vec4(vertexPosition, 1.0));
+ fragTexCoord = vertexTexCoord;
+ fragColor = vertexColor;
+
+ mat3 normalMatrix = transpose(inverse(mat3(matModel)));
+ fragNormal = normalize(normalMatrix*vertexNormal);
+
+ // Calculate final vertex position
+ gl_Position = mvp*vec4(vertexPosition, 1.0);
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/lighting_instancing.vs b/deps/raylib/examples/shaders/resources/shaders/glsl100/lighting_instancing.vs
new file mode 100644
index 0000000..eb47bb9
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/lighting_instancing.vs
@@ -0,0 +1,36 @@
+#version 100
+
+// Input vertex attributes
+attribute vec3 vertexPosition;
+attribute vec2 vertexTexCoord;
+attribute vec3 vertexNormal;
+attribute vec4 vertexColor;
+
+attribute mat4 instanceTransform;
+
+// Input uniform values
+uniform mat4 mvp;
+uniform mat4 matNormal;
+
+// Output vertex attributes (to fragment shader)
+varying vec3 fragPosition;
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+varying vec3 fragNormal;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ // Compute MVP for current instance
+ mat4 mvpi = mvp*instanceTransform;
+
+ // Send vertex attributes to fragment shader
+ fragPosition = vec3(mvpi*vec4(vertexPosition, 1.0));
+ fragTexCoord = vertexTexCoord;
+ fragColor = vertexColor;
+ fragNormal = normalize(vec3(matNormal*vec4(vertexNormal, 1.0)));
+
+ // Calculate final vertex position
+ gl_Position = mvpi*vec4(vertexPosition, 1.0);
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/lightmap.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/lightmap.fs
new file mode 100644
index 0000000..9f0bcd2
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/lightmap.fs
@@ -0,0 +1,22 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec2 fragTexCoord2;
+varying vec3 fragPosition;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform sampler2D texture1;
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture2D(texture0, fragTexCoord);
+ vec4 texelColor2 = texture2D(texture1, fragTexCoord2);
+
+ gl_FragColor = texelColor * texelColor2;
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/lightmap.vs b/deps/raylib/examples/shaders/resources/shaders/glsl100/lightmap.vs
new file mode 100644
index 0000000..f5d87b3
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/lightmap.vs
@@ -0,0 +1,31 @@
+#version 100
+
+// Input vertex attributes
+attribute vec3 vertexPosition;
+attribute vec2 vertexTexCoord;
+attribute vec2 vertexTexCoord2;
+attribute vec4 vertexColor;
+
+// Input uniform values
+uniform mat4 mvp;
+uniform mat4 matModel;
+
+// Output vertex attributes (to fragment shader)
+varying vec3 fragPosition;
+varying vec2 fragTexCoord;
+varying vec2 fragTexCoord2;
+varying vec4 fragColor;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ // Send vertex attributes to fragment shader
+ fragPosition = vec3(matModel*vec4(vertexPosition, 1.0));
+ fragTexCoord = vertexTexCoord;
+ fragTexCoord2 = vertexTexCoord2;
+ fragColor = vertexColor;
+
+ // Calculate final vertex position
+ gl_Position = mvp*vec4(vertexPosition, 1.0);
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/mask.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/mask.fs
new file mode 100644
index 0000000..2071062
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/mask.fs
@@ -0,0 +1,24 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform sampler2D mask;
+uniform vec4 colDiffuse;
+uniform int frame;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ vec4 maskColour = texture2D(mask, fragTexCoord + vec2(sin(-float(frame)/150.0)/10.0, cos(-float(frame)/170.0)/10.0));
+ if (maskColour.r < 0.25) discard;
+ vec4 texelColor = texture2D(texture0, fragTexCoord + vec2(sin(float(frame)/90.0)/8.0, cos(float(frame)/60.0)/8.0));
+
+ gl_FragColor = texelColor*maskColour;
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/outline.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/outline.fs
new file mode 100644
index 0000000..c64409e
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/outline.fs
@@ -0,0 +1,34 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+uniform vec2 textureSize;
+uniform float outlineSize;
+uniform vec4 outlineColor;
+
+void main()
+{
+ vec4 texel = texture2D(texture0, fragTexCoord); // Get texel color
+ vec2 texelScale = vec2(0.0);
+ texelScale.x = outlineSize/textureSize.x;
+ texelScale.y = outlineSize/textureSize.y;
+
+ // We sample four corner texels, but only for the alpha channel (this is for the outline)
+ vec4 corners = vec4(0.0);
+ corners.x = texture2D(texture0, fragTexCoord + vec2(texelScale.x, texelScale.y)).a;
+ corners.y = texture2D(texture0, fragTexCoord + vec2(texelScale.x, -texelScale.y)).a;
+ corners.z = texture2D(texture0, fragTexCoord + vec2(-texelScale.x, texelScale.y)).a;
+ corners.w = texture2D(texture0, fragTexCoord + vec2(-texelScale.x, -texelScale.y)).a;
+
+ float outline = min(dot(corners, vec4(1.0)), 1.0);
+ vec4 color = mix(vec4(0.0), outlineColor, outline);
+ gl_FragColor = mix(color, texel, texel.a);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/palette_switch.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/palette_switch.fs
new file mode 100644
index 0000000..d8d696d
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/palette_switch.fs
@@ -0,0 +1,43 @@
+#version 100
+
+precision mediump float;
+
+const int MAX_INDEXED_COLORS = 8;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform ivec3 palette[MAX_INDEXED_COLORS];
+//uniform sampler2D palette; // Alternative to ivec3, palette provided as a 256x1 texture
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture2D(texture0, fragTexCoord)*fragColor;
+
+ // Convert the (normalized) texel color RED component (GB would work, too)
+ // to the palette index by scaling up from [0..1] to [0..255]
+ int index = int(texelColor.r*255.0);
+
+ ivec3 color = ivec3(0);
+
+ // NOTE: On GLSL 100 we are not allowed to index a uniform array by a variable value,
+ // a constant must be used, so this logic...
+ if (index == 0) color = palette[0];
+ else if (index == 1) color = palette[1];
+ else if (index == 2) color = palette[2];
+ else if (index == 3) color = palette[3];
+ else if (index == 4) color = palette[4];
+ else if (index == 5) color = palette[5];
+ else if (index == 6) color = palette[6];
+ else if (index == 7) color = palette[7];
+
+ //gl_FragColor = texture2D(palette, texelColor.xy); // Alternative to ivec3
+
+ // Calculate final fragment color. Note that the palette color components
+ // are defined in the range [0..255] and need to be normalized to [0..1]
+ gl_FragColor = vec4(float(color.x)/255.0, float(color.y)/255.0, float(color.z)/255.0, texelColor.a);
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/pbr.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/pbr.fs
new file mode 100644
index 0000000..1ada833
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/pbr.fs
@@ -0,0 +1,156 @@
+#version 100
+
+precision mediump float;
+
+#define MAX_LIGHTS 4
+#define LIGHT_DIRECTIONAL 0
+#define LIGHT_POINT 1
+#define PI 3.14159265358979323846
+
+struct Light {
+ int enabled;
+ int type;
+ vec3 position;
+ vec3 target;
+ vec4 color;
+ float intensity;
+};
+
+// Input vertex attributes (from vertex shader)
+varying in vec3 fragPosition;
+varying in vec2 fragTexCoord;
+varying in vec4 fragColor;
+varying in vec3 fragNormal;
+varying in vec4 shadowPos;
+varying in mat3 TBN;
+
+
+// Input uniform values
+uniform int numOfLights;
+uniform sampler2D albedoMap;
+uniform sampler2D mraMap;
+uniform sampler2D normalMap;
+uniform sampler2D emissiveMap; // r: Hight g:emissive
+
+uniform vec2 tiling;
+uniform vec2 offset;
+
+uniform int useTexAlbedo;
+uniform int useTexNormal;
+uniform int useTexMRA;
+uniform int useTexEmissive;
+
+uniform vec4 albedoColor;
+uniform vec4 emissiveColor;
+uniform float normalValue;
+uniform float metallicValue;
+uniform float roughnessValue;
+uniform float aoValue;
+uniform float emissivePower;
+
+// Input lighting values
+uniform Light lights[MAX_LIGHTS];
+uniform vec3 viewPos;
+
+uniform vec3 ambientColor;
+uniform float ambient;
+
+// refl in range 0 to 1
+// returns base reflectivity to 1
+// incrase reflectivity when surface view at larger angle
+vec3 schlickFresnel(float hDotV,vec3 refl)
+{
+ return refl + (1.0 - refl) * pow(1.0 - hDotV,5.0);
+}
+
+float ggxDistribution(float nDotH,float roughness)
+{
+ float a = roughness * roughness * roughness * roughness;
+ float d = nDotH * nDotH * (a - 1.0) + 1.0;
+ d = PI * d * d;
+ return a / max(d,0.0000001);
+}
+
+float geomSmith(float nDotV,float nDotL,float roughness)
+{
+ float r = roughness + 1.0;
+ float k = r * r / 8.0;
+ float ik = 1.0 - k;
+ float ggx1 = nDotV / (nDotV * ik + k);
+ float ggx2 = nDotL / (nDotL * ik + k);
+ return ggx1 * ggx2;
+}
+
+vec3 pbr(){
+ vec3 albedo = texture2D(albedoMap,vec2(fragTexCoord.x*tiling.x+offset.x,fragTexCoord.y*tiling.y+offset.y)).rgb;
+ albedo = vec3(albedoColor.x*albedo.x,albedoColor.y*albedo.y,albedoColor.z*albedo.z);
+ float metallic = clamp(metallicValue,0.0,1.0);
+ float roughness = clamp(roughnessValue,0.0,1.0);
+ float ao = clamp(aoValue,0.0,1.0);
+ if(useTexMRA == 1) {
+ vec4 mra = texture2D(mraMap, vec2(fragTexCoord.x * tiling.x + offset.x, fragTexCoord.y * tiling.y + offset.y));
+ metallic = clamp(mra.r+metallicValue,0.04,1.0);
+ roughness = clamp(mra.g+roughnessValue,0.04,1.0);
+ ao = (mra.b+aoValue)*0.5;
+ }
+
+
+
+ vec3 N = normalize(fragNormal);
+ if(useTexNormal == 1) {
+ N = texture2D(normalMap, vec2(fragTexCoord.x * tiling.x + offset.y, fragTexCoord.y * tiling.y + offset.y)).rgb;
+ N = normalize(N * 2.0 - 1.0);
+ N = normalize(N * TBN);
+ }
+
+ vec3 V = normalize(viewPos - fragPosition);
+
+ vec3 e = vec3(0);
+ e = (texture2D(emissiveMap, vec2(fragTexCoord.x*tiling.x+offset.x, fragTexCoord.y*tiling.y+offset.y)).rgb).g * emissiveColor.rgb*emissivePower * float(useTexEmissive);
+
+ //return N;//vec3(metallic,metallic,metallic);
+ //if dia-electric use base reflectivity of 0.04 otherwise ut is a metal use albedo as base reflectivity
+ vec3 baseRefl = mix(vec3(0.04),albedo.rgb,metallic);
+ vec3 Lo = vec3(0.0); // acumulate lighting lum
+
+ for(int i=0;i<numOfLights;++i){
+
+ vec3 L = normalize(lights[i].position - fragPosition); // calc light vector
+ vec3 H = normalize(V + L); // calc halfway bisecting vector
+ float dist = length(lights[i].position - fragPosition); // calc distance to light
+ float attenuation = 1.0 / (dist * dist * 0.23); // calc attenuation
+ vec3 radiance = lights[i].color.rgb * lights[i].intensity * attenuation; // calc input radiance,light energy comming in
+
+ //Cook-Torrance BRDF distribution function
+ float nDotV = max(dot(N,V),0.0000001);
+ float nDotL = max(dot(N,L),0.0000001);
+ float hDotV = max(dot(H,V),0.0);
+ float nDotH = max(dot(N,H),0.0);
+ float D = ggxDistribution(nDotH,roughness); // larger the more micro-facets aligned to H
+ float G = geomSmith(nDotV,nDotL,roughness); // smaller the more micro-facets shadow
+ vec3 F = schlickFresnel(hDotV, baseRefl); // fresnel proportion of specular reflectance
+
+ vec3 spec = (D * G * F) / (4.0 * nDotV * nDotL);
+ // difuse and spec light can't be above 1.0
+ // kD = 1.0 - kS diffuse component is equal 1.0 - spec comonent
+ vec3 kD = vec3(1.0) - F;
+ //mult kD by the inverse of metallnes , only non-metals should have diffuse light
+ kD *= 1.0 - metallic;
+ Lo += ((kD * albedo.rgb / PI + spec) * radiance * nDotL)*float(lights[i].enabled); // angle of light has impact on result
+ }
+ vec3 ambient_final = (ambientColor + albedo)* ambient * 0.5;
+ return ambient_final+Lo*ao+e;
+}
+
+void main()
+{
+ vec3 color = pbr();
+
+ //HDR tonemapping
+ color = pow(color,color + vec3(1.0));
+ //gamma correction
+ color = pow(color,vec3(1.0/2.2));
+
+ gl_FragColor = vec4(color,1.0);
+
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/pbr.vs b/deps/raylib/examples/shaders/resources/shaders/glsl100/pbr.vs
new file mode 100644
index 0000000..3fa651f
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/pbr.vs
@@ -0,0 +1,75 @@
+#version 100
+
+// Input vertex attributes
+attribute vec3 vertexPosition;
+attribute vec2 vertexTexCoord;
+attribute vec3 vertexNormal;
+attribute vec3 vertexTangent;
+attribute vec4 vertexColor;
+
+// Input uniform values
+uniform mat4 mvp;
+uniform mat4 matModel;
+uniform mat4 matNormal;
+uniform vec3 lightPos;
+uniform vec4 difColor;
+
+// Output vertex attributes (to fragment shader)
+varying vec3 fragPosition;
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+varying vec3 fragNormal;
+varying mat3 TBN;
+
+const float normalOffset = 0.1;
+
+// https://github.com/glslify/glsl-inverse
+mat3 inverse(mat3 m)
+{
+ float a00 = m[0][0], a01 = m[0][1], a02 = m[0][2];
+ float a10 = m[1][0], a11 = m[1][1], a12 = m[1][2];
+ float a20 = m[2][0], a21 = m[2][1], a22 = m[2][2];
+
+ float b01 = a22*a11 - a12*a21;
+ float b11 = -a22*a10 + a12*a20;
+ float b21 = a21*a10 - a11*a20;
+
+ float det = a00*b01 + a01*b11 + a02*b21;
+
+ return mat3(b01, (-a22*a01 + a02*a21), (a12*a01 - a02*a11),
+ b11, (a22*a00 - a02*a20), (-a12*a00 + a02*a10),
+ b21, (-a21*a00 + a01*a20), (a11*a00 - a01*a10))/det;
+}
+
+// https://github.com/glslify/glsl-transpose
+mat3 transpose(mat3 m)
+{
+ return mat3(m[0][0], m[1][0], m[2][0],
+ m[0][1], m[1][1], m[2][1],
+ m[0][2], m[1][2], m[2][2]);
+}
+
+void main()
+{
+
+ // calc binormal from vertex normal and tangent
+ vec3 vertexBinormal = cross(vertexNormal, vertexTangent);
+ // calc fragment normal based on normal transformations
+ mat3 normalMatrix = transpose(inverse(mat3(matModel)));
+ // calc fragment position based on model transformations
+
+ fragPosition = vec3(matModel*vec4(vertexPosition, 1.0));
+
+ fragTexCoord = vertexTexCoord*2.0;
+
+ fragNormal = normalize(normalMatrix*vertexNormal);
+ vec3 fragTangent = normalize(normalMatrix*vertexTangent);
+ fragTangent = normalize(fragTangent - dot(fragTangent, fragNormal)*fragNormal);
+ vec3 fragBinormal = normalize(normalMatrix*vertexBinormal);
+ fragBinormal = cross(fragNormal, fragTangent);
+
+ TBN = transpose(mat3(fragTangent, fragBinormal, fragNormal));
+
+ // Calculate final vertex position
+ gl_Position = mvp * vec4(vertexPosition, 1.0);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/pixelizer.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/pixelizer.fs
new file mode 100644
index 0000000..dae63df
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/pixelizer.fs
@@ -0,0 +1,32 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+// NOTE: Render size values must be passed from code
+const float renderWidth = 800.0;
+const float renderHeight = 450.0;
+
+float pixelWidth = 5.0;
+float pixelHeight = 5.0;
+
+void main()
+{
+ float dx = pixelWidth*(1.0/renderWidth);
+ float dy = pixelHeight*(1.0/renderHeight);
+
+ vec2 coord = vec2(dx*floor(fragTexCoord.x/dx), dy*floor(fragTexCoord.y/dy));
+
+ vec3 tc = texture2D(texture0, coord).rgb;
+
+ gl_FragColor = vec4(tc, 1.0);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/posterization.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/posterization.fs
new file mode 100644
index 0000000..f7060e5
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/posterization.fs
@@ -0,0 +1,29 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+float gamma = 0.6;
+float numColors = 8.0;
+
+void main()
+{
+ vec3 color = texture2D(texture0, fragTexCoord.xy).rgb;
+
+ color = pow(color, vec3(gamma, gamma, gamma));
+ color = color*numColors;
+ color = floor(color);
+ color = color/numColors;
+ color = pow(color, vec3(1.0/gamma));
+
+ gl_FragColor = vec4(color, 1.0);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/predator.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/predator.fs
new file mode 100644
index 0000000..e0c0a9d
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/predator.fs
@@ -0,0 +1,31 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ vec3 color = texture2D(texture0, fragTexCoord).rgb;
+ vec3 colors[3];
+ colors[0] = vec3(0.0, 0.0, 1.0);
+ colors[1] = vec3(1.0, 1.0, 0.0);
+ colors[2] = vec3(1.0, 0.0, 0.0);
+
+ float lum = (color.r + color.g + color.b)/3.0;
+
+ vec3 tc = vec3(0.0, 0.0, 0.0);
+
+ if (lum < 0.5) tc = mix(colors[0], colors[1], lum/0.5);
+ else tc = mix(colors[1], colors[2], (lum - 0.5)/0.5);
+
+ gl_FragColor = vec4(tc, 1.0);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/raymarching.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/raymarching.fs
new file mode 100644
index 0000000..a7339d2
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/raymarching.fs
@@ -0,0 +1,431 @@
+#version 100
+
+precision mediump float;
+
+#extension GL_OES_standard_derivatives : enable
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+uniform vec3 viewEye;
+uniform vec3 viewCenter;
+uniform float runTime;
+uniform vec2 resolution;
+
+// The MIT License
+// Copyright © 2013 Inigo Quilez
+// 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.
+
+// A list of useful distance function to simple primitives, and an example on how to
+// do some interesting boolean operations, repetition and displacement.
+//
+// More info here: http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm
+
+#define AA 1 // make this 1 if your machine is too slow
+
+//------------------------------------------------------------------
+
+float sdPlane( vec3 p )
+{
+ return p.y;
+}
+
+float sdSphere( vec3 p, float s )
+{
+ return length(p)-s;
+}
+
+float sdBox( vec3 p, vec3 b )
+{
+ vec3 d = abs(p) - b;
+ return min(max(d.x,max(d.y,d.z)),0.0) + length(max(d,0.0));
+}
+
+float sdEllipsoid( in vec3 p, in vec3 r )
+{
+ return (length( p/r ) - 1.0) * min(min(r.x,r.y),r.z);
+}
+
+float udRoundBox( vec3 p, vec3 b, float r )
+{
+ return length(max(abs(p)-b,0.0))-r;
+}
+
+float sdTorus( vec3 p, vec2 t )
+{
+ return length( vec2(length(p.xz)-t.x,p.y) )-t.y;
+}
+
+float sdHexPrism( vec3 p, vec2 h )
+{
+ vec3 q = abs(p);
+#if 0
+ return max(q.z-h.y,max((q.x*0.866025+q.y*0.5),q.y)-h.x);
+#else
+ float d1 = q.z-h.y;
+ float d2 = max((q.x*0.866025+q.y*0.5),q.y)-h.x;
+ return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.);
+#endif
+}
+
+float sdCapsule( vec3 p, vec3 a, vec3 b, float r )
+{
+ vec3 pa = p-a, ba = b-a;
+ float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );
+ return length( pa - ba*h ) - r;
+}
+
+float sdEquilateralTriangle( in vec2 p )
+{
+ const float k = sqrt(3.0);
+ p.x = abs(p.x) - 1.0;
+ p.y = p.y + 1.0/k;
+ if( p.x + k*p.y > 0.0 ) p = vec2( p.x - k*p.y, -k*p.x - p.y )/2.0;
+ p.x += 2.0 - 2.0*clamp( (p.x+2.0)/2.0, 0.0, 1.0 );
+ return -length(p)*sign(p.y);
+}
+
+float sdTriPrism( vec3 p, vec2 h )
+{
+ vec3 q = abs(p);
+ float d1 = q.z-h.y;
+#if 1
+ // distance bound
+ float d2 = max(q.x*0.866025+p.y*0.5,-p.y)-h.x*0.5;
+#else
+ // correct distance
+ h.x *= 0.866025;
+ float d2 = sdEquilateralTriangle(p.xy/h.x)*h.x;
+#endif
+ return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.);
+}
+
+float sdCylinder( vec3 p, vec2 h )
+{
+ vec2 d = abs(vec2(length(p.xz),p.y)) - h;
+ return min(max(d.x,d.y),0.0) + length(max(d,0.0));
+}
+
+float sdCone( in vec3 p, in vec3 c )
+{
+ vec2 q = vec2( length(p.xz), p.y );
+ float d1 = -q.y-c.z;
+ float d2 = max( dot(q,c.xy), q.y);
+ return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.);
+}
+
+float sdConeSection( in vec3 p, in float h, in float r1, in float r2 )
+{
+ float d1 = -p.y - h;
+ float q = p.y - h;
+ float si = 0.5*(r1-r2)/h;
+ float d2 = max( sqrt( dot(p.xz,p.xz)*(1.0-si*si)) + q*si - r2, q );
+ return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.);
+}
+
+float sdPryamid4(vec3 p, vec3 h ) // h = { cos a, sin a, height }
+{
+ // Tetrahedron = Octahedron - Cube
+ float box = sdBox( p - vec3(0,-2.0*h.z,0), vec3(2.0*h.z) );
+
+ float d = 0.0;
+ d = max( d, abs( dot(p, vec3( -h.x, h.y, 0 )) ));
+ d = max( d, abs( dot(p, vec3( h.x, h.y, 0 )) ));
+ d = max( d, abs( dot(p, vec3( 0, h.y, h.x )) ));
+ d = max( d, abs( dot(p, vec3( 0, h.y,-h.x )) ));
+ float octa = d - h.z;
+ return max(-box,octa); // Subtraction
+ }
+
+float length2( vec2 p )
+{
+ return sqrt( p.x*p.x + p.y*p.y );
+}
+
+float length6( vec2 p )
+{
+ p = p*p*p; p = p*p;
+ return pow( p.x + p.y, 1.0/6.0 );
+}
+
+float length8( vec2 p )
+{
+ p = p*p; p = p*p; p = p*p;
+ return pow( p.x + p.y, 1.0/8.0 );
+}
+
+float sdTorus82( vec3 p, vec2 t )
+{
+ vec2 q = vec2(length2(p.xz)-t.x,p.y);
+ return length8(q)-t.y;
+}
+
+float sdTorus88( vec3 p, vec2 t )
+{
+ vec2 q = vec2(length8(p.xz)-t.x,p.y);
+ return length8(q)-t.y;
+}
+
+float sdCylinder6( vec3 p, vec2 h )
+{
+ return max( length6(p.xz)-h.x, abs(p.y)-h.y );
+}
+
+//------------------------------------------------------------------
+
+float opS( float d1, float d2 )
+{
+ return max(-d2,d1);
+}
+
+vec2 opU( vec2 d1, vec2 d2 )
+{
+ return (d1.x<d2.x) ? d1 : d2;
+}
+
+vec3 opRep( vec3 p, vec3 c )
+{
+ return mod(p,c)-0.5*c;
+}
+
+vec3 opTwist( vec3 p )
+{
+ float c = cos(10.0*p.y+10.0);
+ float s = sin(10.0*p.y+10.0);
+ mat2 m = mat2(c,-s,s,c);
+ return vec3(m*p.xz,p.y);
+}
+
+//------------------------------------------------------------------
+
+vec2 map( in vec3 pos )
+{
+ vec2 res = opU( vec2( sdPlane( pos), 1.0 ),
+ vec2( sdSphere( pos-vec3( 0.0,0.25, 0.0), 0.25 ), 46.9 ) );
+ res = opU( res, vec2( sdBox( pos-vec3( 1.0,0.25, 0.0), vec3(0.25) ), 3.0 ) );
+ res = opU( res, vec2( udRoundBox( pos-vec3( 1.0,0.25, 1.0), vec3(0.15), 0.1 ), 41.0 ) );
+ res = opU( res, vec2( sdTorus( pos-vec3( 0.0,0.25, 1.0), vec2(0.20,0.05) ), 25.0 ) );
+ res = opU( res, vec2( sdCapsule( pos,vec3(-1.3,0.10,-0.1), vec3(-0.8,0.50,0.2), 0.1 ), 31.9 ) );
+ res = opU( res, vec2( sdTriPrism( pos-vec3(-1.0,0.25,-1.0), vec2(0.25,0.05) ),43.5 ) );
+ res = opU( res, vec2( sdCylinder( pos-vec3( 1.0,0.30,-1.0), vec2(0.1,0.2) ), 8.0 ) );
+ res = opU( res, vec2( sdCone( pos-vec3( 0.0,0.50,-1.0), vec3(0.8,0.6,0.3) ), 55.0 ) );
+ res = opU( res, vec2( sdTorus82( pos-vec3( 0.0,0.25, 2.0), vec2(0.20,0.05) ),50.0 ) );
+ res = opU( res, vec2( sdTorus88( pos-vec3(-1.0,0.25, 2.0), vec2(0.20,0.05) ),43.0 ) );
+ res = opU( res, vec2( sdCylinder6( pos-vec3( 1.0,0.30, 2.0), vec2(0.1,0.2) ), 12.0 ) );
+ res = opU( res, vec2( sdHexPrism( pos-vec3(-1.0,0.20, 1.0), vec2(0.25,0.05) ),17.0 ) );
+ res = opU( res, vec2( sdPryamid4( pos-vec3(-1.0,0.15,-2.0), vec3(0.8,0.6,0.25) ),37.0 ) );
+ res = opU( res, vec2( opS( udRoundBox( pos-vec3(-2.0,0.2, 1.0), vec3(0.15),0.05),
+ sdSphere( pos-vec3(-2.0,0.2, 1.0), 0.25)), 13.0 ) );
+ res = opU( res, vec2( opS( sdTorus82( pos-vec3(-2.0,0.2, 0.0), vec2(0.20,0.1)),
+ sdCylinder( opRep( vec3(atan(pos.x+2.0,pos.z)/6.2831, pos.y, 0.02+0.5*length(pos-vec3(-2.0,0.2, 0.0))), vec3(0.05,1.0,0.05)), vec2(0.02,0.6))), 51.0 ) );
+ res = opU( res, vec2( 0.5*sdSphere( pos-vec3(-2.0,0.25,-1.0), 0.2 ) + 0.03*sin(50.0*pos.x)*sin(50.0*pos.y)*sin(50.0*pos.z), 65.0 ) );
+ res = opU( res, vec2( 0.5*sdTorus( opTwist(pos-vec3(-2.0,0.25, 2.0)),vec2(0.20,0.05)), 46.7 ) );
+ res = opU( res, vec2( sdConeSection( pos-vec3( 0.0,0.35,-2.0), 0.15, 0.2, 0.1 ), 13.67 ) );
+ res = opU( res, vec2( sdEllipsoid( pos-vec3( 1.0,0.35,-2.0), vec3(0.15, 0.2, 0.05) ), 43.17 ) );
+
+ return res;
+}
+
+vec2 castRay( in vec3 ro, in vec3 rd )
+{
+ float tmin = 0.2;
+ float tmax = 30.0;
+
+#if 1
+ // bounding volume
+ float tp1 = (0.0-ro.y)/rd.y; if( tp1>0.0 ) tmax = min( tmax, tp1 );
+ float tp2 = (1.6-ro.y)/rd.y; if( tp2>0.0 ) { if( ro.y>1.6 ) tmin = max( tmin, tp2 );
+ else tmax = min( tmax, tp2 ); }
+#endif
+
+ float t = tmin;
+ float m = -1.0;
+ for( int i=0; i<64; i++ )
+ {
+ float precis = 0.0005*t;
+ vec2 res = map( ro+rd*t );
+ if( res.x<precis || t>tmax ) break;
+ t += res.x;
+ m = res.y;
+ }
+
+ if( t>tmax ) m=-1.0;
+ return vec2( t, m );
+}
+
+
+float calcSoftshadow( in vec3 ro, in vec3 rd, in float mint, in float tmax )
+{
+ float res = 1.0;
+ float t = mint;
+ for( int i=0; i<16; i++ )
+ {
+ float h = map( ro + rd*t ).x;
+ res = min( res, 8.0*h/t );
+ t += clamp( h, 0.02, 0.10 );
+ if( h<0.001 || t>tmax ) break;
+ }
+ return clamp( res, 0.0, 1.0 );
+}
+
+vec3 calcNormal( in vec3 pos )
+{
+ vec2 e = vec2(1.0,-1.0)*0.5773*0.0005;
+ return normalize( e.xyy*map( pos + e.xyy ).x +
+ e.yyx*map( pos + e.yyx ).x +
+ e.yxy*map( pos + e.yxy ).x +
+ e.xxx*map( pos + e.xxx ).x );
+ /*
+ vec3 eps = vec3( 0.0005, 0.0, 0.0 );
+ vec3 nor = vec3(
+ map(pos+eps.xyy).x - map(pos-eps.xyy).x,
+ map(pos+eps.yxy).x - map(pos-eps.yxy).x,
+ map(pos+eps.yyx).x - map(pos-eps.yyx).x );
+ return normalize(nor);
+ */
+}
+
+float calcAO( in vec3 pos, in vec3 nor )
+{
+ float occ = 0.0;
+ float sca = 1.0;
+ for( int i=0; i<5; i++ )
+ {
+ float hr = 0.01 + 0.12*float(i)/4.0;
+ vec3 aopos = nor * hr + pos;
+ float dd = map( aopos ).x;
+ occ += -(dd-hr)*sca;
+ sca *= 0.95;
+ }
+ return clamp( 1.0 - 3.0*occ, 0.0, 1.0 );
+}
+
+// http://iquilezles.org/www/articles/checkerfiltering/checkerfiltering.htm
+float checkersGradBox( in vec2 p )
+{
+ // filter kernel
+ vec2 w = fwidth(p) + 0.001;
+ // analytical integral (box filter)
+ vec2 i = 2.0*(abs(fract((p-0.5*w)*0.5)-0.5)-abs(fract((p+0.5*w)*0.5)-0.5))/w;
+ // xor pattern
+ return 0.5 - 0.5*i.x*i.y;
+}
+
+vec3 render( in vec3 ro, in vec3 rd )
+{
+ vec3 col = vec3(0.7, 0.9, 1.0) +rd.y*0.8;
+ vec2 res = castRay(ro,rd);
+ float t = res.x;
+ float m = res.y;
+ if( m>-0.5 )
+ {
+ vec3 pos = ro + t*rd;
+ vec3 nor = calcNormal( pos );
+ vec3 ref = reflect( rd, nor );
+
+ // material
+ col = 0.45 + 0.35*sin( vec3(0.05,0.08,0.10)*(m-1.0) );
+ if( m<1.5 )
+ {
+
+ float f = checkersGradBox( 5.0*pos.xz );
+ col = 0.3 + f*vec3(0.1);
+ }
+
+ // lighting
+ float occ = calcAO( pos, nor );
+ vec3 lig = normalize( vec3(cos(-0.4 * runTime), sin(0.7 * runTime), -0.6) );
+ vec3 hal = normalize( lig-rd );
+ float amb = clamp( 0.5+0.5*nor.y, 0.0, 1.0 );
+ float dif = clamp( dot( nor, lig ), 0.0, 1.0 );
+ float bac = clamp( dot( nor, normalize(vec3(-lig.x,0.0,-lig.z))), 0.0, 1.0 )*clamp( 1.0-pos.y,0.0,1.0);
+ float dom = smoothstep( -0.1, 0.1, ref.y );
+ float fre = pow( clamp(1.0+dot(nor,rd),0.0,1.0), 2.0 );
+
+ dif *= calcSoftshadow( pos, lig, 0.02, 2.5 );
+ dom *= calcSoftshadow( pos, ref, 0.02, 2.5 );
+
+ float spe = pow( clamp( dot( nor, hal ), 0.0, 1.0 ),16.0)*
+ dif *
+ (0.04 + 0.96*pow( clamp(1.0+dot(hal,rd),0.0,1.0), 5.0 ));
+
+ vec3 lin = vec3(0.0);
+ lin += 1.30*dif*vec3(1.00,0.80,0.55);
+ lin += 0.40*amb*vec3(0.40,0.60,1.00)*occ;
+ lin += 0.50*dom*vec3(0.40,0.60,1.00)*occ;
+ lin += 0.50*bac*vec3(0.25,0.25,0.25)*occ;
+ lin += 0.25*fre*vec3(1.00,1.00,1.00)*occ;
+ col = col*lin;
+ col += 10.00*spe*vec3(1.00,0.90,0.70);
+
+ col = mix( col, vec3(0.8,0.9,1.0), 1.0-exp( -0.0002*t*t*t ) );
+ }
+
+ return vec3( clamp(col,0.0,1.0) );
+}
+
+mat3 setCamera( in vec3 ro, in vec3 ta, float cr )
+{
+ vec3 cw = normalize(ta-ro);
+ vec3 cp = vec3(sin(cr), cos(cr),0.0);
+ vec3 cu = normalize( cross(cw,cp) );
+ vec3 cv = normalize( cross(cu,cw) );
+ return mat3( cu, cv, cw );
+}
+
+void main()
+{
+ vec3 tot = vec3(0.0);
+#if AA>1
+ for( int m=0; m<AA; m++ )
+ for( int n=0; n<AA; n++ )
+ {
+ // pixel coordinates
+ vec2 o = vec2(float(m),float(n)) / float(AA) - 0.5;
+ vec2 p = (-resolution.xy + 2.0*(gl_FragCoord.xy+o))/resolution.y;
+#else
+ vec2 p = (-resolution.xy + 2.0*gl_FragCoord.xy)/resolution.y;
+#endif
+
+ // RAY: Camera is provided from raylib
+ //vec3 ro = vec3( -0.5+3.5*cos(0.1*time + 6.0*mo.x), 1.0 + 2.0*mo.y, 0.5 + 4.0*sin(0.1*time + 6.0*mo.x) );
+
+ vec3 ro = viewEye;
+ vec3 ta = viewCenter;
+
+ // camera-to-world transformation
+ mat3 ca = setCamera( ro, ta, 0.0 );
+ // ray direction
+ vec3 rd = ca * normalize( vec3(p.xy,2.0) );
+
+ // render
+ vec3 col = render( ro, rd );
+
+ // gamma
+ col = pow( col, vec3(0.4545) );
+
+ tot += col;
+#if AA>1
+ }
+ tot /= float(AA*AA);
+#endif
+
+ gl_FragColor = vec4( tot, 1.0 );
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/reload.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/reload.fs
new file mode 100644
index 0000000..d8e4416
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/reload.fs
@@ -0,0 +1,39 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord; // Texture coordinates (sampler2D)
+varying vec4 fragColor; // Tint color
+
+// Uniform inputs
+uniform vec2 resolution; // Viewport resolution (in pixels)
+uniform vec2 mouse; // Mouse pixel xy coordinates
+uniform float time; // Total run time (in secods)
+
+// Draw circle
+vec4 DrawCircle(vec2 fragCoord, vec2 position, float radius, vec3 color)
+{
+ float d = length(position - fragCoord) - radius;
+ float t = clamp(d, 0.0, 1.0);
+ return vec4(color, 1.0 - t);
+}
+
+void main()
+{
+ vec2 fragCoord = gl_FragCoord.xy;
+ vec2 position = vec2(mouse.x, resolution.y - mouse.y);
+ float radius = 40.0;
+
+ // Draw background layer
+ vec4 colorA = vec4(0.2,0.2,0.8, 1.0);
+ vec4 colorB = vec4(1.0,0.7,0.2, 1.0);
+ vec4 layer1 = mix(colorA, colorB, abs(sin(time*0.1)));
+
+ // Draw circle layer
+ vec3 color = vec3(0.9, 0.16, 0.21);
+ vec4 layer2 = DrawCircle(fragCoord, position, radius, color);
+
+ // Blend the two layers
+ gl_FragColor = mix(layer1, layer2, layer2.a);
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/scanlines.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/scanlines.fs
new file mode 100644
index 0000000..74c9c31
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/scanlines.fs
@@ -0,0 +1,44 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+float offset = 0.0;
+float frequency = 450.0/3.0;
+
+uniform float time;
+
+void main()
+{
+/*
+ // Scanlines method 1
+ float tval = 0; //time
+ vec2 uv = 0.5 + (fragTexCoord - 0.5)*(0.9 + 0.01*sin(0.5*tval));
+
+ vec4 color = texture2D(texture0, fragTexCoord);
+
+ color = clamp(color*0.5 + 0.5*color*color*1.2, 0.0, 1.0);
+ color *= 0.5 + 0.5*16.0*uv.x*uv.y*(1.0 - uv.x)*(1.0 - uv.y);
+ color *= vec4(0.8, 1.0, 0.7, 1);
+ color *= 0.9 + 0.1*sin(10.0*tval + uv.y*1000.0);
+ color *= 0.97 + 0.03*sin(110.0*tval);
+
+ fragColor = color;
+*/
+ // Scanlines method 2
+ float globalPos = (fragTexCoord.y + offset) * frequency;
+ float wavePos = cos((fract(globalPos) - 0.5)*3.14);
+
+ vec4 color = texture2D(texture0, fragTexCoord);
+
+ gl_FragColor = mix(vec4(0.0, 0.3, 0.0, 0.0), color, wavePos);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/sobel.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/sobel.fs
new file mode 100644
index 0000000..6468b09
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/sobel.fs
@@ -0,0 +1,40 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+vec2 resolution = vec2(800.0, 450.0);
+
+void main()
+{
+ float x = 1.0/resolution.x;
+ float y = 1.0/resolution.y;
+
+ vec4 horizEdge = vec4(0.0);
+ horizEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y - y))*1.0;
+ horizEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y ))*2.0;
+ horizEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y + y))*1.0;
+ horizEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y - y))*1.0;
+ horizEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y ))*2.0;
+ horizEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y + y))*1.0;
+
+ vec4 vertEdge = vec4(0.0);
+ vertEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y - y))*1.0;
+ vertEdge -= texture2D(texture0, vec2(fragTexCoord.x , fragTexCoord.y - y))*2.0;
+ vertEdge -= texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y - y))*1.0;
+ vertEdge += texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y + y))*1.0;
+ vertEdge += texture2D(texture0, vec2(fragTexCoord.x , fragTexCoord.y + y))*2.0;
+ vertEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y + y))*1.0;
+
+ vec3 edge = sqrt((horizEdge.rgb*horizEdge.rgb) + (vertEdge.rgb*vertEdge.rgb));
+
+ gl_FragColor = vec4(edge, texture2D(texture0, fragTexCoord).a);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/spotlight.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/spotlight.fs
new file mode 100644
index 0000000..a563421
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/spotlight.fs
@@ -0,0 +1,77 @@
+#version 100
+
+precision mediump float;
+
+#define MAX_SPOTS 3
+
+struct Spot {
+ vec2 pos; // window coords of spot
+ float inner; // inner fully transparent centre radius
+ float radius; // alpha fades out to this radius
+};
+
+uniform Spot spots[MAX_SPOTS]; // Spotlight positions array
+uniform float screenWidth; // Width of the screen
+
+void main()
+{
+ float alpha = 1.0;
+
+ // 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
+ int fi = -1; // found index
+
+ for (int i = 0; i < MAX_SPOTS; i++)
+ {
+ for (int j = 0; j < MAX_SPOTS; j++)
+ {
+ float dj = distance(pos, spots[j].pos) - spots[j].radius + spots[i].radius;
+
+ if (d > dj)
+ {
+ d = dj;
+ fi = i;
+ }
+ }
+ }
+
+ // d now equals distance to nearest spot...
+ // allowing for the different radii of all spotlights
+ if (fi == 0)
+ {
+ if (d > spots[0].radius) alpha = 1.0;
+ else
+ {
+ if (d < spots[0].inner) alpha = 0.0;
+ else alpha = (d - spots[0].inner)/(spots[0].radius - spots[0].inner);
+ }
+ }
+ else if (fi == 1)
+ {
+ if (d > spots[1].radius) alpha = 1.0;
+ else
+ {
+ if (d < spots[1].inner) alpha = 0.0;
+ else alpha = (d - spots[1].inner)/(spots[1].radius - spots[1].inner);
+ }
+ }
+ else if (fi == 2)
+ {
+ if (d > spots[2].radius) alpha = 1.0;
+ else
+ {
+ if (d < spots[2].inner) alpha = 0.0;
+ else alpha = (d - spots[2].inner)/(spots[2].radius - spots[2].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/deps/raylib/examples/shaders/resources/shaders/glsl100/swirl.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/swirl.fs
new file mode 100644
index 0000000..7ff401a
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/swirl.fs
@@ -0,0 +1,46 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+// NOTE: Render size values should be passed from code
+const float renderWidth = 800.0;
+const float renderHeight = 450.0;
+
+float radius = 250.0;
+float angle = 0.8;
+
+uniform vec2 center;
+
+void main()
+{
+ vec2 texSize = vec2(renderWidth, renderHeight);
+ vec2 tc = fragTexCoord*texSize;
+ tc -= center;
+
+ float dist = length(tc);
+
+ if (dist < radius)
+ {
+ float percent = (radius - dist)/radius;
+ float theta = percent*percent*angle*8.0;
+ float s = sin(theta);
+ float c = cos(theta);
+
+ tc = vec2(dot(tc, vec2(c, -s)), dot(tc, vec2(s, c)));
+ }
+
+ tc += center;
+ vec4 color = texture2D(texture0, tc/texSize)*colDiffuse*fragColor;;
+
+ gl_FragColor = vec4(color.rgb, 1.0);
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/tiling.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/tiling.fs
new file mode 100644
index 0000000..392786a
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/tiling.fs
@@ -0,0 +1,21 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D diffuseMap;
+uniform vec4 tiling;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ vec2 texCoord = fragTexCoord*tiling;
+ fragColor = texture2D(diffuseMap, texCoord);
+
+ gl_FragColor = fragColor;
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/vertex_displacement.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/vertex_displacement.fs
new file mode 100644
index 0000000..3328a91
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/vertex_displacement.fs
@@ -0,0 +1,18 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from fragment shader)
+varying vec2 fragTexCoord;
+varying float height;
+
+
+void main()
+{
+ vec4 darkblue = vec4(0.0, 0.13, 0.18, 1.0);
+ vec4 lightblue = vec4(1.0, 1.0, 1.0, 1.0);
+ // Interpolate between two colors based on height
+ vec4 finalColor = mix(darkblue, lightblue, height);
+
+ gl_FragColor = finalColor;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/vertex_displacement.vs b/deps/raylib/examples/shaders/resources/shaders/glsl100/vertex_displacement.vs
new file mode 100644
index 0000000..c7b926d
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/vertex_displacement.vs
@@ -0,0 +1,45 @@
+#version 100
+
+precision mediump float;
+
+attribute vec3 vertexPosition;
+attribute vec2 vertexTexCoord;
+attribute vec3 vertexNormal;
+attribute vec4 vertexColor;
+
+uniform mat4 mvp;
+uniform mat4 matModel;
+uniform mat4 matNormal;
+
+uniform float time;
+
+uniform sampler2D perlinNoiseMap;
+
+varying vec3 fragPosition;
+varying vec2 fragTexCoord;
+varying vec3 fragNormal;
+varying float height;
+
+void main()
+{
+ // Calculate animated texture coordinates based on time and vertex position
+ vec2 animatedTexCoord = sin(vertexTexCoord + vec2(sin(time + vertexPosition.x * 0.1), cos(time + vertexPosition.z * 0.1)) * 0.3);
+
+ // Normalize animated texture coordinates to range [0, 1]
+ animatedTexCoord = animatedTexCoord * 0.5 + 0.5;
+
+ // Fetch displacement from the perlin noise map
+ float displacement = texture2D(perlinNoiseMap, animatedTexCoord).r * 7.0; // Amplified displacement
+
+ // Displace vertex position
+ vec3 displacedPosition = vertexPosition + vec3(0.0, displacement, 0.0);
+
+ // Send vertex attributes to fragment shader
+ fragPosition = vec3(matModel * vec4(displacedPosition, 1.0));
+ fragTexCoord = vertexTexCoord;
+ fragNormal = normalize(vec3(matNormal * vec4(vertexNormal, 1.0)));
+ height = displacedPosition.y * 0.2; // send height to fragment shader for coloring
+
+ // Calculate final vertex position
+ gl_Position = mvp * vec4(displacedPosition, 1.0);
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/wave.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/wave.fs
new file mode 100644
index 0000000..cd4ba9d
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/wave.fs
@@ -0,0 +1,36 @@
+#version 100
+
+precision mediump float;
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+uniform float seconds;
+
+uniform vec2 size;
+
+uniform float freqX;
+uniform float freqY;
+uniform float ampX;
+uniform float ampY;
+uniform float speedX;
+uniform float speedY;
+
+void main() {
+ float pixelWidth = 1.0 / size.x;
+ float pixelHeight = 1.0 / size.y;
+ float aspect = pixelHeight / pixelWidth;
+ float boxLeft = 0.0;
+ float boxTop = 0.0;
+
+ vec2 p = fragTexCoord;
+ p.x += cos((fragTexCoord.y - boxTop) * freqX / ( pixelWidth * 750.0) + (seconds * speedX)) * ampX * pixelWidth;
+ p.y += sin((fragTexCoord.x - boxLeft) * freqY * aspect / ( pixelHeight * 750.0) + (seconds * speedY)) * ampY * pixelHeight;
+
+ gl_FragColor = texture2D(texture0, p)*colDiffuse*fragColor;
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl100/write_depth.fs b/deps/raylib/examples/shaders/resources/shaders/glsl100/write_depth.fs
new file mode 100644
index 0000000..341c611
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl100/write_depth.fs
@@ -0,0 +1,17 @@
+#version 100
+#extension GL_EXT_frag_depth : enable
+precision mediump float; // Precision required for OpenGL ES2 (WebGL)
+
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+void main()
+{
+ vec4 texelColor = texture2D(texture0, fragTexCoord);
+
+ gl_FragColor = texelColor*colDiffuse*fragColor;
+ gl_FragDepthEXT = 1.0 - gl_FragCoord.z;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl120/base.fs b/deps/raylib/examples/shaders/resources/shaders/glsl120/base.fs
new file mode 100644
index 0000000..50781ad
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl120/base.fs
@@ -0,0 +1,22 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+uniform vec2 resolution = vec2(800, 450);
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture2D(texture0, fragTexCoord);
+
+ // NOTE: Implement here your fragment shader code
+
+ gl_FragColor = texelColor*colDiffuse;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl120/base.vs b/deps/raylib/examples/shaders/resources/shaders/glsl120/base.vs
new file mode 100644
index 0000000..08a61e3
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl120/base.vs
@@ -0,0 +1,26 @@
+#version 120
+
+// Input vertex attributes
+attribute vec3 vertexPosition;
+attribute vec2 vertexTexCoord;
+attribute vec3 vertexNormal;
+attribute vec4 vertexColor;
+
+// Input uniform values
+uniform mat4 mvp;
+
+// Output vertex attributes (to fragment shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ // Send vertex attributes to fragment shader
+ fragTexCoord = vertexTexCoord;
+ fragColor = vertexColor;
+
+ // Calculate final vertex position
+ gl_Position = mvp*vec4(vertexPosition, 1.0);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl120/bloom.fs b/deps/raylib/examples/shaders/resources/shaders/glsl120/bloom.fs
new file mode 100644
index 0000000..b8c4495
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl120/bloom.fs
@@ -0,0 +1,37 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+const vec2 size = vec2(800, 450); // Framebuffer size
+const float samples = 5.0; // Pixels per axis; higher = bigger glow, worse performance
+const float quality = 2.5; // Defines size factor: Lower = smaller glow, better quality
+
+void main()
+{
+ vec4 sum = vec4(0);
+ vec2 sizeFactor = vec2(1)/size*quality;
+
+ // Texel color fetching from texture sampler
+ vec4 source = texture2D(texture0, fragTexCoord);
+
+ const int range = 2; // should be = (samples - 1)/2;
+
+ for (int x = -range; x <= range; x++)
+ {
+ for (int y = -range; y <= range; y++)
+ {
+ sum += texture2D(texture0, fragTexCoord + vec2(x, y)*sizeFactor);
+ }
+ }
+
+ // Calculate final fragment color
+ gl_FragColor = ((sum/(samples*samples)) + source)*colDiffuse;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl120/blur.fs b/deps/raylib/examples/shaders/resources/shaders/glsl120/blur.fs
new file mode 100644
index 0000000..cf66d87
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl120/blur.fs
@@ -0,0 +1,32 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+// NOTE: Render size values must be passed from code
+const float renderWidth = 800.0;
+const float renderHeight = 450.0;
+
+vec3 offset = vec3(0.0, 1.3846153846, 3.2307692308);
+vec3 weight = vec3(0.2270270270, 0.3162162162, 0.0702702703);
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec3 tc = texture2D(texture0, fragTexCoord).rgb*weight.x;
+
+ tc += texture2D(texture0, fragTexCoord + vec2(offset.y)/renderWidth, 0.0).rgb*weight.y;
+ tc += texture2D(texture0, fragTexCoord - vec2(offset.y)/renderWidth, 0.0).rgb*weight.y;
+
+ tc += texture2D(texture0, fragTexCoord + vec2(offset.z)/renderWidth, 0.0).rgb*weight.z;
+ tc += texture2D(texture0, fragTexCoord - vec2(offset.z)/renderWidth, 0.0).rgb*weight.z;
+
+ gl_FragColor = vec4(tc, 1.0);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl120/cross_hatching.fs b/deps/raylib/examples/shaders/resources/shaders/glsl120/cross_hatching.fs
new file mode 100644
index 0000000..14b7e2e
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl120/cross_hatching.fs
@@ -0,0 +1,45 @@
+# version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+float hatchOffsetY = 5.0;
+float lumThreshold01 = 0.9;
+float lumThreshold02 = 0.7;
+float lumThreshold03 = 0.5;
+float lumThreshold04 = 0.3;
+
+void main()
+{
+ vec3 tc = vec3(1.0, 1.0, 1.0);
+ float lum = length(texture2D(texture0, fragTexCoord).rgb);
+
+ if (lum < lumThreshold01)
+ {
+ if (mod(gl_FragCoord.x + gl_FragCoord.y, 10.0) == 0.0) tc = vec3(0.0, 0.0, 0.0);
+ }
+
+ if (lum < lumThreshold02)
+ {
+ if (mod(gl_FragCoord .x - gl_FragCoord .y, 10.0) == 0.0) tc = vec3(0.0, 0.0, 0.0);
+ }
+
+ if (lum < lumThreshold03)
+ {
+ if (mod(gl_FragCoord .x + gl_FragCoord .y - hatchOffsetY, 10.0) == 0.0) tc = vec3(0.0, 0.0, 0.0);
+ }
+
+ if (lum < lumThreshold04)
+ {
+ if (mod(gl_FragCoord .x - gl_FragCoord .y - hatchOffsetY, 10.0) == 0.0) tc = vec3(0.0, 0.0, 0.0);
+ }
+
+ gl_FragColor = vec4(tc, 1.0);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl120/cross_stitching.fs b/deps/raylib/examples/shaders/resources/shaders/glsl120/cross_stitching.fs
new file mode 100644
index 0000000..0e0cb7c
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl120/cross_stitching.fs
@@ -0,0 +1,55 @@
+# version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+// NOTE: Render size values must be passed from code
+const float renderWidth = 800.0;
+const float renderHeight = 450.0;
+
+float stitchingSize = 6.0;
+int invert = 0;
+
+vec4 PostFX(sampler2D tex, vec2 uv)
+{
+ vec4 c = vec4(0.0);
+ float size = stitchingSize;
+ vec2 cPos = uv * vec2(renderWidth, renderHeight);
+ vec2 tlPos = floor(cPos / vec2(size, size));
+ tlPos *= size;
+
+ int remX = int(mod(cPos.x, size));
+ int remY = int(mod(cPos.y, size));
+
+ if (remX == 0 && remY == 0) tlPos = cPos;
+
+ vec2 blPos = tlPos;
+ blPos.y += (size - 1.0);
+
+ if ((remX == remY) || (((int(cPos.x) - int(blPos.x)) == (int(blPos.y) - int(cPos.y)))))
+ {
+ if (invert == 1) c = vec4(0.2, 0.15, 0.05, 1.0);
+ else c = texture2D(tex, tlPos * vec2(1.0/renderWidth, 1.0/renderHeight)) * 1.4;
+ }
+ else
+ {
+ if (invert == 1) c = texture2D(tex, tlPos * vec2(1.0/renderWidth, 1.0/renderHeight)) * 1.4;
+ else c = vec4(0.0, 0.0, 0.0, 1.0);
+ }
+
+ return c;
+}
+
+void main()
+{
+ vec3 tc = PostFX(texture0, fragTexCoord).rgb;
+
+ gl_FragColor = vec4(tc, 1.0);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl120/distortion.fs b/deps/raylib/examples/shaders/resources/shaders/glsl120/distortion.fs
new file mode 100644
index 0000000..cf73981
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl120/distortion.fs
@@ -0,0 +1,52 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+
+// Input uniform values
+uniform sampler2D texture0;
+
+// NOTE: Default parameters for Oculus Rift DK2 device
+const vec2 LeftLensCenter = vec2(0.2863248, 0.5);
+const vec2 RightLensCenter = vec2(0.7136753, 0.5);
+const vec2 LeftScreenCenter = vec2(0.25, 0.5);
+const vec2 RightScreenCenter = vec2(0.75, 0.5);
+const vec2 Scale = vec2(0.25, 0.45);
+const vec2 ScaleIn = vec2(4.0, 2.5);
+const vec4 HmdWarpParam = vec4(1.0, 0.22, 0.24, 0.0);
+const vec4 ChromaAbParam = vec4(0.996, -0.004, 1.014, 0.0);
+
+void main()
+{
+ // The following two variables need to be set per eye
+ vec2 LensCenter = fragTexCoord.x < 0.5 ? LeftLensCenter : RightLensCenter;
+ vec2 ScreenCenter = fragTexCoord.x < 0.5 ? LeftScreenCenter : RightScreenCenter;
+
+ // Scales input texture coordinates for distortion: vec2 HmdWarp(vec2 fragTexCoord, vec2 LensCenter)
+ vec2 theta = (fragTexCoord - LensCenter)*ScaleIn; // Scales to [-1, 1]
+ float rSq = theta.x*theta.x + theta.y*theta.y;
+ vec2 theta1 = theta*(HmdWarpParam.x + HmdWarpParam.y*rSq + HmdWarpParam.z*rSq*rSq + HmdWarpParam.w*rSq*rSq*rSq);
+ //vec2 tc = LensCenter + Scale*theta1;
+
+ // Detect whether blue texture coordinates are out of range since these will scaled out the furthest
+ vec2 thetaBlue = theta1*(ChromaAbParam.z + ChromaAbParam.w*rSq);
+ vec2 tcBlue = LensCenter + Scale*thetaBlue;
+
+ if (any(bvec2(clamp(tcBlue, ScreenCenter - vec2(0.25, 0.5), ScreenCenter + vec2(0.25, 0.5)) - tcBlue))) gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
+ else
+ {
+ // Do blue texture lookup
+ float blue = texture2D(texture0, tcBlue).b;
+
+ // Do green lookup (no scaling)
+ vec2 tcGreen = LensCenter + Scale*theta1;
+ float green = texture2D(texture0, tcGreen).g;
+
+ // Do red scale and lookup
+ vec2 thetaRed = theta1*(ChromaAbParam.x + ChromaAbParam.y*rSq);
+ vec2 tcRed = LensCenter + Scale*thetaRed;
+ float red = texture2D(texture0, tcRed).r;
+
+ gl_FragColor = vec4(red, green, blue, 1.0);
+ }
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl120/dream_vision.fs b/deps/raylib/examples/shaders/resources/shaders/glsl120/dream_vision.fs
new file mode 100644
index 0000000..cb97b2b
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl120/dream_vision.fs
@@ -0,0 +1,35 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ vec4 color = texture2D(texture0, fragTexCoord);
+
+ color += texture2D(texture0, fragTexCoord + 0.001);
+ color += texture2D(texture0, fragTexCoord + 0.003);
+ color += texture2D(texture0, fragTexCoord + 0.005);
+ color += texture2D(texture0, fragTexCoord + 0.007);
+ color += texture2D(texture0, fragTexCoord + 0.009);
+ color += texture2D(texture0, fragTexCoord + 0.011);
+
+ color += texture2D(texture0, fragTexCoord - 0.001);
+ color += texture2D(texture0, fragTexCoord - 0.003);
+ color += texture2D(texture0, fragTexCoord - 0.005);
+ color += texture2D(texture0, fragTexCoord - 0.007);
+ color += texture2D(texture0, fragTexCoord - 0.009);
+ color += texture2D(texture0, fragTexCoord - 0.011);
+
+ color.rgb = vec3((color.r + color.g + color.b)/3.0);
+ color = color/9.5;
+
+ gl_FragColor = color;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl120/fisheye.fs b/deps/raylib/examples/shaders/resources/shaders/glsl120/fisheye.fs
new file mode 100644
index 0000000..5cc57f0
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl120/fisheye.fs
@@ -0,0 +1,41 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+const float PI = 3.1415926535;
+
+void main()
+{
+ float aperture = 178.0;
+ float apertureHalf = 0.5 * aperture * (PI / 180.0);
+ float maxFactor = sin(apertureHalf);
+
+ vec2 uv = vec2(0.0);
+ vec2 xy = 2.0 * fragTexCoord.xy - 1.0;
+ float d = length(xy);
+
+ if (d < (2.0 - maxFactor))
+ {
+ d = length(xy * maxFactor);
+ float z = sqrt(1.0 - d * d);
+ float r = atan(d, z) / PI;
+ float phi = atan(xy.y, xy.x);
+
+ uv.x = r * cos(phi) + 0.5;
+ uv.y = r * sin(phi) + 0.5;
+ }
+ else
+ {
+ uv = fragTexCoord.xy;
+ }
+
+ gl_FragColor = texture2D(texture0, uv);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl120/fog.fs b/deps/raylib/examples/shaders/resources/shaders/glsl120/fog.fs
new file mode 100644
index 0000000..63af6c4
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl120/fog.fs
@@ -0,0 +1,92 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec3 fragPosition;
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+varying vec3 fragNormal;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+#define MAX_LIGHTS 4
+#define LIGHT_DIRECTIONAL 0
+#define LIGHT_POINT 1
+
+struct MaterialProperty {
+ vec3 color;
+ int useSampler;
+ sampler2D sampler;
+};
+
+struct Light {
+ int enabled;
+ int type;
+ vec3 position;
+ vec3 target;
+ vec4 color;
+};
+
+// Input lighting values
+uniform Light lights[MAX_LIGHTS];
+uniform vec4 ambient;
+uniform vec3 viewPos;
+uniform float fogDensity;
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture2D(texture0, fragTexCoord);
+ vec3 lightDot = vec3(0.0);
+ vec3 normal = normalize(fragNormal);
+ vec3 viewD = normalize(viewPos - fragPosition);
+ vec3 specular = vec3(0.0);
+
+ // NOTE: Implement here your fragment shader code
+
+ for (int i = 0; i < MAX_LIGHTS; i++)
+ {
+ if (lights[i].enabled == 1)
+ {
+ vec3 light = vec3(0.0);
+
+ if (lights[i].type == LIGHT_DIRECTIONAL) light = -normalize(lights[i].target - lights[i].position);
+ if (lights[i].type == LIGHT_POINT) light = normalize(lights[i].position - fragPosition);
+
+ float NdotL = max(dot(normal, light), 0.0);
+ lightDot += lights[i].color.rgb*NdotL;
+
+ float specCo = 0.0;
+ if (NdotL > 0.0) specCo = pow(max(0.0, dot(viewD, reflect(-(light), normal))), 16.0); // Shine: 16.0
+ specular += specCo;
+ }
+ }
+
+ vec4 finalColor = (texelColor*((colDiffuse + vec4(specular,1))*vec4(lightDot, 1.0)));
+ finalColor += texelColor*(ambient/10.0);
+
+ // Gamma correction
+ finalColor = pow(finalColor, vec4(1.0/2.2));
+
+ // Fog calculation
+ float dist = length(viewPos - fragPosition);
+
+ // these could be parameters...
+ const vec4 fogColor = vec4(0.5, 0.5, 0.5, 1.0);
+ //const float fogDensity = 0.16;
+
+ // Exponential fog
+ float fogFactor = 1.0/exp((dist*fogDensity)*(dist*fogDensity));
+
+ // Linear fog (less nice)
+ //const float fogStart = 2.0;
+ //const float fogEnd = 10.0;
+ //float fogFactor = (fogEnd - dist)/(fogEnd - fogStart);
+
+ fogFactor = clamp(fogFactor, 0.0, 1.0);
+
+ gl_FragColor = mix(fogColor, finalColor, fogFactor);
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl120/grayscale.fs b/deps/raylib/examples/shaders/resources/shaders/glsl120/grayscale.fs
new file mode 100644
index 0000000..de48f6b
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl120/grayscale.fs
@@ -0,0 +1,23 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture2D(texture0, fragTexCoord)*colDiffuse*fragColor;
+
+ // Convert texel color to grayscale using NTSC conversion weights
+ float gray = dot(texelColor.rgb, vec3(0.299, 0.587, 0.114));
+
+ // Calculate final fragment color
+ gl_FragColor = vec4(gray, gray, gray, texelColor.a);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl120/lighting.fs b/deps/raylib/examples/shaders/resources/shaders/glsl120/lighting.fs
new file mode 100644
index 0000000..600c0f8
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl120/lighting.fs
@@ -0,0 +1,75 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec3 fragPosition;
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+varying vec3 fragNormal;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+#define MAX_LIGHTS 4
+#define LIGHT_DIRECTIONAL 0
+#define LIGHT_POINT 1
+
+struct Light {
+ int enabled;
+ int type;
+ vec3 position;
+ vec3 target;
+ vec4 color;
+};
+
+// Input lighting values
+uniform Light lights[MAX_LIGHTS];
+uniform vec4 ambient;
+uniform vec3 viewPos;
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture2D(texture0, fragTexCoord);
+ vec3 lightDot = vec3(0.0);
+ vec3 normal = normalize(fragNormal);
+ vec3 viewD = normalize(viewPos - fragPosition);
+ vec3 specular = vec3(0.0);
+
+ vec4 tint = colDiffuse * fragColor;
+
+ // NOTE: Implement here your fragment shader code
+
+ for (int i = 0; i < MAX_LIGHTS; i++)
+ {
+ if (lights[i].enabled == 1)
+ {
+ vec3 light = vec3(0.0);
+
+ if (lights[i].type == LIGHT_DIRECTIONAL)
+ {
+ light = -normalize(lights[i].target - lights[i].position);
+ }
+
+ if (lights[i].type == LIGHT_POINT)
+ {
+ light = normalize(lights[i].position - fragPosition);
+ }
+
+ float NdotL = max(dot(normal, light), 0.0);
+ lightDot += lights[i].color.rgb*NdotL;
+
+ float specCo = 0.0;
+ if (NdotL > 0.0) specCo = pow(max(0.0, dot(viewD, reflect(-(light), normal))), 16.0); // 16 refers to shine
+ specular += specCo;
+ }
+ }
+
+ vec4 finalColor = (texelColor*((tint + vec4(specular, 1.0))*vec4(lightDot, 1.0)));
+ finalColor += texelColor*(ambient/10.0);
+
+ // Gamma correction
+ gl_FragColor = pow(finalColor, vec4(1.0/2.2));
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl120/lighting.vs b/deps/raylib/examples/shaders/resources/shaders/glsl120/lighting.vs
new file mode 100644
index 0000000..b114093
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl120/lighting.vs
@@ -0,0 +1,59 @@
+#version 120
+
+// Input vertex attributes
+attribute vec3 vertexPosition;
+attribute vec2 vertexTexCoord;
+attribute vec3 vertexNormal;
+attribute vec4 vertexColor;
+
+// Input uniform values
+uniform mat4 mvp;
+uniform mat4 matModel;
+
+// Output vertex attributes (to fragment shader)
+varying vec3 fragPosition;
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+varying vec3 fragNormal;
+
+// NOTE: Add here your custom variables
+
+// https://github.com/glslify/glsl-inverse
+mat3 inverse(mat3 m)
+{
+ float a00 = m[0][0], a01 = m[0][1], a02 = m[0][2];
+ float a10 = m[1][0], a11 = m[1][1], a12 = m[1][2];
+ float a20 = m[2][0], a21 = m[2][1], a22 = m[2][2];
+
+ float b01 = a22*a11 - a12*a21;
+ float b11 = -a22*a10 + a12*a20;
+ float b21 = a21*a10 - a11*a20;
+
+ float det = a00*b01 + a01*b11 + a02*b21;
+
+ return mat3(b01, (-a22*a01 + a02*a21), (a12*a01 - a02*a11),
+ b11, (a22*a00 - a02*a20), (-a12*a00 + a02*a10),
+ b21, (-a21*a00 + a01*a20), (a11*a00 - a01*a10))/det;
+}
+
+// https://github.com/glslify/glsl-transpose
+mat3 transpose(mat3 m)
+{
+ return mat3(m[0][0], m[1][0], m[2][0],
+ m[0][1], m[1][1], m[2][1],
+ m[0][2], m[1][2], m[2][2]);
+}
+
+void main()
+{
+ // Send vertex attributes to fragment shader
+ fragPosition = vec3(matModel*vec4(vertexPosition, 1.0));
+ fragTexCoord = vertexTexCoord;
+ fragColor = vertexColor;
+
+ mat3 normalMatrix = transpose(inverse(mat3(matModel)));
+ fragNormal = normalize(normalMatrix*vertexNormal);
+
+ // Calculate final vertex position
+ gl_Position = mvp*vec4(vertexPosition, 1.0);
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl120/lightmap.fs b/deps/raylib/examples/shaders/resources/shaders/glsl120/lightmap.fs
new file mode 100644
index 0000000..93a0609
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl120/lightmap.fs
@@ -0,0 +1,20 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec2 fragTexCoord2;
+varying vec3 fragPosition;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform sampler2D texture1;
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture2D(texture0, fragTexCoord);
+ vec4 texelColor2 = texture2D(texture1, fragTexCoord2);
+
+ gl_FragColor = texelColor * texelColor2;
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl120/lightmap.vs b/deps/raylib/examples/shaders/resources/shaders/glsl120/lightmap.vs
new file mode 100644
index 0000000..9847b25
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl120/lightmap.vs
@@ -0,0 +1,31 @@
+#version 120
+
+// Input vertex attributes
+attribute vec3 vertexPosition;
+attribute vec2 vertexTexCoord;
+attribute vec2 vertexTexCoord2;
+attribute vec4 vertexColor;
+
+// Input uniform values
+uniform mat4 mvp;
+uniform mat4 matModel;
+
+// Output vertex attributes (to fragment shader)
+varying vec3 fragPosition;
+varying vec2 fragTexCoord;
+varying vec2 fragTexCoord2;
+varying vec4 fragColor;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ // Send vertex attributes to fragment shader
+ fragPosition = vec3(matModel*vec4(vertexPosition, 1.0));
+ fragTexCoord = vertexTexCoord;
+ fragTexCoord2 = vertexTexCoord2;
+ fragColor = vertexColor;
+
+ // Calculate final vertex position
+ gl_Position = mvp*vec4(vertexPosition, 1.0);
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl120/palette_switch.fs b/deps/raylib/examples/shaders/resources/shaders/glsl120/palette_switch.fs
new file mode 100644
index 0000000..ab3f79c
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl120/palette_switch.fs
@@ -0,0 +1,27 @@
+#version 120
+
+const int colors = 8;
+
+// Input fragment attributes (from fragment shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform ivec3 palette[colors];
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture(texture0, fragTexCoord) * fragColor;
+
+ // Convert the (normalized) texel color RED component (GB would work, too)
+ // to the palette index by scaling up from [0, 1] to [0, 255].
+ int index = int(texelColor.r * 255.0);
+ ivec3 color = palette[index];
+
+ // Calculate final fragment color. Note that the palette color components
+ // are defined in the range [0, 255] and need to be normalized to [0, 1]
+ // for OpenGL to work.
+ gl_FragColor = vec4(color / 255.0, texelColor.a);
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl120/pbr.fs b/deps/raylib/examples/shaders/resources/shaders/glsl120/pbr.fs
new file mode 100644
index 0000000..1c5eee0
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl120/pbr.fs
@@ -0,0 +1,154 @@
+#version 120
+
+#define MAX_LIGHTS 4
+#define LIGHT_DIRECTIONAL 0
+#define LIGHT_POINT 1
+#define PI 3.14159265358979323846
+
+struct Light {
+ int enabled;
+ int type;
+ vec3 position;
+ vec3 target;
+ vec4 color;
+ float intensity;
+};
+
+// Input vertex attributes (from vertex shader)
+varying vec3 fragPosition;
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+varying vec3 fragNormal;
+varying vec4 shadowPos;
+varying mat3 TBN;
+
+
+// Input uniform values
+uniform int numOfLights;
+uniform sampler2D albedoMap;
+uniform sampler2D mraMap;
+uniform sampler2D normalMap;
+uniform sampler2D emissiveMap; // r: Hight g:emissive
+
+uniform vec2 tiling;
+uniform vec2 offset;
+
+uniform int useTexAlbedo;
+uniform int useTexNormal;
+uniform int useTexMRA;
+uniform int useTexEmissive;
+
+uniform vec4 albedoColor;
+uniform vec4 emissiveColor;
+uniform float normalValue;
+uniform float metallicValue;
+uniform float roughnessValue;
+uniform float aoValue;
+uniform float emissivePower;
+
+// Input lighting values
+uniform Light lights[MAX_LIGHTS];
+uniform vec3 viewPos;
+
+uniform vec3 ambientColor;
+uniform float ambient;
+
+// refl in range 0 to 1
+// returns base reflectivity to 1
+// incrase reflectivity when surface view at larger angle
+vec3 schlickFresnel(float hDotV,vec3 refl)
+{
+ return refl + (1.0 - refl) * pow(1.0 - hDotV,5.0);
+}
+
+float ggxDistribution(float nDotH,float roughness)
+{
+ float a = roughness * roughness * roughness * roughness;
+ float d = nDotH * nDotH * (a - 1.0) + 1.0;
+ d = PI * d * d;
+ return a / max(d,0.0000001);
+}
+
+float geomSmith(float nDotV,float nDotL,float roughness)
+{
+ float r = roughness + 1.0;
+ float k = r * r / 8.0;
+ float ik = 1.0 - k;
+ float ggx1 = nDotV / (nDotV * ik + k);
+ float ggx2 = nDotL / (nDotL * ik + k);
+ return ggx1 * ggx2;
+}
+
+vec3 pbr(){
+ vec3 albedo = texture2D(albedoMap,vec2(fragTexCoord.x*tiling.x+offset.x,fragTexCoord.y*tiling.y+offset.y)).rgb;
+ albedo = vec3(albedoColor.x*albedo.x,albedoColor.y*albedo.y,albedoColor.z*albedo.z);
+ float metallic = clamp(metallicValue,0.0,1.0);
+ float roughness = clamp(roughnessValue,0.0,1.0);
+ float ao = clamp(aoValue,0.0,1.0);
+ if(useTexMRA == 1) {
+ vec4 mra = texture2D(mraMap, vec2(fragTexCoord.x * tiling.x + offset.x, fragTexCoord.y * tiling.y + offset.y));
+ metallic = clamp(mra.r+metallicValue,0.04,1.0);
+ roughness = clamp(mra.g+roughnessValue,0.04,1.0);
+ ao = (mra.b+aoValue)*0.5;
+ }
+
+
+
+ vec3 N = normalize(fragNormal);
+ if(useTexNormal == 1) {
+ N = texture2D(normalMap, vec2(fragTexCoord.x * tiling.x + offset.y, fragTexCoord.y * tiling.y + offset.y)).rgb;
+ N = normalize(N * 2.0 - 1.0);
+ N = normalize(N * TBN);
+ }
+
+ vec3 V = normalize(viewPos - fragPosition);
+
+ vec3 e = vec3(0);
+ e = (texture2D(emissiveMap, vec2(fragTexCoord.x*tiling.x+offset.x, fragTexCoord.y*tiling.y+offset.y)).rgb).g * emissiveColor.rgb*emissivePower * float(useTexEmissive);
+
+ //return N;//vec3(metallic,metallic,metallic);
+ //if dia-electric use base reflectivity of 0.04 otherwise ut is a metal use albedo as base reflectivity
+ vec3 baseRefl = mix(vec3(0.04),albedo.rgb,metallic);
+ vec3 Lo = vec3(0.0); // acumulate lighting lum
+
+ for(int i=0;i<numOfLights;++i){
+
+ vec3 L = normalize(lights[i].position - fragPosition); // calc light vector
+ vec3 H = normalize(V + L); // calc halfway bisecting vector
+ float dist = length(lights[i].position - fragPosition); // calc distance to light
+ float attenuation = 1.0 / (dist * dist * 0.23); // calc attenuation
+ vec3 radiance = lights[i].color.rgb * lights[i].intensity * attenuation; // calc input radiance,light energy comming in
+
+ //Cook-Torrance BRDF distribution function
+ float nDotV = max(dot(N,V),0.0000001);
+ float nDotL = max(dot(N,L),0.0000001);
+ float hDotV = max(dot(H,V),0.0);
+ float nDotH = max(dot(N,H),0.0);
+ float D = ggxDistribution(nDotH,roughness); // larger the more micro-facets aligned to H
+ float G = geomSmith(nDotV,nDotL,roughness); // smaller the more micro-facets shadow
+ vec3 F = schlickFresnel(hDotV, baseRefl); // fresnel proportion of specular reflectance
+
+ vec3 spec = (D * G * F) / (4.0 * nDotV * nDotL);
+ // difuse and spec light can't be above 1.0
+ // kD = 1.0 - kS diffuse component is equal 1.0 - spec comonent
+ vec3 kD = vec3(1.0) - F;
+ //mult kD by the inverse of metallnes , only non-metals should have diffuse light
+ kD *= 1.0 - metallic;
+ Lo += ((kD * albedo.rgb / PI + spec) * radiance * nDotL)*float(lights[i].enabled); // angle of light has impact on result
+ }
+ vec3 ambient_final = (ambientColor + albedo)* ambient * 0.5;
+ return ambient_final+Lo*ao+e;
+}
+
+void main()
+{
+ vec3 color = pbr();
+
+ //HDR tonemapping
+ color = pow(color,color + vec3(1.0));
+ //gamma correction
+ color = pow(color,vec3(1.0/2.2));
+
+ gl_FragColor = vec4(color,1.0);
+
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl120/pbr.vs b/deps/raylib/examples/shaders/resources/shaders/glsl120/pbr.vs
new file mode 100644
index 0000000..4c00261
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl120/pbr.vs
@@ -0,0 +1,75 @@
+#version 120
+
+// Input vertex attributes
+attribute vec3 vertexPosition;
+attribute vec2 vertexTexCoord;
+attribute vec3 vertexNormal;
+attribute vec3 vertexTangent;
+attribute vec4 vertexColor;
+
+// Input uniform values
+uniform mat4 mvp;
+uniform mat4 matModel;
+uniform mat4 matNormal;
+uniform vec3 lightPos;
+uniform vec4 difColor;
+
+// Output vertex attributes (to fragment shader)
+varying vec3 fragPosition;
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+varying vec3 fragNormal;
+varying mat3 TBN;
+
+const float normalOffset = 0.1;
+
+// https://github.com/glslify/glsl-inverse
+mat3 inverse(mat3 m)
+{
+ float a00 = m[0][0], a01 = m[0][1], a02 = m[0][2];
+ float a10 = m[1][0], a11 = m[1][1], a12 = m[1][2];
+ float a20 = m[2][0], a21 = m[2][1], a22 = m[2][2];
+
+ float b01 = a22*a11 - a12*a21;
+ float b11 = -a22*a10 + a12*a20;
+ float b21 = a21*a10 - a11*a20;
+
+ float det = a00*b01 + a01*b11 + a02*b21;
+
+ return mat3(b01, (-a22*a01 + a02*a21), (a12*a01 - a02*a11),
+ b11, (a22*a00 - a02*a20), (-a12*a00 + a02*a10),
+ b21, (-a21*a00 + a01*a20), (a11*a00 - a01*a10))/det;
+}
+
+// https://github.com/glslify/glsl-transpose
+mat3 transpose(mat3 m)
+{
+ return mat3(m[0][0], m[1][0], m[2][0],
+ m[0][1], m[1][1], m[2][1],
+ m[0][2], m[1][2], m[2][2]);
+}
+
+void main()
+{
+
+ // calc binormal from vertex normal and tangent
+ vec3 vertexBinormal = cross(vertexNormal, vertexTangent);
+ // calc fragment normal based on normal transformations
+ mat3 normalMatrix = transpose(inverse(mat3(matModel)));
+ // calc fragment position based on model transformations
+
+ fragPosition = vec3(matModel*vec4(vertexPosition, 1.0));
+
+ fragTexCoord = vertexTexCoord*2.0;
+
+ fragNormal = normalize(normalMatrix*vertexNormal);
+ vec3 fragTangent = normalize(normalMatrix*vertexTangent);
+ fragTangent = normalize(fragTangent - dot(fragTangent, fragNormal)*fragNormal);
+ vec3 fragBinormal = normalize(normalMatrix*vertexBinormal);
+ fragBinormal = cross(fragNormal, fragTangent);
+
+ TBN = transpose(mat3(fragTangent, fragBinormal, fragNormal));
+
+ // Calculate final vertex position
+ gl_Position = mvp * vec4(vertexPosition, 1.0);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl120/pixelizer.fs b/deps/raylib/examples/shaders/resources/shaders/glsl120/pixelizer.fs
new file mode 100644
index 0000000..8f5e4f1
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl120/pixelizer.fs
@@ -0,0 +1,30 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+// NOTE: Render size values must be passed from code
+const float renderWidth = 800.0;
+const float renderHeight = 450.0;
+
+float pixelWidth = 5.0;
+float pixelHeight = 5.0;
+
+void main()
+{
+ float dx = pixelWidth*(1.0/renderWidth);
+ float dy = pixelHeight*(1.0/renderHeight);
+
+ vec2 coord = vec2(dx*floor(fragTexCoord.x/dx), dy*floor(fragTexCoord.y/dy));
+
+ vec3 tc = texture2D(texture0, coord).rgb;
+
+ gl_FragColor = vec4(tc, 1.0);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl120/posterization.fs b/deps/raylib/examples/shaders/resources/shaders/glsl120/posterization.fs
new file mode 100644
index 0000000..445c925
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl120/posterization.fs
@@ -0,0 +1,27 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+float gamma = 0.6;
+float numColors = 8.0;
+
+void main()
+{
+ vec3 color = texture2D(texture0, fragTexCoord.xy).rgb;
+
+ color = pow(color, vec3(gamma, gamma, gamma));
+ color = color*numColors;
+ color = floor(color);
+ color = color/numColors;
+ color = pow(color, vec3(1.0/gamma));
+
+ gl_FragColor = vec4(color, 1.0);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl120/predator.fs b/deps/raylib/examples/shaders/resources/shaders/glsl120/predator.fs
new file mode 100644
index 0000000..2198696
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl120/predator.fs
@@ -0,0 +1,29 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ vec3 color = texture2D(texture0, fragTexCoord).rgb;
+ vec3 colors[3];
+ colors[0] = vec3(0.0, 0.0, 1.0);
+ colors[1] = vec3(1.0, 1.0, 0.0);
+ colors[2] = vec3(1.0, 0.0, 0.0);
+
+ float lum = (color.r + color.g + color.b)/3.0;
+
+ vec3 tc = vec3(0.0, 0.0, 0.0);
+
+ if (lum < 0.5) tc = mix(colors[0], colors[1], lum/0.5);
+ else tc = mix(colors[1], colors[2], (lum - 0.5)/0.5);
+
+ gl_FragColor = vec4(tc, 1.0);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl120/raymarching.fs b/deps/raylib/examples/shaders/resources/shaders/glsl120/raymarching.fs
new file mode 100644
index 0000000..efe4fa1
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl120/raymarching.fs
@@ -0,0 +1,427 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+uniform vec3 viewEye;
+uniform vec3 viewCenter;
+uniform float runTime;
+uniform vec2 resolution;
+
+// The MIT License
+// Copyright © 2013 Inigo Quilez
+// 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.
+
+// A list of useful distance function to simple primitives, and an example on how to
+// do some interesting boolean operations, repetition and displacement.
+//
+// More info here: http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm
+
+#define AA 1 // make this 1 if your machine is too slow
+
+//------------------------------------------------------------------
+
+float sdPlane( vec3 p )
+{
+ return p.y;
+}
+
+float sdSphere( vec3 p, float s )
+{
+ return length(p)-s;
+}
+
+float sdBox( vec3 p, vec3 b )
+{
+ vec3 d = abs(p) - b;
+ return min(max(d.x,max(d.y,d.z)),0.0) + length(max(d,0.0));
+}
+
+float sdEllipsoid( in vec3 p, in vec3 r )
+{
+ return (length( p/r ) - 1.0) * min(min(r.x,r.y),r.z);
+}
+
+float udRoundBox( vec3 p, vec3 b, float r )
+{
+ return length(max(abs(p)-b,0.0))-r;
+}
+
+float sdTorus( vec3 p, vec2 t )
+{
+ return length( vec2(length(p.xz)-t.x,p.y) )-t.y;
+}
+
+float sdHexPrism( vec3 p, vec2 h )
+{
+ vec3 q = abs(p);
+#if 0
+ return max(q.z-h.y,max((q.x*0.866025+q.y*0.5),q.y)-h.x);
+#else
+ float d1 = q.z-h.y;
+ float d2 = max((q.x*0.866025+q.y*0.5),q.y)-h.x;
+ return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.);
+#endif
+}
+
+float sdCapsule( vec3 p, vec3 a, vec3 b, float r )
+{
+ vec3 pa = p-a, ba = b-a;
+ float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );
+ return length( pa - ba*h ) - r;
+}
+
+float sdEquilateralTriangle( in vec2 p )
+{
+ const float k = sqrt(3.0);
+ p.x = abs(p.x) - 1.0;
+ p.y = p.y + 1.0/k;
+ if( p.x + k*p.y > 0.0 ) p = vec2( p.x - k*p.y, -k*p.x - p.y )/2.0;
+ p.x += 2.0 - 2.0*clamp( (p.x+2.0)/2.0, 0.0, 1.0 );
+ return -length(p)*sign(p.y);
+}
+
+float sdTriPrism( vec3 p, vec2 h )
+{
+ vec3 q = abs(p);
+ float d1 = q.z-h.y;
+#if 1
+ // distance bound
+ float d2 = max(q.x*0.866025+p.y*0.5,-p.y)-h.x*0.5;
+#else
+ // correct distance
+ h.x *= 0.866025;
+ float d2 = sdEquilateralTriangle(p.xy/h.x)*h.x;
+#endif
+ return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.);
+}
+
+float sdCylinder( vec3 p, vec2 h )
+{
+ vec2 d = abs(vec2(length(p.xz),p.y)) - h;
+ return min(max(d.x,d.y),0.0) + length(max(d,0.0));
+}
+
+float sdCone( in vec3 p, in vec3 c )
+{
+ vec2 q = vec2( length(p.xz), p.y );
+ float d1 = -q.y-c.z;
+ float d2 = max( dot(q,c.xy), q.y);
+ return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.);
+}
+
+float sdConeSection( in vec3 p, in float h, in float r1, in float r2 )
+{
+ float d1 = -p.y - h;
+ float q = p.y - h;
+ float si = 0.5*(r1-r2)/h;
+ float d2 = max( sqrt( dot(p.xz,p.xz)*(1.0-si*si)) + q*si - r2, q );
+ return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.);
+}
+
+float sdPryamid4(vec3 p, vec3 h ) // h = { cos a, sin a, height }
+{
+ // Tetrahedron = Octahedron - Cube
+ float box = sdBox( p - vec3(0,-2.0*h.z,0), vec3(2.0*h.z) );
+
+ float d = 0.0;
+ d = max( d, abs( dot(p, vec3( -h.x, h.y, 0 )) ));
+ d = max( d, abs( dot(p, vec3( h.x, h.y, 0 )) ));
+ d = max( d, abs( dot(p, vec3( 0, h.y, h.x )) ));
+ d = max( d, abs( dot(p, vec3( 0, h.y,-h.x )) ));
+ float octa = d - h.z;
+ return max(-box,octa); // Subtraction
+ }
+
+float length2( vec2 p )
+{
+ return sqrt( p.x*p.x + p.y*p.y );
+}
+
+float length6( vec2 p )
+{
+ p = p*p*p; p = p*p;
+ return pow( p.x + p.y, 1.0/6.0 );
+}
+
+float length8( vec2 p )
+{
+ p = p*p; p = p*p; p = p*p;
+ return pow( p.x + p.y, 1.0/8.0 );
+}
+
+float sdTorus82( vec3 p, vec2 t )
+{
+ vec2 q = vec2(length2(p.xz)-t.x,p.y);
+ return length8(q)-t.y;
+}
+
+float sdTorus88( vec3 p, vec2 t )
+{
+ vec2 q = vec2(length8(p.xz)-t.x,p.y);
+ return length8(q)-t.y;
+}
+
+float sdCylinder6( vec3 p, vec2 h )
+{
+ return max( length6(p.xz)-h.x, abs(p.y)-h.y );
+}
+
+//------------------------------------------------------------------
+
+float opS( float d1, float d2 )
+{
+ return max(-d2,d1);
+}
+
+vec2 opU( vec2 d1, vec2 d2 )
+{
+ return (d1.x<d2.x) ? d1 : d2;
+}
+
+vec3 opRep( vec3 p, vec3 c )
+{
+ return mod(p,c)-0.5*c;
+}
+
+vec3 opTwist( vec3 p )
+{
+ float c = cos(10.0*p.y+10.0);
+ float s = sin(10.0*p.y+10.0);
+ mat2 m = mat2(c,-s,s,c);
+ return vec3(m*p.xz,p.y);
+}
+
+//------------------------------------------------------------------
+
+vec2 map( in vec3 pos )
+{
+ vec2 res = opU( vec2( sdPlane( pos), 1.0 ),
+ vec2( sdSphere( pos-vec3( 0.0,0.25, 0.0), 0.25 ), 46.9 ) );
+ res = opU( res, vec2( sdBox( pos-vec3( 1.0,0.25, 0.0), vec3(0.25) ), 3.0 ) );
+ res = opU( res, vec2( udRoundBox( pos-vec3( 1.0,0.25, 1.0), vec3(0.15), 0.1 ), 41.0 ) );
+ res = opU( res, vec2( sdTorus( pos-vec3( 0.0,0.25, 1.0), vec2(0.20,0.05) ), 25.0 ) );
+ res = opU( res, vec2( sdCapsule( pos,vec3(-1.3,0.10,-0.1), vec3(-0.8,0.50,0.2), 0.1 ), 31.9 ) );
+ res = opU( res, vec2( sdTriPrism( pos-vec3(-1.0,0.25,-1.0), vec2(0.25,0.05) ),43.5 ) );
+ res = opU( res, vec2( sdCylinder( pos-vec3( 1.0,0.30,-1.0), vec2(0.1,0.2) ), 8.0 ) );
+ res = opU( res, vec2( sdCone( pos-vec3( 0.0,0.50,-1.0), vec3(0.8,0.6,0.3) ), 55.0 ) );
+ res = opU( res, vec2( sdTorus82( pos-vec3( 0.0,0.25, 2.0), vec2(0.20,0.05) ),50.0 ) );
+ res = opU( res, vec2( sdTorus88( pos-vec3(-1.0,0.25, 2.0), vec2(0.20,0.05) ),43.0 ) );
+ res = opU( res, vec2( sdCylinder6( pos-vec3( 1.0,0.30, 2.0), vec2(0.1,0.2) ), 12.0 ) );
+ res = opU( res, vec2( sdHexPrism( pos-vec3(-1.0,0.20, 1.0), vec2(0.25,0.05) ),17.0 ) );
+ res = opU( res, vec2( sdPryamid4( pos-vec3(-1.0,0.15,-2.0), vec3(0.8,0.6,0.25) ),37.0 ) );
+ res = opU( res, vec2( opS( udRoundBox( pos-vec3(-2.0,0.2, 1.0), vec3(0.15),0.05),
+ sdSphere( pos-vec3(-2.0,0.2, 1.0), 0.25)), 13.0 ) );
+ res = opU( res, vec2( opS( sdTorus82( pos-vec3(-2.0,0.2, 0.0), vec2(0.20,0.1)),
+ sdCylinder( opRep( vec3(atan(pos.x+2.0,pos.z)/6.2831, pos.y, 0.02+0.5*length(pos-vec3(-2.0,0.2, 0.0))), vec3(0.05,1.0,0.05)), vec2(0.02,0.6))), 51.0 ) );
+ res = opU( res, vec2( 0.5*sdSphere( pos-vec3(-2.0,0.25,-1.0), 0.2 ) + 0.03*sin(50.0*pos.x)*sin(50.0*pos.y)*sin(50.0*pos.z), 65.0 ) );
+ res = opU( res, vec2( 0.5*sdTorus( opTwist(pos-vec3(-2.0,0.25, 2.0)),vec2(0.20,0.05)), 46.7 ) );
+ res = opU( res, vec2( sdConeSection( pos-vec3( 0.0,0.35,-2.0), 0.15, 0.2, 0.1 ), 13.67 ) );
+ res = opU( res, vec2( sdEllipsoid( pos-vec3( 1.0,0.35,-2.0), vec3(0.15, 0.2, 0.05) ), 43.17 ) );
+
+ return res;
+}
+
+vec2 castRay( in vec3 ro, in vec3 rd )
+{
+ float tmin = 0.2;
+ float tmax = 30.0;
+
+#if 1
+ // bounding volume
+ float tp1 = (0.0-ro.y)/rd.y; if( tp1>0.0 ) tmax = min( tmax, tp1 );
+ float tp2 = (1.6-ro.y)/rd.y; if( tp2>0.0 ) { if( ro.y>1.6 ) tmin = max( tmin, tp2 );
+ else tmax = min( tmax, tp2 ); }
+#endif
+
+ float t = tmin;
+ float m = -1.0;
+ for( int i=0; i<64; i++ )
+ {
+ float precis = 0.0005*t;
+ vec2 res = map( ro+rd*t );
+ if( res.x<precis || t>tmax ) break;
+ t += res.x;
+ m = res.y;
+ }
+
+ if( t>tmax ) m=-1.0;
+ return vec2( t, m );
+}
+
+
+float calcSoftshadow( in vec3 ro, in vec3 rd, in float mint, in float tmax )
+{
+ float res = 1.0;
+ float t = mint;
+ for( int i=0; i<16; i++ )
+ {
+ float h = map( ro + rd*t ).x;
+ res = min( res, 8.0*h/t );
+ t += clamp( h, 0.02, 0.10 );
+ if( h<0.001 || t>tmax ) break;
+ }
+ return clamp( res, 0.0, 1.0 );
+}
+
+vec3 calcNormal( in vec3 pos )
+{
+ vec2 e = vec2(1.0,-1.0)*0.5773*0.0005;
+ return normalize( e.xyy*map( pos + e.xyy ).x +
+ e.yyx*map( pos + e.yyx ).x +
+ e.yxy*map( pos + e.yxy ).x +
+ e.xxx*map( pos + e.xxx ).x );
+ /*
+ vec3 eps = vec3( 0.0005, 0.0, 0.0 );
+ vec3 nor = vec3(
+ map(pos+eps.xyy).x - map(pos-eps.xyy).x,
+ map(pos+eps.yxy).x - map(pos-eps.yxy).x,
+ map(pos+eps.yyx).x - map(pos-eps.yyx).x );
+ return normalize(nor);
+ */
+}
+
+float calcAO( in vec3 pos, in vec3 nor )
+{
+ float occ = 0.0;
+ float sca = 1.0;
+ for( int i=0; i<5; i++ )
+ {
+ float hr = 0.01 + 0.12*float(i)/4.0;
+ vec3 aopos = nor * hr + pos;
+ float dd = map( aopos ).x;
+ occ += -(dd-hr)*sca;
+ sca *= 0.95;
+ }
+ return clamp( 1.0 - 3.0*occ, 0.0, 1.0 );
+}
+
+// http://iquilezles.org/www/articles/checkerfiltering/checkerfiltering.htm
+float checkersGradBox( in vec2 p )
+{
+ // filter kernel
+ vec2 w = fwidth(p) + 0.001;
+ // analytical integral (box filter)
+ vec2 i = 2.0*(abs(fract((p-0.5*w)*0.5)-0.5)-abs(fract((p+0.5*w)*0.5)-0.5))/w;
+ // xor pattern
+ return 0.5 - 0.5*i.x*i.y;
+}
+
+vec3 render( in vec3 ro, in vec3 rd )
+{
+ vec3 col = vec3(0.7, 0.9, 1.0) +rd.y*0.8;
+ vec2 res = castRay(ro,rd);
+ float t = res.x;
+ float m = res.y;
+ if( m>-0.5 )
+ {
+ vec3 pos = ro + t*rd;
+ vec3 nor = calcNormal( pos );
+ vec3 ref = reflect( rd, nor );
+
+ // material
+ col = 0.45 + 0.35*sin( vec3(0.05,0.08,0.10)*(m-1.0) );
+ if( m<1.5 )
+ {
+
+ float f = checkersGradBox( 5.0*pos.xz );
+ col = 0.3 + f*vec3(0.1);
+ }
+
+ // lighting
+ float occ = calcAO( pos, nor );
+ vec3 lig = normalize( vec3(cos(-0.4 * runTime), sin(0.7 * runTime), -0.6) );
+ vec3 hal = normalize( lig-rd );
+ float amb = clamp( 0.5+0.5*nor.y, 0.0, 1.0 );
+ float dif = clamp( dot( nor, lig ), 0.0, 1.0 );
+ float bac = clamp( dot( nor, normalize(vec3(-lig.x,0.0,-lig.z))), 0.0, 1.0 )*clamp( 1.0-pos.y,0.0,1.0);
+ float dom = smoothstep( -0.1, 0.1, ref.y );
+ float fre = pow( clamp(1.0+dot(nor,rd),0.0,1.0), 2.0 );
+
+ dif *= calcSoftshadow( pos, lig, 0.02, 2.5 );
+ dom *= calcSoftshadow( pos, ref, 0.02, 2.5 );
+
+ float spe = pow( clamp( dot( nor, hal ), 0.0, 1.0 ),16.0)*
+ dif *
+ (0.04 + 0.96*pow( clamp(1.0+dot(hal,rd),0.0,1.0), 5.0 ));
+
+ vec3 lin = vec3(0.0);
+ lin += 1.30*dif*vec3(1.00,0.80,0.55);
+ lin += 0.40*amb*vec3(0.40,0.60,1.00)*occ;
+ lin += 0.50*dom*vec3(0.40,0.60,1.00)*occ;
+ lin += 0.50*bac*vec3(0.25,0.25,0.25)*occ;
+ lin += 0.25*fre*vec3(1.00,1.00,1.00)*occ;
+ col = col*lin;
+ col += 10.00*spe*vec3(1.00,0.90,0.70);
+
+ col = mix( col, vec3(0.8,0.9,1.0), 1.0-exp( -0.0002*t*t*t ) );
+ }
+
+ return vec3( clamp(col,0.0,1.0) );
+}
+
+mat3 setCamera( in vec3 ro, in vec3 ta, float cr )
+{
+ vec3 cw = normalize(ta-ro);
+ vec3 cp = vec3(sin(cr), cos(cr),0.0);
+ vec3 cu = normalize( cross(cw,cp) );
+ vec3 cv = normalize( cross(cu,cw) );
+ return mat3( cu, cv, cw );
+}
+
+void main()
+{
+ vec3 tot = vec3(0.0);
+#if AA>1
+ for( int m=0; m<AA; m++ )
+ for( int n=0; n<AA; n++ )
+ {
+ // pixel coordinates
+ vec2 o = vec2(float(m),float(n)) / float(AA) - 0.5;
+ vec2 p = (-resolution.xy + 2.0*(gl_FragCoord.xy+o))/resolution.y;
+#else
+ vec2 p = (-resolution.xy + 2.0*gl_FragCoord.xy)/resolution.y;
+#endif
+
+ // RAY: Camera is provided from raylib
+ //vec3 ro = vec3( -0.5+3.5*cos(0.1*time + 6.0*mo.x), 1.0 + 2.0*mo.y, 0.5 + 4.0*sin(0.1*time + 6.0*mo.x) );
+
+ vec3 ro = viewEye;
+ vec3 ta = viewCenter;
+
+ // camera-to-world transformation
+ mat3 ca = setCamera( ro, ta, 0.0 );
+ // ray direction
+ vec3 rd = ca * normalize( vec3(p.xy,2.0) );
+
+ // render
+ vec3 col = render( ro, rd );
+
+ // gamma
+ col = pow( col, vec3(0.4545) );
+
+ tot += col;
+#if AA>1
+ }
+ tot /= float(AA*AA);
+#endif
+
+ gl_FragColor = vec4( tot, 1.0 );
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl120/scanlines.fs b/deps/raylib/examples/shaders/resources/shaders/glsl120/scanlines.fs
new file mode 100644
index 0000000..520daa5
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl120/scanlines.fs
@@ -0,0 +1,42 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+float offset = 0.0;
+float frequency = 450.0/3.0;
+
+uniform float time;
+
+void main()
+{
+/*
+ // Scanlines method 1
+ float tval = 0; //time
+ vec2 uv = 0.5 + (fragTexCoord - 0.5)*(0.9 + 0.01*sin(0.5*tval));
+
+ vec4 color = texture2D(texture0, fragTexCoord);
+
+ color = clamp(color*0.5 + 0.5*color*color*1.2, 0.0, 1.0);
+ color *= 0.5 + 0.5*16.0*uv.x*uv.y*(1.0 - uv.x)*(1.0 - uv.y);
+ color *= vec4(0.8, 1.0, 0.7, 1);
+ color *= 0.9 + 0.1*sin(10.0*tval + uv.y*1000.0);
+ color *= 0.97 + 0.03*sin(110.0*tval);
+
+ fragColor = color;
+*/
+ // Scanlines method 2
+ float globalPos = (fragTexCoord.y + offset) * frequency;
+ float wavePos = cos((fract(globalPos) - 0.5)*3.14);
+
+ vec4 color = texture2D(texture0, fragTexCoord);
+
+ gl_FragColor = mix(vec4(0.0, 0.3, 0.0, 0.0), color, wavePos);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl120/shadowmap.fs b/deps/raylib/examples/shaders/resources/shaders/glsl120/shadowmap.fs
new file mode 100644
index 0000000..f43e638
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl120/shadowmap.fs
@@ -0,0 +1,84 @@
+#version 120
+
+// This shader is based on the basic lighting shader
+// This only supports one light, which is directional, and it (of course) supports shadows
+
+// Input vertex attributes (from vertex shader)
+varying vec3 fragPosition;
+varying vec2 fragTexCoord;
+//varying in vec4 fragColor;
+varying vec3 fragNormal;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Input lighting values
+uniform vec3 lightDir;
+uniform vec4 lightColor;
+uniform vec4 ambient;
+uniform vec3 viewPos;
+
+// Input shadowmapping values
+uniform mat4 lightVP; // Light source view-projection matrix
+uniform sampler2D shadowMap;
+
+uniform int shadowMapResolution;
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture2D(texture0, fragTexCoord);
+ vec3 lightDot = vec3(0.0);
+ vec3 normal = normalize(fragNormal);
+ vec3 viewD = normalize(viewPos - fragPosition);
+ vec3 specular = vec3(0.0);
+
+ vec3 l = -lightDir;
+
+ float NdotL = max(dot(normal, l), 0.0);
+ lightDot += lightColor.rgb*NdotL;
+
+ float specCo = 0.0;
+ if (NdotL > 0.0) specCo = pow(max(0.0, dot(viewD, reflect(-(l), normal))), 16.0); // 16 refers to shine
+ specular += specCo;
+
+ vec4 finalColor = (texelColor*((colDiffuse + vec4(specular, 1.0))*vec4(lightDot, 1.0)));
+
+ // Shadow calculations
+ vec4 fragPosLightSpace = lightVP * vec4(fragPosition, 1);
+ fragPosLightSpace.xyz /= fragPosLightSpace.w; // Perform the perspective division
+ fragPosLightSpace.xyz = (fragPosLightSpace.xyz + 1.0f) / 2.0f; // Transform from [-1, 1] range to [0, 1] range
+ vec2 sampleCoords = fragPosLightSpace.xy;
+ float curDepth = fragPosLightSpace.z;
+ // Slope-scale depth bias: depth biasing reduces "shadow acne" artifacts, where dark stripes appear all over the scene.
+ // The solution is adding a small bias to the depth
+ // In this case, the bias is proportional to the slope of the surface, relative to the light
+ float bias = max(0.0008 * (1.0 - dot(normal, l)), 0.00008);
+ int shadowCounter = 0;
+ const int numSamples = 9;
+ // PCF (percentage-closer filtering) algorithm:
+ // Instead of testing if just one point is closer to the current point,
+ // we test the surrounding points as well.
+ // This blurs shadow edges, hiding aliasing artifacts.
+ vec2 texelSize = vec2(1.0f / float(shadowMapResolution));
+ for (int x = -1; x <= 1; x++)
+ {
+ for (int y = -1; y <= 1; y++)
+ {
+ float sampleDepth = texture2D(shadowMap, sampleCoords + texelSize * vec2(x, y)).r;
+ if (curDepth - bias > sampleDepth)
+ {
+ shadowCounter++;
+ }
+ }
+ }
+ finalColor = mix(finalColor, vec4(0, 0, 0, 1), float(shadowCounter) / float(numSamples));
+
+ // Add ambient lighting whether in shadow or not
+ finalColor += texelColor*(ambient/10.0)*colDiffuse;
+
+ // Gamma correction
+ finalColor = pow(finalColor, vec4(1.0/2.2));
+ gl_FragColor = finalColor;
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl120/shadowmap.vs b/deps/raylib/examples/shaders/resources/shaders/glsl120/shadowmap.vs
new file mode 100644
index 0000000..bace1d7
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl120/shadowmap.vs
@@ -0,0 +1,32 @@
+#version 120
+
+// Input vertex attributes
+attribute vec3 vertexPosition;
+attribute vec2 vertexTexCoord;
+attribute vec3 vertexNormal;
+attribute vec4 vertexColor;
+
+// Input uniform values
+uniform mat4 mvp;
+uniform mat4 matModel;
+uniform mat4 matNormal;
+
+// Output vertex attributes (to fragment shader)
+varying vec3 fragPosition;
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+varying vec3 fragNormal;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ // Send vertex attributes to fragment shader
+ fragPosition = vec3(matModel*vec4(vertexPosition, 1.0));
+ fragTexCoord = vertexTexCoord;
+ fragColor = vertexColor;
+ fragNormal = normalize(vec3(matNormal*vec4(vertexNormal, 1.0)));
+
+ // Calculate final vertex position
+ gl_Position = mvp*vec4(vertexPosition, 1.0);
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl120/sobel.fs b/deps/raylib/examples/shaders/resources/shaders/glsl120/sobel.fs
new file mode 100644
index 0000000..8c74a6a
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl120/sobel.fs
@@ -0,0 +1,38 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+vec2 resolution = vec2(800.0, 450.0);
+
+void main()
+{
+ float x = 1.0/resolution.x;
+ float y = 1.0/resolution.y;
+
+ vec4 horizEdge = vec4(0.0);
+ horizEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y - y))*1.0;
+ horizEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y ))*2.0;
+ horizEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y + y))*1.0;
+ horizEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y - y))*1.0;
+ horizEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y ))*2.0;
+ horizEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y + y))*1.0;
+
+ vec4 vertEdge = vec4(0.0);
+ vertEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y - y))*1.0;
+ vertEdge -= texture2D(texture0, vec2(fragTexCoord.x , fragTexCoord.y - y))*2.0;
+ vertEdge -= texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y - y))*1.0;
+ vertEdge += texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y + y))*1.0;
+ vertEdge += texture2D(texture0, vec2(fragTexCoord.x , fragTexCoord.y + y))*2.0;
+ vertEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y + y))*1.0;
+
+ vec3 edge = sqrt((horizEdge.rgb*horizEdge.rgb) + (vertEdge.rgb*vertEdge.rgb));
+
+ gl_FragColor = vec4(edge, texture2D(texture0, fragTexCoord).a);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl120/swirl.fs b/deps/raylib/examples/shaders/resources/shaders/glsl120/swirl.fs
new file mode 100644
index 0000000..7b3dd2f
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl120/swirl.fs
@@ -0,0 +1,44 @@
+#version 120
+
+// Input vertex attributes (from vertex shader)
+varying vec2 fragTexCoord;
+varying vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+// NOTE: Render size values should be passed from code
+const float renderWidth = 800;
+const float renderHeight = 450;
+
+float radius = 250.0;
+float angle = 0.8;
+
+uniform vec2 center;
+
+void main()
+{
+ vec2 texSize = vec2(renderWidth, renderHeight);
+ vec2 tc = fragTexCoord*texSize;
+ tc -= center;
+
+ float dist = length(tc);
+
+ if (dist < radius)
+ {
+ float percent = (radius - dist)/radius;
+ float theta = percent*percent*angle*8.0;
+ float s = sin(theta);
+ float c = cos(theta);
+
+ tc = vec2(dot(tc, vec2(c, -s)), dot(tc, vec2(s, c)));
+ }
+
+ tc += center;
+ vec4 color = texture2D(texture0, tc/texSize)*colDiffuse*fragColor;;
+
+ gl_FragColor = vec4(color.rgb, 1.0);;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/base.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/base.fs
new file mode 100644
index 0000000..813f32b
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/base.fs
@@ -0,0 +1,28 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture(texture0, fragTexCoord);
+
+ // NOTE: Implement here your fragment shader code
+
+ // final color is the color from the texture
+ // times the tint color (colDiffuse)
+ // times the fragment color (interpolated vertex color)
+ finalColor = texelColor*colDiffuse*fragColor;
+}
+
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/base.vs b/deps/raylib/examples/shaders/resources/shaders/glsl330/base.vs
new file mode 100644
index 0000000..8cc2abb
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/base.vs
@@ -0,0 +1,26 @@
+#version 330
+
+// Input vertex attributes
+in vec3 vertexPosition;
+in vec2 vertexTexCoord;
+in vec3 vertexNormal;
+in vec4 vertexColor;
+
+// Input uniform values
+uniform mat4 mvp;
+
+// Output vertex attributes (to fragment shader)
+out vec2 fragTexCoord;
+out vec4 fragColor;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ // Send vertex attributes to fragment shader
+ fragTexCoord = vertexTexCoord;
+ fragColor = vertexColor;
+
+ // Calculate final vertex position
+ gl_Position = mvp*vec4(vertexPosition, 1.0);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/bloom.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/bloom.fs
new file mode 100644
index 0000000..56eadb5
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/bloom.fs
@@ -0,0 +1,40 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+const vec2 size = vec2(800, 450); // Framebuffer size
+const float samples = 5.0; // Pixels per axis; higher = bigger glow, worse performance
+const float quality = 2.5; // Defines size factor: Lower = smaller glow, better quality
+
+void main()
+{
+ vec4 sum = vec4(0);
+ vec2 sizeFactor = vec2(1)/size*quality;
+
+ // Texel color fetching from texture sampler
+ vec4 source = texture(texture0, fragTexCoord);
+
+ const int range = 2; // should be = (samples - 1)/2;
+
+ for (int x = -range; x <= range; x++)
+ {
+ for (int y = -range; y <= range; y++)
+ {
+ sum += texture(texture0, fragTexCoord + vec2(x, y)*sizeFactor);
+ }
+ }
+
+ // Calculate final fragment color
+ finalColor = ((sum/(samples*samples)) + source)*colDiffuse;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/blur.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/blur.fs
new file mode 100644
index 0000000..8809f71
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/blur.fs
@@ -0,0 +1,35 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+// NOTE: Render size values must be passed from code
+const float renderWidth = 800;
+const float renderHeight = 450;
+
+float offset[3] = float[](0.0, 1.3846153846, 3.2307692308);
+float weight[3] = float[](0.2270270270, 0.3162162162, 0.0702702703);
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec3 texelColor = texture(texture0, fragTexCoord).rgb*weight[0];
+
+ for (int i = 1; i < 3; i++)
+ {
+ texelColor += texture(texture0, fragTexCoord + vec2(offset[i])/renderWidth, 0.0).rgb*weight[i];
+ texelColor += texture(texture0, fragTexCoord - vec2(offset[i])/renderWidth, 0.0).rgb*weight[i];
+ }
+
+ finalColor = vec4(texelColor, 1.0);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/color_mix.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/color_mix.fs
new file mode 100644
index 0000000..e794d32
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/color_mix.fs
@@ -0,0 +1,27 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec3 vertexPos;
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform sampler2D texture1;
+uniform vec4 colDiffuse;
+
+uniform float divider = 0.5;
+
+out vec4 finalColor;
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor0 = texture(texture0, fragTexCoord);
+ vec4 texelColor1 = texture(texture1, fragTexCoord);
+
+ float x = fract(fragTexCoord.s);
+ float final = smoothstep(divider - 0.1, divider + 0.1, x);
+
+ finalColor = mix(texelColor0, texelColor1, final);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/cross_hatching.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/cross_hatching.fs
new file mode 100644
index 0000000..276eabd
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/cross_hatching.fs
@@ -0,0 +1,48 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+float hatchOffsetY = 5.0;
+float lumThreshold01 = 0.9;
+float lumThreshold02 = 0.7;
+float lumThreshold03 = 0.5;
+float lumThreshold04 = 0.3;
+
+void main()
+{
+ vec3 tc = vec3(1.0, 1.0, 1.0);
+ float lum = length(texture(texture0, fragTexCoord).rgb);
+
+ if (lum < lumThreshold01)
+ {
+ if (mod(gl_FragCoord.x + gl_FragCoord.y, 10.0) == 0.0) tc = vec3(0.0, 0.0, 0.0);
+ }
+
+ if (lum < lumThreshold02)
+ {
+ if (mod(gl_FragCoord.x - gl_FragCoord.y, 10.0) == 0.0) tc = vec3(0.0, 0.0, 0.0);
+ }
+
+ if (lum < lumThreshold03)
+ {
+ if (mod(gl_FragCoord.x + gl_FragCoord.y - hatchOffsetY, 10.0) == 0.0) tc = vec3(0.0, 0.0, 0.0);
+ }
+
+ if (lum < lumThreshold04)
+ {
+ if (mod(gl_FragCoord.x - gl_FragCoord.y - hatchOffsetY, 10.0) == 0.0) tc = vec3(0.0, 0.0, 0.0);
+ }
+
+ finalColor = vec4(tc, 1.0);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/cross_stitching.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/cross_stitching.fs
new file mode 100644
index 0000000..02be861
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/cross_stitching.fs
@@ -0,0 +1,59 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+// NOTE: Render size values must be passed from code
+const float renderWidth = 800.0;
+const float renderHeight = 450.0;
+
+float stitchingSize = 6.0;
+
+uniform int invert = 0;
+
+vec4 PostFX(sampler2D tex, vec2 uv)
+{
+ vec4 c = vec4(0.0);
+ float size = stitchingSize;
+ vec2 cPos = uv * vec2(renderWidth, renderHeight);
+ vec2 tlPos = floor(cPos / vec2(size, size));
+ tlPos *= size;
+
+ int remX = int(mod(cPos.x, size));
+ int remY = int(mod(cPos.y, size));
+
+ if (remX == 0 && remY == 0) tlPos = cPos;
+
+ vec2 blPos = tlPos;
+ blPos.y += (size - 1.0);
+
+ if ((remX == remY) || (((int(cPos.x) - int(blPos.x)) == (int(blPos.y) - int(cPos.y)))))
+ {
+ if (invert == 1) c = vec4(0.2, 0.15, 0.05, 1.0);
+ else c = texture(tex, tlPos * vec2(1.0/renderWidth, 1.0/renderHeight)) * 1.4;
+ }
+ else
+ {
+ if (invert == 1) c = texture(tex, tlPos * vec2(1.0/renderWidth, 1.0/renderHeight)) * 1.4;
+ else c = vec4(0.0, 0.0, 0.0, 1.0);
+ }
+
+ return c;
+}
+
+void main()
+{
+ vec3 tc = PostFX(texture0, fragTexCoord).rgb;
+
+ finalColor = vec4(tc, 1.0);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/cubes_panning.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/cubes_panning.fs
new file mode 100644
index 0000000..1d75e4e
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/cubes_panning.fs
@@ -0,0 +1,61 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Output fragment color
+out vec4 finalColor;
+
+// Custom variables
+#define PI 3.14159265358979323846
+uniform float uTime = 0.0;
+
+float divisions = 5.0;
+float angle = 0.0;
+
+vec2 VectorRotateTime(vec2 v, float speed)
+{
+ float time = uTime*speed;
+ float localTime = fract(time); // The time domain this works on is 1 sec.
+
+ if ((localTime >= 0.0) && (localTime < 0.25)) angle = 0.0;
+ else if ((localTime >= 0.25) && (localTime < 0.50)) angle = PI/4*sin(2*PI*localTime - PI/2);
+ else if ((localTime >= 0.50) && (localTime < 0.75)) angle = PI*0.25;
+ else if ((localTime >= 0.75) && (localTime < 1.00)) angle = PI/4*sin(2*PI*localTime);
+
+ // Rotate vector by angle
+ v -= 0.5;
+ v = mat2(cos(angle), -sin(angle), sin(angle), cos(angle))*v;
+ v += 0.5;
+
+ return v;
+}
+
+float Rectangle(in vec2 st, in float size, in float fill)
+{
+ float roundSize = 0.5 - size/2.0;
+ float left = step(roundSize, st.x);
+ float top = step(roundSize, st.y);
+ float bottom = step(roundSize, 1.0 - st.y);
+ float right = step(roundSize, 1.0 - st.x);
+
+ return (left*bottom*right*top)*fill;
+}
+
+void main()
+{
+ vec2 fragPos = fragTexCoord;
+ fragPos.xy += uTime/9.0;
+
+ fragPos *= divisions;
+ vec2 ipos = floor(fragPos); // Get the integer coords
+ vec2 fpos = fract(fragPos); // Get the fractional coords
+
+ fpos = VectorRotateTime(fpos, 0.2);
+
+ float alpha = Rectangle(fpos, 0.216, 1.0);
+ vec3 color = vec3(0.3, 0.3, 0.3);
+
+ finalColor = vec4(color, alpha);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/deferred_shading.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/deferred_shading.fs
new file mode 100644
index 0000000..c9c6a31
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/deferred_shading.fs
@@ -0,0 +1,55 @@
+#version 330 core
+out vec4 finalColor;
+
+in vec2 texCoord;
+in vec2 texCoord2;
+
+uniform sampler2D gPosition;
+uniform sampler2D gNormal;
+uniform sampler2D gAlbedoSpec;
+
+struct Light {
+ int enabled;
+ int type; // Unused in this demo.
+ vec3 position;
+ vec3 target; // Unused in this demo.
+ vec4 color;
+};
+
+const int NR_LIGHTS = 4;
+uniform Light lights[NR_LIGHTS];
+uniform vec3 viewPosition;
+
+const float QUADRATIC = 0.032;
+const float LINEAR = 0.09;
+
+void main() {
+ vec3 fragPosition = texture(gPosition, texCoord).rgb;
+ vec3 normal = texture(gNormal, texCoord).rgb;
+ vec3 albedo = texture(gAlbedoSpec, texCoord).rgb;
+ float specular = texture(gAlbedoSpec, texCoord).a;
+
+ vec3 ambient = albedo * vec3(0.1f);
+ vec3 viewDirection = normalize(viewPosition - fragPosition);
+
+ for(int i = 0; i < NR_LIGHTS; ++i)
+ {
+ if(lights[i].enabled == 0) continue;
+ vec3 lightDirection = lights[i].position - fragPosition;
+ vec3 diffuse = max(dot(normal, lightDirection), 0.0) * albedo * lights[i].color.xyz;
+
+ vec3 halfwayDirection = normalize(lightDirection + viewDirection);
+ float spec = pow(max(dot(normal, halfwayDirection), 0.0), 32.0);
+ vec3 specular = specular * spec * lights[i].color.xyz;
+
+ // Attenuation
+ float distance = length(lights[i].position - fragPosition);
+ float attenuation = 1.0 / (1.0 + LINEAR * distance + QUADRATIC * distance * distance);
+ diffuse *= attenuation;
+ specular *= attenuation;
+ ambient += diffuse + specular;
+ }
+
+ finalColor = vec4(ambient, 1.0);
+}
+
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/deferred_shading.vs b/deps/raylib/examples/shaders/resources/shaders/glsl330/deferred_shading.vs
new file mode 100644
index 0000000..f2b1bd7
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/deferred_shading.vs
@@ -0,0 +1,11 @@
+#version 330 core
+
+layout (location = 0) in vec3 vertexPosition;
+layout (location = 1) in vec2 vertexTexCoord;
+
+out vec2 texCoord;
+
+void main() {
+ gl_Position = vec4(vertexPosition, 1.0);
+ texCoord = vertexTexCoord;
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/depth.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/depth.fs
new file mode 100644
index 0000000..f7546bb
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/depth.fs
@@ -0,0 +1,27 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0; // Depth texture
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ float zNear = 0.01; // camera z near
+ float zFar = 10.0; // camera z far
+ float z = texture(texture0, fragTexCoord).x;
+
+ // Linearize depth value
+ float depth = (2.0*zNear)/(zFar + zNear - z*(zFar - zNear));
+
+ // Calculate final fragment color
+ finalColor = vec4(depth, depth, depth, 1.0f);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/distortion.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/distortion.fs
new file mode 100644
index 0000000..43d540d
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/distortion.fs
@@ -0,0 +1,56 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+
+// Input uniform values
+uniform sampler2D texture0;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Default parameters for Oculus Rift DK2 device
+const vec2 LeftLensCenter = vec2(0.2863248, 0.5);
+const vec2 RightLensCenter = vec2(0.7136753, 0.5);
+const vec2 LeftScreenCenter = vec2(0.25, 0.5);
+const vec2 RightScreenCenter = vec2(0.75, 0.5);
+const vec2 Scale = vec2(0.25, 0.45);
+const vec2 ScaleIn = vec2(4.0, 2.5);
+const vec4 HmdWarpParam = vec4(1.0, 0.22, 0.24, 0.0);
+const vec4 ChromaAbParam = vec4(0.996, -0.004, 1.014, 0.0);
+
+void main()
+{
+ // The following two variables need to be set per eye
+ vec2 LensCenter = fragTexCoord.x < 0.5 ? LeftLensCenter : RightLensCenter;
+ vec2 ScreenCenter = fragTexCoord.x < 0.5 ? LeftScreenCenter : RightScreenCenter;
+
+ // Scales input texture coordinates for distortion: vec2 HmdWarp(vec2 fragTexCoord, vec2 LensCenter)
+ vec2 theta = (fragTexCoord - LensCenter)*ScaleIn; // Scales to [-1, 1]
+ float rSq = theta.x*theta.x + theta.y*theta.y;
+ vec2 theta1 = theta*(HmdWarpParam.x + HmdWarpParam.y*rSq + HmdWarpParam.z*rSq*rSq + HmdWarpParam.w*rSq*rSq*rSq);
+ //vec2 tc = LensCenter + Scale*theta1;
+
+ // Detect whether blue texture coordinates are out of range since these will scaled out the furthest
+ vec2 thetaBlue = theta1*(ChromaAbParam.z + ChromaAbParam.w*rSq);
+ vec2 tcBlue = LensCenter + Scale*thetaBlue;
+
+ if (any(bvec2(clamp(tcBlue, ScreenCenter - vec2(0.25, 0.5), ScreenCenter + vec2(0.25, 0.5)) - tcBlue))) finalColor = vec4(0.0, 0.0, 0.0, 1.0);
+ else
+ {
+ // Do blue texture lookup
+ float blue = texture(texture0, tcBlue).b;
+
+ // Do green lookup (no scaling)
+ vec2 tcGreen = LensCenter + Scale*theta1;
+ float green = texture(texture0, tcGreen).g;
+
+ // Do red scale and lookup
+ vec2 thetaRed = theta1*(ChromaAbParam.x + ChromaAbParam.y*rSq);
+ vec2 tcRed = LensCenter + Scale*thetaRed;
+ float red = texture(texture0, tcRed).r;
+
+ finalColor = vec4(red, green, blue, 1.0);
+ }
+}
+
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/dream_vision.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/dream_vision.fs
new file mode 100644
index 0000000..31d3fd2
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/dream_vision.fs
@@ -0,0 +1,34 @@
+#version 330
+
+in vec2 fragTexCoord;
+
+out vec4 fragColor;
+
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ vec4 color = texture(texture0, fragTexCoord);
+
+ color += texture(texture0, fragTexCoord + 0.001);
+ color += texture(texture0, fragTexCoord + 0.003);
+ color += texture(texture0, fragTexCoord + 0.005);
+ color += texture(texture0, fragTexCoord + 0.007);
+ color += texture(texture0, fragTexCoord + 0.009);
+ color += texture(texture0, fragTexCoord + 0.011);
+
+ color += texture(texture0, fragTexCoord - 0.001);
+ color += texture(texture0, fragTexCoord - 0.003);
+ color += texture(texture0, fragTexCoord - 0.005);
+ color += texture(texture0, fragTexCoord - 0.007);
+ color += texture(texture0, fragTexCoord - 0.009);
+ color += texture(texture0, fragTexCoord - 0.011);
+
+ color.rgb = vec3((color.r + color.g + color.b)/3.0);
+ color = color/9.5;
+
+ fragColor = color;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/eratosthenes.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/eratosthenes.fs
new file mode 100644
index 0000000..644e38d
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/eratosthenes.fs
@@ -0,0 +1,59 @@
+#version 330
+
+/*************************************************************************************
+
+ The Sieve of Eratosthenes -- a simple shader by ProfJski
+ An early prime number sieve: https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
+
+ The screen is divided into a square grid of boxes, each representing an integer value.
+ Each integer is tested to see if it is a prime number. Primes are colored white.
+ Non-primes are colored with a color that indicates the smallest factor which evenly divdes our integer.
+
+ You can change the scale variable to make a larger or smaller grid.
+ Total number of integers displayed = scale squared, so scale = 100 tests the first 10,000 integers.
+
+ WARNING: If you make scale too large, your GPU may bog down!
+
+***************************************************************************************/
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Output fragment color
+out vec4 finalColor;
+
+// Make a nice spectrum of colors based on counter and maxSize
+vec4 Colorizer(float counter, float maxSize)
+{
+ float red = 0.0, green = 0.0, blue = 0.0;
+ float normsize = counter/maxSize;
+
+ red = smoothstep(0.3, 0.7, normsize);
+ green = sin(3.14159*normsize);
+ blue = 1.0 - smoothstep(0.0, 0.4, normsize);
+
+ return vec4(0.8*red, 0.8*green, 0.8*blue, 1.0);
+}
+
+void main()
+{
+ vec4 color = vec4(1.0);
+ float scale = 1000.0; // Makes 100x100 square grid. Change this variable to make a smaller or larger grid.
+ int value = int(scale*floor(fragTexCoord.y*scale)+floor(fragTexCoord.x*scale)); // Group pixels into boxes representing integer values
+
+ if ((value == 0) || (value == 1) || (value == 2)) finalColor = vec4(1.0);
+ else
+ {
+ for (int i = 2; (i < max(2, sqrt(value) + 1)); i++)
+ {
+ if ((value - i*floor(float(value)/float(i))) == 0)
+ {
+ color = Colorizer(float(i), scale);
+ //break; // Uncomment to color by the largest factor instead
+ }
+ }
+
+ finalColor = color;
+ }
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/fisheye.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/fisheye.fs
new file mode 100644
index 0000000..bb03a61
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/fisheye.fs
@@ -0,0 +1,40 @@
+#version 330
+
+in vec2 fragTexCoord;
+
+out vec4 fragColor;
+
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// NOTE: Add here your custom variables
+
+const float PI = 3.1415926535;
+
+void main()
+{
+ float aperture = 178.0;
+ float apertureHalf = 0.5 * aperture * (PI / 180.0);
+ float maxFactor = sin(apertureHalf);
+
+ vec2 uv = vec2(0);
+ vec2 xy = 2.0 * fragTexCoord.xy - 1.0;
+ float d = length(xy);
+
+ if (d < (2.0 - maxFactor))
+ {
+ d = length(xy * maxFactor);
+ float z = sqrt(1.0 - d * d);
+ float r = atan(d, z) / PI;
+ float phi = atan(xy.y, xy.x);
+
+ uv.x = r * cos(phi) + 0.5;
+ uv.y = r * sin(phi) + 0.5;
+ }
+ else
+ {
+ uv = fragTexCoord.xy;
+ }
+
+ fragColor = texture(texture0, uv);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/fog.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/fog.fs
new file mode 100644
index 0000000..445cca3
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/fog.fs
@@ -0,0 +1,95 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+in vec3 fragPosition;
+in vec3 fragNormal;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+#define MAX_LIGHTS 4
+#define LIGHT_DIRECTIONAL 0
+#define LIGHT_POINT 1
+
+struct MaterialProperty {
+ vec3 color;
+ int useSampler;
+ sampler2D sampler;
+};
+
+struct Light {
+ int enabled;
+ int type;
+ vec3 position;
+ vec3 target;
+ vec4 color;
+};
+
+// Input lighting values
+uniform Light lights[MAX_LIGHTS];
+uniform vec4 ambient;
+uniform vec3 viewPos;
+uniform float fogDensity;
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture(texture0, fragTexCoord);
+ vec3 lightDot = vec3(0.0);
+ vec3 normal = normalize(fragNormal);
+ vec3 viewD = normalize(viewPos - fragPosition);
+ vec3 specular = vec3(0.0);
+
+ // NOTE: Implement here your fragment shader code
+
+ for (int i = 0; i < MAX_LIGHTS; i++)
+ {
+ if (lights[i].enabled == 1)
+ {
+ vec3 light = vec3(0.0);
+
+ if (lights[i].type == LIGHT_DIRECTIONAL) light = -normalize(lights[i].target - lights[i].position);
+ if (lights[i].type == LIGHT_POINT) light = normalize(lights[i].position - fragPosition);
+
+ float NdotL = max(dot(normal, light), 0.0);
+ lightDot += lights[i].color.rgb*NdotL;
+
+ float specCo = 0.0;
+ if (NdotL > 0.0) specCo = pow(max(0.0, dot(viewD, reflect(-(light), normal))), 16.0); // Shine: 16.0
+ specular += specCo;
+ }
+ }
+
+ finalColor = (texelColor*((colDiffuse + vec4(specular,1))*vec4(lightDot, 1.0)));
+ finalColor += texelColor*(ambient/10.0);
+
+ // Gamma correction
+ finalColor = pow(finalColor, vec4(1.0/2.2));
+
+ // Fog calculation
+ float dist = length(viewPos - fragPosition);
+
+ // these could be parameters...
+ const vec4 fogColor = vec4(0.5, 0.5, 0.5, 1.0);
+ //const float fogDensity = 0.16;
+
+ // Exponential fog
+ float fogFactor = 1.0/exp((dist*fogDensity)*(dist*fogDensity));
+
+ // Linear fog (less nice)
+ //const float fogStart = 2.0;
+ //const float fogEnd = 10.0;
+ //float fogFactor = (fogEnd - dist)/(fogEnd - fogStart);
+
+ fogFactor = clamp(fogFactor, 0.0, 1.0);
+
+ finalColor = mix(fogColor, finalColor, fogFactor);
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/gbuffer.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/gbuffer.fs
new file mode 100644
index 0000000..c86e20a
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/gbuffer.fs
@@ -0,0 +1,22 @@
+#version 330 core
+layout (location = 0) out vec3 gPosition;
+layout (location = 1) out vec3 gNormal;
+layout (location = 2) out vec4 gAlbedoSpec;
+
+in vec3 fragPosition;
+in vec2 fragTexCoord;
+in vec3 fragNormal;
+
+uniform sampler2D diffuseTexture;
+uniform sampler2D specularTexture;
+
+void main() {
+ // store the fragment position vector in the first gbuffer texture
+ gPosition = fragPosition;
+ // also store the per-fragment normals into the gbuffer
+ gNormal = normalize(fragNormal);
+ // and the diffuse per-fragment color
+ gAlbedoSpec.rgb = texture(diffuseTexture, fragTexCoord).rgb;
+ // store specular intensity in gAlbedoSpec's alpha component
+ gAlbedoSpec.a = texture(specularTexture, fragTexCoord).r;
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/gbuffer.vs b/deps/raylib/examples/shaders/resources/shaders/glsl330/gbuffer.vs
new file mode 100644
index 0000000..7d264ba
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/gbuffer.vs
@@ -0,0 +1,24 @@
+#version 330 core
+layout (location = 0) in vec3 vertexPosition;
+layout (location = 1) in vec2 vertexTexCoord;
+layout (location = 2) in vec3 vertexNormal;
+
+out vec3 fragPosition;
+out vec2 fragTexCoord;
+out vec3 fragNormal;
+
+uniform mat4 matModel;
+uniform mat4 matView;
+uniform mat4 matProjection;
+
+void main()
+{
+ vec4 worldPos = matModel * vec4(vertexPosition, 1.0);
+ fragPosition = worldPos.xyz;
+ fragTexCoord = vertexTexCoord;
+
+ mat3 normalMatrix = transpose(inverse(mat3(matModel)));
+ fragNormal = normalMatrix * vertexNormal;
+
+ gl_Position = matProjection * matView * worldPos;
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/grayscale.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/grayscale.fs
new file mode 100644
index 0000000..dead6ec
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/grayscale.fs
@@ -0,0 +1,26 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture(texture0, fragTexCoord)*colDiffuse*fragColor;
+
+ // Convert texel color to grayscale using NTSC conversion weights
+ float gray = dot(texelColor.rgb, vec3(0.299, 0.587, 0.114));
+
+ // Calculate final fragment color
+ finalColor = vec4(gray, gray, gray, texelColor.a);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/hybrid_raster.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/hybrid_raster.fs
new file mode 100644
index 0000000..85ef492
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/hybrid_raster.fs
@@ -0,0 +1,14 @@
+#version 330
+
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+void main()
+{
+ vec4 texelColor = texture2D(texture0, fragTexCoord);
+ gl_FragColor = texelColor*colDiffuse*fragColor;
+ gl_FragDepth = gl_FragCoord.z;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/hybrid_raymarch.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/hybrid_raymarch.fs
new file mode 100644
index 0000000..5b66dd7
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/hybrid_raymarch.fs
@@ -0,0 +1,284 @@
+# version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Custom Input Uniform
+uniform vec3 camPos;
+uniform vec3 camDir;
+uniform vec2 screenCenter;
+
+#define ZERO 0
+
+// https://learnopengl.com/Advanced-OpenGL/Depth-testing
+float CalcDepth(in vec3 rd, in float Idist){
+ float local_z = dot(normalize(camDir),rd)*Idist;
+ return (1.0/(local_z) - 1.0/0.01)/(1.0/1000.0 -1.0/0.01);
+}
+
+// https://iquilezles.org/articles/distfunctions/
+float sdHorseshoe( in vec3 p, in vec2 c, in float r, in float le, vec2 w )
+{
+ p.x = abs(p.x);
+ float l = length(p.xy);
+ p.xy = mat2(-c.x, c.y,
+ c.y, c.x)*p.xy;
+ p.xy = vec2((p.y>0.0 || p.x>0.0)?p.x:l*sign(-c.x),
+ (p.x>0.0)?p.y:l );
+ p.xy = vec2(p.x,abs(p.y-r))-vec2(le,0.0);
+
+ vec2 q = vec2(length(max(p.xy,0.0)) + min(0.0,max(p.x,p.y)),p.z);
+ vec2 d = abs(q) - w;
+ return min(max(d.x,d.y),0.0) + length(max(d,0.0));
+}
+
+// r = sphere's radius
+// h = cutting's plane's position
+// t = thickness
+float sdSixWayCutHollowSphere( vec3 p, float r, float h, float t )
+{
+ // Six way symetry Transformation
+ vec3 ap = abs(p);
+ if(ap.x < max(ap.y, ap.z)){
+ if(ap.y < ap.z) ap.xz = ap.zx;
+ else ap.xy = ap.yx;
+ }
+
+ vec2 q = vec2( length(ap.yz), ap.x );
+
+ float w = sqrt(r*r-h*h);
+
+ return ((h*q.x<w*q.y) ? length(q-vec2(w,h)) :
+ abs(length(q)-r) ) - t;
+}
+
+// https://iquilezles.org/articles/boxfunctions
+vec2 iBox( in vec3 ro, in vec3 rd, in vec3 rad )
+{
+ vec3 m = 1.0/rd;
+ vec3 n = m*ro;
+ vec3 k = abs(m)*rad;
+ vec3 t1 = -n - k;
+ vec3 t2 = -n + k;
+ return vec2( max( max( t1.x, t1.y ), t1.z ),
+ min( min( t2.x, t2.y ), t2.z ) );
+}
+
+vec2 opU( vec2 d1, vec2 d2 )
+{
+ return (d1.x<d2.x) ? d1 : d2;
+}
+
+vec2 map( in vec3 pos ){
+ vec2 res = vec2( sdHorseshoe( pos-vec3(-1.0,0.08, 1.0), vec2(cos(1.3),sin(1.3)), 0.2, 0.3, vec2(0.03,0.5) ), 11.5 ) ;
+ res = opU(res, vec2( sdSixWayCutHollowSphere( pos-vec3(0.0, 1.0, 0.0), 4.0, 3.5, 0.5 ), 4.5 )) ;
+ return res;
+}
+
+// https://www.shadertoy.com/view/Xds3zN
+vec2 raycast( in vec3 ro, in vec3 rd ){
+ vec2 res = vec2(-1.0,-1.0);
+
+ float tmin = 1.0;
+ float tmax = 20.0;
+
+ // raytrace floor plane
+ float tp1 = (-ro.y)/rd.y;
+ if( tp1>0.0 )
+ {
+ tmax = min( tmax, tp1 );
+ res = vec2( tp1, 1.0 );
+ }
+
+ float t = tmin;
+ for( int i=0; i<70 ; i++ )
+ {
+ if(t>tmax) break;
+ vec2 h = map( ro+rd*t );
+ if( abs(h.x)<(0.0001*t) )
+ {
+ res = vec2(t,h.y);
+ break;
+ }
+ t += h.x;
+ }
+
+ return res;
+}
+
+
+// https://iquilezles.org/articles/rmshadows
+float calcSoftshadow( in vec3 ro, in vec3 rd, in float mint, in float tmax )
+{
+ // bounding volume
+ float tp = (0.8-ro.y)/rd.y; if( tp>0.0 ) tmax = min( tmax, tp );
+
+ float res = 1.0;
+ float t = mint;
+ for( int i=ZERO; i<24; i++ )
+ {
+ float h = map( ro + rd*t ).x;
+ float s = clamp(8.0*h/t,0.0,1.0);
+ res = min( res, s );
+ t += clamp( h, 0.01, 0.2 );
+ if( res<0.004 || t>tmax ) break;
+ }
+ res = clamp( res, 0.0, 1.0 );
+ return res*res*(3.0-2.0*res);
+}
+
+
+// https://iquilezles.org/articles/normalsSDF
+vec3 calcNormal( in vec3 pos )
+{
+ vec2 e = vec2(1.0,-1.0)*0.5773*0.0005;
+ return normalize( e.xyy*map( pos + e.xyy ).x +
+ e.yyx*map( pos + e.yyx ).x +
+ e.yxy*map( pos + e.yxy ).x +
+ e.xxx*map( pos + e.xxx ).x );
+}
+
+// https://iquilezles.org/articles/nvscene2008/rwwtt.pdf
+float calcAO( in vec3 pos, in vec3 nor )
+{
+ float occ = 0.0;
+ float sca = 1.0;
+ for( int i=ZERO; i<5; i++ )
+ {
+ float h = 0.01 + 0.12*float(i)/4.0;
+ float d = map( pos + h*nor ).x;
+ occ += (h-d)*sca;
+ sca *= 0.95;
+ if( occ>0.35 ) break;
+ }
+ return clamp( 1.0 - 3.0*occ, 0.0, 1.0 ) * (0.5+0.5*nor.y);
+}
+
+// https://iquilezles.org/articles/checkerfiltering
+float checkersGradBox( in vec2 p )
+{
+ // filter kernel
+ vec2 w = fwidth(p) + 0.001;
+ // analytical integral (box filter)
+ vec2 i = 2.0*(abs(fract((p-0.5*w)*0.5)-0.5)-abs(fract((p+0.5*w)*0.5)-0.5))/w;
+ // xor pattern
+ return 0.5 - 0.5*i.x*i.y;
+}
+
+// https://www.shadertoy.com/view/tdS3DG
+vec4 render( in vec3 ro, in vec3 rd)
+{
+ // background
+ vec3 col = vec3(0.7, 0.7, 0.9) - max(rd.y,0.0)*0.3;
+
+ // raycast scene
+ vec2 res = raycast(ro,rd);
+ float t = res.x;
+ float m = res.y;
+ if( m>-0.5 )
+ {
+ vec3 pos = ro + t*rd;
+ vec3 nor = (m<1.5) ? vec3(0.0,1.0,0.0) : calcNormal( pos );
+ vec3 ref = reflect( rd, nor );
+
+ // material
+ col = 0.2 + 0.2*sin( m*2.0 + vec3(0.0,1.0,2.0) );
+ float ks = 1.0;
+
+ if( m<1.5 )
+ {
+ float f = checkersGradBox( 3.0*pos.xz);
+ col = 0.15 + f*vec3(0.05);
+ ks = 0.4;
+ }
+
+ // lighting
+ float occ = calcAO( pos, nor );
+
+ vec3 lin = vec3(0.0);
+
+ // sun
+ {
+ vec3 lig = normalize( vec3(-0.5, 0.4, -0.6) );
+ vec3 hal = normalize( lig-rd );
+ float dif = clamp( dot( nor, lig ), 0.0, 1.0 );
+ //if( dif>0.0001 )
+ dif *= calcSoftshadow( pos, lig, 0.02, 2.5 );
+ float spe = pow( clamp( dot( nor, hal ), 0.0, 1.0 ),16.0);
+ spe *= dif;
+ spe *= 0.04+0.96*pow(clamp(1.0-dot(hal,lig),0.0,1.0),5.0);
+ //spe *= 0.04+0.96*pow(clamp(1.0-sqrt(0.5*(1.0-dot(rd,lig))),0.0,1.0),5.0);
+ lin += col*2.20*dif*vec3(1.30,1.00,0.70);
+ lin += 5.00*spe*vec3(1.30,1.00,0.70)*ks;
+ }
+ // sky
+ {
+ float dif = sqrt(clamp( 0.5+0.5*nor.y, 0.0, 1.0 ));
+ dif *= occ;
+ float spe = smoothstep( -0.2, 0.2, ref.y );
+ spe *= dif;
+ spe *= 0.04+0.96*pow(clamp(1.0+dot(nor,rd),0.0,1.0), 5.0 );
+ //if( spe>0.001 )
+ spe *= calcSoftshadow( pos, ref, 0.02, 2.5 );
+ lin += col*0.60*dif*vec3(0.40,0.60,1.15);
+ lin += 2.00*spe*vec3(0.40,0.60,1.30)*ks;
+ }
+ // back
+ {
+ float dif = clamp( dot( nor, normalize(vec3(0.5,0.0,0.6))), 0.0, 1.0 )*clamp( 1.0-pos.y,0.0,1.0);
+ dif *= occ;
+ lin += col*0.55*dif*vec3(0.25,0.25,0.25);
+ }
+ // sss
+ {
+ float dif = pow(clamp(1.0+dot(nor,rd),0.0,1.0),2.0);
+ dif *= occ;
+ lin += col*0.25*dif*vec3(1.00,1.00,1.00);
+ }
+
+ col = lin;
+
+ col = mix( col, vec3(0.7,0.7,0.9), 1.0-exp( -0.0001*t*t*t ) );
+ }
+
+ return vec4(vec3( clamp(col,0.0,1.0) ),t);
+}
+
+vec3 CalcRayDir(vec2 nCoord){
+ vec3 horizontal = normalize(cross(camDir,vec3(.0 , 1.0, .0)));
+ vec3 vertical = normalize(cross(horizontal,camDir));
+ return normalize(camDir + horizontal*nCoord.x + vertical*nCoord.y);
+}
+
+mat3 setCamera()
+{
+ vec3 cw = normalize(camDir);
+ vec3 cp = vec3(0.0, 1.0 ,0.0);
+ vec3 cu = normalize( cross(cw,cp) );
+ vec3 cv = ( cross(cu,cw) );
+ return mat3( cu, cv, cw );
+}
+
+void main()
+{
+ vec2 nCoord = (gl_FragCoord.xy - screenCenter.xy)/screenCenter.y;
+ mat3 ca = setCamera();
+
+ // focal length
+ float fl = length(camDir);
+ vec3 rd = ca * normalize( vec3(nCoord,fl) );
+ vec3 color = vec3(nCoord/2.0 + 0.5, 0.0);
+ float depth = gl_FragCoord.z;
+ {
+ vec4 res = render( camPos - vec3(0.0, 0.0, 0.0) , rd );
+ color = res.xyz;
+ depth = CalcDepth(rd,res.w);
+ }
+ gl_FragColor = vec4(color , 1.0);
+ gl_FragDepth = depth;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/julia_set.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/julia_set.fs
new file mode 100644
index 0000000..7a6f069
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/julia_set.fs
@@ -0,0 +1,83 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Output fragment color
+out vec4 finalColor;
+
+uniform vec2 c; // c.x = real, c.y = imaginary component. Equation done is z^2 + c
+uniform vec2 offset; // Offset of the scale.
+uniform float zoom; // Zoom of the scale.
+
+const int maxIterations = 255; // Max iterations to do.
+const float colorCycles = 2.0f; // Number of times the color palette repeats. Can show higher detail for higher iteration numbers.
+
+// Square a complex number
+vec2 ComplexSquare(vec2 z)
+{
+ return vec2(
+ z.x*z.x - z.y*z.y,
+ z.x*z.y*2.0f
+ );
+}
+
+// Convert Hue Saturation Value (HSV) color into RGB
+vec3 Hsv2rgb(vec3 c)
+{
+ vec4 K = vec4(1.0f, 2.0f/3.0f, 1.0f/3.0f, 3.0f);
+ vec3 p = abs(fract(c.xxx + K.xyz)*6.0f - K.www);
+ return c.z*mix(K.xxx, clamp(p - K.xxx, 0.0f, 1.0f), c.y);
+}
+
+void main()
+{
+ /**********************************************************************************************
+ Julia sets use a function z^2 + c, where c is a constant.
+ This function is iterated until the nature of the point is determined.
+
+ If the magnitude of the number becomes greater than 2, then from that point onward
+ the number will get bigger and bigger, and will never get smaller (tends towards infinity).
+ 2^2 = 4, 4^2 = 8 and so on.
+ So at 2 we stop iterating.
+
+ If the number is below 2, we keep iterating.
+ But when do we stop iterating if the number is always below 2 (it converges)?
+ That is what maxIterations is for.
+ Then we can divide the iterations by the maxIterations value to get a normalized value that we can
+ then map to a color.
+
+ We use dot product (z.x * z.x + z.y * z.y) to determine the magnitude (length) squared.
+ And once the magnitude squared is > 4, then magnitude > 2 is also true (saves computational power).
+ *************************************************************************************************/
+
+ // The pixel coordinates are scaled so they are on the mandelbrot scale
+ // NOTE: fragTexCoord already comes as normalized screen coordinates but offset must be normalized before scaling and zoom
+ vec2 z = vec2((fragTexCoord.x - 0.5f)*2.5f, (fragTexCoord.y - 0.5f)*1.5f)/zoom;
+ z.x += offset.x;
+ z.y += offset.y;
+
+ int iterations = 0;
+ for (iterations = 0; iterations < maxIterations; iterations++)
+ {
+ z = ComplexSquare(z) + c; // Iterate function
+
+ if (dot(z, z) > 4.0f) break;
+ }
+
+ // Another few iterations decreases errors in the smoothing calculation.
+ // See http://linas.org/art-gallery/escape/escape.html for more information.
+ z = ComplexSquare(z) + c;
+ z = ComplexSquare(z) + c;
+
+ // This last part smooths the color (again see link above).
+ float smoothVal = float(iterations) + 1.0f - (log(log(length(z)))/log(2.0f));
+
+ // Normalize the value so it is between 0 and 1.
+ float norm = smoothVal/float(maxIterations);
+
+ // If in set, color black. 0.999 allows for some float accuracy error.
+ if (norm > 0.999f) finalColor = vec4(0.0f, 0.0f, 0.0f, 1.0f);
+ else finalColor = vec4(Hsv2rgb(vec3(norm*colorCycles, 1.0f, 1.0f)), 1.0f);
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/lighting.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/lighting.fs
new file mode 100644
index 0000000..d2a8e87
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/lighting.fs
@@ -0,0 +1,78 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec3 fragPosition;
+in vec2 fragTexCoord;
+in vec4 fragColor;
+in vec3 fragNormal;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+#define MAX_LIGHTS 4
+#define LIGHT_DIRECTIONAL 0
+#define LIGHT_POINT 1
+
+struct Light {
+ int enabled;
+ int type;
+ vec3 position;
+ vec3 target;
+ vec4 color;
+};
+
+// Input lighting values
+uniform Light lights[MAX_LIGHTS];
+uniform vec4 ambient;
+uniform vec3 viewPos;
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture(texture0, fragTexCoord);
+ vec3 lightDot = vec3(0.0);
+ vec3 normal = normalize(fragNormal);
+ vec3 viewD = normalize(viewPos - fragPosition);
+ vec3 specular = vec3(0.0);
+
+ vec4 tint = colDiffuse * fragColor;
+
+ // NOTE: Implement here your fragment shader code
+
+ for (int i = 0; i < MAX_LIGHTS; i++)
+ {
+ if (lights[i].enabled == 1)
+ {
+ vec3 light = vec3(0.0);
+
+ if (lights[i].type == LIGHT_DIRECTIONAL)
+ {
+ light = -normalize(lights[i].target - lights[i].position);
+ }
+
+ if (lights[i].type == LIGHT_POINT)
+ {
+ light = normalize(lights[i].position - fragPosition);
+ }
+
+ float NdotL = max(dot(normal, light), 0.0);
+ lightDot += lights[i].color.rgb*NdotL;
+
+ float specCo = 0.0;
+ if (NdotL > 0.0) specCo = pow(max(0.0, dot(viewD, reflect(-(light), normal))), 16.0); // 16 refers to shine
+ specular += specCo;
+ }
+ }
+
+ finalColor = (texelColor*((tint + vec4(specular, 1.0))*vec4(lightDot, 1.0)));
+ finalColor += texelColor*(ambient/10.0)*tint;
+
+ // Gamma correction
+ finalColor = pow(finalColor, vec4(1.0/2.2));
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/lighting.vs b/deps/raylib/examples/shaders/resources/shaders/glsl330/lighting.vs
new file mode 100644
index 0000000..f8ec45f
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/lighting.vs
@@ -0,0 +1,32 @@
+#version 330
+
+// Input vertex attributes
+in vec3 vertexPosition;
+in vec2 vertexTexCoord;
+in vec3 vertexNormal;
+in vec4 vertexColor;
+
+// Input uniform values
+uniform mat4 mvp;
+uniform mat4 matModel;
+uniform mat4 matNormal;
+
+// Output vertex attributes (to fragment shader)
+out vec3 fragPosition;
+out vec2 fragTexCoord;
+out vec4 fragColor;
+out vec3 fragNormal;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ // Send vertex attributes to fragment shader
+ fragPosition = vec3(matModel*vec4(vertexPosition, 1.0));
+ fragTexCoord = vertexTexCoord;
+ fragColor = vertexColor;
+ fragNormal = normalize(vec3(matNormal*vec4(vertexNormal, 1.0)));
+
+ // Calculate final vertex position
+ gl_Position = mvp*vec4(vertexPosition, 1.0);
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/lighting_instancing.vs b/deps/raylib/examples/shaders/resources/shaders/glsl330/lighting_instancing.vs
new file mode 100644
index 0000000..3e4da1e
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/lighting_instancing.vs
@@ -0,0 +1,33 @@
+#version 330
+
+// Input vertex attributes
+in vec3 vertexPosition;
+in vec2 vertexTexCoord;
+in vec3 vertexNormal;
+//in vec4 vertexColor; // Not required
+
+in mat4 instanceTransform;
+
+// Input uniform values
+uniform mat4 mvp;
+uniform mat4 matNormal;
+
+// Output vertex attributes (to fragment shader)
+out vec3 fragPosition;
+out vec2 fragTexCoord;
+out vec4 fragColor;
+out vec3 fragNormal;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ // Send vertex attributes to fragment shader
+ fragPosition = vec3(instanceTransform*vec4(vertexPosition, 1.0));
+ fragTexCoord = vertexTexCoord;
+ //fragColor = vertexColor;
+ fragNormal = normalize(vec3(matNormal*vec4(vertexNormal, 1.0)));
+
+ // Calculate final vertex position, note that we multiply mvp by instanceTransform
+ gl_Position = mvp*instanceTransform*vec4(vertexPosition, 1.0);
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/lightmap.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/lightmap.fs
new file mode 100644
index 0000000..827473d
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/lightmap.fs
@@ -0,0 +1,23 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec2 fragTexCoord2;
+in vec3 fragPosition;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform sampler2D texture1;
+
+// Output fragment color
+out vec4 finalColor;
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture(texture0, fragTexCoord);
+ vec4 texelColor2 = texture(texture1, fragTexCoord2);
+
+ finalColor = texelColor * texelColor2;
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/lightmap.vs b/deps/raylib/examples/shaders/resources/shaders/glsl330/lightmap.vs
new file mode 100644
index 0000000..d92c2f0
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/lightmap.vs
@@ -0,0 +1,29 @@
+#version 330
+
+// Input vertex attributes
+in vec3 vertexPosition;
+in vec2 vertexTexCoord;
+in vec2 vertexTexCoord2;
+in vec4 vertexColor;
+
+// Input uniform values
+uniform mat4 mvp;
+uniform mat4 matModel;
+
+// Output vertex attributes (to fragment shader)
+out vec3 fragPosition;
+out vec2 fragTexCoord;
+out vec2 fragTexCoord2;
+out vec4 fragColor;
+
+void main()
+{
+ // Send vertex attributes to fragment shader
+ fragPosition = vec3(matModel*vec4(vertexPosition, 1.0));
+ fragTexCoord = vertexTexCoord;
+ fragTexCoord2 = vertexTexCoord2;
+ fragColor = vertexColor;
+
+ // Calculate final vertex position
+ gl_Position = mvp*vec4(vertexPosition, 1.0);
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/mask.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/mask.fs
new file mode 100644
index 0000000..a93bed0
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/mask.fs
@@ -0,0 +1,22 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform sampler2D mask;
+uniform int frame;
+
+// Output fragment color
+out vec4 finalColor;
+
+void main()
+{
+ vec4 maskColour = texture(mask, fragTexCoord + vec2(sin(-frame/150.0)/10.0, cos(-frame/170.0)/10.0));
+ if (maskColour.r < 0.25) discard;
+ vec4 texelColor = texture(texture0, fragTexCoord + vec2(sin(frame/90.0)/8.0, cos(frame/60.0)/8.0));
+
+ finalColor = texelColor*maskColour;
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/outline.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/outline.fs
new file mode 100644
index 0000000..2584a21
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/outline.fs
@@ -0,0 +1,35 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+uniform vec2 textureSize;
+uniform float outlineSize;
+uniform vec4 outlineColor;
+
+// Output fragment color
+out vec4 finalColor;
+
+void main()
+{
+ vec4 texel = texture(texture0, fragTexCoord); // Get texel color
+ vec2 texelScale = vec2(0.0);
+ texelScale.x = outlineSize/textureSize.x;
+ texelScale.y = outlineSize/textureSize.y;
+
+ // We sample four corner texels, but only for the alpha channel (this is for the outline)
+ vec4 corners = vec4(0.0);
+ corners.x = texture(texture0, fragTexCoord + vec2(texelScale.x, texelScale.y)).a;
+ corners.y = texture(texture0, fragTexCoord + vec2(texelScale.x, -texelScale.y)).a;
+ corners.z = texture(texture0, fragTexCoord + vec2(-texelScale.x, texelScale.y)).a;
+ corners.w = texture(texture0, fragTexCoord + vec2(-texelScale.x, -texelScale.y)).a;
+
+ float outline = min(dot(corners, vec4(1.0)), 1.0);
+ vec4 color = mix(vec4(0.0), outlineColor, outline);
+ finalColor = mix(color, texel, texel.a);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/overdraw.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/overdraw.fs
new file mode 100644
index 0000000..d1a4b6a
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/overdraw.fs
@@ -0,0 +1,26 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ // To show overdraw, we just render all the fragments
+ // with a solid color and some transparency
+
+ // NOTE: This is not a postpro render,
+ // it will only render all screen texture in a plain color
+
+ finalColor = vec4(1.0, 0.0, 0.0, 0.2);
+}
+
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/palette_switch.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/palette_switch.fs
new file mode 100644
index 0000000..6a82529
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/palette_switch.fs
@@ -0,0 +1,33 @@
+#version 330
+
+const int MAX_INDEXED_COLORS = 8;
+
+// Input fragment attributes (from fragment shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform ivec3 palette[MAX_INDEXED_COLORS];
+//uniform sampler2D palette; // Alternative to ivec3, palette provided as a 256x1 texture
+
+// Output fragment color
+out vec4 finalColor;
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ // NOTE: The texel is actually the a GRAYSCALE index color
+ vec4 texelColor = texture(texture0, fragTexCoord)*fragColor;
+
+ // Convert the (normalized) texel color RED component (GB would work, too)
+ // to the palette index by scaling up from [0..1] to [0..255]
+ int index = int(texelColor.r*255.0);
+ ivec3 color = palette[index];
+
+ //finalColor = texture(palette, texelColor.xy); // Alternative to ivec3
+
+ // Calculate final fragment color. Note that the palette color components
+ // are defined in the range [0..255] and need to be normalized to [0..1]
+ finalColor = vec4(color/255.0, texelColor.a);
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/pbr.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/pbr.fs
new file mode 100644
index 0000000..d7544d3
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/pbr.fs
@@ -0,0 +1,162 @@
+#version 330
+
+#define MAX_LIGHTS 4
+#define LIGHT_DIRECTIONAL 0
+#define LIGHT_POINT 1
+#define PI 3.14159265358979323846
+
+struct Light {
+ int enabled;
+ int type;
+ vec3 position;
+ vec3 target;
+ vec4 color;
+ float intensity;
+};
+
+// Input vertex attributes (from vertex shader)
+in vec3 fragPosition;
+in vec2 fragTexCoord;
+in vec4 fragColor;
+in vec3 fragNormal;
+in vec4 shadowPos;
+in mat3 TBN;
+
+// Output fragment color
+out vec4 finalColor;
+
+// Input uniform values
+uniform int numOfLights;
+uniform sampler2D albedoMap;
+uniform sampler2D mraMap;
+uniform sampler2D normalMap;
+uniform sampler2D emissiveMap; // r: Hight g:emissive
+
+uniform vec2 tiling;
+uniform vec2 offset;
+
+uniform int useTexAlbedo;
+uniform int useTexNormal;
+uniform int useTexMRA;
+uniform int useTexEmissive;
+
+uniform vec4 albedoColor;
+uniform vec4 emissiveColor;
+uniform float normalValue;
+uniform float metallicValue;
+uniform float roughnessValue;
+uniform float aoValue;
+uniform float emissivePower;
+
+// Input lighting values
+uniform Light lights[MAX_LIGHTS];
+uniform vec3 viewPos;
+
+uniform vec3 ambientColor;
+uniform float ambient;
+
+// Reflectivity in range 0.0 to 1.0
+// NOTE: Reflectivity is increased when surface view at larger angle
+vec3 SchlickFresnel(float hDotV,vec3 refl)
+{
+ return refl + (1.0 - refl)*pow(1.0 - hDotV, 5.0);
+}
+
+float GgxDistribution(float nDotH,float roughness)
+{
+ float a = roughness * roughness * roughness * roughness;
+ float d = nDotH * nDotH * (a - 1.0) + 1.0;
+ d = PI * d * d;
+ return a / max(d,0.0000001);
+}
+
+float GeomSmith(float nDotV,float nDotL,float roughness)
+{
+ float r = roughness + 1.0;
+ float k = r*r / 8.0;
+ float ik = 1.0 - k;
+ float ggx1 = nDotV/(nDotV*ik + k);
+ float ggx2 = nDotL/(nDotL*ik + k);
+ return ggx1*ggx2;
+}
+
+vec3 ComputePBR()
+{
+ vec3 albedo = texture(albedoMap,vec2(fragTexCoord.x*tiling.x + offset.x, fragTexCoord.y*tiling.y + offset.y)).rgb;
+ albedo = vec3(albedoColor.x*albedo.x, albedoColor.y*albedo.y, albedoColor.z*albedo.z);
+
+ float metallic = clamp(metallicValue, 0.0, 1.0);
+ float roughness = clamp(roughnessValue, 0.0, 1.0);
+ float ao = clamp(aoValue, 0.0, 1.0);
+
+ if (useTexMRA == 1)
+ {
+ vec4 mra = texture(mraMap, vec2(fragTexCoord.x*tiling.x + offset.x, fragTexCoord.y*tiling.y + offset.y))*useTexMRA;
+ metallic = clamp(mra.r + metallicValue, 0.04, 1.0);
+ roughness = clamp(mra.g + roughnessValue, 0.04, 1.0);
+ ao = (mra.b + aoValue)*0.5;
+ }
+
+ vec3 N = normalize(fragNormal);
+ if (useTexNormal == 1)
+ {
+ N = texture(normalMap, vec2(fragTexCoord.x*tiling.x + offset.y, fragTexCoord.y*tiling.y + offset.y)).rgb;
+ N = normalize(N*2.0 - 1.0);
+ N = normalize(N*TBN);
+ }
+
+ vec3 V = normalize(viewPos - fragPosition);
+
+ vec3 emissive = vec3(0);
+ emissive = (texture(emissiveMap, vec2(fragTexCoord.x*tiling.x+offset.x, fragTexCoord.y*tiling.y+offset.y)).rgb).g * emissiveColor.rgb*emissivePower * useTexEmissive;
+
+ // return N;//vec3(metallic,metallic,metallic);
+ // if dia-electric use base reflectivity of 0.04 otherwise ut is a metal use albedo as base reflectivity
+ vec3 baseRefl = mix(vec3(0.04), albedo.rgb, metallic);
+ vec3 lightAccum = vec3(0.0); // Acumulate lighting lum
+
+ for (int i = 0; i < numOfLights; i++)
+ {
+ vec3 L = normalize(lights[i].position - fragPosition); // Compute light vector
+ vec3 H = normalize(V + L); // Compute halfway bisecting vector
+ float dist = length(lights[i].position - fragPosition); // Compute distance to light
+ float attenuation = 1.0/(dist*dist*0.23); // Compute attenuation
+ vec3 radiance = lights[i].color.rgb*lights[i].intensity*attenuation; // Compute input radiance, light energy comming in
+
+ // Cook-Torrance BRDF distribution function
+ float nDotV = max(dot(N,V), 0.0000001);
+ float nDotL = max(dot(N,L), 0.0000001);
+ float hDotV = max(dot(H,V), 0.0);
+ float nDotH = max(dot(N,H), 0.0);
+ float D = GgxDistribution(nDotH, roughness); // Larger the more micro-facets aligned to H
+ float G = GeomSmith(nDotV, nDotL, roughness); // Smaller the more micro-facets shadow
+ vec3 F = SchlickFresnel(hDotV, baseRefl); // Fresnel proportion of specular reflectance
+
+ vec3 spec = (D*G*F)/(4.0*nDotV*nDotL);
+
+ // Difuse and spec light can't be above 1.0
+ // kD = 1.0 - kS diffuse component is equal 1.0 - spec comonent
+ vec3 kD = vec3(1.0) - F;
+
+ // Mult kD by the inverse of metallnes, only non-metals should have diffuse light
+ kD *= 1.0 - metallic;
+ lightAccum += ((kD*albedo.rgb/PI + spec)*radiance*nDotL)*lights[i].enabled; // Angle of light has impact on result
+ }
+
+ vec3 ambientFinal = (ambientColor + albedo)*ambient*0.5;
+
+ return ambientFinal + lightAccum*ao + emissive;
+}
+
+void main()
+{
+ vec3 color = ComputePBR();
+
+ // HDR tonemapping
+ color = pow(color, color + vec3(1.0));
+
+ // Gamma correction
+ color = pow(color, vec3(1.0/2.2));
+
+ finalColor = vec4(color, 1.0);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/pbr.vs b/deps/raylib/examples/shaders/resources/shaders/glsl330/pbr.vs
new file mode 100644
index 0000000..94b0062
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/pbr.vs
@@ -0,0 +1,48 @@
+#version 330
+
+// Input vertex attributes
+in vec3 vertexPosition;
+in vec2 vertexTexCoord;
+in vec3 vertexNormal;
+in vec3 vertexTangent;
+in vec4 vertexColor;
+
+// Input uniform values
+uniform mat4 mvp;
+uniform mat4 matModel;
+uniform mat4 matNormal;
+uniform vec3 lightPos;
+uniform vec4 difColor;
+
+// Output vertex attributes (to fragment shader)
+out vec3 fragPosition;
+out vec2 fragTexCoord;
+out vec4 fragColor;
+out vec3 fragNormal;
+out mat3 TBN;
+
+const float normalOffset = 0.1;
+
+void main()
+{
+ // Compute binormal from vertex normal and tangent
+ vec3 vertexBinormal = cross(vertexNormal, vertexTangent);
+
+ // Compute fragment normal based on normal transformations
+ mat3 normalMatrix = transpose(inverse(mat3(matModel)));
+
+ // Compute fragment position based on model transformations
+ fragPosition = vec3(matModel*vec4(vertexPosition, 1.0f));
+
+ fragTexCoord = vertexTexCoord*2.0;
+ fragNormal = normalize(normalMatrix*vertexNormal);
+ vec3 fragTangent = normalize(normalMatrix*vertexTangent);
+ fragTangent = normalize(fragTangent - dot(fragTangent, fragNormal)*fragNormal);
+ vec3 fragBinormal = normalize(normalMatrix*vertexBinormal);
+ fragBinormal = cross(fragNormal, fragTangent);
+
+ TBN = transpose(mat3(fragTangent, fragBinormal, fragNormal));
+
+ // Calculate final vertex position
+ gl_Position = mvp*vec4(vertexPosition, 1.0);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/pixelizer.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/pixelizer.fs
new file mode 100644
index 0000000..cf8aec4
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/pixelizer.fs
@@ -0,0 +1,33 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+// NOTE: Render size values must be passed from code
+const float renderWidth = 800;
+const float renderHeight = 450;
+
+uniform float pixelWidth = 5.0;
+uniform float pixelHeight = 5.0;
+
+void main()
+{
+ float dx = pixelWidth*(1.0/renderWidth);
+ float dy = pixelHeight*(1.0/renderHeight);
+
+ vec2 coord = vec2(dx*floor(fragTexCoord.x/dx), dy*floor(fragTexCoord.y/dy));
+
+ vec3 tc = texture(texture0, coord).rgb;
+
+ finalColor = vec4(tc, 1.0);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/posterization.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/posterization.fs
new file mode 100644
index 0000000..cf84585
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/posterization.fs
@@ -0,0 +1,31 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+float gamma = 0.6;
+float numColors = 8.0;
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec3 texelColor = texture(texture0, fragTexCoord.xy).rgb;
+
+ texelColor = pow(texelColor, vec3(gamma, gamma, gamma));
+ texelColor = texelColor*numColors;
+ texelColor = floor(texelColor);
+ texelColor = texelColor/numColors;
+ texelColor = pow(texelColor, vec3(1.0/gamma));
+
+ finalColor = vec4(texelColor, 1.0);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/predator.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/predator.fs
new file mode 100644
index 0000000..c0db7b3
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/predator.fs
@@ -0,0 +1,32 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec3 texelColor = texture(texture0, fragTexCoord).rgb;
+ vec3 colors[3];
+ colors[0] = vec3(0.0, 0.0, 1.0);
+ colors[1] = vec3(1.0, 1.0, 0.0);
+ colors[2] = vec3(1.0, 0.0, 0.0);
+
+ float lum = (texelColor.r + texelColor.g + texelColor.b)/3.0;
+
+ int ix = (lum < 0.5)? 0:1;
+
+ vec3 tc = mix(colors[ix], colors[ix + 1], (lum - float(ix)*0.5)/0.5);
+
+ finalColor = vec4(tc, 1.0);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/raymarching.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/raymarching.fs
new file mode 100644
index 0000000..6a9eb45
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/raymarching.fs
@@ -0,0 +1,430 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Output fragment color
+out vec4 finalColor;
+
+uniform vec3 viewEye;
+uniform vec3 viewCenter;
+uniform float runTime;
+uniform vec2 resolution;
+
+// The MIT License
+// Copyright © 2013 Inigo Quilez
+// 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.
+
+// A list of useful distance function to simple primitives, and an example on how to
+// do some interesting boolean operations, repetition and displacement.
+//
+// More info here: http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm
+
+#define AA 1 // make this 1 is your machine is too slow
+
+//------------------------------------------------------------------
+
+float sdPlane( vec3 p )
+{
+ return p.y;
+}
+
+float sdSphere( vec3 p, float s )
+{
+ return length(p)-s;
+}
+
+float sdBox( vec3 p, vec3 b )
+{
+ vec3 d = abs(p) - b;
+ return min(max(d.x,max(d.y,d.z)),0.0) + length(max(d,0.0));
+}
+
+float sdEllipsoid( in vec3 p, in vec3 r )
+{
+ return (length( p/r ) - 1.0) * min(min(r.x,r.y),r.z);
+}
+
+float udRoundBox( vec3 p, vec3 b, float r )
+{
+ return length(max(abs(p)-b,0.0))-r;
+}
+
+float sdTorus( vec3 p, vec2 t )
+{
+ return length( vec2(length(p.xz)-t.x,p.y) )-t.y;
+}
+
+float sdHexPrism( vec3 p, vec2 h )
+{
+ vec3 q = abs(p);
+#if 0
+ return max(q.z-h.y,max((q.x*0.866025+q.y*0.5),q.y)-h.x);
+#else
+ float d1 = q.z-h.y;
+ float d2 = max((q.x*0.866025+q.y*0.5),q.y)-h.x;
+ return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.);
+#endif
+}
+
+float sdCapsule( vec3 p, vec3 a, vec3 b, float r )
+{
+ vec3 pa = p-a, ba = b-a;
+ float h = clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );
+ return length( pa - ba*h ) - r;
+}
+
+float sdEquilateralTriangle( in vec2 p )
+{
+ const float k = sqrt(3.0);
+ p.x = abs(p.x) - 1.0;
+ p.y = p.y + 1.0/k;
+ if( p.x + k*p.y > 0.0 ) p = vec2( p.x - k*p.y, -k*p.x - p.y )/2.0;
+ p.x += 2.0 - 2.0*clamp( (p.x+2.0)/2.0, 0.0, 1.0 );
+ return -length(p)*sign(p.y);
+}
+
+float sdTriPrism( vec3 p, vec2 h )
+{
+ vec3 q = abs(p);
+ float d1 = q.z-h.y;
+#if 1
+ // distance bound
+ float d2 = max(q.x*0.866025+p.y*0.5,-p.y)-h.x*0.5;
+#else
+ // correct distance
+ h.x *= 0.866025;
+ float d2 = sdEquilateralTriangle(p.xy/h.x)*h.x;
+#endif
+ return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.);
+}
+
+float sdCylinder( vec3 p, vec2 h )
+{
+ vec2 d = abs(vec2(length(p.xz),p.y)) - h;
+ return min(max(d.x,d.y),0.0) + length(max(d,0.0));
+}
+
+float sdCone( in vec3 p, in vec3 c )
+{
+ vec2 q = vec2( length(p.xz), p.y );
+ float d1 = -q.y-c.z;
+ float d2 = max( dot(q,c.xy), q.y);
+ return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.);
+}
+
+float sdConeSection( in vec3 p, in float h, in float r1, in float r2 )
+{
+ float d1 = -p.y - h;
+ float q = p.y - h;
+ float si = 0.5*(r1-r2)/h;
+ float d2 = max( sqrt( dot(p.xz,p.xz)*(1.0-si*si)) + q*si - r2, q );
+ return length(max(vec2(d1,d2),0.0)) + min(max(d1,d2), 0.);
+}
+
+float sdPryamid4(vec3 p, vec3 h ) // h = { cos a, sin a, height }
+{
+ // Tetrahedron = Octahedron - Cube
+ float box = sdBox( p - vec3(0,-2.0*h.z,0), vec3(2.0*h.z) );
+
+ float d = 0.0;
+ d = max( d, abs( dot(p, vec3( -h.x, h.y, 0 )) ));
+ d = max( d, abs( dot(p, vec3( h.x, h.y, 0 )) ));
+ d = max( d, abs( dot(p, vec3( 0, h.y, h.x )) ));
+ d = max( d, abs( dot(p, vec3( 0, h.y,-h.x )) ));
+ float octa = d - h.z;
+ return max(-box,octa); // Subtraction
+ }
+
+float length2( vec2 p )
+{
+ return sqrt( p.x*p.x + p.y*p.y );
+}
+
+float length6( vec2 p )
+{
+ p = p*p*p; p = p*p;
+ return pow( p.x + p.y, 1.0/6.0 );
+}
+
+float length8( vec2 p )
+{
+ p = p*p; p = p*p; p = p*p;
+ return pow( p.x + p.y, 1.0/8.0 );
+}
+
+float sdTorus82( vec3 p, vec2 t )
+{
+ vec2 q = vec2(length2(p.xz)-t.x,p.y);
+ return length8(q)-t.y;
+}
+
+float sdTorus88( vec3 p, vec2 t )
+{
+ vec2 q = vec2(length8(p.xz)-t.x,p.y);
+ return length8(q)-t.y;
+}
+
+float sdCylinder6( vec3 p, vec2 h )
+{
+ return max( length6(p.xz)-h.x, abs(p.y)-h.y );
+}
+
+//------------------------------------------------------------------
+
+float opS( float d1, float d2 )
+{
+ return max(-d2,d1);
+}
+
+vec2 opU( vec2 d1, vec2 d2 )
+{
+ return (d1.x<d2.x) ? d1 : d2;
+}
+
+vec3 opRep( vec3 p, vec3 c )
+{
+ return mod(p,c)-0.5*c;
+}
+
+vec3 opTwist( vec3 p )
+{
+ float c = cos(10.0*p.y+10.0);
+ float s = sin(10.0*p.y+10.0);
+ mat2 m = mat2(c,-s,s,c);
+ return vec3(m*p.xz,p.y);
+}
+
+//------------------------------------------------------------------
+
+vec2 map( in vec3 pos )
+{
+ vec2 res = opU( vec2( sdPlane( pos), 1.0 ),
+ vec2( sdSphere( pos-vec3( 0.0,0.25, 0.0), 0.25 ), 46.9 ) );
+ res = opU( res, vec2( sdBox( pos-vec3( 1.0,0.25, 0.0), vec3(0.25) ), 3.0 ) );
+ res = opU( res, vec2( udRoundBox( pos-vec3( 1.0,0.25, 1.0), vec3(0.15), 0.1 ), 41.0 ) );
+ res = opU( res, vec2( sdTorus( pos-vec3( 0.0,0.25, 1.0), vec2(0.20,0.05) ), 25.0 ) );
+ res = opU( res, vec2( sdCapsule( pos,vec3(-1.3,0.10,-0.1), vec3(-0.8,0.50,0.2), 0.1 ), 31.9 ) );
+ res = opU( res, vec2( sdTriPrism( pos-vec3(-1.0,0.25,-1.0), vec2(0.25,0.05) ),43.5 ) );
+ res = opU( res, vec2( sdCylinder( pos-vec3( 1.0,0.30,-1.0), vec2(0.1,0.2) ), 8.0 ) );
+ res = opU( res, vec2( sdCone( pos-vec3( 0.0,0.50,-1.0), vec3(0.8,0.6,0.3) ), 55.0 ) );
+ res = opU( res, vec2( sdTorus82( pos-vec3( 0.0,0.25, 2.0), vec2(0.20,0.05) ),50.0 ) );
+ res = opU( res, vec2( sdTorus88( pos-vec3(-1.0,0.25, 2.0), vec2(0.20,0.05) ),43.0 ) );
+ res = opU( res, vec2( sdCylinder6( pos-vec3( 1.0,0.30, 2.0), vec2(0.1,0.2) ), 12.0 ) );
+ res = opU( res, vec2( sdHexPrism( pos-vec3(-1.0,0.20, 1.0), vec2(0.25,0.05) ),17.0 ) );
+ res = opU( res, vec2( sdPryamid4( pos-vec3(-1.0,0.15,-2.0), vec3(0.8,0.6,0.25) ),37.0 ) );
+ res = opU( res, vec2( opS( udRoundBox( pos-vec3(-2.0,0.2, 1.0), vec3(0.15),0.05),
+ sdSphere( pos-vec3(-2.0,0.2, 1.0), 0.25)), 13.0 ) );
+ res = opU( res, vec2( opS( sdTorus82( pos-vec3(-2.0,0.2, 0.0), vec2(0.20,0.1)),
+ sdCylinder( opRep( vec3(atan(pos.x+2.0,pos.z)/6.2831, pos.y, 0.02+0.5*length(pos-vec3(-2.0,0.2, 0.0))), vec3(0.05,1.0,0.05)), vec2(0.02,0.6))), 51.0 ) );
+ res = opU( res, vec2( 0.5*sdSphere( pos-vec3(-2.0,0.25,-1.0), 0.2 ) + 0.03*sin(50.0*pos.x)*sin(50.0*pos.y)*sin(50.0*pos.z), 65.0 ) );
+ res = opU( res, vec2( 0.5*sdTorus( opTwist(pos-vec3(-2.0,0.25, 2.0)),vec2(0.20,0.05)), 46.7 ) );
+ res = opU( res, vec2( sdConeSection( pos-vec3( 0.0,0.35,-2.0), 0.15, 0.2, 0.1 ), 13.67 ) );
+ res = opU( res, vec2( sdEllipsoid( pos-vec3( 1.0,0.35,-2.0), vec3(0.15, 0.2, 0.05) ), 43.17 ) );
+
+ return res;
+}
+
+vec2 castRay( in vec3 ro, in vec3 rd )
+{
+ float tmin = 0.2;
+ float tmax = 30.0;
+
+#if 1
+ // bounding volume
+ float tp1 = (0.0-ro.y)/rd.y; if( tp1>0.0 ) tmax = min( tmax, tp1 );
+ float tp2 = (1.6-ro.y)/rd.y; if( tp2>0.0 ) { if( ro.y>1.6 ) tmin = max( tmin, tp2 );
+ else tmax = min( tmax, tp2 ); }
+#endif
+
+ float t = tmin;
+ float m = -1.0;
+ for( int i=0; i<64; i++ )
+ {
+ float precis = 0.0005*t;
+ vec2 res = map( ro+rd*t );
+ if( res.x<precis || t>tmax ) break;
+ t += res.x;
+ m = res.y;
+ }
+
+ if( t>tmax ) m=-1.0;
+ return vec2( t, m );
+}
+
+
+float calcSoftshadow( in vec3 ro, in vec3 rd, in float mint, in float tmax )
+{
+ float res = 1.0;
+ float t = mint;
+ for( int i=0; i<16; i++ )
+ {
+ float h = map( ro + rd*t ).x;
+ res = min( res, 8.0*h/t );
+ t += clamp( h, 0.02, 0.10 );
+ if( h<0.001 || t>tmax ) break;
+ }
+ return clamp( res, 0.0, 1.0 );
+}
+
+vec3 calcNormal( in vec3 pos )
+{
+ vec2 e = vec2(1.0,-1.0)*0.5773*0.0005;
+ return normalize( e.xyy*map( pos + e.xyy ).x +
+ e.yyx*map( pos + e.yyx ).x +
+ e.yxy*map( pos + e.yxy ).x +
+ e.xxx*map( pos + e.xxx ).x );
+ /*
+ vec3 eps = vec3( 0.0005, 0.0, 0.0 );
+ vec3 nor = vec3(
+ map(pos+eps.xyy).x - map(pos-eps.xyy).x,
+ map(pos+eps.yxy).x - map(pos-eps.yxy).x,
+ map(pos+eps.yyx).x - map(pos-eps.yyx).x );
+ return normalize(nor);
+ */
+}
+
+float calcAO( in vec3 pos, in vec3 nor )
+{
+ float occ = 0.0;
+ float sca = 1.0;
+ for( int i=0; i<5; i++ )
+ {
+ float hr = 0.01 + 0.12*float(i)/4.0;
+ vec3 aopos = nor * hr + pos;
+ float dd = map( aopos ).x;
+ occ += -(dd-hr)*sca;
+ sca *= 0.95;
+ }
+ return clamp( 1.0 - 3.0*occ, 0.0, 1.0 );
+}
+
+// http://iquilezles.org/www/articles/checkerfiltering/checkerfiltering.htm
+float checkersGradBox( in vec2 p )
+{
+ // filter kernel
+ vec2 w = fwidth(p) + 0.001;
+ // analytical integral (box filter)
+ vec2 i = 2.0*(abs(fract((p-0.5*w)*0.5)-0.5)-abs(fract((p+0.5*w)*0.5)-0.5))/w;
+ // xor pattern
+ return 0.5 - 0.5*i.x*i.y;
+}
+
+vec3 render( in vec3 ro, in vec3 rd )
+{
+ vec3 col = vec3(0.7, 0.9, 1.0) +rd.y*0.8;
+ vec2 res = castRay(ro,rd);
+ float t = res.x;
+ float m = res.y;
+ if( m>-0.5 )
+ {
+ vec3 pos = ro + t*rd;
+ vec3 nor = calcNormal( pos );
+ vec3 ref = reflect( rd, nor );
+
+ // material
+ col = 0.45 + 0.35*sin( vec3(0.05,0.08,0.10)*(m-1.0) );
+ if( m<1.5 )
+ {
+
+ float f = checkersGradBox( 5.0*pos.xz );
+ col = 0.3 + f*vec3(0.1);
+ }
+
+ // lighting
+ float occ = calcAO( pos, nor );
+ vec3 lig = normalize( vec3(cos(-0.4 * runTime), sin(0.7 * runTime), -0.6) );
+ vec3 hal = normalize( lig-rd );
+ float amb = clamp( 0.5+0.5*nor.y, 0.0, 1.0 );
+ float dif = clamp( dot( nor, lig ), 0.0, 1.0 );
+ float bac = clamp( dot( nor, normalize(vec3(-lig.x,0.0,-lig.z))), 0.0, 1.0 )*clamp( 1.0-pos.y,0.0,1.0);
+ float dom = smoothstep( -0.1, 0.1, ref.y );
+ float fre = pow( clamp(1.0+dot(nor,rd),0.0,1.0), 2.0 );
+
+ dif *= calcSoftshadow( pos, lig, 0.02, 2.5 );
+ dom *= calcSoftshadow( pos, ref, 0.02, 2.5 );
+
+ float spe = pow( clamp( dot( nor, hal ), 0.0, 1.0 ),16.0)*
+ dif *
+ (0.04 + 0.96*pow( clamp(1.0+dot(hal,rd),0.0,1.0), 5.0 ));
+
+ vec3 lin = vec3(0.0);
+ lin += 1.30*dif*vec3(1.00,0.80,0.55);
+ lin += 0.40*amb*vec3(0.40,0.60,1.00)*occ;
+ lin += 0.50*dom*vec3(0.40,0.60,1.00)*occ;
+ lin += 0.50*bac*vec3(0.25,0.25,0.25)*occ;
+ lin += 0.25*fre*vec3(1.00,1.00,1.00)*occ;
+ col = col*lin;
+ col += 10.00*spe*vec3(1.00,0.90,0.70);
+
+ col = mix( col, vec3(0.8,0.9,1.0), 1.0-exp( -0.0002*t*t*t ) );
+ }
+
+ return vec3( clamp(col,0.0,1.0) );
+}
+
+mat3 setCamera( in vec3 ro, in vec3 ta, float cr )
+{
+ vec3 cw = normalize(ta-ro);
+ vec3 cp = vec3(sin(cr), cos(cr),0.0);
+ vec3 cu = normalize( cross(cw,cp) );
+ vec3 cv = normalize( cross(cu,cw) );
+ return mat3( cu, cv, cw );
+}
+
+void main()
+{
+ vec3 tot = vec3(0.0);
+#if AA>1
+ for( int m=0; m<AA; m++ )
+ for( int n=0; n<AA; n++ )
+ {
+ // pixel coordinates
+ vec2 o = vec2(float(m),float(n)) / float(AA) - 0.5;
+ vec2 p = (-resolution.xy + 2.0*(gl_FragCoord.xy+o))/resolution.y;
+#else
+ vec2 p = (-resolution.xy + 2.0*gl_FragCoord.xy)/resolution.y;
+#endif
+
+ // RAY: Camera is provided from raylib
+ //vec3 ro = vec3( -0.5+3.5*cos(0.1*time + 6.0*mo.x), 1.0 + 2.0*mo.y, 0.5 + 4.0*sin(0.1*time + 6.0*mo.x) );
+
+ vec3 ro = viewEye;
+ vec3 ta = viewCenter;
+
+ // camera-to-world transformation
+ mat3 ca = setCamera( ro, ta, 0.0 );
+ // ray direction
+ vec3 rd = ca * normalize( vec3(p.xy,2.0) );
+
+ // render
+ vec3 col = render( ro, rd );
+
+ // gamma
+ col = pow( col, vec3(0.4545) );
+
+ tot += col;
+#if AA>1
+ }
+ tot /= float(AA*AA);
+#endif
+
+ finalColor = vec4( tot, 1.0 );
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/reload.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/reload.fs
new file mode 100644
index 0000000..59fdcba
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/reload.fs
@@ -0,0 +1,40 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord; // Texture coordinates (sampler2D)
+in vec4 fragColor; // Tint color
+
+// Output fragment color
+out vec4 finalColor; // Output fragment color
+
+// Uniform inputs
+uniform vec2 resolution; // Viewport resolution (in pixels)
+uniform vec2 mouse; // Mouse pixel xy coordinates
+uniform float time; // Total run time (in secods)
+
+// Draw circle
+vec4 DrawCircle(vec2 fragCoord, vec2 position, float radius, vec3 color)
+{
+ float d = length(position - fragCoord) - radius;
+ float t = clamp(d, 0.0, 1.0);
+ return vec4(color, 1.0 - t);
+}
+
+void main()
+{
+ vec2 fragCoord = gl_FragCoord.xy;
+ vec2 position = vec2(mouse.x, resolution.y - mouse.y);
+ float radius = 40.0;
+
+ // Draw background layer
+ vec4 colorA = vec4(0.2,0.2,0.8, 1.0);
+ vec4 colorB = vec4(1.0,0.7,0.2, 1.0);
+ vec4 layer1 = mix(colorA, colorB, abs(sin(time*0.1)));
+
+ // Draw circle layer
+ vec3 color = vec3(0.9, 0.16, 0.21);
+ vec4 layer2 = DrawCircle(fragCoord, position, radius, color);
+
+ // Blend the two layers
+ finalColor = mix(layer1, layer2, layer2.a);
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/scanlines.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/scanlines.fs
new file mode 100644
index 0000000..2c4c6fd
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/scanlines.fs
@@ -0,0 +1,49 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+// NOTE: Render size values must be passed from code
+const float renderWidth = 800;
+const float renderHeight = 450;
+float offset = 0.0;
+
+uniform float time;
+
+void main()
+{
+ float frequency = renderHeight/3.0;
+/*
+ // Scanlines method 1
+ float tval = 0; //time
+ vec2 uv = 0.5 + (fragTexCoord - 0.5)*(0.9 + 0.01*sin(0.5*tval));
+
+ vec4 color = texture(texture0, fragTexCoord);
+
+ color = clamp(color*0.5 + 0.5*color*color*1.2, 0.0, 1.0);
+ color *= 0.5 + 0.5*16.0*uv.x*uv.y*(1.0 - uv.x)*(1.0 - uv.y);
+ color *= vec4(0.8, 1.0, 0.7, 1);
+ color *= 0.9 + 0.1*sin(10.0*tval + uv.y*1000.0);
+ color *= 0.97 + 0.03*sin(110.0*tval);
+
+ fragColor = color;
+*/
+ // Scanlines method 2
+ float globalPos = (fragTexCoord.y + offset) * frequency;
+ float wavePos = cos((fract(globalPos) - 0.5)*3.14);
+
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture(texture0, fragTexCoord);
+
+ finalColor = mix(vec4(0.0, 0.3, 0.0, 0.0), texelColor, wavePos);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/shadowmap.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/shadowmap.fs
new file mode 100644
index 0000000..506b51a
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/shadowmap.fs
@@ -0,0 +1,86 @@
+#version 330
+
+// This shader is based on the basic lighting shader
+// This only supports one light, which is directional, and it (of course) supports shadows
+
+// Input vertex attributes (from vertex shader)
+in vec3 fragPosition;
+in vec2 fragTexCoord;
+//in vec4 fragColor;
+in vec3 fragNormal;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// Input lighting values
+uniform vec3 lightDir;
+uniform vec4 lightColor;
+uniform vec4 ambient;
+uniform vec3 viewPos;
+
+// Input shadowmapping values
+uniform mat4 lightVP; // Light source view-projection matrix
+uniform sampler2D shadowMap;
+
+uniform int shadowMapResolution;
+
+void main()
+{
+ // Texel color fetching from texture sampler
+ vec4 texelColor = texture(texture0, fragTexCoord);
+ vec3 lightDot = vec3(0.0);
+ vec3 normal = normalize(fragNormal);
+ vec3 viewD = normalize(viewPos - fragPosition);
+ vec3 specular = vec3(0.0);
+
+ vec3 l = -lightDir;
+
+ float NdotL = max(dot(normal, l), 0.0);
+ lightDot += lightColor.rgb*NdotL;
+
+ float specCo = 0.0;
+ if (NdotL > 0.0) specCo = pow(max(0.0, dot(viewD, reflect(-(l), normal))), 16.0); // 16 refers to shine
+ specular += specCo;
+
+ finalColor = (texelColor*((colDiffuse + vec4(specular, 1.0))*vec4(lightDot, 1.0)));
+
+ // Shadow calculations
+ vec4 fragPosLightSpace = lightVP * vec4(fragPosition, 1);
+ fragPosLightSpace.xyz /= fragPosLightSpace.w; // Perform the perspective division
+ fragPosLightSpace.xyz = (fragPosLightSpace.xyz + 1.0f) / 2.0f; // Transform from [-1, 1] range to [0, 1] range
+ vec2 sampleCoords = fragPosLightSpace.xy;
+ float curDepth = fragPosLightSpace.z;
+ // Slope-scale depth bias: depth biasing reduces "shadow acne" artifacts, where dark stripes appear all over the scene.
+ // The solution is adding a small bias to the depth
+ // In this case, the bias is proportional to the slope of the surface, relative to the light
+ float bias = max(0.0002 * (1.0 - dot(normal, l)), 0.00002) + 0.00001;
+ int shadowCounter = 0;
+ const int numSamples = 9;
+ // PCF (percentage-closer filtering) algorithm:
+ // Instead of testing if just one point is closer to the current point,
+ // we test the surrounding points as well.
+ // This blurs shadow edges, hiding aliasing artifacts.
+ vec2 texelSize = vec2(1.0f / float(shadowMapResolution));
+ for (int x = -1; x <= 1; x++)
+ {
+ for (int y = -1; y <= 1; y++)
+ {
+ float sampleDepth = texture(shadowMap, sampleCoords + texelSize * vec2(x, y)).r;
+ if (curDepth - bias > sampleDepth)
+ {
+ shadowCounter++;
+ }
+ }
+ }
+ finalColor = mix(finalColor, vec4(0, 0, 0, 1), float(shadowCounter) / float(numSamples));
+
+ // Add ambient lighting whether in shadow or not
+ finalColor += texelColor*(ambient/10.0)*colDiffuse;
+
+ // Gamma correction
+ finalColor = pow(finalColor, vec4(1.0/2.2));
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/shadowmap.vs b/deps/raylib/examples/shaders/resources/shaders/glsl330/shadowmap.vs
new file mode 100644
index 0000000..f8ec45f
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/shadowmap.vs
@@ -0,0 +1,32 @@
+#version 330
+
+// Input vertex attributes
+in vec3 vertexPosition;
+in vec2 vertexTexCoord;
+in vec3 vertexNormal;
+in vec4 vertexColor;
+
+// Input uniform values
+uniform mat4 mvp;
+uniform mat4 matModel;
+uniform mat4 matNormal;
+
+// Output vertex attributes (to fragment shader)
+out vec3 fragPosition;
+out vec2 fragTexCoord;
+out vec4 fragColor;
+out vec3 fragNormal;
+
+// NOTE: Add here your custom variables
+
+void main()
+{
+ // Send vertex attributes to fragment shader
+ fragPosition = vec3(matModel*vec4(vertexPosition, 1.0));
+ fragTexCoord = vertexTexCoord;
+ fragColor = vertexColor;
+ fragNormal = normalize(vec3(matNormal*vec4(vertexNormal, 1.0)));
+
+ // Calculate final vertex position
+ gl_Position = mvp*vec4(vertexPosition, 1.0);
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/sobel.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/sobel.fs
new file mode 100644
index 0000000..f76e9ca
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/sobel.fs
@@ -0,0 +1,41 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+uniform vec2 resolution = vec2(800, 450);
+
+void main()
+{
+ float x = 1.0/resolution.x;
+ float y = 1.0/resolution.y;
+
+ vec4 horizEdge = vec4(0.0);
+ horizEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y - y))*1.0;
+ horizEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y ))*2.0;
+ horizEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y + y))*1.0;
+ horizEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y - y))*1.0;
+ horizEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y ))*2.0;
+ horizEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y + y))*1.0;
+
+ vec4 vertEdge = vec4(0.0);
+ vertEdge -= texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y - y))*1.0;
+ vertEdge -= texture2D(texture0, vec2(fragTexCoord.x , fragTexCoord.y - y))*2.0;
+ vertEdge -= texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y - y))*1.0;
+ vertEdge += texture2D(texture0, vec2(fragTexCoord.x - x, fragTexCoord.y + y))*1.0;
+ vertEdge += texture2D(texture0, vec2(fragTexCoord.x , fragTexCoord.y + y))*2.0;
+ vertEdge += texture2D(texture0, vec2(fragTexCoord.x + x, fragTexCoord.y + y))*1.0;
+
+ vec3 edge = sqrt((horizEdge.rgb*horizEdge.rgb) + (vertEdge.rgb*vertEdge.rgb));
+
+ finalColor = vec4(edge, texture2D(texture0, fragTexCoord).a);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/spotlight.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/spotlight.fs
new file mode 100644
index 0000000..02cddf4
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/spotlight.fs
@@ -0,0 +1,65 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+#define MAX_SPOTS 3
+
+struct Spot {
+ vec2 pos; // window coords of spot
+ float inner; // inner fully transparent centre radius
+ float radius; // alpha fades out to this radius
+};
+
+uniform Spot spots[MAX_SPOTS]; // Spotlight positions array
+uniform float screenWidth; // Width of the screen
+
+void main()
+{
+ float alpha = 1.0;
+
+ // 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
+ int fi = -1; // found index
+
+ for (int i = 0; i < MAX_SPOTS; i++)
+ {
+ for (int j = 0; j < MAX_SPOTS; j++)
+ {
+ float dj = distance(pos, spots[j].pos) - spots[j].radius + spots[i].radius;
+
+ if (d > dj)
+ {
+ d = dj;
+ fi = i;
+ }
+ }
+ }
+
+ // d now equals distance to nearest spot...
+ // allowing for the different radii of all spotlights
+ if (fi != -1)
+ {
+ if (d > spots[fi].radius) alpha = 1.0;
+ else
+ {
+ if (d < spots[fi].inner) alpha = 0.0;
+ else alpha = (d - spots[fi].inner) / (spots[fi].radius - spots[fi].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;
+
+ finalColor = vec4(0, 0, 0, alpha);
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/swirl.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/swirl.fs
new file mode 100644
index 0000000..bb0732c
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/swirl.fs
@@ -0,0 +1,47 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+// NOTE: Add here your custom variables
+
+// NOTE: Render size values should be passed from code
+const float renderWidth = 800;
+const float renderHeight = 450;
+
+float radius = 250.0;
+float angle = 0.8;
+
+uniform vec2 center = vec2(200.0, 200.0);
+
+void main()
+{
+ vec2 texSize = vec2(renderWidth, renderHeight);
+ vec2 tc = fragTexCoord*texSize;
+ tc -= center;
+
+ float dist = length(tc);
+
+ if (dist < radius)
+ {
+ float percent = (radius - dist)/radius;
+ float theta = percent*percent*angle*8.0;
+ float s = sin(theta);
+ float c = cos(theta);
+
+ tc = vec2(dot(tc, vec2(c, -s)), dot(tc, vec2(s, c)));
+ }
+
+ tc += center;
+ vec4 color = texture2D(texture0, tc/texSize)*colDiffuse*fragColor;;
+
+ finalColor = vec4(color.rgb, 1.0);;
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/tiling.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/tiling.fs
new file mode 100644
index 0000000..6e7f524
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/tiling.fs
@@ -0,0 +1,14 @@
+#version 330 core
+
+uniform sampler2D diffuseMap;
+uniform vec2 tiling;
+
+in vec2 fragTexCoord;
+
+out vec4 fragColor;
+
+void main()
+{
+ vec2 texCoord = fragTexCoord * tiling;
+ fragColor = texture(diffuseMap, texCoord);
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/vertex_displacement.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/vertex_displacement.fs
new file mode 100644
index 0000000..424f526
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/vertex_displacement.fs
@@ -0,0 +1,16 @@
+#version 330
+
+// Input fragment attributes (from fragment shader)
+in vec2 fragTexCoord;
+in float height;
+
+// Output fragment color
+out vec4 finalColor;
+
+void main()
+{
+ vec4 darkblue = vec4(0.0, 0.13, 0.18, 1.0);
+ vec4 lightblue = vec4(1.0, 1.0, 1.0, 1.0);
+ // interplate between two colors based on height
+ finalColor = mix(darkblue, lightblue, height);
+} \ No newline at end of file
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/vertex_displacement.vs b/deps/raylib/examples/shaders/resources/shaders/glsl330/vertex_displacement.vs
new file mode 100644
index 0000000..73cf161
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/vertex_displacement.vs
@@ -0,0 +1,46 @@
+#version 330
+
+// Input vertex attributes
+in vec3 vertexPosition;
+in vec2 vertexTexCoord;
+in vec3 vertexNormal;
+in vec4 vertexColor;
+
+// Input uniform values
+uniform mat4 mvp;
+uniform mat4 matModel;
+uniform mat4 matNormal;
+
+uniform float time;
+
+uniform sampler2D perlinNoiseMap;
+
+// Output vertex attributes (to fragment shader)
+out vec3 fragPosition;
+out vec2 fragTexCoord;
+out vec3 fragNormal;
+out float height;
+
+void main()
+{
+ // Calculate animated texture coordinates based on time and vertex position
+ vec2 animatedTexCoord = sin(vertexTexCoord + vec2(sin(time + vertexPosition.x * 0.1), cos(time + vertexPosition.z * 0.1)) * 0.3);
+
+ // Normalize animated texture coordinates to range [0, 1]
+ animatedTexCoord = animatedTexCoord * 0.5 + 0.5;
+
+ // Fetch displacement from the perlin noise map
+ float displacement = texture(perlinNoiseMap, animatedTexCoord).r * 7; // Amplified displacement
+
+ // Displace vertex position
+ vec3 displacedPosition = vertexPosition + vec3(0.0, displacement, 0.0);
+
+ // Send vertex attributes to fragment shader
+ fragPosition = vec3(matModel*vec4(displacedPosition, 1.0));
+ fragTexCoord = vertexTexCoord;
+ fragNormal = normalize(vec3(matNormal*vec4(vertexNormal, 1.0)));
+ height = displacedPosition.y * 0.2; // send height to fragment shader for coloring
+
+ // Calculate final vertex position
+ gl_Position = mvp*vec4(displacedPosition , 1.0);
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/wave.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/wave.fs
new file mode 100644
index 0000000..1f22bee
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/wave.fs
@@ -0,0 +1,37 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+uniform float seconds;
+
+uniform vec2 size;
+
+uniform float freqX;
+uniform float freqY;
+uniform float ampX;
+uniform float ampY;
+uniform float speedX;
+uniform float speedY;
+
+void main() {
+ float pixelWidth = 1.0 / size.x;
+ float pixelHeight = 1.0 / size.y;
+ float aspect = pixelHeight / pixelWidth;
+ float boxLeft = 0.0;
+ float boxTop = 0.0;
+
+ vec2 p = fragTexCoord;
+ p.x += cos((fragTexCoord.y - boxTop) * freqX / ( pixelWidth * 750.0) + (seconds * speedX)) * ampX * pixelWidth;
+ p.y += sin((fragTexCoord.x - boxLeft) * freqY * aspect / ( pixelHeight * 750.0) + (seconds * speedY)) * ampY * pixelHeight;
+
+ finalColor = texture(texture0, p)*colDiffuse*fragColor;
+}
diff --git a/deps/raylib/examples/shaders/resources/shaders/glsl330/write_depth.fs b/deps/raylib/examples/shaders/resources/shaders/glsl330/write_depth.fs
new file mode 100644
index 0000000..f0e07be
--- /dev/null
+++ b/deps/raylib/examples/shaders/resources/shaders/glsl330/write_depth.fs
@@ -0,0 +1,20 @@
+#version 330
+
+// Input vertex attributes (from vertex shader)
+in vec2 fragTexCoord;
+in vec4 fragColor;
+
+// Input uniform values
+uniform sampler2D texture0;
+uniform vec4 colDiffuse;
+
+// Output fragment color
+out vec4 finalColor;
+
+void main()
+{
+ vec4 texelColor = texture(texture0, fragTexCoord);
+
+ finalColor = texelColor*colDiffuse*fragColor;
+ gl_FragDepth = 1.0 - finalColor.z;
+}