Files
loop/src/Shader/Data.hs
T
2021-09-20 12:36:35 +01:00

86 lines
2.1 KiB
Haskell

{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE StrictData #-}
{- | Datatypes used to setup and pass data to shaders. -}
module Shader.Data
( VAO (..)
, VBO (..)
, EBO (..)
, FullShader (..)
, ShaderTexture (..)
, EPrimitiveMode (..)
-- | Lens functions
, vao
, vaoVBO
, shadProg
, shadVAO
, shadPrim
, shadTex
, shadUnis
, vbo
, vboPtr
, vboAttribSizes
, vboStride
, ebo
, eboPtr
-- | Synonyms
, vert
, geom
, frag
) where
import Graphics.Rendering.OpenGL
import Foreign
import Control.Lens
{- | Datatype containing the necessary information for a single shader. -}
data FullShader = FullShader
{ _shadProg :: Program
, _shadVAO :: VAO
, _shadPrim :: EPrimitiveMode
, _shadTex :: Maybe ShaderTexture
, _shadUnis :: [UniformLocation]
}
{- | Vertex array object: contains the reference to the object,
and its buffer targets. -}
data VAO = VAO
{ _vao :: VertexArrayObject
, _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
{ _ebo :: BufferObject
, _eboPtr :: Ptr GLushort
}
{- | Datatype containing the reference to a texture object. -}
newtype ShaderTexture = ShaderTexture
{ _textureObject :: TextureObject }
data EPrimitiveMode
= EPoints
| ELines
| ELinesAdjacency
| ELineLoop
| ELineStrip
| ETriangles
| ETriangleStrip
| ETriangleFan
| EQuads
| EQuadStrip
| EPolygon
| EPatches
-- | Short synonyms for shader types
vert, geom, frag :: ShaderType
vert = VertexShader
geom = GeometryShader
frag = FragmentShader
makeLenses ''VAO
makeLenses ''VBO
makeLenses ''FullShader
makeLenses ''EBO