diff options
Diffstat (limited to 'src/Vivant/Terrain.hs')
-rw-r--r-- | src/Vivant/Terrain.hs | 65 |
1 files changed, 62 insertions, 3 deletions
diff --git a/src/Vivant/Terrain.hs b/src/Vivant/Terrain.hs index 9d5201a..3099177 100644 --- a/src/Vivant/Terrain.hs +++ b/src/Vivant/Terrain.hs @@ -1,6 +1,65 @@ -module Vivant.Terrain where +module Vivant.Terrain + (Terrain(..), initTerrain) +where + +import Vivant.Renderer +import qualified Data.Vector.Storable as V +import qualified Graphics.Rendering.OpenGL as GL +import SDL (($=)) +import Foreign.Marshal.Alloc (free, malloc) +import Foreign.Ptr +import Vivant.Common (vectorSize) +import Foreign.Storable (poke) +import Linear data Terrain = Terrain { - terrainVao :: - } + terrainWidth :: Int, + terrainHeight :: Int, + terrainGeometry :: [[Int]], + terrainRenderer :: Renderer + } deriving (Show) + +partition + :: (V.Storable a1, Integral a2, Num a1) => [[a2]] -> V.Vector a1 +partition r = + V.fromList . fmap fromIntegral . concat . concat . + fmap (\(e, y) -> fmap (generateP y) $ zip (zip (uncurry zip e) $ tail (uncurry zip e)) [0..]) + $ zip (zip r $ tail r) [0..] + where + generateP y (((z1, z2), (z3, z4)), x) = + [ x, y, z1 + , x, y+1, z2 + , x+1, y, z3 + , x, y+1, z2 + , x+1, y, z3 + , x+1, y+1, z4 + ] + +initTerrain :: [[Int]] -> GL.Program -> IO Terrain +initTerrain g p = do + vao <- GL.genObjectName + GL.bindVertexArrayObject $= Just vao + + vbo <- GL.genObjectName + GL.bindBuffer GL.ArrayBuffer $= Just vbo + + let g' = partition g :: V.Vector Float + V.unsafeWith g' $ \ptr -> + GL.bufferData GL.ArrayBuffer $= (vectorSize g', castPtr ptr, GL.StaticDraw) + + setVertexAttribute p "position" 3 0 0 + + GL.bindVertexArrayObject $= Nothing + + modelP <- malloc + let modelMatrix = mkTransformation (axisAngle (V3 0 0 0) 0) (V3 (-2.5) (-2.5) 0) + poke modelP modelMatrix + + let h = length g + w = length (head g) + return $ Terrain w h g (Renderer (Just p) (Just vao) modelP 72) + +destroyTerrain :: Terrain -> IO () +destroyTerrain t = + destroyRenderer $ terrainRenderer t |