Cleanup render preload somewhat
This commit is contained in:
+26
-33
@@ -108,39 +108,39 @@ doDrawing' win pdata u = do
|
||||
setViewportSize (round winx `div` resFact) (round winy `div` resFact)
|
||||
glBindFramebuffer GL_FRAMEBUFFER (pdata ^. fboBase ._1 . unFBO)
|
||||
glDepthMask GL_TRUE
|
||||
-- the following clear may not be necessary
|
||||
withArray [0, 0, 0, 1] $ \ptr ->
|
||||
glClearNamedFramebufferfv
|
||||
(pdata ^. fboBase . _1 . unFBO)
|
||||
GL_COLOR
|
||||
0
|
||||
ptr
|
||||
glDisable GL_BLEND
|
||||
glDepthFunc GL_LESS
|
||||
with 1 $ \ptr ->
|
||||
glClearNamedFramebufferfv
|
||||
(pdata ^. fboBase . _1 . unFBO)
|
||||
GL_DEPTH
|
||||
0
|
||||
ptr
|
||||
glDepthFunc GL_LESS
|
||||
-- draw wall occlusions from the camera's point of view
|
||||
glUseProgram (pdata ^. lightingWallShadShader . shaderUINT)
|
||||
glProgramUniform3f
|
||||
(pdata ^. lightingWallShadShader . shaderUINT)
|
||||
0
|
||||
vfx
|
||||
vfy
|
||||
20
|
||||
glProgramUniform1f
|
||||
(pdata ^. lightingWallShadShader . shaderUINT)
|
||||
1
|
||||
1000
|
||||
glBindVertexArray $ pdata ^. lightingWallShadShader . shaderVAO . vaoName
|
||||
unless (debugOn Remove_LOS cfig) $
|
||||
unless (debugOn Remove_LOS cfig) $ do
|
||||
glUseProgram (pdata ^. lightingWallShadShader . shaderUINT)
|
||||
glProgramUniform3f
|
||||
(pdata ^. lightingWallShadShader . shaderUINT)
|
||||
0
|
||||
vfx
|
||||
vfy
|
||||
20
|
||||
glProgramUniform1f
|
||||
(pdata ^. lightingWallShadShader . shaderUINT)
|
||||
1
|
||||
1000
|
||||
glBindVertexArray $ pdata ^. lightingWallShadShader . shaderVAO . vaoName
|
||||
glDrawArrays
|
||||
(_unPrimitiveMode $ pdata ^. lightingWallShadShader . shaderPrimitive)
|
||||
0
|
||||
(fromIntegral trueNWalls)
|
||||
-- clear normals
|
||||
-- clear color and normals
|
||||
withArray [0, 0, 0, 1] $ \ptr ->
|
||||
glClearNamedFramebufferfv
|
||||
(pdata ^. fboBase . _1 . unFBO)
|
||||
GL_COLOR
|
||||
0
|
||||
ptr
|
||||
withArray [0, 0, 0, 0] $ \ptr ->
|
||||
glClearNamedFramebufferfv
|
||||
(pdata ^. fboBase . _1 . unFBO)
|
||||
@@ -148,34 +148,26 @@ doDrawing' win pdata u = do
|
||||
2
|
||||
ptr
|
||||
--draw walls onto base buffer
|
||||
glDisable GL_BLEND
|
||||
-- maybe cull faces? maybe do this before?
|
||||
--glEnable GL_CULL_FACE
|
||||
--glCullFace GL_BACK
|
||||
glEnable GL_CULL_FACE
|
||||
glCullFace GL_BACK
|
||||
glUseProgram (pdata ^. wallShader . shaderUINT)
|
||||
glBindVertexArray $ pdata ^. wallShader . shaderVAO . vaoName
|
||||
glDrawArrays
|
||||
(_unPrimitiveMode $ pdata ^. wallShader . shaderPrimitive)
|
||||
0
|
||||
(fromIntegral trueNWalls)
|
||||
--glDisable GL_CULL_FACE
|
||||
-- if cfig ^. graphics_wall_textured
|
||||
-- then renderTextureWalls pdata nWalls
|
||||
-- else renderBlankWalls pdata nWalls
|
||||
--draw object pictures onto base buffer
|
||||
--draw object pictures onto base buffer (are there any?!)
|
||||
renderLayer BottomLayer shadV layerCounts
|
||||
--draw object shapes onto base buffer
|
||||
let fs = _shapeShader pdata
|
||||
glUseProgram (_shaderUINT fs)
|
||||
glBindVertexArray $ fs ^. shaderVAO . vaoName
|
||||
-- glEnable GL_CULL_FACE
|
||||
-- glCullFace GL_BACK
|
||||
glDrawElements
|
||||
(_unPrimitiveMode $ _shaderPrimitive fs)
|
||||
(fromIntegral nIndices)
|
||||
GL_UNSIGNED_SHORT
|
||||
nullPtr
|
||||
glDisable GL_CULL_FACE
|
||||
--draw floor onto base buffer
|
||||
glUseProgram (pdata ^. floorShader . shaderUINT)
|
||||
glBindVertexArray $ pdata ^. floorShader . shaderVAO . vaoName
|
||||
@@ -183,6 +175,7 @@ doDrawing' win pdata u = do
|
||||
(_unPrimitiveMode $ pdata ^. floorShader . shaderPrimitive)
|
||||
0
|
||||
(fromIntegral nFls)
|
||||
glDisable GL_CULL_FACE
|
||||
glEnable GL_BLEND
|
||||
--draw lightmap into its own buffer
|
||||
createLightMap
|
||||
|
||||
+16
-34
@@ -46,41 +46,27 @@ preloadRender = do
|
||||
|
||||
-- setup shape geometry/cap VBO and two VAOs
|
||||
shVBO <- setupVBO nShapeVerxComp
|
||||
shPosVAOname <- mglCreate glCreateVertexArrays
|
||||
glBindVertexArray shPosVAOname
|
||||
glVertexArrayVertexBuffer shPosVAOname 0 (shVBO ^. vboName) 0 (fromIntegral $ floatSize * nShapeVerxComp)
|
||||
setupVertexAttribPointer shPosVAOname 0 4 0
|
||||
let shPosVAO = VAO{_vaoName = shPosVAOname}
|
||||
shPosVAO <- setupVAOUsingVBO [4] shVBO
|
||||
shEBO <- setupEBO shPosVAO
|
||||
-- note the shape shader vao is distinct from the position vao, but they
|
||||
-- share an EBO
|
||||
shapeshader <- makeShaderUsingVBO "shape/basic" [vert, frag] shapeVerxSizes pmTriangles shVBO
|
||||
glVertexArrayElementBuffer (shapeshader ^. shaderVAO . vaoName) (shEBO ^. eboName)
|
||||
|
||||
--setup silhouette edge VAO
|
||||
shEBO' <- setupEBO shPosVAO
|
||||
shEdgeVAOname <- mglCreate glCreateVertexArrays
|
||||
glBindVertexArray shEdgeVAOname
|
||||
glVertexArrayVertexBuffer shEdgeVAOname 0 (shVBO ^. vboName) 0 (fromIntegral $ floatSize * nShapeVerxComp)
|
||||
setupVertexAttribPointer shEdgeVAOname 0 4 0
|
||||
--setup ebo for silhouette edges
|
||||
silEBOname <- mglCreate glCreateBuffers
|
||||
silEBOptr <- mallocArray numDrawableElements
|
||||
glVertexArrayElementBuffer shEdgeVAOname silEBOname
|
||||
glNamedBufferData
|
||||
silEBOname
|
||||
( fromIntegral $ glushortSize * numDrawableElements)
|
||||
nullPtr
|
||||
GL_STREAM_DRAW
|
||||
let silEBO = EBO{_eboName = silEBOname, _eboPtr = silEBOptr}
|
||||
shEdgeVAO = VAO{_vaoName = shEdgeVAOname}
|
||||
shedgevao <- setupVAOUsingVBO [4] shVBO
|
||||
shedgeebo <- setupEBO shedgevao
|
||||
|
||||
let wallverxstrd = 8
|
||||
wallvbo <- setupVBO wallverxstrd
|
||||
lightingWallShadShad <-
|
||||
makeShaderUsingVBO "lighting/wallShadow" [vert, geom, frag] [4] pmPoints wallvbo
|
||||
|
||||
makeShaderUsingVBO "lighting/wallShadow" [vert, geom] [4] pmPoints wallvbo
|
||||
lightingCapShad <-
|
||||
makeShaderUsingVAO "lighting/cap" [vert, geom] pmTriangles shPosVAO
|
||||
lightingLineShadowShad <-
|
||||
makeShaderUsingVAO "lighting/lineShadow" [vert, geom] pmLinesAdjacency shEdgeVAO
|
||||
|
||||
makeShaderUsingVAO "lighting/lineShadow" [vert, geom] pmLinesAdjacency shedgevao
|
||||
shadowedgeshader <-
|
||||
makeShaderUsingVAO "shadow/edge" [vert, geom] pmLinesAdjacency shEdgeVAO
|
||||
makeShaderUsingVAO "shadow/edge" [vert, geom] pmLinesAdjacency shedgevao
|
||||
shadowcapshader <-
|
||||
makeShaderUsingVAO "shadow/cap" [vert, geom] pmTriangles shPosVAO
|
||||
shadowwallshader <-
|
||||
@@ -93,9 +79,6 @@ preloadRender = do
|
||||
|
||||
-- 2D draw shaders
|
||||
bslist <- makeShaderVBO "dualTwoD/basic" [vert, frag] [3, 4] pmTriangles
|
||||
bslista <- makeShaderUsingVBO "shape/basic" [vert, frag] shapeVerxSizes pmTriangles shVBO
|
||||
glVertexArrayElementBuffer (bslista ^. shaderVAO . vaoName) (shEBO' ^. eboName)
|
||||
--glVertexArrayElementBuffer (bslista ^. shaderVAO . vaoName) shEBOname
|
||||
aslist <- makeShaderVBO "dualTwoD/arc" [vert, frag] [3, 4, 3] pmTriangles
|
||||
eslist <- makeShaderVBO "dualTwoD/ellipse" [vert, geom, frag] [3, 4] pmTriangles
|
||||
cslist <-
|
||||
@@ -131,8 +114,7 @@ preloadRender = do
|
||||
let cloudverxsizes = [4,4,4,4]
|
||||
cloudvbo <- setupVBO (sum cloudverxsizes)
|
||||
(cloudshader, cloudebo)
|
||||
<- makeShaderEBO "cloud/basic" [vert, frag] cloudverxsizes (sum cloudverxsizes)
|
||||
pmTriangles cloudvbo
|
||||
<- makeShaderEBO "cloud/basic" [vert, frag] cloudverxsizes pmTriangles cloudvbo
|
||||
framebuf2 <- setupTextureFramebuffer 800 600
|
||||
framebuf3 <- setupTextureFramebuffer 800 600
|
||||
|
||||
@@ -171,9 +153,9 @@ preloadRender = do
|
||||
return $
|
||||
RenderData
|
||||
{ _pictureShaders = shadV
|
||||
, _shapeShader = bslista -- & shaderVAO' .~ shPosColVAO
|
||||
, _shapeEBO = shEBO'
|
||||
, _silhouetteEBO = silEBO
|
||||
, _shapeShader = shapeshader -- & shaderVAO' .~ shPosColVAO
|
||||
, _shapeEBO = shEBO
|
||||
, _silhouetteEBO = shedgeebo
|
||||
, _lightingCapShader = lightingCapShad
|
||||
, _lightingLineShadowShader = lightingLineShadowShad
|
||||
, _lightingWallShadShader = lightingWallShadShad
|
||||
|
||||
@@ -67,10 +67,6 @@ renderLightingNoShadows positiontexture normaltexture lightPoints pdata = do
|
||||
GL_COLOR
|
||||
0
|
||||
ptr
|
||||
-- for each of the lights:
|
||||
-- 1. stencil out the shadows from this light's point of view
|
||||
-- 2. calculate lighting based on each fragment's position
|
||||
-- to consider: adding normals/a "material" for each fragment
|
||||
glBlendFunc GL_ZERO GL_ONE_MINUS_SRC_COLOR
|
||||
glEnable GL_STENCIL_TEST
|
||||
glStencilOpSeparate GL_FRONT GL_KEEP GL_KEEP GL_INCR_WRAP
|
||||
|
||||
+13
-19
@@ -8,7 +8,7 @@ module Shader.Compile (
|
||||
makeShaderSized,
|
||||
makeShaderUsingVAO,
|
||||
setupVAO,
|
||||
setupVAOvbo,
|
||||
setupVAOUsingVBO,
|
||||
setupVAOvbo',
|
||||
setupEBO,
|
||||
setupVertexAttribPointer,
|
||||
@@ -59,17 +59,14 @@ makeShaderEBO ::
|
||||
[GLenum] ->
|
||||
-- | The input vertex sizes
|
||||
[Int] ->
|
||||
-- | The stride
|
||||
Int ->
|
||||
PrimitiveMode ->
|
||||
VBO ->
|
||||
IO (Shader, EBO)
|
||||
makeShaderEBO s shaderlist sizes strd pm vbo = do
|
||||
prog <- makeSourcedShader s shaderlist
|
||||
vao <- setupVAOvbo sizes strd vbo
|
||||
ebo <- setupEBO vao
|
||||
return
|
||||
( Shader prog pm vao
|
||||
makeShaderEBO s shaderlist sizes pm vbo = do
|
||||
shad <- makeShaderUsingVBO s shaderlist sizes pm vbo
|
||||
ebo <- setupEBO (shad ^. shaderVAO)
|
||||
glVertexArrayElementBuffer (shad ^. shaderVAO . vaoName) (ebo ^. eboName)
|
||||
return ( shad
|
||||
, ebo
|
||||
)
|
||||
|
||||
@@ -84,10 +81,7 @@ makeShaderUsingVBO ::
|
||||
VBO ->
|
||||
IO Shader
|
||||
makeShaderUsingVBO s shaderlist sizes pm vbo = do
|
||||
let strd = vbo ^. vboVertexSize
|
||||
when (strd < sum sizes) $
|
||||
error "Tried to assign vertex attributes to VBO with too small a stride."
|
||||
vao <- setupVAOvbo sizes strd vbo
|
||||
vao <- setupVAOUsingVBO sizes vbo
|
||||
makeShaderUsingVAO s shaderlist pm vao
|
||||
|
||||
setupVBO :: Int -> IO VBO
|
||||
@@ -205,15 +199,15 @@ setupVAOvbo' sizes strd vbo = do
|
||||
{ _vaoName = vaoname
|
||||
}
|
||||
|
||||
setupVAOvbo :: [Int] -> Int -> VBO -> IO VAO
|
||||
setupVAOvbo sizes strd vbo = do
|
||||
setupVAOUsingVBO :: [Int] -> VBO -> IO VAO
|
||||
setupVAOUsingVBO sizes vbo = do
|
||||
let strd = vbo ^. vboVertexSize
|
||||
when (strd < sum sizes) $
|
||||
error "Tried to assign vertex attributes to VBO with too small a stride."
|
||||
vaoname <- mglCreate glCreateVertexArrays
|
||||
glBindVertexArray vaoname
|
||||
setupVertexAttribs vbo vaoname sizes strd
|
||||
return $
|
||||
VAO
|
||||
{ _vaoName = vaoname
|
||||
}
|
||||
return VAO { _vaoName = vaoname }
|
||||
|
||||
setupEBO :: VAO -> IO EBO
|
||||
setupEBO vao = do
|
||||
|
||||
Reference in New Issue
Block a user