Work on textures and lighting
This commit is contained in:
+60
-79
@@ -2,9 +2,8 @@ module Shader.Compile (
|
||||
setupVBO,
|
||||
setupVBOStatic,
|
||||
makeShaderEBO,
|
||||
makeShader,
|
||||
makeShader4,
|
||||
makeShader4UsingVAO,
|
||||
makeShaderVBO,
|
||||
makeShaderUsingVBO,
|
||||
makeByteStringShaderUsingVAO,
|
||||
makeShaderSized,
|
||||
makeShaderUsingVAO,
|
||||
@@ -25,13 +24,14 @@ 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.
|
||||
The shader is made up of files begining with the inputted string with extensions .vert, .geom etc.
|
||||
-}
|
||||
makeShader ::
|
||||
makeShaderVBO ::
|
||||
-- | First part of the name of the shader
|
||||
String ->
|
||||
-- | shader types
|
||||
@@ -39,17 +39,18 @@ makeShader ::
|
||||
-- | The input vertex sizes
|
||||
[Int] ->
|
||||
PrimitiveMode ->
|
||||
IO (Shader,VBO)
|
||||
makeShader s shaderlist sizes pm = do
|
||||
IO (Shader, VBO)
|
||||
makeShaderVBO s shaderlist sizes pm = do
|
||||
prog <- makeSourcedShader s shaderlist
|
||||
(vao,vbo) <- setupVAO sizes
|
||||
return ( Shader
|
||||
(vao, vbo) <- setupVAO sizes
|
||||
return
|
||||
( Shader
|
||||
{ _shaderUINT = prog
|
||||
, _shaderVAO = vao
|
||||
, _shaderPrimitive = pm
|
||||
, _shaderTextures = mempty
|
||||
}
|
||||
, vbo)
|
||||
, vbo
|
||||
)
|
||||
|
||||
makeShaderEBO ::
|
||||
-- | First part of the name of the shader
|
||||
@@ -68,11 +69,11 @@ makeShaderEBO s shaderlist sizes strd pm vbo = do
|
||||
vao <- setupVAOvbo sizes strd vbo
|
||||
ebo <- setupEBO vao
|
||||
return
|
||||
( Shader prog pm vao []
|
||||
( Shader prog pm vao
|
||||
, ebo
|
||||
)
|
||||
|
||||
makeShader4 ::
|
||||
makeShaderUsingVBO ::
|
||||
-- | First part of the name of the shader
|
||||
String ->
|
||||
-- | shader types
|
||||
@@ -84,54 +85,32 @@ makeShader4 ::
|
||||
PrimitiveMode ->
|
||||
VBO ->
|
||||
IO Shader
|
||||
makeShader4 s shaderlist sizes strd pm vbo = do
|
||||
prog <- makeSourcedShader s shaderlist
|
||||
vao <- setupVAOvbo sizes strd vbo
|
||||
return $ Shader
|
||||
{ _shaderUINT = prog
|
||||
, _shaderVAO = vao
|
||||
, _shaderPrimitive = pm
|
||||
, _shaderTextures = mempty
|
||||
}
|
||||
|
||||
makeShader4UsingVAO ::
|
||||
-- | First part of the name of the shader
|
||||
String ->
|
||||
-- | shader types
|
||||
[GLenum] ->
|
||||
PrimitiveMode ->
|
||||
VAO ->
|
||||
IO Shader
|
||||
makeShader4UsingVAO s shaderlist pm vao = do
|
||||
prog <- makeSourcedShader s shaderlist
|
||||
return $ Shader
|
||||
{ _shaderUINT = prog
|
||||
, _shaderVAO = vao
|
||||
, _shaderPrimitive = pm
|
||||
, _shaderTextures = []
|
||||
}
|
||||
makeShaderUsingVBO s shaderlist sizes strd pm vbo = setupVAOvbo sizes strd vbo
|
||||
>>= makeShaderUsingVAO s shaderlist pm
|
||||
|
||||
setupVBO :: Int -> IO VBO
|
||||
setupVBO vertexsize = do
|
||||
vboname <- mglCreate glCreateBuffers
|
||||
thePtr <- mallocArray (vertexsize * numDrawableElements)
|
||||
-- Allocate space
|
||||
glNamedBufferData vboname
|
||||
( fromIntegral $ floatSize * numDrawableElements * vertexsize)
|
||||
nullPtr
|
||||
glNamedBufferData
|
||||
vboname
|
||||
(fromIntegral $ floatSize * numDrawableElements * vertexsize)
|
||||
nullPtr
|
||||
GL_STREAM_DRAW
|
||||
return VBO {_vboName = vboname, _vboPtr = thePtr, _vboVertexSize = vertexsize}
|
||||
return VBO{_vboName = vboname, _vboPtr = thePtr, _vboVertexSize = vertexsize}
|
||||
|
||||
setupVBOStatic :: Int -> IO VBO
|
||||
setupVBOStatic vertexsize = do
|
||||
vboname <- mglCreate glCreateBuffers
|
||||
thePtr <- mallocArray (vertexsize * numDrawableElements)
|
||||
-- Allocate space
|
||||
glNamedBufferData vboname
|
||||
( fromIntegral $ floatSize * numDrawableElements * vertexsize)
|
||||
nullPtr
|
||||
glNamedBufferData
|
||||
vboname
|
||||
(fromIntegral $ floatSize * numDrawableElements * vertexsize)
|
||||
nullPtr
|
||||
GL_STATIC_DRAW
|
||||
return VBO {_vboName = vboname, _vboPtr = thePtr, _vboVertexSize = vertexsize}
|
||||
return VBO{_vboName = vboname, _vboPtr = thePtr, _vboVertexSize = vertexsize}
|
||||
|
||||
makeByteStringShaderUsingVAO ::
|
||||
-- | (Arbitrary) name of the shader
|
||||
@@ -143,12 +122,11 @@ makeByteStringShaderUsingVAO ::
|
||||
IO Shader
|
||||
makeByteStringShaderUsingVAO s shaderlist pm vao = do
|
||||
prog <- makeShaderProgram s shaderlist
|
||||
return $
|
||||
return
|
||||
Shader
|
||||
{ _shaderUINT = prog
|
||||
, _shaderVAO = vao
|
||||
, _shaderPrimitive = pm
|
||||
, _shaderTextures = mempty
|
||||
}
|
||||
|
||||
-- | Takes the VAO from elsewhere
|
||||
@@ -162,12 +140,11 @@ makeShaderUsingVAO ::
|
||||
IO Shader
|
||||
makeShaderUsingVAO s shaderlist pm theVAO = do
|
||||
prog <- makeSourcedShader s shaderlist
|
||||
return $
|
||||
return
|
||||
Shader
|
||||
{ _shaderUINT = prog
|
||||
, _shaderVAO = theVAO
|
||||
, _shaderPrimitive = pm
|
||||
, _shaderTextures = mempty
|
||||
}
|
||||
|
||||
{- |
|
||||
@@ -184,17 +161,18 @@ makeShaderSized ::
|
||||
-- | Number of vertexes that can be poked
|
||||
Int ->
|
||||
PrimitiveMode ->
|
||||
IO (Shader,VBO)
|
||||
IO (Shader, VBO)
|
||||
makeShaderSized s shaderlist sizes ndraw pm = do
|
||||
prog <- makeSourcedShader s shaderlist
|
||||
(vao,vbo) <- setupVAOSized ndraw sizes
|
||||
return ( Shader
|
||||
(vao, vbo) <- setupVAOSized ndraw sizes
|
||||
return
|
||||
( Shader
|
||||
{ _shaderUINT = prog
|
||||
, _shaderVAO = vao
|
||||
, _shaderPrimitive = pm
|
||||
, _shaderTextures = mempty
|
||||
}
|
||||
, vbo)
|
||||
, vbo
|
||||
)
|
||||
|
||||
{- | Compile shader and get its uniform locations.
|
||||
supposes the shader code is in the shader folder, with the string names
|
||||
@@ -202,17 +180,17 @@ makeShaderSized s shaderlist sizes ndraw pm = do
|
||||
-}
|
||||
makeSourcedShader :: String -> [GLenum] -> IO GLuint
|
||||
makeSourcedShader s sts = do
|
||||
sources <- forM sts $ \st -> BS.readFile ("shader/" ++ s ++ shaderTypeExt' st)
|
||||
sources <- forM sts $ \st -> BS.readFile ("shader/" ++ s ++ shaderTypeExt st)
|
||||
makeShaderProgram s $ zip sts sources
|
||||
|
||||
shaderTypeExt' :: GLenum -> String
|
||||
shaderTypeExt' GL_VERTEX_SHADER = ".vert"
|
||||
shaderTypeExt' GL_GEOMETRY_SHADER = ".geom"
|
||||
shaderTypeExt' GL_FRAGMENT_SHADER = ".frag"
|
||||
shaderTypeExt' _ = undefined
|
||||
shaderTypeExt :: GLenum -> String
|
||||
shaderTypeExt GL_VERTEX_SHADER = ".vert"
|
||||
shaderTypeExt GL_GEOMETRY_SHADER = ".geom"
|
||||
shaderTypeExt GL_FRAGMENT_SHADER = ".frag"
|
||||
shaderTypeExt _ = undefined
|
||||
|
||||
-- I think that this requires that the correct shader program is bound?
|
||||
setupVAO :: [Int] -> IO (VAO,VBO)
|
||||
setupVAO :: [Int] -> IO (VAO, VBO)
|
||||
setupVAO = setupVAOSized numDrawableElements
|
||||
|
||||
setupVAOvbo' :: [Int] -> Int -> GLuint -> IO VAO
|
||||
@@ -220,17 +198,18 @@ setupVAOvbo' sizes strd vbo = do
|
||||
vaoname <- mglCreate glCreateVertexArrays
|
||||
glBindVertexArray vaoname
|
||||
setupVertexAttribs' vbo vaoname sizes strd
|
||||
return $ VAO
|
||||
return $
|
||||
VAO
|
||||
{ _vaoName = vaoname
|
||||
}
|
||||
|
||||
|
||||
setupVAOvbo :: [Int] -> Int -> VBO -> IO VAO
|
||||
setupVAOvbo sizes strd vbo = do
|
||||
vaoname <- mglCreate glCreateVertexArrays
|
||||
glBindVertexArray vaoname
|
||||
setupVertexAttribs vbo vaoname sizes strd
|
||||
return $ VAO
|
||||
return $
|
||||
VAO
|
||||
{ _vaoName = vaoname
|
||||
}
|
||||
|
||||
@@ -238,37 +217,40 @@ setupEBO :: VAO -> IO EBO
|
||||
setupEBO vao = do
|
||||
eboptr <- mallocArray numDrawableElements
|
||||
eboname <- mglCreate glCreateBuffers
|
||||
glNamedBufferData
|
||||
glNamedBufferData
|
||||
eboname
|
||||
( fromIntegral $ glushortSize * numDrawableElements)
|
||||
nullPtr
|
||||
(fromIntegral $ glushortSize * numDrawableElements)
|
||||
nullPtr
|
||||
GL_STREAM_DRAW
|
||||
glVertexArrayElementBuffer (vao ^. vaoName) eboname
|
||||
return $ EBO eboname eboptr
|
||||
|
||||
setupVAOSized :: Int -> [Int] -> IO (VAO,VBO)
|
||||
setupVAOSized :: Int -> [Int] -> IO (VAO, VBO)
|
||||
setupVAOSized ndraw sizes = do
|
||||
vaoname <- mglCreate glCreateVertexArrays
|
||||
glBindVertexArray vaoname
|
||||
theVBO <- setupVBOSized ndraw vaoname sizes
|
||||
return ( VAO
|
||||
return
|
||||
( VAO
|
||||
{ _vaoName = vaoname
|
||||
}
|
||||
, theVBO)
|
||||
, theVBO
|
||||
)
|
||||
|
||||
setupVBOSized :: Int -> GLuint -> [Int] -> IO VBO
|
||||
setupVBOSized ndraw vao sizes = do
|
||||
--vboName <- genObjectName
|
||||
--bindBuffer ArrayBuffer $= Just vboName
|
||||
vboname <- mglCreate glCreateBuffers
|
||||
glVertexArrayVertexBuffer vao 0 vboname 0 (fromIntegral $ floatSize * strd)
|
||||
glVertexArrayVertexBuffer vao 0 vboname 0 (fromIntegral $ floatSize * strd)
|
||||
forM_ (zip3 [0 ..] sizes offs) $ \(loc, siz, off) -> do
|
||||
setupVertexAttribPointer vao loc siz off
|
||||
thePtr <- mallocArray (strd * ndraw)
|
||||
-- Allocate space
|
||||
glNamedBufferData vboname
|
||||
( fromIntegral $ floatSize * ndraw * strd)
|
||||
nullPtr
|
||||
glNamedBufferData
|
||||
vboname
|
||||
(fromIntegral $ floatSize * ndraw * strd)
|
||||
nullPtr
|
||||
GL_STREAM_DRAW
|
||||
return $
|
||||
VBO
|
||||
@@ -282,7 +264,7 @@ setupVBOSized ndraw vao sizes = do
|
||||
|
||||
setupVertexAttribs :: VBO -> GLuint -> [Int] -> Int -> IO ()
|
||||
setupVertexAttribs vbo vao sizes strd = do
|
||||
glVertexArrayVertexBuffer vao 0 (_vboName vbo) 0 (fromIntegral $ floatSize * strd)
|
||||
glVertexArrayVertexBuffer vao 0 (_vboName vbo) 0 (fromIntegral $ floatSize * strd)
|
||||
forM_ (zip3 [0 ..] sizes offs) $ \(loc, siz, off) -> do
|
||||
setupVertexAttribPointer vao loc siz off
|
||||
where
|
||||
@@ -290,7 +272,7 @@ setupVertexAttribs vbo vao sizes strd = do
|
||||
|
||||
setupVertexAttribs' :: GLuint -> GLuint -> [Int] -> Int -> IO ()
|
||||
setupVertexAttribs' vbo vao sizes strd = do
|
||||
glVertexArrayVertexBuffer vao 0 vbo 0 (fromIntegral $ floatSize * strd)
|
||||
glVertexArrayVertexBuffer vao 0 vbo 0 (fromIntegral $ floatSize * strd)
|
||||
forM_ (zip3 [0 ..] sizes offs) $ \(loc, siz, off) -> do
|
||||
setupVertexAttribPointer vao loc siz off
|
||||
where
|
||||
@@ -356,7 +338,7 @@ compileAndCheckShader str (theShaderType, sourceCode) = do
|
||||
setShaderSource theShader sourceCode
|
||||
glCompileShader theShader
|
||||
checkErrorGL
|
||||
(str ++ shaderTypeExt' theShaderType)
|
||||
(str ++ shaderTypeExt theShaderType)
|
||||
glGetShaderiv
|
||||
glGetShaderInfoLog
|
||||
theShader
|
||||
@@ -375,4 +357,3 @@ withByteString :: Num t => BS.ByteString -> (Ptr b -> t -> IO a) -> IO a
|
||||
withByteString bs act =
|
||||
BU.unsafeUseAsCStringLen bs $ \(ptr, size) ->
|
||||
act (castPtr ptr) (fromIntegral size)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user