{-# 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