diff --git a/src/IO.hs b/src/IO.hs index 39b7798..d656256 100644 --- a/src/IO.hs +++ b/src/IO.hs @@ -39,9 +39,9 @@ view window objects model = do displayObjects :: GLFW.Window -> DisplayableObjects -> IO (DisplayableObjects) displayObjects _ [] = return [] -displayObjects window ((DisplayableObject vertices firstIndex numVertices _ _ primitiveMode):objects) = do - GL.bindVertexArrayObject $= Just vertices - GL.drawArrays primitiveMode firstIndex numVertices +displayObjects window ((DisplayableObject vao numVertices _ primitiveMode):objects) = do + GL.bindVertexArrayObject $= Just vao + GL.drawArrays primitiveMode 0 numVertices displayObjects window objects -- INIT RENDERER -- @@ -59,6 +59,13 @@ verticesArray = , GL.Vertex2 0.5 0.0 ] +testArray :: [GL.Vertex3 GL.GLfloat] +testArray = + [ GL.Vertex3 0.5 1 0.5 + , GL.Vertex3 (-0.5) (-0.5) (-0.5) + , GL.Vertex3 0 0 0 + ] + generateRGBA :: Int -> [GL.Color4 GL.GLfloat] generateRGBA i = take i $ cycle rgba @@ -74,42 +81,53 @@ sizeOfArray :: (Storable a, Num b) => [a] -> b sizeOfArray [] = 0 sizeOfArray (x:xs) = fromIntegral $ (*) ( 1 + length xs) $ sizeOf x -makeBuffer :: Storable (a GL.GLfloat) => [a GL.GLfloat] -> GL.NumComponents -> GL.GLuint -> IO () -makeBuffer array numComponents attributeLocation = do - let vPosition = GL.AttribLocation attributeLocation +createVBO :: Storable (a GL.GLfloat) => [a GL.GLfloat] -> GL.NumComponents -> GL.AttribLocation -> IO GL.BufferObject +createVBO array numComponents attribLocation = do buffer <- GL.genObjectName GL.bindBuffer GL.ArrayBuffer $= Just buffer - withArray array $ \ptr -> - GL.bufferData GL.ArrayBuffer $= (sizeOfArray array, ptr, GL.StaticDraw) - GL.vertexAttribPointer vPosition $= - (GL.ToFloat, GL.VertexArrayDescriptor numComponents GL.Float 0 (bufferOffset 0)) - GL.vertexAttribArray vPosition $= GL.Enabled + withArray + array + $ \ptr -> + GL.bufferData GL.ArrayBuffer $= (sizeOfArray array, ptr, GL.StaticDraw) + GL.vertexAttribPointer attribLocation $= + ( GL.ToFloat + , GL.VertexArrayDescriptor + numComponents + GL.Float + 0 + (bufferOffset 0) + ) + GL.vertexAttribArray attribLocation $= GL.Enabled + return buffer -initResources :: IO DisplayableObject +createDisplayableObject :: Storable (a GL.GLfloat) => [a GL.GLfloat] -> GL.NumComponents -> GL.PrimitiveMode -> IO DisplayableObject +createDisplayableObject array numComponents primitiveMode = do + vao <- GL.genObjectName + GL.bindVertexArrayObject $= Just vao + vbo_0 <- createVBO array numComponents $ GL.AttribLocation 0 + vbo_1 <- createVBO (generateRGBA $ length array) 4 $ GL.AttribLocation 1 + return + (DisplayableObject + vao + (fromIntegral $ length array) + numComponents + primitiveMode + ) + +initResources :: IO DisplayableObjects initResources = do - -- vertices array - verticesGLArray <- GL.genObjectName - GL.bindVertexArrayObject $= Just verticesGLArray - let verticesObject = DisplayableObject - verticesGLArray - 0 - (fromIntegral $ length verticesArray) - 2 - (GL.AttribLocation 0) - GL.TriangleStrip - - makeBuffer verticesArray 2 0 - makeBuffer (generateRGBA $ length verticesArray) 4 1 + verticesObject <- createDisplayableObject verticesArray 2 GL.TriangleStrip + testObject <- createDisplayableObject testArray 3 GL.TriangleStrip -- load shaders program <- loadShaders [ ShaderInfo GL.VertexShader (StringSource $ unpack $ GLSL.generateGLSL vertShader) , ShaderInfo GL.FragmentShader (StringSource $ unpack $ GLSL.generateGLSL fragShader) ] + GL.currentProgram $= Just program - -- return descriptor for vertices array - return verticesObject + return [verticesObject, testObject] -- INPUT -- @@ -137,8 +155,8 @@ openWindow GLFW.setWindowCloseCallback window (Just shutdownWindow) GLFW.setWindowSizeCallback window (Just resizeWindow) GLFW.setKeyCallback window (Just keyPressed) - object <- initResources - return (window, [object]) + objects <- initResources + return (window, objects) shutdownWindow :: GLFW.WindowCloseCallback shutdownWindow window = diff --git a/src/Transforms.hs b/src/Transforms.hs index 2848c5d..d80c7fa 100644 --- a/src/Transforms.hs +++ b/src/Transforms.hs @@ -1,7 +1,7 @@ {-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE OverloadedStrings #-} -module Transforms (displayableObjectFromTriangles) where +module Transforms (pointToVertex) where -- IMPORTS -- @@ -13,18 +13,5 @@ import Relude import IO import Types -displayableObjectFromTriangles :: [Triangle] -> GL.GLuint -> IO DisplayableObject -displayableObjectFromTriangles triangles attribLocation = do - let array = [ pointToVertex p | (Triangle a b c) <- triangles, p <- [a, b, c] ] - glArray <- GL.genObjectName - GL.bindVertexArrayObject $= Just glArray - return $ DisplayableObject - glArray - 0 - (fromIntegral $ length array) - 4 - (GL.AttribLocation attribLocation) - GL.Triangles - pointToVertex :: Point -> GL.Vertex4 GL.GLfloat pointToVertex (Point x y z k) = GL.Vertex4 x y z k diff --git a/src/Types.hs b/src/Types.hs index b8adbe9..f8a90e2 100644 --- a/src/Types.hs +++ b/src/Types.hs @@ -18,10 +18,8 @@ type DisplayableObjects = [DisplayableObject] data DisplayableObject = DisplayableObject GL.VertexArrayObject - GL.ArrayIndex GL.NumArrayIndices GL.NumComponents - GL.AttribLocation GL.PrimitiveMode -- model --