diff --git a/examples/Makefile b/examples/Makefile index 74335fe84..534adee8d 100644 --- a/examples/Makefile +++ b/examples/Makefile @@ -85,6 +85,8 @@ ifeq ($(PLATFORM),PLATFORM_DESKTOP) # add standard directories for GNU/Linux ifeq ($(PLATFORM_OS),LINUX) INCLUDES = -I. -I../src -I/usr/local/include/raylib/ + else ifeq ($(PLATFORM_OS),OSX) + INCLUDES = -I. -I../src else INCLUDES = -I. -I../../src -IC:/raylib/raylib/src # external libraries headers @@ -103,6 +105,8 @@ ifeq ($(PLATFORM),PLATFORM_DESKTOP) # add standard directories for GNU/Linux ifeq ($(PLATFORM_OS),LINUX) LFLAGS = -L. -L../../src + else ifeq ($(PLATFORM_OS),OSX) + LFLAGS = -L. -L../src else LFLAGS = -L. -L../../src -LC:/raylib/raylib/src # external libraries to link with @@ -129,7 +133,7 @@ ifeq ($(PLATFORM),PLATFORM_DESKTOP) # libraries for OS X 10.9 desktop compiling # requires the following packages: # libglfw3-dev libopenal-dev libegl1-mesa-dev - LIBS = -lraylib -lglfw -framework OpenGL -framework OpenAl -framework Cocoa + LIBS = -lraylib -lglfw3 -framework OpenGL -framework OpenAl -framework Cocoa else # libraries for Windows desktop compiling # NOTE: GLFW3 and OpenAL Soft libraries should be installed diff --git a/examples/resources/shaders/glsl100/bloom.fs b/examples/resources/shaders/glsl100/bloom.fs index 5a08843d7..280d2fb66 100644 --- a/examples/resources/shaders/glsl100/bloom.fs +++ b/examples/resources/shaders/glsl100/bloom.fs @@ -33,5 +33,5 @@ void main() else if (texelColor.r < 0.5) tc = sum*sum*0.009 + texelColor; else tc = sum*sum*0.0075 + texelColor; - finalColor = tc; + gl_FragColor = tc; } \ No newline at end of file diff --git a/examples/resources/shaders/glsl100/swirl.fs b/examples/resources/shaders/glsl100/swirl.fs index e77d4f872..0d6d24f26 100644 --- a/examples/resources/shaders/glsl100/swirl.fs +++ b/examples/resources/shaders/glsl100/swirl.fs @@ -20,7 +20,7 @@ float angle = 0.8; uniform vec2 center = vec2(200.0, 200.0); -void main (void) +void main() { vec2 texSize = vec2(renderWidth, renderHeight); vec2 tc = fragTexCoord*texSize; diff --git a/examples/resources/shaders/glsl330/bloom.fs b/examples/resources/shaders/glsl330/bloom.fs index c8cb0d32e..0307bc06e 100644 --- a/examples/resources/shaders/glsl330/bloom.fs +++ b/examples/resources/shaders/glsl330/bloom.fs @@ -17,12 +17,12 @@ void main() { vec4 sum = vec4(0); vec4 tc = vec4(0); - + for (int i = -4; i < 4; i++) { for (int j = -3; j < 3; j++) { - sum += texture2D(texture0, fragTexCoord + vec2(j, i)*0.004)*0.25; + sum += texture(texture0, fragTexCoord + vec2(j, i)*0.004)*0.25; } } diff --git a/examples/resources/shaders/glsl330/phong.fs b/examples/resources/shaders/glsl330/phong.fs index 80e3d6735..c14b346a9 100644 --- a/examples/resources/shaders/glsl330/phong.fs +++ b/examples/resources/shaders/glsl330/phong.fs @@ -29,6 +29,9 @@ uniform float matGlossiness = 50.0; uniform vec3 lightPosition; uniform vec3 cameraPosition; +// Fragment shader output data +out vec4 fragColor; + // Calculate ambient lighting component vec3 AmbientLighting() { diff --git a/examples/resources/shaders/glsl330/swirl.fs b/examples/resources/shaders/glsl330/swirl.fs index b1dc82f01..80c16cc9e 100644 --- a/examples/resources/shaders/glsl330/swirl.fs +++ b/examples/resources/shaders/glsl330/swirl.fs @@ -21,7 +21,7 @@ float angle = 0.8; uniform vec2 center = vec2(200.0, 200.0); -void main (void) +void main() { vec2 texSize = vec2(renderWidth, renderHeight); vec2 tc = fragTexCoord*texSize; @@ -40,7 +40,7 @@ void main (void) } tc += center; - vec3 color = texture2D(texture0, tc/texSize).rgb; + vec3 color = texture(texture0, tc/texSize).rgb; finalColor = vec4(color, 1.0);; } \ No newline at end of file diff --git a/shaders/glsl100/base.vs b/shaders/glsl100/base.vs index 9f339382b..e93869396 100644 --- a/shaders/glsl100/base.vs +++ b/shaders/glsl100/base.vs @@ -1,20 +1,26 @@ #version 100 +// Input vertex attributes attribute vec3 vertexPosition; attribute vec2 vertexTexCoord; attribute vec3 vertexNormal; +attribute vec4 vertexColor; -varying vec2 fragTexCoord; - +// Input uniform values uniform mat4 mvpMatrix; +// Output vertex attributes (to fragment shader) +varying vec2 fragTexCoord; +varying vec4 fragColor; + // NOTE: Add here your custom variables void main() { - vec3 normal = vertexNormal; - + // Send vertex attributes to fragment shader fragTexCoord = vertexTexCoord; + fragColor = vertexColor; + // Calculate final vertex position gl_Position = mvpMatrix*vec4(vertexPosition, 1.0); } \ No newline at end of file diff --git a/shaders/glsl100/bloom.fs b/shaders/glsl100/bloom.fs index 33754c7ef..280d2fb66 100644 --- a/shaders/glsl100/bloom.fs +++ b/shaders/glsl100/bloom.fs @@ -2,8 +2,11 @@ precision mediump float; +// Input vertex attributes (from vertex shader) varying vec2 fragTexCoord; +varying vec4 fragColor; +// Input uniform values uniform sampler2D texture0; uniform vec4 fragTintColor; @@ -22,21 +25,13 @@ void main() } } - if (texture2D(texture0, fragTexCoord).r < 0.3) - { - tc = sum*sum*0.012 + texture2D(texture0, fragTexCoord); - } - else - { - if (texture2D(texture0, fragTexCoord).r < 0.5) - { - tc = sum*sum*0.009 + texture2D(texture0, fragTexCoord); - } - else - { - tc = sum*sum*0.0075 + texture2D(texture0, fragTexCoord); - } - } + // Texel color fetching from texture sampler + vec4 texelColor = texture(texture0, fragTexCoord); + + // Calculate final fragment color + if (texelColor.r < 0.3) tc = sum*sum*0.012 + texelColor; + else if (texelColor.r < 0.5) tc = sum*sum*0.009 + texelColor; + else tc = sum*sum*0.0075 + texelColor; gl_FragColor = tc; } \ No newline at end of file diff --git a/shaders/glsl100/blur.fs b/shaders/glsl100/blur.fs index a1069c6fd..80d408343 100644 --- a/shaders/glsl100/blur.fs +++ b/shaders/glsl100/blur.fs @@ -2,7 +2,11 @@ precision mediump float; +// Input vertex attributes (from vertex shader) varying vec2 fragTexCoord; +varying vec4 fragColor; + +// Input uniform values uniform sampler2D texture0; uniform vec4 fragTintColor; @@ -16,6 +20,7 @@ float weight[3] = float[]( 0.2270270270, 0.3162162162, 0.0702702703 ); void main() { + // Texel color fetching from texture sampler vec3 tc = texture2D(texture0, fragTexCoord).rgb*weight[0]; for (int i = 1; i < 3; i++) diff --git a/shaders/glsl100/cross_hatching.fs b/shaders/glsl100/cross_hatching.fs index cf01b65ed..1f7dab087 100644 --- a/shaders/glsl100/cross_hatching.fs +++ b/shaders/glsl100/cross_hatching.fs @@ -2,12 +2,15 @@ precision mediump float; +// Input vertex attributes (from vertex shader) varying vec2 fragTexCoord; +varying vec4 fragColor; +// Input uniform values uniform sampler2D texture0; uniform vec4 fragTintColor; -// NOTE: Add here your custom variables +// NOTE: Add here your custom variables float hatchOffsetY = 5.0f; float lumThreshold01 = 0.9f; diff --git a/shaders/glsl100/cross_stitching.fs b/shaders/glsl100/cross_stitching.fs index f1afef048..6fabc027c 100644 --- a/shaders/glsl100/cross_stitching.fs +++ b/shaders/glsl100/cross_stitching.fs @@ -2,8 +2,11 @@ precision mediump float; +// Input vertex attributes (from vertex shader) varying vec2 fragTexCoord; +varying vec4 fragColor; +// Input uniform values uniform sampler2D texture0; uniform vec4 fragTintColor; @@ -46,7 +49,7 @@ vec4 PostFX(sampler2D tex, vec2 uv) return c; } -void main(void) +void main() { vec3 tc = PostFX(texture0, fragTexCoord).rgb; diff --git a/shaders/glsl100/dream_vision.fs b/shaders/glsl100/dream_vision.fs index bb8289700..d0cdc6874 100644 --- a/shaders/glsl100/dream_vision.fs +++ b/shaders/glsl100/dream_vision.fs @@ -2,8 +2,11 @@ precision mediump float; +// Input vertex attributes (from vertex shader) varying vec2 fragTexCoord; +varying vec4 fragColor; +// Input uniform values uniform sampler2D texture0; uniform vec4 fragTintColor; diff --git a/shaders/glsl100/fisheye.fs b/shaders/glsl100/fisheye.fs index e7a4485c7..9dba297b3 100644 --- a/shaders/glsl100/fisheye.fs +++ b/shaders/glsl100/fisheye.fs @@ -2,12 +2,15 @@ precision mediump float; +// Input vertex attributes (from vertex shader) varying vec2 fragTexCoord; +varying vec4 fragColor; +// Input uniform values uniform sampler2D texture0; uniform vec4 fragTintColor; -// NOTE: Add here your custom variables +// NOTE: Add here your custom variables const float PI = 3.1415926535; diff --git a/shaders/glsl100/grayscale.fs b/shaders/glsl100/grayscale.fs index e55545e22..f92ec335c 100644 --- a/shaders/glsl100/grayscale.fs +++ b/shaders/glsl100/grayscale.fs @@ -2,8 +2,11 @@ precision mediump float; +// Input vertex attributes (from vertex shader) varying vec2 fragTexCoord; +varying vec4 fragColor; +// Input uniform values uniform sampler2D texture0; uniform vec4 fragTintColor; @@ -11,10 +14,12 @@ uniform vec4 fragTintColor; void main() { - vec4 base = texture2D(texture0, fragTexCoord)*fragTintColor; + // Texel color fetching from texture sampler + vec4 texelColor = texture(texture0, fragTexCoord)*fragTintColor*fragColor; - // Convert to grayscale using NTSC conversion weights - float gray = dot(base.rgb, vec3(0.299, 0.587, 0.114)); + // Convert texel color to grayscale using NTSC conversion weights + float gray = dot(texelColor.rgb, vec3(0.299, 0.587, 0.114)); - gl_FragColor = vec4(gray, gray, gray, fragTintColor.a); + // Calculate final fragment color + gl_FragColor = vec4(gray, gray, gray, texelColor.a); } \ No newline at end of file diff --git a/shaders/glsl100/pixel.fs b/shaders/glsl100/pixel.fs index 552e89004..c532f2190 100644 --- a/shaders/glsl100/pixel.fs +++ b/shaders/glsl100/pixel.fs @@ -2,8 +2,11 @@ precision mediump float; +// Input vertex attributes (from vertex shader) varying vec2 fragTexCoord; +varying vec4 fragColor; +// Input uniform values uniform sampler2D texture0; uniform vec4 fragTintColor; diff --git a/shaders/glsl100/posterization.fs b/shaders/glsl100/posterization.fs index 4f4c4b935..801ca89cc 100644 --- a/shaders/glsl100/posterization.fs +++ b/shaders/glsl100/posterization.fs @@ -2,8 +2,11 @@ precision mediump float; +// Input vertex attributes (from vertex shader) varying vec2 fragTexCoord; +varying vec4 fragColor; +// Input uniform values uniform sampler2D texture0; uniform vec4 fragTintColor; diff --git a/shaders/glsl100/predator.fs b/shaders/glsl100/predator.fs index 2fbdc7afb..1f0e2ce54 100644 --- a/shaders/glsl100/predator.fs +++ b/shaders/glsl100/predator.fs @@ -2,8 +2,11 @@ precision mediump float; +// Input vertex attributes (from vertex shader) varying vec2 fragTexCoord; +varying vec4 fragColor; +// Input uniform values uniform sampler2D texture0; uniform vec4 fragTintColor; diff --git a/shaders/glsl100/scanlines.fs b/shaders/glsl100/scanlines.fs index 85de158d8..d885e10b3 100644 --- a/shaders/glsl100/scanlines.fs +++ b/shaders/glsl100/scanlines.fs @@ -2,8 +2,11 @@ precision mediump float; +// Input vertex attributes (from vertex shader) varying vec2 fragTexCoord; +varying vec4 fragColor; +// Input uniform values uniform sampler2D texture0; uniform vec4 fragTintColor; @@ -14,7 +17,7 @@ float frequency = 720/3.0; uniform float time; -void main (void) +void main() { /* // Scanlines method 1 diff --git a/shaders/glsl100/swirl.fs b/shaders/glsl100/swirl.fs index b0d54b235..0d6d24f26 100644 --- a/shaders/glsl100/swirl.fs +++ b/shaders/glsl100/swirl.fs @@ -2,28 +2,32 @@ precision mediump float; +// Input vertex attributes (from vertex shader) varying vec2 fragTexCoord; +varying vec4 fragColor; +// Input uniform values uniform sampler2D texture0; uniform vec4 fragTintColor; // NOTE: Add here your custom variables -const float renderWidth = 1280; -const float renderHeight = 720; +const float renderWidth = 800.0; // HARDCODED for example! +const float renderHeight = 480.0; // Use uniforms instead... float radius = 250.0; float angle = 0.8; -uniform vec2 center = vec2(200, 200); +uniform vec2 center = vec2(200.0, 200.0); -void main (void) +void main() { vec2 texSize = vec2(renderWidth, renderHeight); vec2 tc = fragTexCoord*texSize; tc -= center; - float dist = length(tc); + float dist = length(tc); + if (dist < radius) { float percent = (radius - dist)/radius; @@ -33,7 +37,7 @@ void main (void) tc = vec2(dot(tc, vec2(c, -s)), dot(tc, vec2(s, c))); } - + tc += center; vec3 color = texture2D(texture0, tc/texSize).rgb; diff --git a/shaders/glsl100/template.fs b/shaders/glsl100/template.fs index 1f4b8ccfa..a39428907 100644 --- a/shaders/glsl100/template.fs +++ b/shaders/glsl100/template.fs @@ -2,8 +2,11 @@ precision mediump float; +// Input vertex attributes (from vertex shader) varying vec2 fragTexCoord; +varying vec4 fragColor; +// Input uniform values uniform sampler2D texture0; uniform vec4 fragTintColor; @@ -11,6 +14,7 @@ uniform vec4 fragTintColor; void main() { + // Texel color fetching from texture sampler vec4 texelColor = texture2D(texture0, fragTexCoord); // NOTE: Implement here your fragment shader code diff --git a/shaders/glsl330/base.vs b/shaders/glsl330/base.vs index b0f930b70..638cb8aee 100644 --- a/shaders/glsl330/base.vs +++ b/shaders/glsl330/base.vs @@ -1,18 +1,26 @@ #version 330 +// Input vertex attributes in vec3 vertexPosition; in vec2 vertexTexCoord; in vec3 vertexNormal; +in vec4 vertexColor; -out vec2 fragTexCoord; - +// Input uniform values uniform mat4 mvpMatrix; +// 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 = mvpMatrix*vec4(vertexPosition, 1.0); } \ No newline at end of file diff --git a/shaders/glsl330/bloom.fs b/shaders/glsl330/bloom.fs index 34b6295c6..0307bc06e 100644 --- a/shaders/glsl330/bloom.fs +++ b/shaders/glsl330/bloom.fs @@ -1,12 +1,16 @@ #version 330 +// Input vertex attributes (from vertex shader) in vec2 fragTexCoord; +in vec4 fragColor; -out vec4 fragColor; - +// Input uniform values uniform sampler2D texture0; uniform vec4 fragTintColor; +// Output fragment color +out vec4 finalColor; + // NOTE: Add here your custom variables void main() @@ -18,25 +22,17 @@ void main() { for (int j = -3; j < 3; j++) { - sum += texture(texture0, fragTexCoord + vec2(j, i)*0.004) * 0.25; + sum += texture(texture0, fragTexCoord + vec2(j, i)*0.004)*0.25; } } - if (texture(texture0, fragTexCoord).r < 0.3) - { - tc = sum*sum*0.012 + texture(texture0, fragTexCoord); - } - else - { - if (texture(texture0, fragTexCoord).r < 0.5) - { - tc = sum*sum*0.009 + texture(texture0, fragTexCoord); - } - else - { - tc = sum*sum*0.0075 + texture(texture0, fragTexCoord); - } - } + // Texel color fetching from texture sampler + vec4 texelColor = texture(texture0, fragTexCoord); - fragColor = tc; + // Calculate final fragment color + if (texelColor.r < 0.3) tc = sum*sum*0.012 + texelColor; + else if (texelColor.r < 0.5) tc = sum*sum*0.009 + texelColor; + else tc = sum*sum*0.0075 + texelColor; + + finalColor = tc; } \ No newline at end of file diff --git a/shaders/glsl330/blur.fs b/shaders/glsl330/blur.fs index 44ea42b14..7c31f727a 100644 --- a/shaders/glsl330/blur.fs +++ b/shaders/glsl330/blur.fs @@ -1,12 +1,16 @@ #version 330 +// Input vertex attributes (from vertex shader) in vec2 fragTexCoord; +in vec4 fragColor; -out vec4 fragColor; - +// Input uniform values uniform sampler2D texture0; uniform vec4 fragTintColor; +// Output fragment color +out vec4 finalColor; + // NOTE: Add here your custom variables const float renderWidth = 1280.0; @@ -17,13 +21,14 @@ float weight[3] = float[](0.2270270270, 0.3162162162, 0.0702702703); void main() { - vec3 tc = texture(texture0, fragTexCoord).rgb*weight[0]; - + // Texel color fetching from texture sampler + vec3 texelColor = texture(texture0, fragTexCoord).rgb*weight[0]; + for (int i = 1; i < 3; i++) { - tc += texture(texture0, fragTexCoord + vec2(offset[i])/renderWidth, 0.0).rgb*weight[i]; - tc += 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]; + texelColor += texture(texture0, fragTexCoord - vec2(offset[i])/renderWidth, 0.0).rgb*weight[i]; } - fragColor = vec4(tc, 1.0); + finalColor = vec4(texelColor, 1.0); } \ No newline at end of file diff --git a/shaders/glsl330/cross_hatching.fs b/shaders/glsl330/cross_hatching.fs index 6f5df9647..c12c48cd9 100644 --- a/shaders/glsl330/cross_hatching.fs +++ b/shaders/glsl330/cross_hatching.fs @@ -1,13 +1,17 @@ #version 330 +// Input vertex attributes (from vertex shader) in vec2 fragTexCoord; +in vec4 fragColor; -out vec4 fragColor; - +// Input uniform values uniform sampler2D texture0; uniform vec4 fragTintColor; -// NOTE: Add here your custom variables +// Output fragment color +out vec4 finalColor; + +// NOTE: Add here your custom variables float hatchOffsetY = 5.0; float lumThreshold01 = 0.9; @@ -27,18 +31,18 @@ void main() if (lum < lumThreshold02) { - if (mod(gl_FragCoord .x - gl_FragCoord .y, 10.0) == 0.0) tc = vec3(0.0, 0.0, 0.0); + 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 (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); + if (mod(gl_FragCoord.x - gl_FragCoord.y - hatchOffsetY, 10.0) == 0.0) tc = vec3(0.0, 0.0, 0.0); } - fragColor = vec4(tc, 1.0); + finalColor = vec4(tc, 1.0); } \ No newline at end of file diff --git a/shaders/glsl330/cross_stitching.fs b/shaders/glsl330/cross_stitching.fs index dcb26e79b..7c87c6cdf 100644 --- a/shaders/glsl330/cross_stitching.fs +++ b/shaders/glsl330/cross_stitching.fs @@ -1,12 +1,16 @@ #version 330 +// Input vertex attributes (from vertex shader) in vec2 fragTexCoord; +in vec4 fragColor; -out vec4 fragColor; - +// Input uniform values uniform sampler2D texture0; uniform vec4 fragTintColor; +// Output fragment color +out vec4 finalColor; + // NOTE: Add here your custom variables const float renderWidth = 1280.0; @@ -46,9 +50,9 @@ vec4 PostFX(sampler2D tex, vec2 uv) return c; } -void main(void) +void main() { vec3 tc = PostFX(texture0, fragTexCoord).rgb; - fragColor = vec4(tc, 1.0); + finalColor = vec4(tc, 1.0); } \ No newline at end of file diff --git a/shaders/glsl330/depth.fs b/shaders/glsl330/depth.fs new file mode 100644 index 000000000..06d399f9f --- /dev/null +++ b/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 fragTintColor; + +// 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/shaders/glsl330/grayscale.fs b/shaders/glsl330/grayscale.fs index b3a695bfb..d4a8824f6 100644 --- a/shaders/glsl330/grayscale.fs +++ b/shaders/glsl330/grayscale.fs @@ -1,20 +1,26 @@ #version 330 +// Input vertex attributes (from vertex shader) in vec2 fragTexCoord; +in vec4 fragColor; -out vec4 fragColor; - +// Input uniform values uniform sampler2D texture0; uniform vec4 fragTintColor; +// Output fragment color +out vec4 finalColor; + // NOTE: Add here your custom variables void main() { - vec4 base = texture(texture0, fragTexCoord)*fragTintColor; + // Texel color fetching from texture sampler + vec4 texelColor = texture(texture0, fragTexCoord)*fragTintColor*fragColor; - // Convert to grayscale using NTSC conversion weights - float gray = dot(base.rgb, vec3(0.299, 0.587, 0.114)); + // Convert texel color to grayscale using NTSC conversion weights + float gray = dot(texelColor.rgb, vec3(0.299, 0.587, 0.114)); - fragColor = vec4(gray, gray, gray, fragTintColor.a); + // Calculate final fragment color + finalColor = vec4(gray, gray, gray, texelColor.a); } \ No newline at end of file diff --git a/shaders/glsl330/phong.fs b/shaders/glsl330/phong.fs index 75b7e6d73..c14b346a9 100644 --- a/shaders/glsl330/phong.fs +++ b/shaders/glsl330/phong.fs @@ -1,76 +1,85 @@ #version 330 -// Vertex shader input data +// Input vertex attributes (from vertex shader) in vec2 fragTexCoord; in vec3 fragNormal; -// Diffuse data +// Input uniform values uniform sampler2D texture0; uniform vec4 fragTintColor; -// Light attributes -uniform vec3 light_ambientColor = vec3(0.6, 0.3, 0); -uniform vec3 light_diffuseColor = vec3(1, 0.5, 0); -uniform vec3 light_specularColor = vec3(0, 1, 0); -uniform float light_intensity = 1; -uniform float light_specIntensity = 1; +// Output fragment color +out vec4 finalColor; -// Material attributes -uniform vec3 mat_ambientColor = vec3(1, 1, 1); -uniform vec3 mat_specularColor = vec3(1, 1, 1); -uniform float mat_glossiness = 50; +// NOTE: Add here your custom variables -// World attributes -uniform vec3 lightPos; -uniform vec3 cameraPos; +// Light uniform values +uniform vec3 lightAmbientColor = vec3(0.6, 0.3, 0.0); +uniform vec3 lightDiffuseColor = vec3(1.0, 0.5, 0.0); +uniform vec3 lightSpecularColor = vec3(0.0, 1.0, 0.0); +uniform float lightIntensity = 1.0; +uniform float lightSpecIntensity = 1.0; + +// Material uniform values +uniform vec3 matAmbientColor = vec3(1.0, 1.0, 1.0); +uniform vec3 matSpecularColor = vec3(1.0, 1.0, 1.0); +uniform float matGlossiness = 50.0; + +// World uniform values +uniform vec3 lightPosition; +uniform vec3 cameraPosition; // Fragment shader output data out vec4 fragColor; +// Calculate ambient lighting component vec3 AmbientLighting() { - return mat_ambientColor * light_ambientColor; + return (matAmbientColor*lightAmbientColor); } +// Calculate diffuse lighting component vec3 DiffuseLighting(in vec3 N, in vec3 L) { - // Lambertian reflection calculation - float diffuse = clamp(dot(N, L), 0, 1); - - return tintColor.xyz * light_diffuseColor * light_intensity * diffuse; + // Lambertian reflection calculation + float diffuse = clamp(dot(N, L), 0, 1); + + return (fragTintColor.xyz*lightDiffuseColor*lightIntensity*diffuse); } +// Calculate specular lighting component vec3 SpecularLighting(in vec3 N, in vec3 L, in vec3 V) { - float specular = 0; + float specular = 0.0; - // Calculate specular reflection only if the surface is oriented to the light source - if(dot(N, L) > 0) - { - // Calculate half vector - vec3 H = normalize(L + V); - - // Calculate specular intensity - specular = pow(dot(N, H), 3 + mat_glossiness); - } + // Calculate specular reflection only if the surface is oriented to the light source + if (dot(N, L) > 0) + { + // Calculate half vector + vec3 H = normalize(L + V); + + // Calculate specular intensity + specular = pow(dot(N, H), 3 + matGlossiness); + } - return mat_specularColor * light_specularColor * light_specIntensity * specular; + return (matSpecularColor*lightSpecularColor*lightSpecIntensity*specular); } void main() { // Normalize input vectors - vec3 L = normalize(lightPos); - vec3 V = normalize(cameraPos); + vec3 L = normalize(lightPosition); + vec3 V = normalize(cameraPosition); vec3 N = normalize(fragNormal); + // Calculate lighting components vec3 ambient = AmbientLighting(); vec3 diffuse = DiffuseLighting(N, L); vec3 specular = SpecularLighting(N, L, V); - // Get base color from texture - vec4 textureColor = texture(texture0, fragTexCoord); - vec3 finalColor = textureColor.rgb; - - fragColor = vec4(finalColor * (ambient + diffuse + specular), textureColor.a); + // Texel color fetching from texture sampler + vec4 texelColor = texture(texture0, fragTexCoord); + + // Calculate final fragment color + finalColor = vec4(texelColor.rgb*(ambient + diffuse + specular), texelColor.a); } \ No newline at end of file diff --git a/shaders/glsl330/phong.vs b/shaders/glsl330/phong.vs index ee6d34bfa..d68d9b3fc 100644 --- a/shaders/glsl330/phong.vs +++ b/shaders/glsl330/phong.vs @@ -1,23 +1,25 @@ #version 330 -// Vertex input data +// Input vertex attributes in vec3 vertexPosition; in vec2 vertexTexCoord; in vec3 vertexNormal; -// Projection and model data +// Input uniform values uniform mat4 mvpMatrix; -uniform mat4 modelMatrix; -// Attributes to fragment shader +// Output vertex attributes (to fragment shader) out vec2 fragTexCoord; out vec3 fragNormal; +// NOTE: Add here your custom variables +uniform mat4 modelMatrix; + void main() { - // Send texture coord to fragment shader + // Send vertex attributes to fragment shader fragTexCoord = vertexTexCoord; - + // Calculate view vector normal from model mat3 normalMatrix = transpose(inverse(mat3(modelMatrix))); fragNormal = normalize(normalMatrix*vertexNormal); diff --git a/shaders/glsl330/pixel.fs b/shaders/glsl330/pixel.fs index aa5a22fe1..9ed3ea7d0 100644 --- a/shaders/glsl330/pixel.fs +++ b/shaders/glsl330/pixel.fs @@ -1,13 +1,17 @@ #version 330 +// Input vertex attributes (from vertex shader) in vec2 fragTexCoord; +in vec4 fragColor; -out vec4 fragColor; - +// Input uniform values uniform sampler2D texture0; uniform vec4 fragTintColor; -// NOTE: Add here your custom variables +// Output fragment color +out vec4 finalColor; + +// NOTE: Add here your custom variables const float renderWidth = 1280.0; const float renderHeight = 720.0; @@ -24,5 +28,5 @@ void main() vec3 tc = texture(texture0, coord).rgb; - fragColor = vec4(tc, 1.0); + finalColor = vec4(tc, 1.0); } \ No newline at end of file diff --git a/shaders/glsl330/posterization.fs b/shaders/glsl330/posterization.fs index 5215bd8bc..f1d72a196 100644 --- a/shaders/glsl330/posterization.fs +++ b/shaders/glsl330/posterization.fs @@ -1,12 +1,16 @@ #version 330 +// Input vertex attributes (from vertex shader) in vec2 fragTexCoord; +in vec4 fragColor; -out vec4 fragColor; - +// Input uniform values uniform sampler2D texture0; uniform vec4 fragTintColor; +// Output fragment color +out vec4 finalColor; + // NOTE: Add here your custom variables float gamma = 0.6; @@ -14,13 +18,14 @@ float numColors = 8.0; void main() { - vec3 color = texture(texture0, fragTexCoord.xy).rgb; + // Texel color fetching from texture sampler + vec3 texelColor = texture(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)); + texelColor = pow(texelColor, vec3(gamma, gamma, gamma)); + texelColor = texelColor*numColors; + texelColor = floor(texelColor); + texelColor = texelColor/numColors; + texelColor = pow(texelColor, vec3(1.0/gamma)); - fragColor = vec4(color, 1.0); + finalColor = vec4(texelColor, 1.0); } \ No newline at end of file diff --git a/shaders/glsl330/predator.fs b/shaders/glsl330/predator.fs index 85c93d0cd..9269dfd4c 100644 --- a/shaders/glsl330/predator.fs +++ b/shaders/glsl330/predator.fs @@ -1,27 +1,32 @@ #version 330 +// Input vertex attributes (from vertex shader) in vec2 fragTexCoord; +in vec4 fragColor; -out vec4 fragColor; - +// Input uniform values uniform sampler2D texture0; uniform vec4 fragTintColor; +// Output fragment color +out vec4 finalColor; + // NOTE: Add here your custom variables void main() { - vec3 color = texture(texture0, fragTexCoord).rgb; + // 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 = (color.r + color.g + color.b)/3.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); - fragColor = vec4(tc, 1.0); + finalColor = vec4(tc, 1.0); } \ No newline at end of file diff --git a/shaders/glsl330/scanlines.fs b/shaders/glsl330/scanlines.fs index 0c89e6107..177f000df 100644 --- a/shaders/glsl330/scanlines.fs +++ b/shaders/glsl330/scanlines.fs @@ -1,12 +1,16 @@ #version 330 +// Input vertex attributes (from vertex shader) in vec2 fragTexCoord; +in vec4 fragColor; -out vec4 fragColor; - +// Input uniform values uniform sampler2D texture0; uniform vec4 fragTintColor; +// Output fragment color +out vec4 finalColor; + // NOTE: Add here your custom variables float offset = 0.0; @@ -14,7 +18,7 @@ float frequency = 720.0/3.0; uniform float time; -void main (void) +void main() { /* // Scanlines method 1 @@ -35,7 +39,8 @@ void main (void) float globalPos = (fragTexCoord.y + offset) * frequency; float wavePos = cos((fract(globalPos) - 0.5)*3.14); - vec4 color = texture(texture0, fragTexCoord); + // Texel color fetching from texture sampler + vec4 texelColor = texture(texture0, fragTexCoord); - fragColor = mix(vec4(0.0, 0.3, 0.0, 0.0), color, wavePos); + finalColor = mix(vec4(0.0, 0.3, 0.0, 0.0), texelColor, wavePos); } \ No newline at end of file diff --git a/shaders/glsl330/swirl.fs b/shaders/glsl330/swirl.fs index 19d7468b1..80c16cc9e 100644 --- a/shaders/glsl330/swirl.fs +++ b/shaders/glsl330/swirl.fs @@ -1,27 +1,32 @@ #version 330 +// Input vertex attributes (from vertex shader) in vec2 fragTexCoord; +in vec4 fragColor; -out vec4 fragColor; - +// Input uniform values uniform sampler2D texture0; uniform vec4 fragTintColor; +// Output fragment color +out vec4 finalColor; + // NOTE: Add here your custom variables -const float renderWidth = 1280.0; -const float renderHeight = 720.0; +const float renderWidth = 800.0; // HARDCODED for example! +const float renderHeight = 480.0; // Use uniforms instead... float radius = 250.0; float angle = 0.8; uniform vec2 center = vec2(200.0, 200.0); -void main (void) +void main() { vec2 texSize = vec2(renderWidth, renderHeight); vec2 tc = fragTexCoord*texSize; tc -= center; + float dist = length(tc); if (dist < radius) @@ -37,5 +42,5 @@ void main (void) tc += center; vec3 color = texture(texture0, tc/texSize).rgb; - fragColor = vec4(color, 1.0);; + finalColor = vec4(color, 1.0);; } \ No newline at end of file diff --git a/shaders/glsl330/template.fs b/shaders/glsl330/template.fs index ad7210a4c..55b8d4a49 100644 --- a/shaders/glsl330/template.fs +++ b/shaders/glsl330/template.fs @@ -1,19 +1,24 @@ #version 330 +// Input vertex attributes (from vertex shader) in vec2 fragTexCoord; +in vec4 fragColor; -out vec4 fragColor; - +// Input uniform values uniform sampler2D texture0; uniform vec4 fragTintColor; +// 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 - fragColor = texelColor*fragTintColor; + finalColor = texelColor*fragTintColor; } diff --git a/src/core.c b/src/core.c index 54d42f837..a94ad48d0 100644 --- a/src/core.c +++ b/src/core.c @@ -1447,7 +1447,11 @@ static void InitDisplay(int width, int height) glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); // Choose OpenGL minor version (just hint) glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // Profiles Hint: Only 3.3 and above! // Other values: GLFW_OPENGL_ANY_PROFILE, GLFW_OPENGL_COMPAT_PROFILE +#ifdef __APPLE__ + glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // OSX Requires +#else glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_FALSE); // Fordward Compatibility Hint: Only 3.3 and above! +#endif //glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE); } diff --git a/src/models.c b/src/models.c index 066b919ed..bb2d56c25 100644 --- a/src/models.c +++ b/src/models.c @@ -691,31 +691,14 @@ Model LoadCubicmap(Image cubicmap) return model; } -// Unload 3d model from memory +// Unload 3d model from memory (mesh and material) void UnloadModel(Model model) { - // Unload mesh data - if (model.mesh.vertices != NULL) free(model.mesh.vertices); - if (model.mesh.texcoords != NULL) free(model.mesh.texcoords); - if (model.mesh.normals != NULL) free(model.mesh.normals); - if (model.mesh.colors != NULL) free(model.mesh.colors); - if (model.mesh.tangents != NULL) free(model.mesh.tangents); - if (model.mesh.texcoords2 != NULL) free(model.mesh.texcoords2); - if (model.mesh.indices != NULL) free(model.mesh.indices); - - TraceLog(INFO, "Unloaded model data from RAM (CPU)"); - - rlDeleteBuffers(model.mesh.vboId[0]); // vertex - rlDeleteBuffers(model.mesh.vboId[1]); // texcoords - rlDeleteBuffers(model.mesh.vboId[2]); // normals - rlDeleteBuffers(model.mesh.vboId[3]); // colors - rlDeleteBuffers(model.mesh.vboId[4]); // tangents - rlDeleteBuffers(model.mesh.vboId[5]); // texcoords2 - rlDeleteBuffers(model.mesh.vboId[6]); // indices + rlglUnloadMesh(&model.mesh); - rlDeleteVertexArrays(model.mesh.vaoId); - UnloadMaterial(model.material); + + TraceLog(INFO, "Unloaded model data from RAM and VRAM"); } // Load material data (from file) @@ -1247,40 +1230,27 @@ void DrawModelEx(Model model, Vector3 position, Vector3 rotationAxis, float rota model.transform = MatrixMultiply(MatrixMultiply(matScale, matRotation), matTranslation); model.material.colDiffuse = tint; - rlglDrawEx(model.mesh, model.material, model.transform, false); + rlglDrawMesh(model.mesh, model.material, model.transform); } // Draw a model wires (with texture if set) void DrawModelWires(Model model, Vector3 position, float scale, Color tint) { - Vector3 vScale = { scale, scale, scale }; - Vector3 rotationAxis = { 0.0f, 0.0f, 0.0f }; - - // Calculate transformation matrix from function parameters - // Get transform matrix (rotation -> scale -> translation) - Matrix matRotation = MatrixRotate(rotationAxis, 0.0f); - Matrix matScale = MatrixScale(vScale.x, vScale.y, vScale.z); - Matrix matTranslation = MatrixTranslate(position.x, position.y, position.z); + rlEnableWireMode(); - model.transform = MatrixMultiply(MatrixMultiply(matScale, matRotation), matTranslation); - model.material.colDiffuse = tint; + DrawModel(model, position, scale, tint); - rlglDrawEx(model.mesh, model.material, model.transform, true); + rlDisableWireMode(); } // Draw a model wires (with texture if set) with extended parameters void DrawModelWiresEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint) { - // Calculate transformation matrix from function parameters - // Get transform matrix (rotation -> scale -> translation) - Matrix matRotation = MatrixRotate(rotationAxis, rotationAngle*DEG2RAD); - Matrix matScale = MatrixScale(scale.x, scale.y, scale.z); - Matrix matTranslation = MatrixTranslate(position.x, position.y, position.z); + rlEnableWireMode(); - model.transform = MatrixMultiply(MatrixMultiply(matScale, matRotation), matTranslation); - model.material.colDiffuse = tint; + DrawModelEx(model, position, rotationAxis, rotationAngle, scale, tint); - rlglDrawEx(model.mesh, model.material, model.transform, true); + rlDisableWireMode(); } // Draw a billboard diff --git a/src/rlgl.c b/src/rlgl.c index 0c0da2218..888a93131 100644 --- a/src/rlgl.c +++ b/src/rlgl.c @@ -740,6 +740,24 @@ void rlDisableDepthTest(void) glDisable(GL_DEPTH_TEST); } +// Enable wire mode +void rlEnableWireMode(void) +{ +#if defined (GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) + // NOTE: glPolygonMode() not available on OpenGL ES + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); +#endif +} + +// Disable wire mode +void rlDisableWireMode(void) +{ +#if defined (GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) + // NOTE: glPolygonMode() not available on OpenGL ES + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); +#endif +} + // Unload texture from GPU memory void rlDeleteTextures(unsigned int id) { @@ -1033,178 +1051,18 @@ void rlglClose(void) void rlglDraw(void) { #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) +/* + for (int i = 0; i < modelsCount; i++) + { + rlglDrawMesh(models[i]->mesh, models[i]->material, models[i]->transform); + } +*/ + // NOTE: Default buffers always drawn at the end UpdateDefaultBuffers(); DrawDefaultBuffers(); #endif } -// Draw a 3d mesh with material and transform -void rlglDrawEx(Mesh mesh, Material material, Matrix transform, bool wires) -{ -#if defined (GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) - // NOTE: glPolygonMode() not available on OpenGL ES - if (wires) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); -#endif - -#if defined(GRAPHICS_API_OPENGL_11) - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, material.texDiffuse.id); - - // NOTE: On OpenGL 1.1 we use Vertex Arrays to draw model - glEnableClientState(GL_VERTEX_ARRAY); // Enable vertex array - glEnableClientState(GL_TEXTURE_COORD_ARRAY); // Enable texture coords array - if (mesh.normals != NULL) glEnableClientState(GL_NORMAL_ARRAY); // Enable normals array - if (mesh.colors != NULL) glEnableClientState(GL_COLOR_ARRAY); // Enable colors array - - glVertexPointer(3, GL_FLOAT, 0, mesh.vertices); // Pointer to vertex coords array - glTexCoordPointer(2, GL_FLOAT, 0, mesh.texcoords); // Pointer to texture coords array - if (mesh.normals != NULL) glNormalPointer(GL_FLOAT, 0, mesh.normals); // Pointer to normals array - if (mesh.colors != NULL) glColorPointer(4, GL_UNSIGNED_BYTE, 0, mesh.colors); // Pointer to colors array - - rlPushMatrix(); - rlMultMatrixf(MatrixToFloat(transform)); - rlColor4ub(material.colDiffuse.r, material.colDiffuse.g, material.colDiffuse.b, material.colDiffuse.a); - - if (mesh.indices != NULL) glDrawElements(GL_TRIANGLES, mesh.triangleCount*3, GL_UNSIGNED_SHORT, mesh.indices); - else glDrawArrays(GL_TRIANGLES, 0, mesh.vertexCount); - rlPopMatrix(); - - glDisableClientState(GL_VERTEX_ARRAY); // Disable vertex array - glDisableClientState(GL_TEXTURE_COORD_ARRAY); // Disable texture coords array - if (mesh.normals != NULL) glDisableClientState(GL_NORMAL_ARRAY); // Disable normals array - if (mesh.colors != NULL) glDisableClientState(GL_NORMAL_ARRAY); // Disable colors array - - glDisable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, 0); -#endif - -#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) - glUseProgram(material.shader.id); - - // At this point the modelview matrix just contains the view matrix (camera) - // That's because Begin3dMode() sets it an no model-drawing function modifies it, all use rlPushMatrix() and rlPopMatrix() - Matrix matView = modelview; // View matrix (camera) - Matrix matProjection = projection; // Projection matrix (perspective) - - // Calculate model-view matrix combining matModel and matView - Matrix matModelView = MatrixMultiply(transform, matView); // Transform to camera-space coordinates - - // Calculate model-view-projection matrix (MVP) - Matrix matMVP = MatrixMultiply(matModelView, matProjection); // Transform to screen-space coordinates - - // Send combined model-view-projection matrix to shader - glUniformMatrix4fv(material.shader.mvpLoc, 1, false, MatrixToFloat(matMVP)); - - // Apply color tinting (material.colDiffuse) - // NOTE: Just update one uniform on fragment shader - float vColor[4] = { (float)material.colDiffuse.r/255, (float)material.colDiffuse.g/255, (float)material.colDiffuse.b/255, (float)material.colDiffuse.a/255 }; - glUniform4fv(material.shader.tintColorLoc, 1, vColor); - - // Set shader textures (diffuse, normal, specular) - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, material.texDiffuse.id); - glUniform1i(material.shader.mapDiffuseLoc, 0); // Texture fits in active texture unit 0 - - if ((material.texNormal.id != 0) && (material.shader.mapNormalLoc != -1)) - { - glActiveTexture(GL_TEXTURE1); - glBindTexture(GL_TEXTURE_2D, material.texNormal.id); - glUniform1i(material.shader.mapNormalLoc, 1); // Texture fits in active texture unit 1 - } - - if ((material.texSpecular.id != 0) && (material.shader.mapSpecularLoc != -1)) - { - glActiveTexture(GL_TEXTURE2); - glBindTexture(GL_TEXTURE_2D, material.texSpecular.id); - glUniform1i(material.shader.mapSpecularLoc, 2); // Texture fits in active texture unit 2 - } - - if (vaoSupported) - { - glBindVertexArray(mesh.vaoId); - } - else - { - // Bind mesh VBO data: vertex position (shader-location = 0) - glBindBuffer(GL_ARRAY_BUFFER, mesh.vboId[0]); - glVertexAttribPointer(material.shader.vertexLoc, 3, GL_FLOAT, 0, 0, 0); - glEnableVertexAttribArray(material.shader.vertexLoc); - - // Bind mesh VBO data: vertex texcoords (shader-location = 1) - glBindBuffer(GL_ARRAY_BUFFER, mesh.vboId[1]); - glVertexAttribPointer(material.shader.texcoordLoc, 2, GL_FLOAT, 0, 0, 0); - glEnableVertexAttribArray(material.shader.texcoordLoc); - - // Bind mesh VBO data: vertex normals (shader-location = 2, if available) - if (material.shader.normalLoc != -1) - { - glBindBuffer(GL_ARRAY_BUFFER, mesh.vboId[2]); - glVertexAttribPointer(material.shader.normalLoc, 3, GL_FLOAT, 0, 0, 0); - glEnableVertexAttribArray(material.shader.normalLoc); - } - - // Bind mesh VBO data: vertex colors (shader-location = 3, if available) , tangents, texcoords2 (if available) - if (material.shader.colorLoc != -1) - { - glBindBuffer(GL_ARRAY_BUFFER, mesh.vboId[3]); - glVertexAttribPointer(material.shader.colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0); - glEnableVertexAttribArray(material.shader.colorLoc); - } - - // Bind mesh VBO data: vertex tangents (shader-location = 4, if available) - if (material.shader.tangentLoc != -1) - { - glBindBuffer(GL_ARRAY_BUFFER, mesh.vboId[4]); - glVertexAttribPointer(material.shader.tangentLoc, 3, GL_FLOAT, 0, 0, 0); - glEnableVertexAttribArray(material.shader.tangentLoc); - } - - // Bind mesh VBO data: vertex texcoords2 (shader-location = 5, if available) - if (material.shader.texcoord2Loc != -1) - { - glBindBuffer(GL_ARRAY_BUFFER, mesh.vboId[5]); - glVertexAttribPointer(material.shader.texcoord2Loc, 2, GL_FLOAT, 0, 0, 0); - glEnableVertexAttribArray(material.shader.texcoord2Loc); - } - - if (mesh.indices != NULL) glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, quads.vboId[3]); - } - - // Draw call! - if (mesh.indices != NULL) glDrawElements(GL_TRIANGLES, mesh.triangleCount*3, GL_UNSIGNED_SHORT, 0); // Indexed vertices draw - else glDrawArrays(GL_TRIANGLES, 0, mesh.vertexCount); - - if (material.texNormal.id != 0) - { - glActiveTexture(GL_TEXTURE1); - glBindTexture(GL_TEXTURE_2D, 0); - } - - if (material.texSpecular.id != 0) - { - glActiveTexture(GL_TEXTURE2); - glBindTexture(GL_TEXTURE_2D, 0); - } - - glActiveTexture(GL_TEXTURE0); // Set shader active texture to default 0 - glBindTexture(GL_TEXTURE_2D, 0); // Unbind textures - - if (vaoSupported) glBindVertexArray(0); // Unbind VAO - else - { - glBindBuffer(GL_ARRAY_BUFFER, 0); // Unbind VBOs - if (mesh.indices != NULL) glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - } - - glUseProgram(0); // Unbind shader program -#endif - -#if defined (GRAPHICS_API_OPENGL_11) || defined(GRAPHICS_API_OPENGL_33) - // NOTE: glPolygonMode() not available on OpenGL ES - if (wires) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); -#endif -} - // Initialize Graphics Device (OpenGL stuff) // NOTE: Stores global variables screenWidth and screenHeight void rlglInitGraphics(int offsetX, int offsetY, int width, int height) @@ -1776,6 +1634,245 @@ void rlglLoadMesh(Mesh *mesh) #endif } +// Update vertex data on GPU (upload new data to one buffer) +void rlglUpdateMesh(Mesh mesh, int buffer, int numVertex) +{ + // Activate mesh VAO + if (vaoSupported) glBindVertexArray(mesh.vaoId); + + switch (buffer) + { + case 0: // Update vertices (vertex position) + { + glBindBuffer(GL_ARRAY_BUFFER, mesh.vboId[0]); + if (numVertex >= mesh.vertexCount) glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*numVertex, mesh.vertices, GL_DYNAMIC_DRAW); + else glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float)*3*numVertex, mesh.vertices); + + } break; + case 1: // Update texcoords (vertex texture coordinates) + { + glBindBuffer(GL_ARRAY_BUFFER, mesh.vboId[1]); + if (numVertex >= mesh.vertexCount) glBufferData(GL_ARRAY_BUFFER, sizeof(float)*2*numVertex, mesh.texcoords, GL_DYNAMIC_DRAW); + else glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float)*2*numVertex, mesh.texcoords); + + } break; + case 2: // Update normals (vertex normals) + { + glBindBuffer(GL_ARRAY_BUFFER, mesh.vboId[0]); + if (numVertex >= mesh.vertexCount) glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*numVertex, mesh.normals, GL_DYNAMIC_DRAW); + else glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float)*3*numVertex, mesh.normals); + + } break; + case 3: // Update colors (vertex colors) + { + glBindBuffer(GL_ARRAY_BUFFER, mesh.vboId[2]); + if (numVertex >= mesh.vertexCount) glBufferData(GL_ARRAY_BUFFER, sizeof(float)*4*numVertex, mesh.colors, GL_DYNAMIC_DRAW); + else glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(unsigned char)*4*numVertex, mesh.colors); + + } break; + case 4: // Update tangents (vertex tangents) + { + glBindBuffer(GL_ARRAY_BUFFER, mesh.vboId[0]); + if (numVertex >= mesh.vertexCount) glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*numVertex, mesh.tangents, GL_DYNAMIC_DRAW); + else glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float)*3*numVertex, mesh.tangents); + } break; + case 5: // Update texcoords2 (vertex second texture coordinates) + { + glBindBuffer(GL_ARRAY_BUFFER, mesh.vboId[1]); + if (numVertex >= mesh.vertexCount) glBufferData(GL_ARRAY_BUFFER, sizeof(float)*2*numVertex, mesh.texcoords2, GL_DYNAMIC_DRAW); + else glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float)*2*numVertex, mesh.texcoords2); + } break; + default: break; + } + + // Unbind the current VAO + if (vaoSupported) glBindVertexArray(0); + + // Another option would be using buffer mapping... + //mesh.vertices = glMapBuffer(GL_ARRAY_BUFFER, GL_READ_WRITE); + // Now we can modify vertices + //glUnmapBuffer(GL_ARRAY_BUFFER); +} + +// Draw a 3d mesh with material and transform +void rlglDrawMesh(Mesh mesh, Material material, Matrix transform) +{ +#if defined(GRAPHICS_API_OPENGL_11) + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, material.texDiffuse.id); + + // NOTE: On OpenGL 1.1 we use Vertex Arrays to draw model + glEnableClientState(GL_VERTEX_ARRAY); // Enable vertex array + glEnableClientState(GL_TEXTURE_COORD_ARRAY); // Enable texture coords array + if (mesh.normals != NULL) glEnableClientState(GL_NORMAL_ARRAY); // Enable normals array + if (mesh.colors != NULL) glEnableClientState(GL_COLOR_ARRAY); // Enable colors array + + glVertexPointer(3, GL_FLOAT, 0, mesh.vertices); // Pointer to vertex coords array + glTexCoordPointer(2, GL_FLOAT, 0, mesh.texcoords); // Pointer to texture coords array + if (mesh.normals != NULL) glNormalPointer(GL_FLOAT, 0, mesh.normals); // Pointer to normals array + if (mesh.colors != NULL) glColorPointer(4, GL_UNSIGNED_BYTE, 0, mesh.colors); // Pointer to colors array + + rlPushMatrix(); + rlMultMatrixf(MatrixToFloat(transform)); + rlColor4ub(material.colDiffuse.r, material.colDiffuse.g, material.colDiffuse.b, material.colDiffuse.a); + + if (mesh.indices != NULL) glDrawElements(GL_TRIANGLES, mesh.triangleCount*3, GL_UNSIGNED_SHORT, mesh.indices); + else glDrawArrays(GL_TRIANGLES, 0, mesh.vertexCount); + rlPopMatrix(); + + glDisableClientState(GL_VERTEX_ARRAY); // Disable vertex array + glDisableClientState(GL_TEXTURE_COORD_ARRAY); // Disable texture coords array + if (mesh.normals != NULL) glDisableClientState(GL_NORMAL_ARRAY); // Disable normals array + if (mesh.colors != NULL) glDisableClientState(GL_NORMAL_ARRAY); // Disable colors array + + glDisable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, 0); +#endif + +#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) + glUseProgram(material.shader.id); + + // At this point the modelview matrix just contains the view matrix (camera) + // That's because Begin3dMode() sets it an no model-drawing function modifies it, all use rlPushMatrix() and rlPopMatrix() + Matrix matView = modelview; // View matrix (camera) + Matrix matProjection = projection; // Projection matrix (perspective) + + // Calculate model-view matrix combining matModel and matView + Matrix matModelView = MatrixMultiply(transform, matView); // Transform to camera-space coordinates + + // Calculate model-view-projection matrix (MVP) + Matrix matMVP = MatrixMultiply(matModelView, matProjection); // Transform to screen-space coordinates + + // Send combined model-view-projection matrix to shader + glUniformMatrix4fv(material.shader.mvpLoc, 1, false, MatrixToFloat(matMVP)); + + // Apply color tinting (material.colDiffuse) + // NOTE: Just update one uniform on fragment shader + float vColor[4] = { (float)material.colDiffuse.r/255, (float)material.colDiffuse.g/255, (float)material.colDiffuse.b/255, (float)material.colDiffuse.a/255 }; + glUniform4fv(material.shader.tintColorLoc, 1, vColor); + + // Set shader textures (diffuse, normal, specular) + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, material.texDiffuse.id); + glUniform1i(material.shader.mapDiffuseLoc, 0); // Texture fits in active texture unit 0 + + if ((material.texNormal.id != 0) && (material.shader.mapNormalLoc != -1)) + { + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_2D, material.texNormal.id); + glUniform1i(material.shader.mapNormalLoc, 1); // Texture fits in active texture unit 1 + } + + if ((material.texSpecular.id != 0) && (material.shader.mapSpecularLoc != -1)) + { + glActiveTexture(GL_TEXTURE2); + glBindTexture(GL_TEXTURE_2D, material.texSpecular.id); + glUniform1i(material.shader.mapSpecularLoc, 2); // Texture fits in active texture unit 2 + } + + if (vaoSupported) + { + glBindVertexArray(mesh.vaoId); + } + else + { + // Bind mesh VBO data: vertex position (shader-location = 0) + glBindBuffer(GL_ARRAY_BUFFER, mesh.vboId[0]); + glVertexAttribPointer(material.shader.vertexLoc, 3, GL_FLOAT, 0, 0, 0); + glEnableVertexAttribArray(material.shader.vertexLoc); + + // Bind mesh VBO data: vertex texcoords (shader-location = 1) + glBindBuffer(GL_ARRAY_BUFFER, mesh.vboId[1]); + glVertexAttribPointer(material.shader.texcoordLoc, 2, GL_FLOAT, 0, 0, 0); + glEnableVertexAttribArray(material.shader.texcoordLoc); + + // Bind mesh VBO data: vertex normals (shader-location = 2, if available) + if (material.shader.normalLoc != -1) + { + glBindBuffer(GL_ARRAY_BUFFER, mesh.vboId[2]); + glVertexAttribPointer(material.shader.normalLoc, 3, GL_FLOAT, 0, 0, 0); + glEnableVertexAttribArray(material.shader.normalLoc); + } + + // Bind mesh VBO data: vertex colors (shader-location = 3, if available) , tangents, texcoords2 (if available) + if (material.shader.colorLoc != -1) + { + glBindBuffer(GL_ARRAY_BUFFER, mesh.vboId[3]); + glVertexAttribPointer(material.shader.colorLoc, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0); + glEnableVertexAttribArray(material.shader.colorLoc); + } + + // Bind mesh VBO data: vertex tangents (shader-location = 4, if available) + if (material.shader.tangentLoc != -1) + { + glBindBuffer(GL_ARRAY_BUFFER, mesh.vboId[4]); + glVertexAttribPointer(material.shader.tangentLoc, 3, GL_FLOAT, 0, 0, 0); + glEnableVertexAttribArray(material.shader.tangentLoc); + } + + // Bind mesh VBO data: vertex texcoords2 (shader-location = 5, if available) + if (material.shader.texcoord2Loc != -1) + { + glBindBuffer(GL_ARRAY_BUFFER, mesh.vboId[5]); + glVertexAttribPointer(material.shader.texcoord2Loc, 2, GL_FLOAT, 0, 0, 0); + glEnableVertexAttribArray(material.shader.texcoord2Loc); + } + + if (mesh.indices != NULL) glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, quads.vboId[3]); + } + + // Draw call! + if (mesh.indices != NULL) glDrawElements(GL_TRIANGLES, mesh.triangleCount*3, GL_UNSIGNED_SHORT, 0); // Indexed vertices draw + else glDrawArrays(GL_TRIANGLES, 0, mesh.vertexCount); + + if (material.texNormal.id != 0) + { + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_2D, 0); + } + + if (material.texSpecular.id != 0) + { + glActiveTexture(GL_TEXTURE2); + glBindTexture(GL_TEXTURE_2D, 0); + } + + glActiveTexture(GL_TEXTURE0); // Set shader active texture to default 0 + glBindTexture(GL_TEXTURE_2D, 0); // Unbind textures + + if (vaoSupported) glBindVertexArray(0); // Unbind VAO + else + { + glBindBuffer(GL_ARRAY_BUFFER, 0); // Unbind VBOs + if (mesh.indices != NULL) glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + } + + glUseProgram(0); // Unbind shader program +#endif +} + +// Unload mesh data from CPU and GPU +void rlglUnloadMesh(Mesh *mesh) +{ + if (mesh->vertices != NULL) free(mesh->vertices); + if (mesh->texcoords != NULL) free(mesh->texcoords); + if (mesh->normals != NULL) free(mesh->normals); + if (mesh->colors != NULL) free(mesh->colors); + if (mesh->tangents != NULL) free(mesh->tangents); + if (mesh->texcoords2 != NULL) free(mesh->texcoords2); + if (mesh->indices != NULL) free(mesh->indices); + + rlDeleteBuffers(mesh->vboId[0]); // vertex + rlDeleteBuffers(mesh->vboId[1]); // texcoords + rlDeleteBuffers(mesh->vboId[2]); // normals + rlDeleteBuffers(mesh->vboId[3]); // colors + rlDeleteBuffers(mesh->vboId[4]); // tangents + rlDeleteBuffers(mesh->vboId[5]); // texcoords2 + rlDeleteBuffers(mesh->vboId[6]); // indices + + rlDeleteVertexArrays(mesh->vaoId); +} + // Read screen pixel data (color buffer) unsigned char *rlglReadScreenPixels(int width, int height) { @@ -2328,12 +2425,12 @@ static void LoadDefaultShaderLocations(Shader *shader) // vertex texcoord2 location = 5 // Get handles to GLSL input attibute locations - shader->vertexLoc = glGetAttribLocation(shader->id, "vertexPosition"); - shader->texcoordLoc = glGetAttribLocation(shader->id, "vertexTexCoord"); - shader->normalLoc = glGetAttribLocation(shader->id, "vertexNormal"); - shader->colorLoc = glGetAttribLocation(shader->id, "vertexColor"); - shader->tangentLoc = glGetAttribLocation(shader->id, "vertexTangent"); - shader->texcoord2Loc = glGetAttribLocation(shader->id, "vertexTexCoord2"); + shader->vertexLoc = glGetAttribLocation(shader->id, DEFAULT_ATTRIB_POSITION_NAME); + shader->texcoordLoc = glGetAttribLocation(shader->id, DEFAULT_ATTRIB_TEXCOORD_NAME); + shader->normalLoc = glGetAttribLocation(shader->id, DEFAULT_ATTRIB_NORMAL_NAME); + shader->colorLoc = glGetAttribLocation(shader->id, DEFAULT_ATTRIB_COLOR_NAME); + shader->tangentLoc = glGetAttribLocation(shader->id, DEFAULT_ATTRIB_TANGENT_NAME); + shader->texcoord2Loc = glGetAttribLocation(shader->id, DEFAULT_ATTRIB_TEXCOORD2_NAME); // Get handles to GLSL uniform locations (vertex shader) shader->mvpLoc = glGetUniformLocation(shader->id, "mvpMatrix"); @@ -2350,8 +2447,8 @@ static void UnloadDefaultShader(void) { glUseProgram(0); - //glDetachShader(defaultShaderProgram, vertexShader); - //glDetachShader(defaultShaderProgram, fragmentShader); + //glDetachShader(defaultShader, vertexShader); + //glDetachShader(defaultShader, fragmentShader); //glDeleteShader(vertexShader); // Already deleted on shader compilation //glDeleteShader(fragmentShader); // Already deleted on sahder compilation glDeleteProgram(defaultShader.id); diff --git a/src/rlgl.h b/src/rlgl.h index 7b88bc9ea..a33e3a0a1 100644 --- a/src/rlgl.h +++ b/src/rlgl.h @@ -256,6 +256,8 @@ void rlEnableRenderTexture(unsigned int id); // Enable render texture (fbo) void rlDisableRenderTexture(void); // Disable render texture (fbo), return to default framebuffer void rlEnableDepthTest(void); // Enable depth test void rlDisableDepthTest(void); // Disable depth test +void rlEnableWireMode(void); // Enable wire mode +void rlDisableWireMode(void); // Disable wire mode void rlDeleteTextures(unsigned int id); // Delete OpenGL texture from GPU void rlDeleteRenderTextures(RenderTexture2D target); // Delete render textures (fbo) from GPU void rlDeleteShader(unsigned int id); // Delete OpenGL shader program from GPU @@ -277,8 +279,11 @@ unsigned int rlglLoadTexture(void *data, int width, int height, int textureForma RenderTexture2D rlglLoadRenderTexture(int width, int height); // Load a texture to be used for rendering (fbo with color and depth attachments) void rlglUpdateTexture(unsigned int id, int width, int height, int format, void *data); // Update GPU texture with new data void rlglGenerateMipmaps(Texture2D texture); // Generate mipmap data for selected texture -void rlglLoadMesh(Mesh *mesh); // Upload vertex data into GPU and provided VAO/VBO ids -void rlglDrawEx(Mesh mesh, Material material, Matrix transform, bool wires); + +void rlglLoadMesh(Mesh *mesh); // Upload vertex data into GPU and provided VAO/VBO ids +void rlglUpdateMesh(Mesh mesh, int buffer, int numVertex); // Update vertex data on GPU (upload new data to one buffer) +void rlglDrawMesh(Mesh mesh, Material material, Matrix transform); // Draw a 3d mesh with material and transform +void rlglUnloadMesh(Mesh *mesh); // Unload mesh data from CPU and GPU Vector3 rlglUnproject(Vector3 source, Matrix proj, Matrix view); // Get world coordinates from screen coordinates diff --git a/templates/advance_game/Makefile b/templates/advance_game/Makefile index ee982de47..b3947205e 100644 --- a/templates/advance_game/Makefile +++ b/templates/advance_game/Makefile @@ -109,7 +109,10 @@ ifeq ($(PLATFORM),PLATFORM_DESKTOP) ifeq ($(PLATFORM_OS),LINUX) LFLAGS = -L. -L../../src else - LFLAGS = -L. -L../../src -LC:/raylib/raylib/src + LFLAGS = -L. -L../../src + ifeq ($(PLATFORM_OS),WINDOWS) + LFLAGS += -LC:/raylib/raylib/src + endif # external libraries to link with # GLFW3 LFLAGS += -L../../external/glfw3/lib/$(LIBPATH) @@ -134,7 +137,7 @@ ifeq ($(PLATFORM),PLATFORM_DESKTOP) # libraries for OS X 10.9 desktop compiling # requires the following packages: # libglfw3-dev libopenal-dev libegl1-mesa-dev - LIBS = -lraylib -lglfw -framework OpenGL -framework OpenAl -framework Cocoa + LIBS = -lraylib -lglfw3 -framework OpenGL -framework OpenAl -framework Cocoa else # libraries for Windows desktop compiling # NOTE: GLFW3 and OpenAL Soft libraries should be installed diff --git a/templates/basic_game/Makefile b/templates/basic_game/Makefile index 3b2a06d0e..76337490e 100644 --- a/templates/basic_game/Makefile +++ b/templates/basic_game/Makefile @@ -109,7 +109,10 @@ ifeq ($(PLATFORM),PLATFORM_DESKTOP) ifeq ($(PLATFORM_OS),LINUX) LFLAGS = -L. -L../../src else - LFLAGS = -L. -L../../src -LC:/raylib/raylib/src + LFLAGS = -L. -L../../src + ifeq ($(PLATFORM_OS),WINDOWS) + LFLAGS += -LC:/raylib/raylib/src + endif # external libraries to link with # GLFW3 LFLAGS += -L../../external/glfw3/lib/$(LIBPATH) diff --git a/templates/basic_test/Makefile b/templates/basic_test/Makefile index b08aacdf0..b6fd44a74 100644 --- a/templates/basic_test/Makefile +++ b/templates/basic_test/Makefile @@ -108,7 +108,10 @@ ifeq ($(PLATFORM),PLATFORM_DESKTOP) ifeq ($(PLATFORM_OS),LINUX) LFLAGS = -L. -L../../src else - LFLAGS = -L. -L../../src -LC:/raylib/raylib/src + LFLAGS = -L. -L../../src + ifeq ($(PLATFORM_OS),WINDOWS) + LFLAGS += -LC:/raylib/raylib/src + endif # external libraries to link with # GLFW3 LFLAGS += -L../../external/glfw3/lib/$(LIBPATH) @@ -133,7 +136,7 @@ ifeq ($(PLATFORM),PLATFORM_DESKTOP) # libraries for OS X 10.9 desktop compiling # requires the following packages: # libglfw3-dev libopenal-dev libegl1-mesa-dev - LIBS = -lraylib -lglfw -framework OpenGL -framework OpenAl -framework Cocoa + LIBS = -lraylib -lglfw3 -framework OpenGL -framework OpenAl -framework Cocoa else # libraries for Windows desktop compiling # NOTE: GLFW3 and OpenAL Soft libraries should be installed diff --git a/templates/simple_game/Makefile b/templates/simple_game/Makefile index 6a3adcc85..3d303082c 100644 --- a/templates/simple_game/Makefile +++ b/templates/simple_game/Makefile @@ -109,7 +109,10 @@ ifeq ($(PLATFORM),PLATFORM_DESKTOP) ifeq ($(PLATFORM_OS),LINUX) LFLAGS = -L. -L../../src else - LFLAGS = -L. -L../../src -LC:/raylib/raylib/src + LFLAGS = -L. -L../../src + ifeq ($(PLATFORM_OS),WINDOWS) + LFLAGS += -LC:/raylib/raylib/src + endif # external libraries to link with # GLFW3 LFLAGS += -L../../external/glfw3/lib/$(LIBPATH) @@ -134,7 +137,7 @@ ifeq ($(PLATFORM),PLATFORM_DESKTOP) # libraries for OS X 10.9 desktop compiling # requires the following packages: # libglfw3-dev libopenal-dev libegl1-mesa-dev - LIBS = -lraylib -lglfw -framework OpenGL -framework OpenAl -framework Cocoa + LIBS = -lraylib -lglfw3 -framework OpenGL -framework OpenAl -framework Cocoa else # libraries for Windows desktop compiling # NOTE: GLFW3 and OpenAL Soft libraries should be installed diff --git a/templates/standard_game/Makefile b/templates/standard_game/Makefile index 4629d1b1c..c7cb7add7 100644 --- a/templates/standard_game/Makefile +++ b/templates/standard_game/Makefile @@ -109,7 +109,10 @@ ifeq ($(PLATFORM),PLATFORM_DESKTOP) ifeq ($(PLATFORM_OS),LINUX) LFLAGS = -L. -L../../src else - LFLAGS = -L. -L../../src -LC:/raylib/raylib/src + LFLAGS = -L. -L../../src + ifeq ($(PLATFORM_OS),WINDOWS) + LFLAGS += -LC:/raylib/raylib/src + endif # external libraries to link with # GLFW3 LFLAGS += -L../../external/glfw3/lib/$(LIBPATH) @@ -134,7 +137,7 @@ ifeq ($(PLATFORM),PLATFORM_DESKTOP) # libraries for OS X 10.9 desktop compiling # requires the following packages: # libglfw3-dev libopenal-dev libegl1-mesa-dev - LIBS = -lraylib -lglfw -framework OpenGL -framework OpenAl -framework Cocoa + LIBS = -lraylib -lglfw3 -framework OpenGL -framework OpenAl -framework Cocoa else # libraries for Windows desktop compiling # NOTE: GLFW3 and OpenAL Soft libraries should be installed