Use vertex pulling for clouds

This commit is contained in:
2025-11-12 19:57:07 +00:00
parent ce1937c78e
commit 409180959c
11 changed files with 202 additions and 107 deletions
+64 -37
View File
@@ -61,6 +61,11 @@ doDrawing' win pdata u = do
let wswp = wallSPics <> worldSPic cfig u
ws = wswp ^. _1
wp = wswp ^. _2
nCloudVs <-
V.foldM'
(pokeCloud (pdata ^. cloudVBO . vboPtr))
0
(V.fromList $ w ^. cWorld . lWorld . clouds)
((nWins, trueNWalls), (nShapeVs, nIndices, nSilIndices)) <-
MP.liftM3
(\_ a b -> (a, b))
@@ -83,28 +88,40 @@ doDrawing' win pdata u = do
(0, 0, 0)
ws
)
(nCloudVs', nCloudIs') <-
-- Might want to sort the clouds based on z depth, not sure
V.foldM'
(pokeCloud (pdata ^. cloudVBO . vboPtr) (pdata ^. cloudEBO . uiboPtr))
(0, 0)
(V.fromList $ w ^. cWorld . lWorld . clouds)
(nCloudVs, nCloudIs) <-
V.foldM'
(pokeDust (pdata ^. cloudVBO . vboPtr) (pdata ^. cloudEBO . uiboPtr))
(nCloudVs', nCloudIs')
(V.fromList $ w ^. cWorld . lWorld . dusts)
-- (nCloudVs', nCloudIs') <-
-- -- Might want to sort the clouds based on z depth, not sure
-- V.foldM'
-- (pokeCloud (pdata ^. cloudVBO . vboPtr) (pdata ^. cloudEBO . uiboPtr))
-- (0, 0)
-- (V.fromList $ w ^. cWorld . lWorld . clouds)
-- (nCloudVs, nCloudIs) <-
-- V.foldM'
-- (pokeDust (pdata ^. cloudVBO . vboPtr) (pdata ^. cloudEBO . uiboPtr))
-- (nCloudVs', nCloudIs')
-- (V.fromList $ w ^. cWorld . lWorld . dusts)
--nCloudVs' <-
-- nCloudVs <-
-- V.foldM'
-- (pokeCloud (pdata ^. cloudVBO . vboPtr))
-- 0
-- (V.fromList $ w ^. cWorld . lWorld . clouds)
-- nCloudVs <-
-- V.foldM'
-- (pokeDust (pdata ^. cloudVBO . vboPtr))
-- nCloudVs'
-- (V.fromList $ w ^. cWorld . lWorld . dusts)
-- bind wall points, silhouette data, surface geometry
bufferShaderLayers shadV pokeCounts
mapM_
(uncurry bufferPokedVBO)
[ (_vboShapes pdata, nShapeVs)
, (pdata ^. cloudVBO, nCloudVs)
-- , (pdata ^. cloudVBO, nCloudVs) should probably do it this way
-- eventually
]
mapM_
(uncurry bufferEBO)
[ (_cloudEBO pdata, nCloudIs)
, (_shapeEBO pdata, nIndices)
[-- (_cloudEBO pdata, nCloudIs)
(_shapeEBO pdata, nIndices)
]
-- set the coordinate uniform ready for drawing elements using world coordinates
bufferPerspectiveMatrixUBO cfig (w ^. wCam) (pdata ^. matUBO)
@@ -115,13 +132,20 @@ doDrawing' win pdata u = do
glNamedBufferSubData (pdata ^. wallVBO . vboName) 0
(fromIntegral $ trueNWalls * sizeOf (0::Float) * 8)
(pdata ^. wallVBO . vboPtr)
glNamedBufferSubData (pdata ^. vboShapes . vboName) 0
(fromIntegral $ nShapeVs * shapeVerxSize)
(pdata ^. vboShapes . vboPtr)
-- glNamedBufferSubData (pdata ^. vboShapes . vboName) 0
-- (fromIntegral $ nShapeVs * shapeVerxSize)
-- (pdata ^. vboShapes . vboPtr)
glNamedBufferSubData (pdata ^. shapeEBO . uiboName) 0
(fromIntegral $ nIndices * (sizeOf (0::GLuint)))
(pdata ^. shapeEBO . uiboPtr)
bufferEBO (pdata ^. silhouetteEBO) nSilIndices
-- withArray [0::Float,0,30,1,1,1,1,1] $
-- glNamedBufferSubData (pdata ^. cloudVBO . vboName) 0
-- (fromIntegral (sizeOf (0::Float)) * 8)
glNamedBufferSubData (pdata ^. cloudVBO . vboName)
0
(fromIntegral $ 8 * nCloudVs * (sizeOf (0::Float)))
(pdata ^. cloudVBO . vboPtr)
setViewport _gr_world_res cfig
glBindFramebuffer GL_FRAMEBUFFER (pdata ^. fboBase . _1 . unFBO)
glDepthMask GL_TRUE
@@ -169,11 +193,8 @@ doDrawing' win pdata u = do
-- 0
-- (fromIntegral trueNWalls)
glUseProgram (pdata ^. pullWallShader . shaderUINT)
glBindVertexArray $ pdata ^. dummyVAO . vaoName
glDrawArrays
GL_TRIANGLES
0
(fromIntegral trueNWalls * 6)
--glBindVertexArray $ pdata ^. dummyVAO . vaoName
glDrawArrays GL_TRIANGLES 0 (fromIntegral trueNWalls * 6)
--draw object shapes onto base buffer
let fs = _shapeShader pdata
glUseProgram (_shaderUINT fs)
@@ -251,11 +272,13 @@ doDrawing' win pdata u = do
glBlendFuncSeparate GL_ZERO GL_ONE GL_CONSTANT_ALPHA GL_ONE_MINUS_SRC_ALPHA
glUseProgram (pdata ^. cloudShader . shaderUINT)
glBindVertexArray $ pdata ^. cloudShader . shaderVAO . vaoName
glDrawElements
(pdata ^. cloudShader . shaderPrimitive . unPrimitiveMode)
(fromIntegral nCloudIs)
GL_UNSIGNED_INT
nullPtr
glDrawArrays GL_TRIANGLES 0 (fromIntegral nCloudVs * 6)
--glDrawArrays GL_TRIANGLES 0 6
-- glDrawElements
-- (pdata ^. cloudShader . shaderPrimitive . unPrimitiveMode)
-- (fromIntegral nCloudIs)
-- GL_UNSIGNED_INT
-- nullPtr
glDepthMask GL_TRUE
--setup downscale viewport for blurring bloom
@@ -295,11 +318,13 @@ doDrawing' win pdata u = do
0
glUseProgram (pdata ^. cloudShader . shaderUINT)
glBindVertexArray $ pdata ^. cloudShader . shaderVAO . vaoName
glDrawElements
(pdata ^. cloudShader . shaderPrimitive . unPrimitiveMode)
(fromIntegral nCloudIs)
GL_UNSIGNED_INT
nullPtr
glDrawArrays GL_TRIANGLES 0 (fromIntegral nCloudVs * 6)
--glDrawArrays GL_TRIANGLES 0 6
---- glDrawElements
---- (pdata ^. cloudShader . shaderPrimitive . unPrimitiveMode)
---- (fromIntegral nCloudIs)
---- GL_UNSIGNED_INT
---- nullPtr
-- glEnable GL_CULL_FACE
-- glEnable GL_DEPTH_CLAMP
-- glCullFace GL_BACK
@@ -327,11 +352,13 @@ doDrawing' win pdata u = do
glUseProgram (pdata ^. cloudShader . shaderUINT)
glBindVertexArray $ pdata ^. cloudShader . shaderVAO . vaoName
-- glDepthMask GL_TRUE
glDrawElements
(pdata ^. cloudShader . shaderPrimitive . unPrimitiveMode)
(fromIntegral nCloudIs)
GL_UNSIGNED_INT
nullPtr
glDrawArrays GL_TRIANGLES 0 (fromIntegral nCloudVs * 6)
--glDrawArrays GL_TRIANGLES 0 6
----glDrawElements
---- (pdata ^. cloudShader . shaderPrimitive . unPrimitiveMode)
---- (fromIntegral nCloudIs)
---- GL_UNSIGNED_INT
---- nullPtr
---
-- glEnable GL_CULL_FACE
-- glEnable GL_DEPTH_CLAMP