From 7bd2a5caa60342acfc44c73195ef894f85d49d30 Mon Sep 17 00:00:00 2001 From: Fredrik Robertsen Date: Thu, 29 Jan 2026 19:54:03 +0100 Subject: [PATCH] shadows everywhere! lights must be moved elsewhere --- res/shaders/simple.frag | 13 ++++++++++++- src/gamelogic.cpp | 2 ++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/res/shaders/simple.frag b/res/shaders/simple.frag index f1db30e..2f50165 100644 --- a/res/shaders/simple.frag +++ b/res/shaders/simple.frag @@ -6,6 +6,7 @@ in layout(location = 2) vec3 worldPositions; uniform vec3 lightPositions[3]; uniform vec3 cameraPosition; +uniform vec3 ballPosition; out vec4 color; @@ -15,6 +16,9 @@ float rand(vec2 co) { float dither(vec2 uv) { return (rand(uv) * 2.0 - 1.0) / 256.0; } +vec3 reject(vec3 from, vec3 onto) { + return from - onto * dot(from, onto) / dot(onto, onto); +} const vec3 objectColor = vec3(1.0, 1.0, 1.0); const vec3 lightColor = vec3(0.5, 0.5, 0.5); @@ -25,6 +29,8 @@ const float shininess = 32.0; const float la = 0.1, lb = 0.01, lc = 0.001; +const float ballRadius = 1.0; + void main() { vec3 norm = normalize(normal); @@ -36,8 +42,12 @@ void main() for (int i = 0; i < 3; i++) { vec3 lightVector = lightPositions[i] - worldPositions; vec3 lightDir = normalize(lightVector); + + vec3 fragToBall = lightPositions[i] - ballPosition; + float d = length(lightVector); float attenuation = 1.0 / (la + d * lb + d * d * lc); + float diff = max(dot(norm, lightDir), 0.0); vec3 diffuse = diff * lightColor; @@ -45,7 +55,8 @@ void main() float spec = pow(max(dot(norm, halfwayDir), 0.0), shininess); vec3 specular = specularStrength * spec * lightColor; - result += attenuation * (diffuse + specular) * objectColor; + if (length(lightVector) < length(fragToBall) && dot(lightVector, fragToBall) < 0.0) + result += attenuation * (diffuse + specular) * objectColor; } color = vec4(result + dither(textureCoordinates), 1.0); diff --git a/src/gamelogic.cpp b/src/gamelogic.cpp index a0d570b..afe3f76 100644 --- a/src/gamelogic.cpp +++ b/src/gamelogic.cpp @@ -409,6 +409,8 @@ void renderNode(SceneNode* node) { GLint cameraPosLoc = shader->getUniformFromName("cameraPosition"); glUniform3fv(cameraPosLoc, 1, glm::value_ptr(cameraPosition)); + GLint ballPosLoc = shader->getUniformFromName("ballPosition"); + glUniform3fv(ballPosLoc, 1, glm::value_ptr(ballPosition)); switch(node->nodeType) { case GEOMETRY: