packages feed

keid-geometry-0.1.0.0: src/Geometry/Cube.hs

module Geometry.Cube where

import RIO

import Geomancy (Vec3, Vec4, vec3, vec4)
import Geomancy.Vec3 qualified as Vec3

import Resource.Model qualified as Model

data Vertices a = Vertices
  { vLTN :: a
  , vLTF :: a
  , vLBN :: a
  , vLBF :: a
  , vRTN :: a
  , vRTF :: a
  , vRBN :: a
  , vRBF :: a
  }
  deriving (Eq, Ord, Show, Functor, Foldable, Traversable)

-- | Unit cube vertices centered at (0,0,0).
positions :: Vertices Vec3
positions = Vertices
  { vLTN = vec3 (-0.5) (-0.5) (-0.5)
  , vLTF = vec3 (-0.5) (-0.5)   0.5
  , vLBN = vec3 (-0.5)   0.5  (-0.5)
  , vLBF = vec3 (-0.5)   0.5    0.5
  , vRTN = vec3   0.5  (-0.5) (-0.5)
  , vRTF = vec3   0.5  (-0.5)   0.5
  , vRBN = vec3   0.5    0.5  (-0.5)
  , vRBF = vec3   0.5    0.5    0.5
  }

instance Applicative Vertices where
  {-# INLINE pure #-}
  pure x = Vertices
    { vLTN = x
    , vLTF = x
    , vLBN = x
    , vLBF = x
    , vRTN = x
    , vRTF = x
    , vRBN = x
    , vRBF = x
    }

  funcs <*> args = Vertices
    { vLTN = vLTN funcs $ vLTN args
    , vLTF = vLTF funcs $ vLTF args
    , vLBN = vLBN funcs $ vLBN args
    , vLBF = vLBF funcs $ vLBF args
    , vRTN = vRTN funcs $ vRTN args
    , vRTF = vRTF funcs $ vRTF args
    , vRBN = vRBN funcs $ vRBN args
    , vRBF = vRBF funcs $ vRBF args
    }

edges :: [Vec3]
edges =
  [ -- XXX: top plane
    vLTF
  , vLTN

  , vRTF
  , vRTN

  , vLTF
  , vRTF

  , vLTN
  , vRTN

    -- XXX: bottom plane
  , vLBF
  , vLBN

  , vRBF
  , vRBN

  , vLBF
  , vRBF

  , vLBN
  , vRBN

    -- XXX: vertical bars
  , vLTN
  , vLBN

  , vRTN
  , vRBN

  , vLTF
  , vLBF

  , vRTF
  , vRBF
  ]
  where
    Vertices{..} = positions

bbWireColored :: [Model.Vertex Vec3.Packed Vec4]
bbWireColored = zipWith Model.Vertex (map Vec3.Packed edges) colors
  where
    colors =
      [ -- XXX: top plane - red
        vec4 1 0 0 1
      , vec4 1 0 0 1

      , vec4 1 0 0 1
      , vec4 1 0 0 1

      , vec4 1 0 0 1
      , vec4 1 0 0 1

      , vec4 1 0 0 1
      , vec4 1 0 0 1

        -- XXX: bottom plane - green
      , vec4 0 1 0 1
      , vec4 0 1 0 1

      , vec4 0 1 0 1
      , vec4 0 1 0 1

      , vec4 0 1 0 1
      , vec4 0 1 0 1

      , vec4 0 1 0 1
      , vec4 0 1 0 1

        -- XXX: vertical bars - blue
      , vec4 0 0 1 1
      , vec4 0 0 1 1

      , vec4 0 0 1 1
      , vec4 0 0 1 1

      , vec4 0 0 1 1
      , vec4 0 0 1 1

      , vec4 0 0 1 1
      , vec4 0 0 1 1
      ]