packages feed

GPipe-Core-0.2.3.0: src/Graphics/GPipe/Internal/Linear.hs

module Graphics.GPipe.Internal.Linear where

import           Control.Lens ((^.))
import           Linear


lookAt :: Floating a => V3 a -> V3 a -> V3 a -> V4 (V4 a)
lookAt eye center up =
  V4 (V4 (xa^._x)  (xa^._y)  (xa^._z)  xd)
     (V4 (ya^._x)  (ya^._y)  (ya^._z)  yd)
     (V4 (-za^._x) (-za^._y) (-za^._z) zd)
     (V4 0         0         0          1)
  where za = signorm $ center - eye
        xa = signorm $ cross za up
        ya = cross xa za
        xd = -dot xa eye
        yd = -dot ya eye
        zd = dot za eye


rotMatrixX :: Floating a => a -> M44 a
rotMatrixX phi = V4
    (V4 1          0          0          0)
    (V4 0          ( cos phi) (-sin phi) 0)
    (V4 0          ( sin phi) ( cos phi) 0)
    (V4 0          0          0          1)


rotMatrixY :: Floating a => a -> M44 a
rotMatrixY phi = V4
    (V4 ( cos phi) 0          ( sin phi) 0)
    (V4 0          1          0          0)
    (V4 (-sin phi) 0          ( cos phi) 0)
    (V4 0          0          0          1)


rotMatrixZ :: Floating a => a -> M44 a
rotMatrixZ phi = V4
    (V4 ( cos phi) (-sin phi) 0          0)
    (V4 ( sin phi) ( cos phi) 0          0)
    (V4 0          0          1          0)
    (V4 0          0          0          1)