diff options
Diffstat (limited to 'src/Vivant/Renderer.hs')
-rw-r--r-- | src/Vivant/Renderer.hs | 42 |
1 files changed, 38 insertions, 4 deletions
diff --git a/src/Vivant/Renderer.hs b/src/Vivant/Renderer.hs index ca623e7..f66b0d7 100644 --- a/src/Vivant/Renderer.hs +++ b/src/Vivant/Renderer.hs @@ -1,15 +1,49 @@ module Vivant.Renderer - (Renderer(..)) + (Renderer(..), getUniformLocation, destroyRenderer, render, setVertexAttribute) where import qualified Graphics.Rendering.OpenGL as GL import Linear import Foreign.Ptr +import qualified Graphics.GL.Functions as GL (glUniformMatrix4fv) +import Graphics.Rendering.OpenGL (($=)) +import Foreign.Marshal.Alloc (free) +import Foreign.Storable (sizeOf) data Renderer = Renderer { rendererProgram :: Maybe GL.Program, rendererVao :: Maybe GL.VertexArrayObject, - rendererModelP :: Ptr (M44 Float) - } deriving Show + rendererModelP :: Ptr (M44 Float), + rendererTriangleNum :: Int + } deriving (Show) -draw :: Renderer -> IO () +getUniformLocation :: GL.UniformLocation -> GL.GLint +getUniformLocation (GL.UniformLocation i) = i + +render :: Renderer -> IO () +render r@(Renderer {rendererProgram = Just p}) = do +-- GL.currentProgram $= rendererProgram r + GL.bindVertexArrayObject $= rendererVao r + + model <- getUniformLocation <$> GL.uniformLocation p "model" + GL.glUniformMatrix4fv model 1 1 (castPtr (rendererModelP r)) + + GL.drawArrays GL.Triangles 0 (fromIntegral $ rendererTriangleNum r) + +destroyRenderer :: Renderer -> IO () +destroyRenderer r = + free $ rendererModelP r + +setVertexAttribute :: GL.Program -> String -> Int -> Int -> Int -> IO () +setVertexAttribute program name vertices stride offset = do + let floatSize = sizeOf (1.0 :: Float) + attrib <- GL.get $ GL.attribLocation program name + GL.vertexAttribPointer attrib + $= ( GL.ToFloat, + GL.VertexArrayDescriptor + (fromIntegral vertices) + GL.Float + (fromIntegral $ stride * floatSize) + (plusPtr nullPtr (offset * floatSize)) + ) + GL.vertexAttribArray attrib $= GL.Enabled |