module Graphics.GPipe.Internal.Linear where

import           Control.Lens ((^.))
import           Linear       (M44, Metric (dot, signorm), R1 (..), R2 (..),
                               R3 (..), V3, V4 (..), cross)


lookAt :: Floating a => V3 a -> V3 a -> V3 a -> V4 (V4 a)
lookAt :: V3 a -> V3 a -> V3 a -> V4 (V4 a)
lookAt V3 a
eye V3 a
center V3 a
up =
  V4 a -> V4 a -> V4 a -> V4 a -> V4 (V4 a)
forall a. a -> a -> a -> a -> V4 a
V4 (a -> a -> a -> a -> V4 a
forall a. a -> a -> a -> a -> V4 a
V4 (V3 a
xaV3 a -> Getting a (V3 a) a -> a
forall s a. s -> Getting a s a -> a
^.Getting a (V3 a) a
forall (t :: * -> *) a. R1 t => Lens' (t a) a
_x)  (V3 a
xaV3 a -> Getting a (V3 a) a -> a
forall s a. s -> Getting a s a -> a
^.Getting a (V3 a) a
forall (t :: * -> *) a. R2 t => Lens' (t a) a
_y)  (V3 a
xaV3 a -> Getting a (V3 a) a -> a
forall s a. s -> Getting a s a -> a
^.Getting a (V3 a) a
forall (t :: * -> *) a. R3 t => Lens' (t a) a
_z)  a
xd)
     (a -> a -> a -> a -> V4 a
forall a. a -> a -> a -> a -> V4 a
V4 (V3 a
yaV3 a -> Getting a (V3 a) a -> a
forall s a. s -> Getting a s a -> a
^.Getting a (V3 a) a
forall (t :: * -> *) a. R1 t => Lens' (t a) a
_x)  (V3 a
yaV3 a -> Getting a (V3 a) a -> a
forall s a. s -> Getting a s a -> a
^.Getting a (V3 a) a
forall (t :: * -> *) a. R2 t => Lens' (t a) a
_y)  (V3 a
yaV3 a -> Getting a (V3 a) a -> a
forall s a. s -> Getting a s a -> a
^.Getting a (V3 a) a
forall (t :: * -> *) a. R3 t => Lens' (t a) a
_z)  a
yd)
     (a -> a -> a -> a -> V4 a
forall a. a -> a -> a -> a -> V4 a
V4 (-V3 a
zaV3 a -> Getting a (V3 a) a -> a
forall s a. s -> Getting a s a -> a
^.Getting a (V3 a) a
forall (t :: * -> *) a. R1 t => Lens' (t a) a
_x) (-V3 a
zaV3 a -> Getting a (V3 a) a -> a
forall s a. s -> Getting a s a -> a
^.Getting a (V3 a) a
forall (t :: * -> *) a. R2 t => Lens' (t a) a
_y) (-V3 a
zaV3 a -> Getting a (V3 a) a -> a
forall s a. s -> Getting a s a -> a
^.Getting a (V3 a) a
forall (t :: * -> *) a. R3 t => Lens' (t a) a
_z) a
zd)
     (a -> a -> a -> a -> V4 a
forall a. a -> a -> a -> a -> V4 a
V4 a
0         a
0         a
0          a
1)
  where za :: V3 a
za = V3 a -> V3 a
forall (f :: * -> *) a. (Metric f, Floating a) => f a -> f a
signorm (V3 a -> V3 a) -> V3 a -> V3 a
forall a b. (a -> b) -> a -> b
$ V3 a
center V3 a -> V3 a -> V3 a
forall a. Num a => a -> a -> a
- V3 a
eye
        xa :: V3 a
xa = V3 a -> V3 a
forall (f :: * -> *) a. (Metric f, Floating a) => f a -> f a
signorm (V3 a -> V3 a) -> V3 a -> V3 a
forall a b. (a -> b) -> a -> b
$ V3 a -> V3 a -> V3 a
forall a. Num a => V3 a -> V3 a -> V3 a
cross V3 a
za V3 a
up
        ya :: V3 a
