diff --git a/shader/cloud/basic.frag b/shader/cloud/basic.frag index a17f3f5d3..4f07fbb1c 100644 --- a/shader/cloud/basic.frag +++ b/shader/cloud/basic.frag @@ -11,6 +11,9 @@ void main() float d = dot(vControls,vControls); if (d > 1) {discard;} fCol = vCol; - fPos = vec4(vPosID.xy, vPosID.z + (1-d) * vCenterSize.w, 1); - fNorm = vec4(vCenterSize.xyz - fPos.xyz, 1); + fPos = vec4(vPosID.xy, vPosID.z + (1-d) * vCenterSize.w, 0.5); + vec3 fn1 = (1-d)*vec3(vCenterSize.xyz - fPos.xyz); + //vec3 fn1 = vec3(vCenterSize.xyz - fPos.xyz); + fNorm = vec4(0.3*fn1.xy,fn1.z, 0.5); + //fNorm = vec4(0,0,1, 1); } diff --git a/src/Data/Preload/Render.hs b/src/Data/Preload/Render.hs index 7a0739701..5227d2f3b 100644 --- a/src/Data/Preload/Render.hs +++ b/src/Data/Preload/Render.hs @@ -44,7 +44,7 @@ data RenderData = RenderData , _fboHalf2 :: (FBO, TO) , _fboHalf3 :: (FBO, TO) , _fboBase :: (FBO, (TO, TO, TO)) - , _fboCloud :: (FBO, (TO, TO)) + , _fboCloud :: (FBO, (TO, TO, TO)) , _fboBloom :: (FBO, TO) , _fboPos :: (FBO, TO) , _fboLighting :: (FBO, TO) diff --git a/src/Dodge/Data/Config.hs b/src/Dodge/Data/Config.hs index 0d7866a85..fb21af636 100644 --- a/src/Dodge/Data/Config.hs +++ b/src/Dodge/Data/Config.hs @@ -86,7 +86,6 @@ data ResFactor = FullRes | HalfRes | QuarterRes data ObjectShadows = GeoObjShads | InstancingShads - | CPUObjShads | NoObjShads | NoShadows | NoLighting diff --git a/src/Dodge/Event/Test.hs b/src/Dodge/Event/Test.hs index 1ca290d6d..be8f8b331 100644 --- a/src/Dodge/Event/Test.hs +++ b/src/Dodge/Event/Test.hs @@ -2,8 +2,15 @@ module Dodge.Event.Test ( testEvent, ) where +import Dodge.SoundLogic.ExternallyGeneratedSounds import Dodge.Data.World +import Control.Lens +import Geometry testEvent :: World -> World testEvent w = w + & cWorld . lWorld . worldEvents .~ SoundStart BackgroundSound (V2 0 0) foamSprayFadeOutS Nothing : + [MakeStartCloudAt (V3 (cx + x) (cy + y) 5) | x <- [-5, -4 .. 5], y <- [-5, -4 .. 5]] + where + V2 cx cy = w ^?! cWorld . lWorld . creatures . ix 0 . crPos diff --git a/src/Dodge/Render.hs b/src/Dodge/Render.hs index d676de488..a961abe43 100644 --- a/src/Dodge/Render.hs +++ b/src/Dodge/Render.hs @@ -132,7 +132,6 @@ doDrawing' win pdata u = do GL_DEPTH 0 ptr - glDepthFunc GL_LESS -- draw wall occlusions from the camera's point of view glUseProgram (pdata ^. lightingWallShadShader . shadName) @@ -203,7 +202,7 @@ doDrawing' win pdata u = do nIndices (u ^. uvConfig . graphics_object_shadows) (pdata ^. fboBase . _2 . _2) - (drawCPUShadows pdata ws) + (pdata ^. fboBase . _2 . _3) glColorMask GL_TRUE GL_TRUE GL_TRUE GL_TRUE --apply lightmap to base buffer glBindFramebuffer GL_FRAMEBUFFER (pdata ^. fboBase . _1 . unFBO) @@ -250,36 +249,58 @@ doDrawing' win pdata u = do GL_COLOR 0 ptr - renderLayer MidLayer shadV layerCounts --- glUseProgram (pdata ^. cloudShader . shaderUINT) --- glBindVertexArray $ pdata ^. cloudShader . shaderVAO . vaoName --- glDrawElements --- (pdata ^. cloudShader . shaderPrimitive) --- (fromIntegral nCloudIs) --- GL_UNSIGNED_SHORT --- nullPtr +-- renderLayer MidLayer shadV layerCounts + glUseProgram (pdata ^. cloudShader . shaderUINT) + glBindVertexArray $ pdata ^. cloudShader . shaderVAO . vaoName + glDrawElements + (pdata ^. cloudShader . shaderPrimitive) + (fromIntegral nCloudIs) + GL_UNSIGNED_SHORT + nullPtr drawShader (_windowShader pdata) nWins --- when (_graphics_cloud_shadows cfig) $ do --- ----render transparency depths --- glDepthMask GL_TRUE --- glDisable GL_BLEND --- withArray [GL_NONE, GL_COLOR_ATTACHMENT1] $ \ptr -> glDrawBuffers 2 ptr --- renderLayer MidLayer shadV layerCounts --- drawShader (_windowShader pdata) nWins --- ----draw lightmap for cloud buffer --- glDepthMask GL_FALSE --- glEnable GL_BLEND --- glBindFramebuffer GL_FRAMEBUFFER (_unFBO (fst (_fboLighting pdata))) --- createLightMap --- cfig --- pdata --- lightPoints --- nWalls --- nSilIndices --- nIndices --- (_graphics_object_shadows $ _uvConfig u) --- (snd $ snd $ _fboCloud pdata) --- (drawCPUShadows pdata ws) + when (_graphics_cloud_shadows cfig) $ do + ----render transparency depths + glDepthMask GL_TRUE + glDepthFunc GL_ALWAYS + glDisable GL_BLEND + withArray [GL_NONE, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2] $ \ptr -> glDrawBuffers 3 ptr + withArray [0,0,0,0] $ \ptr -> glClearNamedFramebufferfv + (pdata ^. fboCloud . _1 . unFBO) + GL_COLOR + 1 + ptr + withArray [0,0,0,0] $ \ptr -> glClearNamedFramebufferfv + (pdata ^. fboCloud . _1 . unFBO) + GL_COLOR + 2 + ptr + glEnable GL_BLEND + glBlendColor 0.5 0.5 0.5 0.5 + glBlendFunci 1 GL_ONE_MINUS_DST_ALPHA GL_DST_ALPHA + glBlendFunci 2 GL_ONE GL_ONE + glUseProgram (pdata ^. cloudShader . shaderUINT) + glBindVertexArray $ pdata ^. cloudShader . shaderVAO . vaoName + glDrawElements + (pdata ^. cloudShader . shaderPrimitive) + (fromIntegral nCloudIs) + GL_UNSIGNED_SHORT + nullPtr + drawShader (_windowShader pdata) nWins + ----draw lightmap for cloud buffer + glDepthMask GL_FALSE + glDepthFunc GL_LEQUAL + glEnable GL_BLEND + glBindFramebuffer GL_FRAMEBUFFER (_unFBO (fst (_fboLighting pdata))) + createLightMap + cfig + pdata + lightPoints + nWalls + nSilIndices + nIndices + (_graphics_object_shadows $ _uvConfig u) + (pdata ^. fboCloud . _2 . _2) + (pdata ^. fboCloud . _2 . _3) glInvalidateBufferData (pdata ^. vboShapes . vboName) --apply lightmap to cloud buffer glBindFramebuffer GL_FRAMEBUFFER (_unFBO (fst (_fboCloud pdata))) @@ -300,7 +321,7 @@ doDrawing' win pdata u = do drawShader (fst $ _fullscreenShader pdata) 4 glBlendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA --draw shadowed clouds onto base buffer - glBindTexture GL_TEXTURE_2D (_unTO . fst . snd $ _fboCloud pdata) + glBindTexture GL_TEXTURE_2D (pdata ^. fboCloud . _2 . _1 . unTO) drawShader (fst $ _fullscreenShader pdata) 4 --set viewport for radial distortion setViewportSize (round winx) (round winy) diff --git a/src/Dodge/WorldEvent/Cloud.hs b/src/Dodge/WorldEvent/Cloud.hs index 5eb035126..3b65b0191 100644 --- a/src/Dodge/WorldEvent/Cloud.hs +++ b/src/Dodge/WorldEvent/Cloud.hs @@ -59,7 +59,8 @@ makeThinSmokeAt :: Point3 -> World -> World makeThinSmokeAt = makeCloudAt (CloudColor 4 400 (withAlpha 0.05 black)) 5 400 50 makeStartCloudAt :: Point3 -> World -> World -makeStartCloudAt = makeCloudAt (CloudColor 2 800 white) 10 400 5 +--makeStartCloudAt = makeCloudAt (CloudColor 2 800 white) 10 400 5 +makeStartCloudAt = makeCloudAt (CloudColor 2 800 white) 10 400 50 shellTrailCloud :: Point3 -> World -> World shellTrailCloud = makeCloudAt (CloudColor (4 / 3) 800 (greyN 0.5)) 15 400 40 diff --git a/src/Framebuffer/Update.hs b/src/Framebuffer/Update.hs index 8b9501363..169e68d58 100644 --- a/src/Framebuffer/Update.hs +++ b/src/Framebuffer/Update.hs @@ -30,11 +30,8 @@ sizeFBOs :: sizeFBOs xsize ysize xfull yfull rdata = do resizeRBO (_rboBaseBloom rdata) xsize ysize rdata1 <- updateFBOTO3 xsize ysize GL_NEAREST GL_NEAREST GL_RGBA8 GL_RGBA16F GL_RGBA16F rdata fboBase - rdata' <- - foldM (updateFBOTO2 xsize ysize GL_NEAREST GL_NEAREST GL_RGBA8 GL_RGBA16F) rdata1 [fboCloud] - >>= flip - (foldM (updateFBOTO xsize ysize GL_NEAREST GL_NEAREST GL_RGBA8)) - [fboLighting] + rdata2 <- updateFBOTO3 xsize ysize GL_NEAREST GL_NEAREST GL_RGBA8 GL_RGBA16F GL_RGBA16F rdata1 fboCloud + rdata' <- updateFBOTO xsize ysize GL_NEAREST GL_NEAREST GL_RGBA8 rdata2 fboLighting rdata'' <- foldM (updateFBOTO xsize ysize GL_LINEAR_MIPMAP_LINEAR GL_LINEAR GL_RGBA16F) diff --git a/src/Preload/Render.hs b/src/Preload/Render.hs index 33bee37ba..be1ffc5ed 100644 --- a/src/Preload/Render.hs +++ b/src/Preload/Render.hs @@ -76,22 +76,14 @@ preloadRender = do let winColVAO = VAO {_vaoName = winColVAOname} -- setup shape geometry/cap VBO and two VAOs - shEBOptr <- mallocArray numDrawableElements - shEBOname <- mglCreate glCreateBuffers - glNamedBufferData - shEBOname - ( fromIntegral $ glushortSize * numDrawableElements) - nullPtr - GL_STREAM_DRAW - let shEBO = EBO{_eboName = shEBOname, _eboPtr = shEBOptr} shVBO <- setupVBO nShapeVerxComp shPosVAOname <- mglCreate glCreateVertexArrays glBindVertexArray shPosVAOname glVertexArrayVertexBuffer shPosVAOname 0 (shVBO ^. vboName) 0 (fromIntegral $ floatSize * nShapeVerxComp) setupVertexAttribPointer shPosVAOname 0 4 0 - glVertexArrayElementBuffer shPosVAOname shEBOname let shPosVAO = VAO{_vaoName = shPosVAOname} --setup silhouette edge VAO + shEBO' <- setupEBO shPosVAO shEdgeVAOname <- mglCreate glCreateVertexArrays glBindVertexArray shEdgeVAOname glVertexArrayVertexBuffer shEdgeVAOname 0 (shVBO ^. vboName) 0 (fromIntegral $ floatSize * nShapeVerxComp) @@ -133,7 +125,8 @@ preloadRender = do -- 2D draw shaders bslist <- makeShader "dualTwoD/basic" [vert, frag] [3, 4] ETriangles bslista <- makeShader4 "shape/basic" [vert, frag] shapeVerxSizes nShapeVerxComp ETriangles shVBO - glVertexArrayElementBuffer (bslista ^. shadVAO . vaoName) shEBOname + glVertexArrayElementBuffer (bslista ^. shadVAO . vaoName) (shEBO' ^. eboName) + --glVertexArrayElementBuffer (bslista ^. shadVAO . vaoName) shEBOname aslist <- makeShader "dualTwoD/arc" [vert, frag] [3, 4, 3] ETriangles eslist <- makeShader "dualTwoD/ellipse" [vert, geom, frag] [3, 4] ETriangles bezierQuadShader <- makeShader "dualTwoD/bezierQuad" [vert, frag] [3, 4, 4] ETriangleStrip @@ -172,9 +165,9 @@ preloadRender = do let cloudverxsizes = [4,4,4,4] cloudvbo <- setupVBO (sum cloudverxsizes) - (cloudshader, cloudebo) - <- makeShaderEBO "floor/arrayPos" [vert, frag] cloudverxsizes (sum cloudverxsizes) - GL_TRIANGLES floorvbo + (cloudshader, cloudebo) + <- makeShaderEBO "cloud/basic" [vert, frag] cloudverxsizes (sum cloudverxsizes) + GL_TRIANGLES cloudvbo -- bind fixed vertex data bufferPokedVBO (snd fsShad) 4 framebuf2 <- setupTextureFramebuffer 800 600 @@ -188,7 +181,7 @@ preloadRender = do 600 fboBaseName <- setupFramebuffer3GivenStencil rboBaseBloomName - fboCloudName <- setupFramebuffer2GivenStencil rboBaseBloomName + fboCloudName <- setupFramebuffer3GivenStencil rboBaseBloomName fboBloomName <- setupFramebufferGivenStencil rboBaseBloomName fboPosName <- setupFramebufferGivenStencil rboBaseBloomName fboLightingName <- setupFramebufferGivenStencil rboBaseBloomName @@ -218,7 +211,7 @@ preloadRender = do RenderData { _pictureShaders = shadV , _shapeShader = bslista -- & shadVAO' .~ shPosColVAO - , _shapeEBO = shEBO + , _shapeEBO = shEBO' , _silhouetteEBO = silEBO , _lightingCapShader = lightingCapShad , _lightingLineShadowShader = lightingLineShadowShad diff --git a/src/Render.hs b/src/Render.hs index 182f68c5b..0b923f8cd 100644 --- a/src/Render.hs +++ b/src/Render.hs @@ -43,9 +43,13 @@ createLightMap :: ObjectShadows -> -- | the texture object giving positions TO -> - (Point3 -> Float -> IO ()) -> -- attempt at drawing shadow not using geo shader + -- | the texture object giving normals + TO -> IO () -createLightMap cfig pdata lightPoints nWalls nSils nCaps shadsdrawtype toPos drawCPUShadows = case shadsdrawtype of +createLightMap cfig pdata lightPoints nWalls nSils nCaps shadsdrawtype + toPos + normaltexture + = case shadsdrawtype of InstancingShads -> instanceLightMap cfig pdata lightPoints nWalls nSils nCaps toPos NoShadows -> do glBindFramebuffer GL_FRAMEBUFFER (_unFBO (fst (_fboLighting pdata))) @@ -183,14 +187,13 @@ createLightMap cfig pdata lightPoints nWalls nSils nCaps shadsdrawtype toPos dra GL_UNSIGNED_SHORT nullPtr glDisable GL_DEPTH_CLAMP - CPUObjShads -> drawCPUShadows (V3 x y z) rad NoObjShads -> return () --draw lightmap itself glDepthFunc GL_ALWAYS -- bind world position texture glDisable GL_CULL_FACE bindTO toPos - glBindTextureUnit 1 (pdata ^. fboBase . _2 . _3 . unTO) + glBindTextureUnit 1 (normaltexture ^. unTO) glColorMask GL_TRUE GL_TRUE GL_TRUE GL_TRUE glStencilFunc GL_EQUAL 0 255 glUseProgram (ltextShad ^. shadName) --Just (_shadProg ltextShad) diff --git a/src/Shader/Compile.hs b/src/Shader/Compile.hs index b99af2119..970f0d411 100644 --- a/src/Shader/Compile.hs +++ b/src/Shader/Compile.hs @@ -8,6 +8,7 @@ module Shader.Compile ( makeShaderSized, makeShaderUsingVAO, setupVAO, + setupEBO, setupVertexAttribPointer, ) where diff --git a/src/Shader/Poke/Cloud.hs b/src/Shader/Poke/Cloud.hs index 4f780e157..0ecaa9a25 100644 --- a/src/Shader/Poke/Cloud.hs +++ b/src/Shader/Poke/Cloud.hs @@ -10,8 +10,8 @@ import Graphics.GL.Core45 pokeCloud :: Ptr Float -> Ptr GLushort -> (Int, Int) -> Cloud -> IO (Int, Int) pokeCloud vptr iptr (nv,ni) cl = do - UV.imapM_ (pokeCloudVerx vptr cl nv) $ UV.fromList [(1, 1), (1, -1), (-1, -1), (-1, 1)] - UV.imapM_ (pokeCloudIndex iptr nv ni) $ UV.fromList [0, 1, 2, 2, 1, 3] + UV.imapM_ (pokeCloudVerx vptr cl nv) $ UV.fromList [(1, 1), (-1, 1), (-1, -1), (1, -1)] + UV.imapM_ (pokeCloudIndex iptr nv ni) $ UV.fromList [0, 1, 2, 2, 0, 3] return (nv + 4, ni + 6) pokeCloudVerx :: Ptr Float -> Cloud -> Int -> Int -> (Float, Float) -> IO ()