Rename shaders, remove a dependency on Dodge.Data

This commit is contained in:
2021-04-28 13:32:50 +02:00
parent 2085d5a048
commit 1b4eac2da7
28 changed files with 163 additions and 176 deletions
+48 -95
View File
@@ -25,61 +25,6 @@ import Data.Maybe (fromJust)
import qualified Data.IntMap.Strict as IM
import qualified SDL
renderPicture
:: RenderData -- ^ Preloaded render data
-> Float -- ^ Rotation
-> Float -- ^ Zoom
-> Point2 -- ^ Translation
-> Point2 -- ^ Window size
-> [((Point2,Point2),Point4)] -- ^ Wall data
-> [((Point2,Point2),Point4)] -- ^ Window data
-> [Point4] -- ^ Lights data
-> (Float,Float) -- ^ View from point
-> Picture -- ^ Picture
-> IO Word32 -- ^ Time taken according to SDL.ticks
renderPicture pdata rot zoom trans@(tranx,trany) wins@(winx,winy) wallPointsCol windowPoints lightPoints
viewFroms@(viewFromx,viewFromy) pic = do
startTicks <- SDL.ticks
let wallPoints = map fst wallPointsCol
setCommonUniforms pdata rot zoom trans wins
depthFunc $= Just Less
pmat <- (newMatrix RowMajor
$ perspectiveMatrix rot zoom (tranx,trany) (winx,winy) (viewFromx,viewFromy)
) :: IO (GLmatrix GLfloat)
createLightMap pdata rot zoom trans wins wallPoints lightPoints viewFroms pmat
renderBackground pdata rot zoom trans wins
renderWalls pdata wallPointsCol pmat
setWallDepth pdata wallPoints (viewFromx,viewFromy) pmat
depthFunc $= Just Lequal
renderFoldable pdata $ picToLTree (Just 0) pic
-- reset blend so that light map doesn't apply
-- blendFunc $= (SrcAlpha,OneMinusSrcAlpha)
blendFuncSeparate $= ((SrcAlpha,OneMinusSrcAlpha) , (Zero,One))
-- blendFunc $= (SrcAlpha,OneMinusSrcAlpha)
renderFoldable pdata $ picToLTree (Just 1) pic
-- set drawing for on top
blendFuncSeparate $= ((SrcAlphaSaturate, OneMinusSrcAlpha), (Zero,One))
renderFoldable pdata $ picToLTree (Just 2) pic
depthMask $= Disabled
renderWalls pdata windowPoints pmat
depthMask $= Enabled
resetShaderUniforms (map extractProgAndUnis $ _listShaders pdata)
endTicks <- SDL.ticks
return (endTicks - startTicks)
renderWalls :: RenderData -> [((Point2,Point2),Point4)] -> GLmatrix GLfloat -> IO ()
renderWalls pdata wps pmat = do
@@ -94,55 +39,63 @@ setWallDepth :: RenderData -> [(Point2,Point2)] -> (Float,Float) -> GLmatrix GLf
setWallDepth pdata wallPoints (viewFromx,viewFromy) pmat = do
startTicks <- SDL.ticks
colorMask $= Color4 Disabled Disabled Disabled Disabled
nWalls <- F.foldM (pokeShader $ _wallShadowShader pdata) wallPoints
bindShaderBuffers [_wallShadowShader pdata] [nWalls]
nWalls <- F.foldM (pokeShader $ _lightingOccludeShader pdata) wallPoints
bindShaderBuffers [_lightingOccludeShader pdata] [nWalls]
currentProgram $= Just (_shaderProgram $ _wallShadowShader pdata)
uniform (head $ fromJust $ _shaderCustomUnis $ _wallShadowShader pdata)
currentProgram $= Just (_shaderProgram $ _lightingOccludeShader pdata)
uniform (head $ fromJust $ _shaderCustomUnis $ _lightingOccludeShader pdata)
$= Vector2 viewFromx viewFromy
uniform ( fromJust (_shaderCustomUnis $ _wallShadowShader pdata) !! 1)
uniform ( fromJust (_shaderCustomUnis $ _lightingOccludeShader pdata) !! 1)
$= pmat
uniform ( fromJust (_shaderCustomUnis $ _wallShadowShader pdata) !! 2)
uniform ( fromJust (_shaderCustomUnis $ _lightingOccludeShader pdata) !! 2)
$= (0 :: Float)
-- cullFace $= Just Front
drawShader (_wallShadowShader pdata) nWalls
drawShader (_lightingOccludeShader pdata) nWalls
colorMask $= Color4 Enabled Enabled Enabled Enabled
endTicks <- SDL.ticks
return $ endTicks - startTicks
createLightMap :: RenderData -> Float -> Float -> (Float,Float) -> (Float,Float) ->
[(Point2,Point2)] -> [Point4] ->
(Float,Float) -> GLmatrix GLfloat -> IO ()
createLightMap
:: RenderData
-> Float -- Rotation
-> Float -- Zoom
-> (Float,Float) -- Translation
-> (Float,Float) -- Window size
-> [(Point2,Point2)] -- Wall pairs
-> [Point4] -- Lights
-> (Float,Float) -- View from position
-> GLmatrix GLfloat
-> IO ()
createLightMap pdata rot zoom (tranx,trany) (winx,winy) wallPoints lightPoints
(viewFromx,viewFromy) pmat = do
bindFramebuffer Framebuffer $= _spareFBO pdata
-- store wall and light positions into buffer
nWallLights <- F.foldM (pokeShader $ _lightingWallShader pdata) wallPoints
bindShaderBuffers [_lightingWallShader pdata] [nWallLights]
nWalls <- F.foldM (pokeShader $ _lightingOccludeShader pdata) wallPoints
bindShaderBuffers [_lightingOccludeShader pdata] [nWalls]
-- set uniforms for shader that draws lights
currentProgram $= Just (_shaderProgram $ _lightingWallShader pdata)
uniform ( fromJust (_shaderCustomUnis $ _lightingWallShader pdata) !! 1)
$= pmat
-- 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)
currentProgram $= Just (_shaderProgram $ _lightingOccludeShader pdata)
uniform (head $ fromJust $ _shaderCustomUnis $ _lightingOccludeShader pdata)
$= Vector2 viewFromx viewFromy
uniform ( fromJust (_shaderCustomUnis $ _wallShadowShader pdata) !! 1)
uniform ( fromJust (_shaderCustomUnis $ _lightingOccludeShader pdata) !! 1)
$= pmat
uniform ( fromJust (_shaderCustomUnis $ _wallShadowShader pdata) !! 2)
uniform ( fromJust (_shaderCustomUnis $ _lightingOccludeShader pdata) !! 2)
$= (0 :: Float)
cullFace $= Just Back
drawShader (_wallShadowShader pdata) nWalls
drawShader (_lightingOccludeShader pdata) nWalls
-- for each of the lights:
-- stencil out the walls from this light's point of view
-- draw fading lightmap circles on the floor
@@ -153,7 +106,7 @@ createLightMap pdata rot zoom (tranx,trany) (winx,winy) wallPoints lightPoints
forM_ lightPoints $ \(x,y,r,lum) -> do
-- bind buffer for floor light circle
let lightPtr = (\(_,ptr,_) -> ptr) $ head
$ _vaoBufferTargets $ _shaderVAO $ _lightSourceShader pdata
$ _vaoBufferTargets $ _shaderVAO $ _lightingFloorShader pdata
(x',y') = zTran $ rotateV (negate rot) $ (x,y) -.- (tranx,trany)
zTran (a,b) = (a*2*zoom / winx, b*2*zoom / winy)
pokeFourOff lightPtr 0 (x',y',r,lum)
@@ -163,26 +116,26 @@ createLightMap pdata rot zoom (tranx,trany) (winx,winy) wallPoints lightPoints
cullFace $= Just Back
stencilOp $= (OpKeep,OpKeep,OpIncr)
stencilFunc $= (Always, 0, 255)
currentProgram $= Just (_shaderProgram $ _wallShadowShader pdata)
uniform (head $ fromJust $ _shaderCustomUnis $ _wallShadowShader pdata)
currentProgram $= Just (_shaderProgram $ _lightingOccludeShader pdata)
uniform (head $ fromJust $ _shaderCustomUnis $ _lightingOccludeShader pdata)
$= Vector2 x y
drawShader (_wallShadowShader pdata) nWalls
drawShader (_lightingOccludeShader pdata) nWalls
cullFace $= Just Front
stencilOp $= (OpKeep,OpKeep,OpDecr)
drawShader (_wallShadowShader pdata) nWalls
drawShader (_lightingOccludeShader pdata) nWalls
-- draw floor light circles
cullFace $= Nothing
colorMask $= Color4 Disabled Disabled Disabled Enabled
bindShaderBuffers [_lightSourceShader pdata] [1]
bindShaderBuffers [_lightingFloorShader pdata] [1]
stencilFunc $= (Equal, 0, 255)
drawShader (_lightSourceShader pdata) 1
drawShader (_lightingFloorShader pdata) 1
-- draw wall light "circles"
currentProgram $= Just (_shaderProgram $ _wallLightShader pdata)
uniform (head $ fromJust $ _shaderCustomUnis $ _wallLightShader pdata)
currentProgram $= Just (_shaderProgram $ _lightingWallShader pdata)
uniform (head $ fromJust $ _shaderCustomUnis $ _lightingWallShader pdata)
$= Vector2 x y
uniform (fromJust (_shaderCustomUnis $ _wallLightShader pdata) !! 2)
uniform (fromJust (_shaderCustomUnis $ _lightingWallShader pdata) !! 2)
$= Vector2 r lum
drawShader (_wallLightShader pdata) nWallLights
drawShader (_lightingWallShader pdata) nWallLights
depthMask $= Enabled
cullFace $= Nothing
stencilTest $= Disabled
@@ -214,18 +167,18 @@ renderBackground pdata rot zoom (tranx,trany) (winx,winy) = do
setCommonUniforms :: RenderData -> Float -> Float -> (Float,Float) -> (Float,Float) -> IO ()
setCommonUniforms pdata rot zoom (tranx,trany) (winx,winy) = do
setShaderUniforms rot zoom (tranx,trany) (winx,winy)
( extractProgAndUnis (_lightSourceShader pdata)
: extractProgAndUnis (_wallShadowShader pdata)
: extractProgAndUnis (_wallLightShader pdata)
( extractProgAndUnis (_lightingFloorShader pdata)
: extractProgAndUnis (_lightingOccludeShader pdata)
: extractProgAndUnis (_lightingWallShader pdata)
: extractProgAndUnis (_backgroundShader pdata)
: map extractProgAndUnis (_listShaders pdata)
: map extractProgAndUnis (_pictureShaders pdata)
)
renderFoldable :: Foldable f => RenderData -> f RenderType -> IO Word32
renderFoldable pdata tree = do
pokeStartTicks <- SDL.ticks
let slist = _listShaders pdata
let slist = _pictureShaders pdata
-- poke data, returns list of number of vertices for each shader
is <- F.foldM (pokeShaders slist) tree