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