packages feed

geomancy-0.4.0.0: src/Geomancy/Vulkan/DView.hs

{-# LANGUAGE BlockArguments #-}

module Geomancy.Vulkan.DView
  ( lookAtRH
  , lookAtRH_
  ) where

import Geomancy.DMat4 (colMajor)
import Geomancy.DTransform (DTransform(..))
import Geomancy.DVec3 (DVec3, cross, dot, normalize, dvec3, withDVec3)

lookAtRH
  :: DVec3
  -> DVec3
  -> DVec3
  -> DTransform
lookAtRH eye target up =
  withDVec3 rgt \rx ry rz ->
  withDVec3 up' \ux uy uz ->
  withDVec3 fwd \fx fy fz ->
  colMajor
    rx ry rz (-er)
    ux uy uz (-eu)
    fx fy fz (-ef)
     0  0  0    1
  where
    fwd = normalize (target - eye)
    rgt = normalize (cross fwd up)
    up' = normalize (cross fwd rgt)
    er = dot eye rgt
    eu = dot eye up'
    ef = dot eye fwd

{-# INLINE lookAtRH_ #-}
lookAtRH_ :: DVec3 -> DVec3 -> DTransform
lookAtRH_ eye target = lookAtRH eye target yNeg
  where
    yNeg = dvec3 0 (-1) 0