ya = V3 a -> V3 a -> V3 a
forall a. Num a => V3 a -> V3 a -> V3 a
cross V3 a
xa V3 a
za
        xd :: a
xd = -V3 a -> V3 a -> a
forall (f :: * -> *) a. (Metric f, Num a) => f a -> f a -> a
dot V3 a
xa V3 a
eye
        yd :: a
yd = -V3 a -> V3 a -> a
forall (f :: * -> *) a. (Metric f, Num a) => f a -> f a -> a
dot V3 a
ya V3 a
eye
        zd :: a
zd = V3 a -> V3 a -> a
forall (f :: * -> *) a. (Metric f, Num a) => f a -> f a -> a
dot V3 a
za V3 a
eye


rotMatrixX :: Floating a => a -> M44 a
rotMatrixX :: a -> M44 a
rotMatrixX a
phi = V4 a -> V4 a -> V4 a -> V4 a -> M44 a
forall a. a -> a -> a -> a -> V4 a
V4
    (a -> a -> a -> a -> V4 a
forall a. a -> a -> a -> a -> V4 a
V4 a
1          a
0          a
0          a
0)
    (a -> a -> a -> a -> V4 a
forall a. a -> a -> a -> a -> V4 a
V4 a
0          ( a -> a
forall a. Floating a => a -> a
cos a
phi) (-a -> a
forall a. Floating a => a -> a
sin a
phi) a
0)
    (a -> a -> a -> a -> V4 a
forall a. a -> a -> a -> a -> V4 a
V4 a
0          ( a -> a
forall a. Floating a => a -> a
sin a
phi) ( a -> a
forall a. Floating a => a -> a
cos a
phi) a
0)
    (a -> a -> a -> a -> V4 a
forall a. a -> a -> a -> a -> V4 a
V4 a
0          a
0          a
0          a
1)


rotMatrixY :: Floating a => a -> M44 a
rotMatrixY :: a -> M44 a
rotMatrixY a
phi = V4 a -> V4 a -> V4 a -> V4 a -> M44 a
forall a. a -> a -> a -> a -> V4 a
V4
    (a -> a -> a -> a -> V4 a
forall a. a -> a -> a -> a -> V4 a
V4 ( a -> a
forall a. Floating a => a -> a
cos a
phi) a
0          ( a -> a
forall a. Floating a => a -> a
sin a
phi) a
0)
    (a -> a -> a -> a -> V4 a
forall a. a -> a -> a -> a -> V4 a
V4 a
0          a
1          a
0          a
0)
    (a -> a -> a -> a -> V4 a
forall a. a -> a -> a -> a -> V4 a
V4 (-a -> a
forall a. Floating a => a -> a
sin a
phi) a
0          ( a -> a
forall a. Floating a => a -> a
cos a
phi) a
0)
    (a -> a -> a -> a -> V4 a
forall a. a -> a -> a -> a -> V4 a
V4 a
0          a
0          a
0          a
1)


rotMatrixZ :: Floating a => a -> M44 a
rotMatrixZ :: a -> M44 a
rotMatrixZ a
phi = V4 a -> V4 a -> V4 a -> V4 a -> M44 a
forall a. a -> a -> a -> a -> V4 a
V4
    (a -> a -> a -> a -> V4 a
forall a. a -> a -> a -> a -> V4 a
V4 ( a -> a
forall a. Floating a => a -> a
cos a
phi) (-a -> a
forall a. Floating a => a -> a
sin a
phi) a
0          a
0)
    (a -> a -> a -> a -> V4 a
forall a. a -> a -> a -> a -> V4 a
V4 ( a -> a
forall a. Floating a => a -> a
sin a
phi) ( a -> a
forall a. Floating a => a -> a
cos a
phi) a
0          a
0)
    (a -> a -> a -> a -> V4 a
forall a. a -> a -> a -> a -> V4 a
V4 a
0          a
0          a
1          a
0)
    (a -> a -> a -> a -> V4 a
forall a. a -> a -> a -> a -> V4 a
V4 a
0          a
0          a
0          a
1)