92 lines
2.2 KiB
Haskell
92 lines
2.2 KiB
Haskell
{-# LANGUAGE TemplateHaskell #-}
|
|
{-# LANGUAGE StrictData #-}
|
|
{- | Datatypes used to setup and pass data to shaders. -}
|
|
module Shader.Data
|
|
( VAO (..)
|
|
, VBO (..)
|
|
, EBO (..)
|
|
-- , FullShader (..)
|
|
, FullShader' (..)
|
|
, ShaderTexture (..)
|
|
, EPrimitiveMode (..)
|
|
-- | Lens functions
|
|
, vaoName
|
|
, vaoVBO
|
|
, vbo
|
|
, vboPtr
|
|
, vboAttribSizes
|
|
, vboStride
|
|
, eboName
|
|
, eboPtr
|
|
|
|
, shadProg'
|
|
, shadVAO'
|
|
, shadPrim'
|
|
, shadTex'
|
|
, shadUnis'
|
|
-- | Synonyms
|
|
, vert'
|
|
, geom'
|
|
, frag'
|
|
) where
|
|
import Data.Vector (Vector)
|
|
import Graphics.Rendering.OpenGL
|
|
import Graphics.GL.Core43
|
|
import Foreign
|
|
import Control.Lens
|
|
{- | Datatype containing the necessary information for a single shader. -}
|
|
data FullShader' = FullShader'
|
|
{ _shadProg' :: GLuint -- should be shaderID
|
|
, _shadVAO' :: VAO
|
|
, _shadPrim' :: EPrimitiveMode
|
|
, _shadTex' :: Maybe ShaderTexture
|
|
, _shadUnis' :: Vector GLint
|
|
}
|
|
{- | Vertex array object: contains the reference to the object,
|
|
and its buffer targets. -}
|
|
data VAO = VAO
|
|
{ _vaoName :: GLuint
|
|
, _vaoVBO :: VBO
|
|
}
|
|
{- | Vertex buffer object: contains the reference to the object,
|
|
a pointer to a location with space that can be written to the buffer,
|
|
and a list of attribute pointer sizes.
|
|
Vertex attributes are interleaved within the vbo. -}
|
|
data VBO = VBO
|
|
{ _vbo :: BufferObject
|
|
, _vboPtr :: Ptr Float
|
|
, _vboAttribSizes :: [Int] -- ^ It is not clear to me if this is necessary to store or not
|
|
, _vboStride :: Int
|
|
}
|
|
data EBO = EBO
|
|
{ _eboName :: GLuint
|
|
, _eboPtr :: Ptr GLushort
|
|
}
|
|
{- | Datatype containing the reference to a texture object. -}
|
|
newtype ShaderTexture = ShaderTexture
|
|
{ _textureObject :: GLuint -- DSA style texture, 450
|
|
-- , _textureTarget :: GLenum
|
|
}
|
|
data EPrimitiveMode
|
|
= EPoints
|
|
| ELines
|
|
| ELinesAdjacency
|
|
| ELineLoop
|
|
| ELineStrip
|
|
| ETriangles
|
|
| ETriangleStrip
|
|
| ETriangleFan
|
|
| EQuads
|
|
| EQuadStrip
|
|
| EPolygon
|
|
| EPatches
|
|
-- | Short synonyms for shader types
|
|
vert', geom', frag' :: GLenum
|
|
vert' = GL_VERTEX_SHADER
|
|
geom' = GL_GEOMETRY_SHADER
|
|
frag' = GL_FRAGMENT_SHADER
|
|
makeLenses ''VAO
|
|
makeLenses ''VBO
|
|
makeLenses ''FullShader'
|
|
makeLenses ''EBO
|