diff --git a/src/Dodge/Render.hs b/src/Dodge/Render.hs index f2cebb57b..9df21497d 100644 --- a/src/Dodge/Render.hs +++ b/src/Dodge/Render.hs @@ -61,17 +61,11 @@ doDrawing pdata w = do -- set the coordinate uniform ready for drawing elements using world coordinates bufferUBO $ perspectiveMatrixb rot camzoom trans wins viewFroms - -- store floor position into buffer - let addC (xx,yy) = (xx,yy,0) - nsurfVs <- F.foldM (pokeShader (_lightingSurfaceShader pdata)) - $ [Render3 $ polyToTris $ map addC $ screenPolygon w ] - ++ concatMap polyToGeoRender (foregroundPics w) - bindShaderBuffers [_lightingSurfaceShader pdata] [nsurfVs] - depthFunc $= Just Less + let scPol = screenPolygon w -- draw the lightmap. Probably changes the bound framebufferObject createLightMap pdata (w ^. config . shadow_resolution) wallPoints lightPoints viewFroms - (foregroundPics w) + (foregroundPics w) scPol clear [DepthBuffer] depthFunc $= Just Less -- set blending to depend upon the alpha level already present diff --git a/src/Render.hs b/src/Render.hs index 7dc5fa064..6f5b06c1d 100644 --- a/src/Render.hs +++ b/src/Render.hs @@ -7,7 +7,7 @@ import Shader.Poke import Data.Preload.Render import Picture.Data --import Picture.Tree ---import Geometry +import Geometry import Geometry.Data import Polyhedra.Data import Polyhedra @@ -57,8 +57,9 @@ createLightMap -> [(Point3,Float,Float)] -- Lights -> (Float,Float) -- View from position -> [Polyhedra] -- foreground geometry + -> [Point2] -> IO () -createLightMap pdata resDiv wallPoints lightPoints (viewFromx,viewFromy) fpics = do +createLightMap pdata resDiv wallPoints lightPoints (viewFromx,viewFromy) fpics scPol = do -- get viewport size so we can reset it later (vppos,vpsize) <- get viewport -- set the viewport size to that of the render buffer @@ -75,6 +76,14 @@ createLightMap pdata resDiv wallPoints lightPoints (viewFromx,viewFromy) fpics = nSils <- F.foldM (pokeShader $ _lightingLineShadowShader pdata) (concatMap polyToRender fpics) bindShaderBuffers [_lightingLineShadowShader pdata] [nSils] + -- store foreground geometry and floor into buffer + let addC (xx,yy) = (xx,yy,0) + nsurfVs <- F.foldM (pokeShader (_lightingSurfaceShader pdata)) + $ [Render3 $ polyToTris $ map addC $ scPol ] + ++ concatMap polyToGeoRender (fpics) + bindShaderBuffers [_lightingSurfaceShader pdata] [nsurfVs] + + -- clear buffer to full alpha and furthest depth -- clearColor is specified in preloadRender clear [ColorBuffer,DepthBuffer] @@ -91,7 +100,7 @@ createLightMap pdata resDiv wallPoints lightPoints (viewFromx,viewFromy) fpics = ---- draw foreground elements to set z buffer --_ <- renderFoldable pdata $ picToLTree (Just 0) (polysToPic fpics) currentProgram $= Just (_shaderProgram $ _lightingSurfaceShader pdata) - drawShader (_lightingSurfaceShader pdata) nWallLights + drawShader (_lightingSurfaceShader pdata) nsurfVs -- for each of the lights: -- stencil out the walls from this light's point of view @@ -138,7 +147,7 @@ createLightMap pdata resDiv wallPoints lightPoints (viewFromx,viewFromy) fpics = $= Vector3 x y z uniform (_shaderCustomUnis (_lightingSurfaceShader pdata) !! 1) $= Vector2 r lum - drawShader (_lightingSurfaceShader pdata) nWallLights + drawShader (_lightingSurfaceShader pdata) nsurfVs -- draw wall light "circles" currentProgram $= Just (_shaderProgram $ _lightingWallShader pdata)