Reorganise rendering in Dodge
This commit is contained in:
+3
-24
@@ -3,7 +3,7 @@
|
||||
module Picture.Render
|
||||
( module Picture.Render
|
||||
, picToLTree
|
||||
, perspectiveMatrix
|
||||
-- , perspectiveMatrix
|
||||
)
|
||||
where
|
||||
|
||||
@@ -114,30 +114,23 @@ createLightMap pdata rot zoom (tranx,trany) (winx,winy) wallPoints lightPoints
|
||||
(viewFromx,viewFromy) pmat = do
|
||||
|
||||
bindFramebuffer Framebuffer $= (_spareFBO pdata)
|
||||
|
||||
-- clear buffer to full alpha and furthest depth
|
||||
clearColor $= Color4 0 0 0 1
|
||||
clearDepth $= 1
|
||||
clear [ColorBuffer,DepthBuffer]
|
||||
|
||||
depthFunc $= Just Less
|
||||
|
||||
-- store wall and light positions into buffer
|
||||
nWallLights <- F.foldM (pokeShader $ _wallLightShader pdata) wallPoints
|
||||
bindShaderBuffers [_wallLightShader pdata] [nWallLights]
|
||||
nWalls <- F.foldM (pokeShader $ _wallShadowShader pdata) wallPoints
|
||||
bindShaderBuffers [_wallShadowShader pdata] [nWalls]
|
||||
|
||||
-- set uniforms for shader that draws lights
|
||||
currentProgram $= Just (_shaderProgram $ _wallLightShader pdata)
|
||||
uniform ( (fromJust $ _shaderCustomUnis $ _wallLightShader pdata) !! 1)
|
||||
$= pmat
|
||||
|
||||
-- draw walls from your point of view in order to set z buffer
|
||||
colorMask $= (Color4 Disabled Disabled Disabled Disabled)
|
||||
|
||||
let (tx,ty) = (tranx,trany) -.- (viewFromx,viewFromy)
|
||||
|
||||
currentProgram $= Just (_shaderProgram $ _wallShadowShader pdata)
|
||||
uniform (head $ fromJust $ _shaderCustomUnis $ _wallShadowShader pdata)
|
||||
$= Vector2 viewFromx viewFromy
|
||||
@@ -147,23 +140,20 @@ createLightMap pdata rot zoom (tranx,trany) (winx,winy) wallPoints lightPoints
|
||||
$= (0 :: Float)
|
||||
cullFace $= Just Back
|
||||
drawShader (_wallShadowShader pdata) nWalls
|
||||
|
||||
-- for each of the lights:
|
||||
-- stencil out the walls from this lights point of view
|
||||
-- stencil out the walls from this light's point of view
|
||||
-- draw fading lightmap circles on the floor
|
||||
-- draw fading lightmaps on the walls
|
||||
depthMask $= Disabled
|
||||
blendFunc $= (Zero, OneMinusSrcAlpha)
|
||||
stencilTest $= Enabled
|
||||
forM_ lightPoints $ \(x,y,r,lum) -> do
|
||||
|
||||
-- bind buffer for floor light circle
|
||||
let lightPtr = (\(_,ptr,_) -> ptr) $ head
|
||||
$ _vaoBufferTargets $ _shaderVAO $ _lightSourceShader pdata
|
||||
(x',y') = zTran $ rotateV (0 - rot) $ (x,y) -.- (tranx,trany)
|
||||
zTran (a,b) = (a*2*zoom / winx, b*2*zoom / winy)
|
||||
pokeFourOff lightPtr 0 (x',y',r,lum)
|
||||
|
||||
-- stencil out walls
|
||||
colorMask $= (Color4 Disabled Disabled Disabled Disabled)
|
||||
clear [StencilBuffer]
|
||||
@@ -177,14 +167,12 @@ createLightMap pdata rot zoom (tranx,trany) (winx,winy) wallPoints lightPoints
|
||||
cullFace $= Just Front
|
||||
stencilOp $= (OpKeep,OpKeep,OpDecr)
|
||||
drawShader (_wallShadowShader pdata) nWalls
|
||||
|
||||
-- draw floor light circles
|
||||
cullFace $= Nothing
|
||||
colorMask $= (Color4 Disabled Disabled Disabled Enabled)
|
||||
bindShaderBuffers [_lightSourceShader pdata] [1]
|
||||
stencilFunc $= (Equal, 0, 255)
|
||||
drawShader (_lightSourceShader pdata) 1
|
||||
|
||||
-- draw wall light "circles"
|
||||
currentProgram $= Just (_shaderProgram $ _wallLightShader pdata)
|
||||
uniform (head $ fromJust $ _shaderCustomUnis $ _wallLightShader pdata)
|
||||
@@ -192,34 +180,25 @@ createLightMap pdata rot zoom (tranx,trany) (winx,winy) wallPoints lightPoints
|
||||
uniform ( (fromJust $ _shaderCustomUnis $ _wallLightShader pdata) !! 2)
|
||||
$= Vector2 r lum
|
||||
drawShader (_wallLightShader pdata) nWallLights
|
||||
|
||||
depthMask $= Enabled
|
||||
cullFace $= Nothing
|
||||
stencilTest $= Disabled
|
||||
|
||||
blend $= Disabled
|
||||
|
||||
bindFramebuffer Framebuffer $= defaultFramebufferObject
|
||||
|
||||
colorMask $= (Color4 Disabled Disabled Disabled Enabled)
|
||||
bindShaderBuffers [_fullscreenShader pdata] [4]
|
||||
textureBinding Texture2D $= Just (_fboTexture pdata)
|
||||
drawShader (_fullscreenShader pdata) 4
|
||||
|
||||
colorMask $= (Color4 Enabled Enabled Enabled Enabled)
|
||||
|
||||
blend $= Enabled
|
||||
|
||||
renderBackground :: RenderData -> Float -> Float -> (Float,Float) -> (Float,Float) -> IO ()
|
||||
renderBackground pdata rot zoom (tranx,trany) (winx,winy) = do
|
||||
depthFunc $= Just Less
|
||||
|
||||
-- depthFunc $= Just Less
|
||||
-- set drawing for on top
|
||||
--blendFuncSeparate $= ((SrcAlphaSaturate, OneMinusSrcAlpha), (Zero,One))
|
||||
|
||||
-- draw background
|
||||
bindArrayBuffers 1 $ _vaoBufferTargets $ _shaderVAO $ _backgroundShader pdata
|
||||
|
||||
currentProgram $= Just (_shaderProgram $ _backgroundShader pdata)
|
||||
bindVertexArrayObject $= Just (_vao $ _shaderVAO $ _backgroundShader pdata)
|
||||
let backPtr = (\(_,x,_) -> x) $ head $ _vaoBufferTargets $ _shaderVAO $ _backgroundShader pdata
|
||||
|
||||
Reference in New Issue
Block a user