diff --git a/src/Dodge/Render.hs b/src/Dodge/Render.hs index 7feef8976..0384e2792 100644 --- a/src/Dodge/Render.hs +++ b/src/Dodge/Render.hs @@ -54,7 +54,10 @@ doDrawing pdata w = do --viewFroms@(viewFromx,viewFromy) = _cameraViewFrom w viewFroms = _cameraViewFrom w pic = worldPictures w - wallPoints = map fst wallPointsCol + + -- bind wall points and colors to vbo + nWalls <- F.foldM (pokeShader $ _wallTextureShader pdata) (map Render22x4 wallPointsCol) + bindShaderBuffers [_wallTextureShader pdata] [nWalls] -- set the coordinate uniform ready for drawing elements using world coordinates bufferUBO $ perspectiveMatrixb rot camzoom trans wins viewFroms bindFramebuffer Framebuffer $= (fst $ _fboBase pdata) @@ -62,8 +65,8 @@ doDrawing pdata w = do clear [ColorBuffer,DepthBuffer] depthFunc $= Just Less if w ^. config . wall_textured - then renderTextureWalls pdata wallPointsCol - else renderBlankWalls pdata wallPointsCol + then renderTextureWalls pdata nWalls + else renderBlankWalls pdata nWalls -- _ <- setWallDepth pdata wallPoints (viewFromx,viewFromy) _ <- renderFoldable pdata $ picToLTree (Just 0) (polysToPic $ foregroundPics w) _ <- renderFoldable pdata $ picToLTree (Just 0) pic @@ -108,8 +111,8 @@ doDrawing pdata w = do bindFramebuffer Framebuffer $= (fst $ _fboLighting pdata) let scPol = screenPolygon w - createLightMap pdata (w ^. config . shadow_resolution) wallPoints lightPoints - (foregroundPics w) scPol + createLightMap pdata (w ^. config . shadow_resolution) lightPoints + (foregroundPics w) scPol nWalls colorMask $= Color4 Enabled Enabled Enabled Enabled clearColor $= Color4 0 0 0 0 @@ -136,7 +139,7 @@ doDrawing pdata w = do depthFunc $= Just Lequal _ <- renderFoldable pdata $ picToLTree (Just 2) pic - renderBlankWalls pdata windowPoints + renderWindows pdata windowPoints depthFunc $= Just Always blendFunc $= (One,Zero) @@ -208,11 +211,21 @@ bufferUBO mat = withArray mat $ \ptr -> bufferSubData UniformBuffer WriteToBuffer 0 64 ptr renderBlankWalls + :: RenderData + -> Int -- ^ number of walls +-- -> GLmatrix GLfloat + -> IO () +renderBlankWalls pdata nWalls = do + cullFace $= Just Back + drawShader (_wallBlankShader pdata) nWalls + cullFace $= Nothing + +renderWindows :: RenderData -> [((Point2,Point2),Point4)] -- ^ List: wall positions and color -- -> GLmatrix GLfloat -> IO () -renderBlankWalls pdata wps = do +renderWindows pdata wps = do n <- F.foldM (pokeShader $ _wallBlankShader pdata) (map Render22x4 wps) bindShaderBuffers [_wallBlankShader pdata] [n] currentProgram $= Just (_shaderProgram $ _wallBlankShader pdata) @@ -222,12 +235,9 @@ renderBlankWalls pdata wps = do renderTextureWalls :: RenderData - -> [((Point2,Point2),Point4)] -- ^ List: wall positions and color + -> Int -- ^ number of walls -> IO () -renderTextureWalls pdata wps = do - n <- F.foldM (pokeShader $ _wallTextureShader pdata) (map Render22x4 wps) - bindShaderBuffers [_wallTextureShader pdata] [n] - currentProgram $= Just (_shaderProgram $ _wallTextureShader pdata) +renderTextureWalls pdata nWalls = do cullFace $= Just Back - drawShader (_wallTextureShader pdata) n + drawShader (_wallTextureShader pdata) nWalls cullFace $= Nothing diff --git a/src/Preload/Render.hs b/src/Preload/Render.hs index fe950dc3c..8d013f284 100644 --- a/src/Preload/Render.hs +++ b/src/Preload/Render.hs @@ -10,6 +10,7 @@ import Shader import Shader.Data import Shader.Compile import Shader.AuxAddition +import Shader.Parameters import Data.Preload.Render import Graphics.Rendering.OpenGL hiding (Point,translate,scale,imageHeight) @@ -19,22 +20,39 @@ import Foreign preloadRender :: IO RenderData preloadRender = do - -- set up uniform buffer object theUBO <- genObjectName bindBuffer UniformBuffer $= Just theUBO bufferData UniformBuffer $= (64, nullPtr, DynamicDraw) bindBufferBase IndexedUniformBuffer 0 $= Just theUBO + -- setup wall points VBO, VAOs and shaders + wpVBOname <- genObjectName + wpVBOptr <- mallocArray (8 * numDrawableElements) + bindBuffer ArrayBuffer $= Just wpVBOname + bufferData ArrayBuffer $= + (fromIntegral $ floatSize * numDrawableElements * 8 + , nullPtr + , DynamicDraw + ) + let wpVBO = VBO {_vbo = wpVBOname, _vboPointer = wpVBOptr, _vboAttribSizes = [4,4]} + wpVAOname <- genObjectName + bindVertexArrayObject $= Just wpVAOname + bindBuffer ArrayBuffer $= Just wpVBOname + setupVertexAttribPointer 0 4 8 0 + wpColVAOname <- genObjectName + bindVertexArrayObject $= Just wpColVAOname + bindBuffer ArrayBuffer $= Just wpVBOname + setupVertexAttribPointer 0 4 8 0 + setupVertexAttribPointer 1 4 8 4 + let wpVAO = VAO {_vao = wpVAOname, _vaoVBO = wpVBO} + wpColVAO = VAO {_vao = wpColVAOname, _vaoVBO = wpVBO} --- lighting shaders + -- lighting shaders wsShad <- makeShader "lighting/occlude" [vert,geom,frag] [4] EPoints pokeWPStrat >>= addUniforms ["lightPos"] wlLightShad <- makeShaderUsingShaderVAO "lighting/wall" [vert,geom,frag] EPoints wsShad >>= addUniforms ["lightPos","radLum"] --- wlLightShad --- <- makeShader "lighting/wall" [vert,geom,frag] [4] EPoints pokeWPStrat --- >>= addUniforms ["lightPos","radLum"] lightingSurfaceShad <- makeShader "lighting/surface" [vert,frag] [3] ETriangles poke3 >>= addUniforms ["lightPos","radLum"] @@ -58,12 +76,9 @@ preloadRender = do fsShad <- makeShader "texture/simple" [vert,frag] [2,2] ETriangleStrip $ const cornerList -- note we directly poke the shader vertex data here pokeArray (_vboPointer $ _vaoVBO $ _shaderVAO fsShad) $ concat cornerList - bloomBlurShad <- makeShader "texture/bloomBlur" [vert,frag] [2,2] ETriangleStrip $ const cornerList - pokeArray (_vboPointer $ _vaoVBO $ _shaderVAO bloomBlurShad) $ concat cornerList - colorBlurShad <- makeShader "texture/colorBlur" [vert,frag] [2,2] ETriangleStrip $ const cornerList - pokeArray (_vboPointer $ _vaoVBO $ _shaderVAO colorBlurShad) $ concat cornerList - grayscaleShad <- makeShader "texture/grayscale" [vert,frag] [2,2] ETriangleStrip $ const cornerList - pokeArray (_vboPointer $ _vaoVBO $ _shaderVAO grayscaleShad) $ concat cornerList + bloomBlurShad <- makeShaderUsingShaderVAO "texture/bloomBlur" [vert,frag] ETriangleStrip fsShad + colorBlurShad <- makeShaderUsingShaderVAO "texture/colorBlur" [vert,frag] ETriangleStrip fsShad + grayscaleShad <- makeShaderUsingShaderVAO "texture/grayscale" [vert,frag] ETriangleStrip fsShad barrelShad <- makeShader "texture/barrel" [vert,geom,frag] [2,2,2,1] EPoints pokeRadDist -- blank wallShader wlBlank <- makeShader "wall/blank" [vert,geom,frag] [4,4] EPoints pokeWPColStrat @@ -77,7 +92,7 @@ preloadRender = do textArrayShad <- makeShader "texture/array" [vert,frag] [3,3] ETriangles poke33 >>= addTextureArray "data/texture/ayene_wooden_floor.png" -- bind fixed vertex data - bindShaderBuffers [fsShad,bloomBlurShad,colorBlurShad,fullscreenAlphaHalveShad] [4,4,4,4] + bindShaderBuffers [fsShad,fullscreenAlphaHalveShad] [4,4] -- framebuffer for lighting (fbo,fboTO,fboRBO) <- setupFramebufferWithStencil framebuf2 <- setupFramebufferWithStencil @@ -110,10 +125,10 @@ preloadRender = do [bslist,lslist,cslist,aslist,eslist,bezierQuadShader,basicTweakZShad] , _lightingSurfaceShader = lightingSurfaceShad , _lightingLineShadowShader = lightingLineShadowShad - , _lightingOccludeShader = wsShad - , _lightingWallShader = wlLightShad - , _wallBlankShader = wlBlank - , _wallTextureShader = wlTexture + , _lightingOccludeShader = wsShad {_shaderVAO = wpVAO} + , _lightingWallShader = wlLightShad {_shaderVAO = wpVAO} + , _wallBlankShader = wlBlank { _shaderVAO = wpColVAO } + , _wallTextureShader = wlTexture { _shaderVAO = wpColVAO } , _textureShader = textShad , _textureArrayShader = textArrayShad , _fullscreenShader = fsShad diff --git a/src/Render.hs b/src/Render.hs index cbb569fee..4e7e7b4e2 100644 --- a/src/Render.hs +++ b/src/Render.hs @@ -22,26 +22,26 @@ import Data.Tuple.Extra --import qualified Data.IntMap.Strict as IM import qualified SDL -setWallDepth - :: RenderData - -> [(Point2,Point2)] -- ^ Wall points - -> (Float,Float) -- ^ View from point - -> IO Word32 -setWallDepth pdata wallPoints (viewFromx,viewFromy) = do - startTicks <- SDL.ticks - colorMask $= Color4 Disabled Disabled Disabled Disabled - nWalls <- F.foldM (pokeShader $ _lightingOccludeShader pdata) (map Render22 wallPoints) - bindShaderBuffers [_lightingOccludeShader pdata] [nWalls] - - currentProgram $= Just (_shaderProgram $ _lightingOccludeShader pdata) - -- reseting this uniform appears to be necessary - uniform (head $ _shaderCustomUnis $ _lightingOccludeShader pdata) - $= Vector2 viewFromx viewFromy --- cullFace $= Just Front - drawShader (_lightingOccludeShader pdata) nWalls - colorMask $= Color4 Enabled Enabled Enabled Enabled - endTicks <- SDL.ticks - return $ endTicks - startTicks +--setWallDepth +-- :: RenderData +-- -> [(Point2,Point2)] -- ^ Wall points +-- -> (Float,Float) -- ^ View from point +-- -> IO Word32 +--setWallDepth pdata wallPoints (viewFromx,viewFromy) = do +-- startTicks <- SDL.ticks +-- colorMask $= Color4 Disabled Disabled Disabled Disabled +-- nWalls <- F.foldM (pokeShader $ _lightingOccludeShader pdata) (map Render22 wallPoints) +-- bindShaderBuffers [_lightingOccludeShader pdata] [nWalls] +-- +-- currentProgram $= Just (_shaderProgram $ _lightingOccludeShader pdata) +-- -- reseting this uniform appears to be necessary +-- uniform (head $ _shaderCustomUnis $ _lightingOccludeShader pdata) +-- $= Vector2 viewFromx viewFromy +---- cullFace $= Just Front +-- drawShader (_lightingOccludeShader pdata) nWalls +-- colorMask $= Color4 Enabled Enabled Enabled Enabled +-- endTicks <- SDL.ticks +-- return $ endTicks - startTicks divideSize :: Int -> Size -> Size divideSize i (Size x y) = Size (div x $ fromIntegral i) (div y $ fromIntegral i) @@ -55,12 +55,12 @@ Determine where light is shining in the world. createLightMap :: RenderData -> Int -- Resolution division - -> [(Point2,Point2)] -- Wall pairs -> [(Point3,Float,Float)] -- Lights -> [Polyhedra] -- foreground geometry -> [Point2] + -> Int -- ^ number of walls -> IO () -createLightMap pdata resDiv wallPoints lightPoints fpics scPol = do +createLightMap pdata resDiv lightPoints fpics scPol nWalls = do depthFunc $= Just Less -- get viewport size so we can reset it later (vppos,vpsize) <- get viewport @@ -68,11 +68,6 @@ createLightMap pdata resDiv wallPoints lightPoints fpics scPol = do let vsize = divideSize resDiv vpsize viewport $= (vppos, vsize) textureBinding Texture2D $= Just (snd $ _fboLighting pdata) - -- store wall and light positions into buffer --- nWallLights <- F.foldM (pokeShader $ _lightingWallShader pdata) (map Render22 wallPoints) --- bindShaderBuffers [_lightingWallShader pdata] [nWallLights] - nWalls <- F.foldM (pokeShader $ _lightingOccludeShader pdata) (map Render22 wallPoints) - bindShaderBuffers [_lightingOccludeShader pdata] [nWalls] -- store foreground silhouette geometry into buffer nSils <- F.foldM (pokeShader $ _lightingLineShadowShader pdata) (concatMap polyToRender fpics) bindShaderBuffers [_lightingLineShadowShader pdata] [nSils] @@ -152,7 +147,6 @@ createLightMap pdata resDiv wallPoints lightPoints fpics scPol = do $= Vector3 x y z uniform (_shaderCustomUnis (_lightingWallShader pdata) !! 1) $= Vector2 r lum - --drawShader (_lightingWallShader pdata) nWallLights drawShader (_lightingWallShader pdata) nWalls cullFace $= Nothing stencilTest $= Disabled diff --git a/src/Shader/Compile.hs b/src/Shader/Compile.hs index d5d4187cb..76559a861 100644 --- a/src/Shader/Compile.hs +++ b/src/Shader/Compile.hs @@ -3,6 +3,7 @@ module Shader.Compile , makeShaderUsingShaderVAO , makeSourcedShader , setupVAO + , setupVertexAttribPointer ) where import Shader.Data import Shader.Parameters