content: module Diagrams.TwoD.Deform where
  
  import           Control.Lens
  
  import           Diagrams.Deform
  
  import           Linear.V2
  import           Linear.Vector
  
  -- | The parallel projection onto the plane x=0
  parallelX0 :: (R1 v, Num n) => Deformation v v n
  parallelX0 = Deformation (_x .~ 0)
  
  -- | The perspective division onto the plane x=1 along lines going
  -- through the origin.
  perspectiveX1 :: (R1 v, Functor v, Fractional n) => Deformation v v n
  perspectiveX1 = Deformation $ \p -> p ^/ (p ^. _x)
  
  -- | The parallel projection onto the plane y=0
  parallelY0 :: (R2 v, Num n) => Deformation v v n
  parallelY0 = Deformation (_y .~ 0)
  
  -- | The perspective division onto the plane y=1 along lines going
  -- through the origin.
  perspectiveY1 :: (R2 v, Functor v, Floating n) => Deformation v v n
  perspectiveY1 = Deformation $ \p -> p ^/ (p ^. _y)
  
  -- | The viewing transform for a viewer facing along the positive X
  -- axis.  X coördinates stay fixed, while Y coördinates are compressed
  -- with increasing distance.  @asDeformation (translation unitX) <>
  -- parallelX0 <> frustrumX = perspectiveX1@
  facingX :: (R1 v, Functor v, Fractional n) => Deformation v v n
  facingX = Deformation $
    \p -> let x = p ^. _x
          in  p ^/ x & _x .~ x
  
  facingY :: (R2 v, Functor v, Fractional n) => Deformation v v n
  facingY = Deformation $
    \p -> let y = p ^. _y
          in  p ^/ y & _y .~ y
  
  