From e3bd99868f29d3eaad2e4a7c1bd5a4a597c8de8b Mon Sep 17 00:00:00 2001 From: jgk Date: Sun, 4 Jul 2021 14:09:07 +0200 Subject: [PATCH] Changes towards bloom --- src/Dodge/Render.hs | 81 ++++++++++++++++++++++++++++--------------- src/Preload/Render.hs | 15 ++++++-- 2 files changed, 66 insertions(+), 30 deletions(-) diff --git a/src/Dodge/Render.hs b/src/Dodge/Render.hs index 9e8f77a7e..569a52bb5 100644 --- a/src/Dodge/Render.hs +++ b/src/Dodge/Render.hs @@ -45,6 +45,7 @@ import qualified SDL Returns a 'Word32' that should give the number of ticks it took to evaluate. -} doDrawing :: RenderData -> World -> IO Word32 doDrawing pdata w = do + clearColor $= Color4 0 0 0 1 sTicks <- SDL.ticks clear [ColorBuffer,DepthBuffer] let rot = _cameraRot w @@ -87,37 +88,12 @@ doDrawing pdata w = do -- I believe a more apt name would be setCeilingDepth: stops drawing of objects -- at points that are behind the extension of walls to the screen edge _ <- setWallDepth pdata wallPoints (viewFromx,viewFromy) + _ <- renderFoldable pdata $ picToLTree (Just 0) (polysToPic $ foregroundPics w) -- draw the first layer of pictures -- these will probably all be opaque _ <- renderFoldable pdata $ picToLTree (Just 0) pic - -- reset blend so that light map doesn't apply - -- useful for drawing vivid projectiles - blendFuncSeparate $= ((SrcAlpha,OneMinusSrcAlpha) , (Zero,One)) - depthFunc $= Just Lequal - _ <- renderFoldable pdata $ picToLTree (Just 1) pic - depthMask $= Disabled - _ <- renderFoldable pdata $ picToLTree (Just 3) pic - _ <- renderFoldable pdata $ picToLTree (Just 4) pic - _ <- renderFoldable pdata $ picToLTree (Just 5) pic - depthMask $= Enabled - -- reset blend so that light map applies again - -- allows us to be certain these elements are drawn on top of those before, - -- in case we want transparency effects - blendFuncSeparate $= ((SrcAlphaSaturate, OneMinusSrcAlpha), (Zero,One)) - _ <- renderFoldable pdata $ picToLTree (Just 2) pic - depthMask $= Disabled - -- render transparent walls - -- the ordering between these and transparent clouds perhaps presents a challenge - renderBlankWalls pdata windowPoints - depthMask $= Enabled - depthFunc $= Just Lequal - _ <- renderFoldable pdata $ picToLTree (Just 0) (polysToPic $ foregroundPics w) - --(Pictures $ concatmap (Poly3D 0 . _pyFaces) (foregroundPics w)) - - -- draw the fbo to the screen - -- allows for post-processing - -- first, bind the screen fbo + -- draw opaque background to screen bindFramebuffer Framebuffer $= defaultFramebufferObject -- we probably do not want to blend during this step blend $= Disabled @@ -133,12 +109,63 @@ doDrawing pdata w = do bindShaderBuffers [_grayscaleShader pdata] [4] drawShader (_grayscaleShader pdata) 4 blend $= Enabled + bindFramebuffer Framebuffer $= fst3 (_fbo2 pdata) + + depthFunc $= Just Less + clearColor $= Color4 0 0 0 0 + clear [ColorBuffer] + + -- reset blend so that light map doesn't apply + -- useful for drawing vivid projectiles + blendFunc $= (SrcAlpha,OneMinusSrcAlpha) + _ <- renderFoldable pdata $ picToLTree (Just 1) pic + depthMask $= Disabled + _ <- renderFoldable pdata $ picToLTree (Just 3) pic + _ <- renderFoldable pdata $ picToLTree (Just 4) pic + _ <- renderFoldable pdata $ picToLTree (Just 5) pic + --depthFunc $= Just Lequal + --_ <- renderFoldable pdata $ picToLTree (Just 0) (polysToPic $ foregroundPics w) + --(Pictures $ concatmap (Poly3D 0 . _pyFaces) (foregroundPics w)) + + -- draw the fbo to the screen + -- allows for post-processing + -- first, bind the screen fbo + bindFramebuffer Framebuffer $= defaultFramebufferObject + blend $= Enabled + blendFuncSeparate $= ((SrcAlpha,OneMinusSrcAlpha),(Zero,One)) + depthFunc $= Just Always + textureBinding Texture2D $= Just (snd3 $ _fbo2 pdata) +-- textureFilter Texture2D $= ((Linear',Just Linear') , Linear') +-- generateMipmap' Texture2D + if _crHP (you w) > 0 + then do + bindShaderBuffers [_fullscreenShader pdata] [4] + drawShader (_fullscreenShader pdata) 4 + else do + bindShaderBuffers [_grayscaleShader pdata] [4] + drawShader (_grayscaleShader pdata) 4 + blend $= Enabled + --depthMask $= Enabled + depthMask $= Disabled + depthFunc $= Just Less + -- reset blend so that light map applies again + -- allows us to be certain these elements are drawn on top of those before, + -- in case we want transparency effects + blendFuncSeparate $= ((SrcAlphaSaturate, OneMinusSrcAlpha), (Zero,One)) + _ <- renderFoldable pdata $ picToLTree (Just 2) pic + -- render transparent walls + -- the ordering between these and transparent clouds perhaps presents a challenge + renderBlankWalls pdata windowPoints + + --depthMask $= Enabled bufferUBO $ isoMatrix 0 1 (0,0) (2,2) + depthFunc $= Just Always blendFunc $= (SrcAlpha,OneMinusSrcAlpha) _ <- renderFoldable pdata (picToLTree Nothing $ fixedCoordPictures w) eTicks <- SDL.ticks + depthMask $= Enabled return (eTicks - sTicks) -------------------------------------------------------------------------------- diff --git a/src/Preload/Render.hs b/src/Preload/Render.hs index 859d257b3..5079868f3 100644 --- a/src/Preload/Render.hs +++ b/src/Preload/Render.hs @@ -127,6 +127,18 @@ setupFramebufferWithStencil = do return (fboName, fboTO, fboRBO) +setupFramebuffersSharedStencil :: IO + ( ( (FramebufferObject, TextureObject) + , (FramebufferObject, TextureObject) + , (FramebufferObject, TextureObject) + , (FramebufferObject, TextureObject) + , (FramebufferObject, TextureObject) + , (FramebufferObject, TextureObject) + ) + , RenderbufferObject + ) +setupFramebuffersSharedStencil = undefined + setupFramebuffer :: IO (FramebufferObject, TextureObject) setupFramebuffer = do fboName <- genObjectName @@ -208,6 +220,3 @@ poke32 _ = undefined poke33 :: RenderType -> [[Float]] poke33 Render3x3{_unRender3x3=((x,y,z),(a,b,c))} = [[x,y,z,a,b,c]] poke33 _ = undefined - -pokeBGStrat :: a -> [[Float]] -pokeBGStrat = const []