-- | 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 = 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 x y) = dolly (V3 x 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 = fmap getXYW . getXYW . C.camMatrix
  where getXYW (V4 x y _ w) = V3 x y 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 = 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 = C.rollRad