diff --git a/shader/lighting/cap.geom b/shader/lighting/cap.geom index e7e4f1315..32e9274be 100644 --- a/shader/lighting/cap.geom +++ b/shader/lighting/cap.geom @@ -3,17 +3,38 @@ layout (triangles) in; layout (triangle_strip, max_vertices = 3) out; layout (std140, binding = 0) uniform TheMat { mat4 theMat; } ; uniform vec3 lightPos; +vec4 projNear (vec4 pos) +{ + // note we project to a specific height + // this is quite brittle, not ideal + vec3 dir = pos.xyz - lightPos ; + float a = (150 - pos.z) / dir.z ; + vec2 xy = (pos.xyz + a * dir).xy ; + return vec4 ( xy, 150 , 1) ; +} void main() { vec4 p0 = gl_in[0].gl_Position ; vec4 p1 = gl_in[1].gl_Position ; vec4 p2 = gl_in[2].gl_Position ; - if ( dot( p0.xyz - lightPos, cross( p0.xyz - p1.xyz, p1.xyz - p2.xyz)) < 0) + if ( //dot( p0.xyz - vec3 (0,0,1), cross( p0.xyz - p1.xyz, p1.xyz - p2.xyz)) < 0 + // && + ( p0.z - lightPos.z > 0 ) + && ( p1.z - lightPos.z > 0 ) + && ( p2.z - lightPos.z > 0 ) + ) { - gl_Position = theMat * p0; EmitVertex(); - gl_Position = theMat * p1; EmitVertex(); - gl_Position = theMat * p2; EmitVertex(); + // front cap + vec4 v1 = vec4 (0,0,1,0) ; + gl_Position = theMat * projNear(p0); EmitVertex(); + gl_Position = theMat * projNear(p1); EmitVertex(); + gl_Position = theMat * projNear(p2); EmitVertex(); EndPrimitive(); + // if light points downwards onto surface, draw back cap too + if (dot ( p0.xyz - lightPos, vec3 ( 0,0,1) ) > 0) + { + } + else {} } else {} } diff --git a/src/Dodge/Default/World.hs b/src/Dodge/Default/World.hs index 84e099262..e481f1ae3 100644 --- a/src/Dodge/Default/World.hs +++ b/src/Dodge/Default/World.hs @@ -93,8 +93,8 @@ youLight = TLS { _tlsPos = V3 0 0 0 ,_tlsRad = 300 ,_tlsIntensity = 0.1 - ,_tlsUpdate = \w _ -> (w, Nothing) - --,_tlsUpdate = \w _ -> (w, Just (youLight {_tlsPos = f $ _crPos (you w)})) + --,_tlsUpdate = \w _ -> (w, Nothing) + ,_tlsUpdate = \w _ -> (w, Just (youLight {_tlsPos = f $ _crPos (you w)})) ,_tlsTime = 0 } where diff --git a/src/Render.hs b/src/Render.hs index 913e6aacd..c5c65acc5 100644 --- a/src/Render.hs +++ b/src/Render.hs @@ -57,9 +57,10 @@ createLightMap pdata lightPoints nWalls nSils nsurfVs = do depthMask $= Disabled blendFunc $= (Zero, OneMinusSrcColor) stencilTest $= Enabled - depthFunc $= Just Lequal + --depthFunc $= Just Lequal flip VS.mapM_ (VS.fromList lightPoints) $ \(V3 x y z,rad,V3 r g b) -> do --forM_ lightPoints $ \(V3 x y z,r,lum) -> do + -- the use of Less is for caps on geometry depthFunc $= Just Less -- stencil out shadows colorMask $= Color4 Disabled Disabled Disabled Disabled @@ -74,21 +75,25 @@ createLightMap pdata lightPoints nWalls nSils nsurfVs = do drawShader (_lightingOccludeShader pdata) nWalls --stencilOp $= (OpKeep,OpDecr,OpKeep) - stencilOpSeparate Front $= (OpKeep,OpDecrWrap,OpKeep) - stencilOpSeparate Back $= (OpKeep,OpIncrWrap,OpKeep) +-- stencilOpSeparate Front $= (OpKeep,OpDecrWrap,OpKeep) +-- stencilOpSeparate Back $= (OpKeep,OpIncrWrap,OpKeep) currentProgram $= Just (_shaderProgram $ _lightingLineShadowShader pdata) uniform (head $ _shaderCustomUnis $ _lightingLineShadowShader pdata) $= Vector3 x y z - depthClamp $= Enabled +-- depthClamp $= Enabled drawShader (_lightingLineShadowShader pdata) nSils - depthClamp $= Disabled +-- depthClamp $= Disabled + cullFace $= Just Back --stencilOp $= (OpKeep,OpDecrWrap,OpKeep) currentProgram $= Just (_shaderProgram $ _lightingCapShader pdata) uniform (head $ _shaderCustomUnis $ _lightingCapShader pdata) $= Vector3 x y z +-- depthClamp $= Enabled drawShader (_lightingCapShader pdata) (nSils - 6) +-- depthClamp $= Disabled + -- use Lequal to redraw surfaces above already drawn surfaces depthFunc $= Just Lequal -- draw geometry surfaces --cullFace $= Just Back