Interleave vertex buffer data
This commit is contained in:
+43
-6
@@ -3,8 +3,10 @@ module Shader
|
||||
, addTexture
|
||||
, addUniforms
|
||||
, pokeShaders
|
||||
, pokeShader
|
||||
, bindArrayBuffers
|
||||
--, pokeShader
|
||||
, pokeShader'
|
||||
--, bindArrayBuffers
|
||||
, bindArrayBuffers'
|
||||
, bindShaderBuffers
|
||||
, makeSourcedShader
|
||||
, setupVAO
|
||||
@@ -41,7 +43,8 @@ extractProgAndUnis :: FullShader -> (Program,UniformLocation)
|
||||
extractProgAndUnis s = (_shaderProgram s, _shaderMatrixUniform s)
|
||||
|
||||
pokeShaders :: [FullShader] -> F.FoldM IO RenderType [Int]
|
||||
pokeShaders = traverse pokeShader
|
||||
pokeShaders = traverse pokeShader'
|
||||
--pokeShaders = traverse pokeShader
|
||||
|
||||
pokeShader :: FullShader -> F.FoldM IO RenderType Int
|
||||
pokeShader fs = F.FoldM (pokeRender fls (zip ptrs nAtss)) (return 0) return
|
||||
@@ -49,13 +52,39 @@ pokeShader fs = F.FoldM (pokeRender fls (zip ptrs nAtss)) (return 0) return
|
||||
(_,ptrs,nAtss) = unzip3 $ _vaoBufferTargets $ _shaderVAO fs
|
||||
fls = _shaderPokeStrategy fs
|
||||
|
||||
pokeShader' :: FullShader -> F.FoldM IO RenderType Int
|
||||
pokeShader' fs = F.FoldM (pokeRender' fls ptr stride) (return 0) return
|
||||
where
|
||||
theVBO = _vaoVBO $ _shaderVAO fs
|
||||
ptr = _vboPointer theVBO
|
||||
stride = sum $ _vboAttribSizes theVBO
|
||||
fls = _shaderPokeStrategy fs
|
||||
|
||||
pokeRender :: (RenderType -> [[[Float]]])
|
||||
-> [(Ptr Float,Int)] -> Int -> RenderType -> IO Int
|
||||
pokeRender toFs ptrs n rt = pokeList ptrs n (toFs rt)
|
||||
|
||||
pokeRender'
|
||||
:: (RenderType
|
||||
-> [[[Float]]])
|
||||
-> Ptr Float
|
||||
-> Int -- ^ stride
|
||||
-> Int
|
||||
-> RenderType
|
||||
-> IO Int
|
||||
pokeRender' toFs ptr stride n rt = pokeList' ptr stride n (toFs rt)
|
||||
|
||||
pokeList :: [(Ptr Float,Int)] -> Int -> [[[Float]]] -> IO Int
|
||||
pokeList ptrs = foldM (pokePtrs ptrs)
|
||||
|
||||
pokeList' :: Ptr Float -> Int -> Int -> [[[Float]]] -> IO Int
|
||||
pokeList' ptr stride = foldM (pokePtrs' ptr stride)
|
||||
|
||||
pokePtrs' :: Ptr Float -> Int -> Int -> [[Float]] -> IO Int
|
||||
pokePtrs' ptr stride n fss = do
|
||||
pokeArrayOff ptr (stride * n) (concat fss)
|
||||
return $ n + 1
|
||||
|
||||
pokePtrs :: [(Ptr Float,Int)] -> Int -> [[Float]] -> IO Int
|
||||
pokePtrs ptrIs n fss = do
|
||||
zipWithM_ f ptrIs fss
|
||||
@@ -73,10 +102,18 @@ bindArrayBuffers numVs ps = do
|
||||
bindBuffer ArrayBuffer $= Just bo
|
||||
bufferData ArrayBuffer $= (fromIntegral $ floatSize * numVs * i, ptr, DynamicDraw)
|
||||
|
||||
bindArrayBuffers' :: Int -> VBO -> IO ()
|
||||
bindArrayBuffers' numVs theVBO = do
|
||||
bindBuffer ArrayBuffer $= Just (_vbo theVBO)
|
||||
bufferData ArrayBuffer $=
|
||||
(fromIntegral $ floatSize * numVs * (sum $ _vboAttribSizes theVBO), _vboPointer theVBO, DynamicDraw)
|
||||
|
||||
|
||||
bindShaderBuffers :: [FullShader] -> [Int] -> IO ()
|
||||
bindShaderBuffers = zipWithM_ f
|
||||
where
|
||||
f fs i = bindArrayBuffers i $ _vaoBufferTargets $ _shaderVAO fs
|
||||
--f fs i = bindArrayBuffers i $ _vaoBufferTargets $ _shaderVAO fs
|
||||
f fs i = bindArrayBuffers' i $ _vaoVBO $ _shaderVAO fs
|
||||
|
||||
drawShaders :: [FullShader] -> [Int] -> IO ()
|
||||
drawShaders = zipWithM_ drawShader
|
||||
@@ -137,7 +174,7 @@ floatSize = sizeOf (0.5 :: GLfloat)
|
||||
{-# INLINE floatSize #-}
|
||||
|
||||
bufferOffset :: Integral a => a -> Ptr b
|
||||
bufferOffset = plusPtr nullPtr . fromIntegral
|
||||
bufferOffset = plusPtr nullPtr . (* floatSize) . fromIntegral
|
||||
|
||||
numDrawableElements :: Int
|
||||
{-# INLINE numDrawableElements #-}
|
||||
@@ -147,9 +184,9 @@ setupVAO :: [Int] -> IO VAO
|
||||
setupVAO sizes = do
|
||||
theVAO <- genObjectName
|
||||
bindVertexArrayObject $= Just theVAO
|
||||
theVBO <- setupVBO $ sizes
|
||||
vbos <- forM (zip (map fromIntegral [(0::Int)..]) sizes) setupArrayBuffer
|
||||
ptrs <- forM (zip vbos sizes) setupVBOPointers
|
||||
theVBO <- setupVBO $ sizes
|
||||
return $ VAO
|
||||
{ _vao = theVAO
|
||||
, _vaoBufferTargets = ptrs
|
||||
|
||||
Reference in New Issue
Block a user