packages feed

roguestar-gl-0.2.1: src/Models/Terrain.lhs

\section{Terrain Tiles}

\begin{code}
module Models.Terrain
    (known_terrain_types,
     terrainTile)
    where

import Quality
import Models.RecreantFactory
import RSAGL.Model
import RSAGL.ModelingExtras
import Models.Tree
import RSAGL.Vector
import RSAGL.Curve
import RSAGL.Interpolation
import RSAGL.Affine
import RSAGL.Angle

known_terrain_types :: [String]
known_terrain_types =
    ["water",
     "deepwater",
     "sand",
     "desert",
     "grass",
     "forest",
     "deepforest",
     "ice",
     "lava",
     "glass",
     "rockyground",
     "rubble",
     "rockface",
     "recreantfactory"]

terrainTileShape :: Double -> Double -> Modeling ()
terrainTileShape squash height = model $
    do regularPrism (origin_point_3d,sqrt 0.5) (Point3D 0 1 0,0.0001) 4
       deform $ \(Point3D x y z) -> Point3D x (sqrt $ max 0 y) z
       affine $ scale (Vector3D 1 height 1) . rotate (Vector3D 0 1 0) (fromDegrees 45)
       deform $ \(SurfaceVertex3D p v) -> SurfaceVertex3D (scale (Vector3D 1 squash 1) p) v

terrainTile :: String -> Quality -> Modeling ()
terrainTile "recreantfactory" q = recreant_factory q
terrainTile "forest" q =
    do basicTerrainTile "forest"
       leafy_tree q
terrainTile "deepforest" q =
    do basicTerrainTile "deepforest"
       translate (Vector3D 0.5 0 0.5) $ leafy_tree q
       translate (Vector3D (-0.5) 0 0.5) $ leafy_tree q
       translate (Vector3D 0 0 (-0.5)) $ leafy_tree q
terrainTile "rockface" _ = model $
    do terrainTileShape 1.0 (terrainHeight "rockface")
       material $ terrainTexture "rockface"
terrainTile s _ = basicTerrainTile s

basicTerrainTile :: String -> Modeling ()
basicTerrainTile s = model $
    do terrainTileShape 0.01 (terrainHeight s)
       material $ terrainTexture s

terrainHeight :: String -> Double
terrainHeight "water" = 0.025
terrainHeight "deepwater" = 0.025
terrainHeight "sand" = 0.1
terrainHeight "desert" = 0.1
terrainHeight "grass" = 0.13
terrainHeight "dirt" = 0.12
terrainHeight "forest" = 0.15
terrainHeight "deepforest" = 0.17
terrainHeight "ice" = 0.05
terrainHeight "lava" = 0.06
terrainHeight "glass" = 0.04
terrainHeight "rockyground" = 0.18
terrainHeight "rubble" = 0.2
terrainHeight "rockface" = 0.5
terrainHeight _ = 2.0

terrainTexture :: String -> MaterialM () ()
terrainTexture "water" =
    do pigment $ pure blue
       specular 100 $ pure white
terrainTexture "deepwater" =
    do pigment $ pure $ scaleRGB 0.8 blue
       specular 100 $ pure white
terrainTexture "sand" = pigment $ pure corn
terrainTexture "desert" = pigment $ pure $ lerp 0.5 (corn,white)
terrainTexture "grass" = pigment $ pure forest_green
terrainTexture "dirt" = pigment $ pure brown
terrainTexture "forest" = pigment $ pure fern_green
terrainTexture "deepforest" = pigment $ pure fern_green
terrainTexture "ice" = 
    do pigment $ pure white
       specular 1 $ pure teal
terrainTexture "lava" =
    do pigment $ pure blackbody
       emissive $ pure coral
terrainTexture "glass" =
    do pigment $ pure black
       specular 1 $ pure white
terrainTexture "rockyground" = pigment $ pure slate_gray
terrainTexture "rubble" = pigment $ pure slate_gray
terrainTexture "rockface" = pigment $ pure slate_gray
terrainTexture _ =
    do pigment $ pure blackbody
       emissive $ pure magenta
\end{code}