module Diagrams.ThreeD.Deform
  ( parallelX0, perspectiveX1, facingX
  , parallelY0, perspectiveY1, facingY
  , parallelZ0, perspectiveZ1, facingZ
  ) where

import           Control.Lens

import           Diagrams.Deform
import           Diagrams.TwoD.Deform

import           Linear.V3
import           Linear.Vector

-- | The parallel projection onto the plane z=0
parallelZ0 :: (R3 v, Num n) => Deformation v v n
parallelZ0 = Deformation (_z .~ 0)

-- | The perspective division onto the plane z=1 along lines going
--   through the origin.
perspectiveZ1 :: (R3 v, Functor v, Fractional n) => Deformation v v n
perspectiveZ1 = Deformation $ \p -> p ^/ (p ^. _x)

facingZ :: (R3 v, Functor v, Fractional n) => Deformation v v n
facingZ = Deformation $
  \p -> let z = p ^. _z
        in  p ^/ z & _z .~ z