diff --git a/src/Dodge/Render.hs b/src/Dodge/Render.hs index 1f9fd063e..9652dbb7f 100644 --- a/src/Dodge/Render.hs +++ b/src/Dodge/Render.hs @@ -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 diff --git a/src/Preload/Render.hs b/src/Preload/Render.hs index e25df89f8..b921a8296 100644 --- a/src/Preload/Render.hs +++ b/src/Preload/Render.hs @@ -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 diff --git a/src/Render.hs b/src/Render.hs index e66f6fd7a..418434ed6 100644 --- a/src/Render.hs +++ b/src/Render.hs @@ -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 diff --git a/src/Shader/Compile.hs b/src/Shader/Compile.hs index 271617348..6f0f4dd4e 100644 --- a/src/Shader/Compile.hs +++ b/src/Shader/Compile.hs @@ -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