-- | A camera designed for 2D viewing. The camera may be translated
-- perpendicular to its view direction, or rolled about its view
-- direction.
module Graphics.GLUtil.Camera2D 
  (-- * Camera movement
   Camera(..), track, roll, rollRad,
   -- * Camera initialization
   camera2D,
   -- * Math
   camMatrix, deg2rad) where
import Graphics.GLUtil.Camera3D hiding (camMatrix, roll, rollRad)
import qualified Graphics.GLUtil.Camera3D as C
import Linear (Conjugate, Epsilon, V2(..), V3(..), V4(..), M33)

-- | Initialize a camera for 2D rendering.
camera2D :: (Epsilon a, RealFloat a) => Camera a
camera2D :: Camera a
camera2D = Camera a
forall a. (Epsilon a, RealFloat a) => Camera a
fpsCamera

-- | Move the camera side-to-side or up-and-down as in a tracking shot.
track :: (Conjugate a, Epsilon a, RealFloat a) => V2 a -> Camera a -> Camera a
track :: V2 a -> Camera a -> Camera a
track (V2 x :: a
x y :: a
y) = V3 a -> Camera a -> Camera a
forall a.
(Conjugate a, Epsilon a, RealFloat a) =>
V3 a -> Camera a -> Camera a
dolly (a -> a -> a -> V3 a
forall a. a -> a -> a -> V3 a
V3 a
x a
y 0)

-- | Produce a matrix that transforms homogenous 2D points into the
-- camera's coordinate frame.
camMatrix :: (Conjugate a, Epsilon a, RealFloat a) => Camera a -> M33 a
camMatrix :: Camera a -> M33 a
camMatrix = (V4 a -> V3 a) -> V3 (V4 a) -> M33 a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap V4 a -> V3 a
forall a. V4 a -> V3 a
getXYW (V3 (V4 a) -> M33 a)
-> (Camera a -> V3 (V4 a)) -> Camera a -> M33 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. V4 (V4 a) -> V3 (V4 a)
forall a. V4 a -> V3 a
getXYW (V4 (V4 a) -> V3 (V4 a))
-> (Camera a -> V4 (V4 a)) -> Camera a -> V3 (V4 a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Camera a -> V4 (V4 a)
forall a.
(Conjugate a, Epsilon a, RealFloat a) =>
Camera a -> M44 a
C.camMatrix
  where getXYW :: V4 a -> V3 a
getXYW (V4 x :: a
x y :: a
y _ w :: a
w) = a -> a -> a -> V3 a
forall a. a -> a -> a -> V3 a
V3 a
x a
y a
w

-- | Roll a camera view about its view direction by an angle given in
-- degrees.
roll :: (Epsilon a, RealFloat a) => a -> Camera a -> Camera a
roll :: a -> Camera a -> Camera a
roll = a -> Camera a -> Camera a
forall a. (Epsilon a, RealFloat a) => a -> Camera a -> Camera a
C.roll

-- | Roll a camera view about its view direction by an angle given in
-- radians.
rollRad :: (Epsilon a, RealFloat a) => a -> Camera a -> Camera a
rollRad :: a -> Camera a -> Camera a
rollRad = a -> Camera a -> Camera a
forall a. (Epsilon a, RealFloat a) => a -> Camera a -> Camera a
C.rollRad