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