aboutsummaryrefslogtreecommitdiffstats
path: root/src/Vivant/Renderer.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Vivant/Renderer.hs')
-rw-r--r--src/Vivant/Renderer.hs42
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