Refactor shaders, vbos and vaos
This commit is contained in:
+60
-6
@@ -1,5 +1,7 @@
|
||||
module Shader.Compile (
|
||||
trueSetupVBO,
|
||||
makeShader,
|
||||
makeShader',
|
||||
makeByteStringShaderUsingVAO,
|
||||
makeShaderSized,
|
||||
makeShaderUsingVAO,
|
||||
@@ -16,6 +18,7 @@ import GLHelp
|
||||
import Graphics.GL.Core45
|
||||
import Shader.Data
|
||||
import Shader.Parameters
|
||||
--import Graphics.GL.Core45
|
||||
|
||||
{- |
|
||||
Compiles a full shader found within the shader directory.
|
||||
@@ -35,13 +38,45 @@ makeShader s shaderlist sizes pm = do
|
||||
(vao,vbo) <- setupVAO sizes
|
||||
return ( FullShader
|
||||
{ _shadName = prog
|
||||
, _shadVAO' = vao
|
||||
, _shadVAO = vao
|
||||
, _shadPrim' = pm
|
||||
, _shadTex' = Nothing
|
||||
, _shadUnis' = mempty
|
||||
}
|
||||
, vbo)
|
||||
|
||||
makeShader' ::
|
||||
-- | First part of the name of the shader
|
||||
String ->
|
||||
-- | shader types
|
||||
[GLenum] ->
|
||||
-- | The input vertex sizes
|
||||
[Int] ->
|
||||
EPrimitiveMode ->
|
||||
VBO ->
|
||||
IO FullShader
|
||||
makeShader' s shaderlist sizes pm vbo = do
|
||||
prog <- makeSourcedShader s shaderlist
|
||||
vao <- setupVAOvbo sizes vbo
|
||||
return $ FullShader
|
||||
{ _shadName = prog
|
||||
, _shadVAO = vao
|
||||
, _shadPrim' = pm
|
||||
, _shadTex' = Nothing
|
||||
, _shadUnis' = mempty
|
||||
}
|
||||
|
||||
trueSetupVBO :: Int -> IO VBO
|
||||
trueSetupVBO vertexsize = do
|
||||
vboname <- mglCreate glCreateBuffers
|
||||
thePtr <- mallocArray (vertexsize * numDrawableElements)
|
||||
-- Allocate space
|
||||
glNamedBufferData vboname
|
||||
( fromIntegral $ floatSize * numDrawableElements * vertexsize)
|
||||
nullPtr
|
||||
GL_STREAM_DRAW
|
||||
return VBO {_vboName = vboname, _vboPtr = thePtr, _vboVertexSize = vertexsize}
|
||||
|
||||
makeByteStringShaderUsingVAO ::
|
||||
-- | (Arbitrary) name of the shader
|
||||
String ->
|
||||
@@ -55,7 +90,7 @@ makeByteStringShaderUsingVAO s shaderlist pm vao = do
|
||||
return $
|
||||
FullShader
|
||||
{ _shadName = prog
|
||||
, _shadVAO' = vao
|
||||
, _shadVAO = vao
|
||||
, _shadPrim' = pm
|
||||
, _shadTex' = Nothing
|
||||
, _shadUnis' = mempty
|
||||
@@ -75,7 +110,7 @@ makeShaderUsingVAO s shaderlist pm theVAO = do
|
||||
return $
|
||||
FullShader
|
||||
{ _shadName = prog
|
||||
, _shadVAO' = theVAO
|
||||
, _shadVAO = theVAO
|
||||
, _shadPrim' = pm
|
||||
, _shadTex' = Nothing
|
||||
, _shadUnis' = mempty
|
||||
@@ -101,7 +136,7 @@ makeShaderSized s shaderlist sizes ndraw pm = do
|
||||
(vao,vbo) <- setupVAOSized ndraw sizes
|
||||
return ( FullShader
|
||||
{ _shadName = prog
|
||||
, _shadVAO' = vao
|
||||
, _shadVAO = vao
|
||||
, _shadPrim' = pm
|
||||
, _shadTex' = Nothing
|
||||
, _shadUnis' = mempty
|
||||
@@ -127,6 +162,17 @@ shaderTypeExt' _ = undefined
|
||||
setupVAO :: [Int] -> IO (VAO,VBO)
|
||||
setupVAO = setupVAOSized numDrawableElements
|
||||
|
||||
setupVAOvbo :: [Int] -> VBO -> IO VAO
|
||||
setupVAOvbo sizes vbo = do
|
||||
vaoname <- mglCreate glCreateVertexArrays
|
||||
glBindVertexArray vaoname
|
||||
setupVertexAttribs vbo vaoname sizes
|
||||
return $ VAO
|
||||
{ _vaoName = vaoname
|
||||
, _vaoAttribSizes = sizes
|
||||
, _vaoStride = sum sizes
|
||||
}
|
||||
|
||||
setupVAOSized :: Int -> [Int] -> IO (VAO,VBO)
|
||||
setupVAOSized ndraw sizes = do
|
||||
vaoname <- mglCreate glCreateVertexArrays
|
||||
@@ -156,13 +202,21 @@ setupVBOSized ndraw vao sizes = do
|
||||
VBO
|
||||
{ _vboName = vboname
|
||||
, _vboPtr = thePtr
|
||||
, _vboAttribSizes = sizes
|
||||
, _vboStride = sum sizes
|
||||
, _vboVertexSize = sum sizes
|
||||
}
|
||||
where
|
||||
strd = sum sizes
|
||||
offs = scanl (+) 0 sizes
|
||||
|
||||
setupVertexAttribs :: VBO -> GLuint -> [Int] -> IO ()
|
||||
setupVertexAttribs vbo vao sizes = do
|
||||
let vboname = _vboName vbo
|
||||
forM_ (zip3 [0 ..] sizes offs) $ \(loc, siz, off) -> do
|
||||
setupVertexAttribPointer vao vboname loc siz strd off
|
||||
where
|
||||
strd = sum sizes
|
||||
offs = scanl (+) 0 sizes
|
||||
|
||||
-- | Assumes the correct VBO is bound
|
||||
setupVertexAttribPointer ::
|
||||
GLuint ->
|
||||
|
||||
Reference in New Issue
Block a user