{-# LANGUAGE DataKinds             #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MagicHash             #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables   #-}
{-# LANGUAGE TypeApplications      #-}
{-# LANGUAGE UnboxedTuples         #-}
{-# LANGUAGE ViewPatterns          #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

module Numeric.Matrix.Internal.Float () where

import qualified Control.Monad.ST        as ST
import qualified Numeric.DataFrame.ST    as ST
import           Numeric.Dimensions      (KnownDim)
import           Numeric.Matrix.Internal
import           Numeric.Matrix.LU
import           Numeric.Scalar.Internal
import           Numeric.Vector.Internal

{-# INLINE mkMat #-}
mkMat ::
  Float -> Float -> Float -> Float ->
  Float -> Float -> Float -> Float ->
  Float -> Float -> Float -> Float ->
  Float -> Float -> Float -> Float ->
  Mat44f
mkMat :: Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Mat44f
mkMat
  Float
_11 Float
_12 Float
_13 Float
_14
  Float
_21 Float
_22 Float
_23 Float
_24
  Float
_31 Float
_32 Float
_33 Float
_34
  Float
_41 Float
_42 Float
_43 Float
_44
  = (forall s. ST s Mat44f) -> Mat44f
forall a. (forall s. ST s a) -> a
ST.runST ((forall s. ST s Mat44f) -> Mat44f)
-> (forall s. ST s Mat44f) -> Mat44f
forall a b. (a -> b) -> a -> b
$ do
    STDataFrame s Float '[4, 4]
df <- ST s (STDataFrame s Float '[4, 4])
forall k t (ns :: [k]) s.
(PrimBytes t, Dimensions ns) =>
ST s (STDataFrame s t ns)
ST.newDataFrame
    STDataFrame s Float '[4, 4]
-> Int -> DataFrame Float '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Float '[4, 4]
df Int
0  (DataFrame Float '[] -> ST s ()) -> DataFrame Float '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Float -> DataFrame Float '[]
forall t. t -> DataFrame t '[]
scalar Float
_11
    STDataFrame s Float '[4, 4]
-> Int -> DataFrame Float '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Float '[4, 4]
df Int
1  (DataFrame Float '[] -> ST s ()) -> DataFrame Float '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Float -> DataFrame Float '[]
forall t. t -> DataFrame t '[]
scalar Float
_12
    STDataFrame s Float '[4, 4]
-> Int -> DataFrame Float '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Float '[4, 4]
df Int
2  (DataFrame Float '[] -> ST s ()) -> DataFrame Float '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Float -> DataFrame Float '[]
forall t. t -> DataFrame t '[]
scalar Float
_13
    STDataFrame s Float '[4, 4]
-> Int -> DataFrame Float '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Float '[4, 4]
df Int
3  (DataFrame Float '[] -> ST s ()) -> DataFrame Float '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Float -> DataFrame Float '[]
forall t. t -> DataFrame t '[]
scalar Float
_14
    STDataFrame s Float '[4, 4]
-> Int -> DataFrame Float '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Float '[4, 4]
df Int
4  (DataFrame Float '[] -> ST s ()) -> DataFrame Float '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Float -> DataFrame Float '[]
forall t. t -> DataFrame t '[]
scalar Float
_21
    STDataFrame s Float '[4, 4]
-> Int -> DataFrame Float '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Float '[4, 4]
df Int
5  (DataFrame Float '[] -> ST s ()) -> DataFrame Float '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Float -> DataFrame Float '[]
forall t. t -> DataFrame t '[]
scalar Float
_22
    STDataFrame s Float '[4, 4]
-> Int -> DataFrame Float '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Float '[4, 4]
df Int
6  (DataFrame Float '[] -> ST s ()) -> DataFrame Float '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Float -> DataFrame Float '[]
forall t. t -> DataFrame t '[]
scalar Float
_23
    STDataFrame s Float '[4, 4]
-> Int -> DataFrame Float '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Float '[4, 4]
df Int
7  (DataFrame Float '[] -> ST s ()) -> DataFrame Float '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Float -> DataFrame Float '[]
forall t. t -> DataFrame t '[]
scalar Float
_24
    STDataFrame s Float '[4, 4]
-> Int -> DataFrame Float '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Float '[4, 4]
df Int
8  (DataFrame Float '[] -> ST s ()) -> DataFrame Float '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Float -> DataFrame Float '[]
forall t. t -> DataFrame t '[]
scalar Float
_31
    STDataFrame s Float '[4, 4]
-> Int -> DataFrame Float '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Float '[4, 4]
df Int
9  (DataFrame Float '[] -> ST s ()) -> DataFrame Float '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Float -> DataFrame Float '[]
forall t. t -> DataFrame t '[]
scalar Float
_32
    STDataFrame s Float '[4, 4]
-> Int -> DataFrame Float '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Float '[4, 4]
df Int
10 (DataFrame Float '[] -> ST s ()) -> DataFrame Float '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Float -> DataFrame Float '[]
forall t. t -> DataFrame t '[]
scalar Float
_33
    STDataFrame s Float '[4, 4]
-> Int -> DataFrame Float '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Float '[4, 4]
df Int
11 (DataFrame Float '[] -> ST s ()) -> DataFrame Float '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Float -> DataFrame Float '[]
forall t. t -> DataFrame t '[]
scalar Float
_34
    STDataFrame s Float '[4, 4]
-> Int -> DataFrame Float '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Float '[4, 4]
df Int
12 (DataFrame Float '[] -> ST s ()) -> DataFrame Float '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Float -> DataFrame Float '[]
forall t. t -> DataFrame t '[]
scalar Float
_41
    STDataFrame s Float '[4, 4]
-> Int -> DataFrame Float '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Float '[4, 4]
df Int
13 (DataFrame Float '[] -> ST s ()) -> DataFrame Float '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Float -> DataFrame Float '[]
forall t. t -> DataFrame t '[]
scalar Float
_42
    STDataFrame s Float '[4, 4]
-> Int -> DataFrame Float '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Float '[4, 4]
df Int
14 (DataFrame Float '[] -> ST s ()) -> DataFrame Float '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Float -> DataFrame Float '[]
forall t. t -> DataFrame t '[]
scalar Float
_43
    STDataFrame s Float '[4, 4]
-> Int -> DataFrame Float '[] -> ST s ()
forall k t (ns :: [k]) s.
PrimBytes (DataFrame t '[]) =>
STDataFrame s t ns -> Int -> DataFrame t '[] -> ST s ()
ST.writeDataFrameOff STDataFrame s Float '[4, 4]
df Int
15 (DataFrame Float '[] -> ST s ()) -> DataFrame Float '[] -> ST s ()
forall a b. (a -> b) -> a -> b
$ Float -> DataFrame Float '[]
forall t. t -> DataFrame t '[]
scalar Float
_44
    STDataFrame s Float '[4, 4] -> ST s Mat44f
forall k t (ns :: [k]) s.
PrimArray t (DataFrame t ns) =>
STDataFrame s t ns -> ST s (DataFrame t ns)
ST.unsafeFreezeDataFrame STDataFrame s Float '[4, 4]
df

instance HomTransform4 Float where
  {-# INLINE translate4 #-}
  translate4 :: Vector Float 4 -> Mat44f
translate4 (Vector Float 4 -> (# Float, Float, Float, Float #)
forall t. Vector4 t => Vector t 4 -> (# t, t, t, t #)
unpackV4# -> (# Float
x, Float
y, Float
z, Float
_ #)) = Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Mat44f
mkMat
    Float
1 Float
0 Float
0 Float
0
    Float
0 Float
1 Float
0 Float
0
    Float
0 Float
0 Float
1 Float
0
    Float
x Float
y Float
z Float
1

  {-# INLINE translate3 #-}
  translate3 :: Vector Float 3 -> Mat44f
translate3 (Vector Float 3 -> (# Float, Float, Float #)
forall t. Vector3 t => Vector t 3 -> (# t, t, t #)
unpackV3# -> (# Float
x, Float
y, Float
z #)) = Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Mat44f
mkMat
    Float
1 Float
0 Float
0 Float
0
    Float
0 Float
1 Float
0 Float
0
    Float
0 Float
0 Float
1 Float
0
    Float
x Float
y Float
z Float
1

  {-# INLINE rotateX #-}
  rotateX :: Float -> Mat44f
rotateX Float
a = Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Mat44f
mkMat
    Float
1 Float
0 Float
0 Float
0
    Float
0 Float
c Float
s Float
0
    Float
0 Float
n Float
c Float
0
    Float
0 Float
0 Float
0 Float
1
    where
      c :: Float
c = Float -> Float
forall a. Floating a => a -> a
cos Float
a
      s :: Float
s = Float -> Float
forall a. Floating a => a -> a
sin Float
a
      n :: Float
n = -Float
s

  {-# INLINE rotateY #-}
  rotateY :: Float -> Mat44f
rotateY Float
a = Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Mat44f
mkMat
    Float
c Float
0 Float
n Float
0
    Float
0 Float
1 Float
0 Float
0
    Float
s Float
0 Float
c Float
0
    Float
0 Float
0 Float
0 Float
1
    where
      c :: Float
c = Float -> Float
forall a. Floating a => a -> a
cos Float
a
      s :: Float
s = Float -> Float
forall a. Floating a => a -> a
sin Float
a
      n :: Float
n = -Float
s

  {-# INLINE rotateZ #-}
  rotateZ :: Float -> Mat44f
rotateZ Float
a = Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Mat44f
mkMat
    Float
c Float
s Float
0 Float
0
    Float
n Float
c Float
0 Float
0
    Float
0 Float
0 Float
1 Float
0
    Float
0 Float
0 Float
0 Float
1
    where
      c :: Float
c = Float -> Float
forall a. Floating a => a -> a
cos Float
a
      s :: Float
s = Float -> Float
forall a. Floating a => a -> a
sin Float
a
      n :: Float
n = -Float
s

  {-# INLINE rotate #-}
  rotate :: Vector Float 3 -> Float -> Mat44f
rotate (Vector Float 3 -> (# Float, Float, Float #)
forall t. Vector3 t => Vector t 3 -> (# t, t, t #)
unpackV3# -> (# Float
x, Float
y, Float
z #)) Float
a = Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Mat44f
mkMat
    (Float
cFloat -> Float -> Float
forall a. Num a => a -> a -> a
+Float
xxv)  (Float
yxvFloat -> Float -> Float
forall a. Num a => a -> a -> a
+Float
zs) (Float
zxvFloat -> Float -> Float
forall a. Num a => a -> a -> a
-Float
ys) Float
0
    (Float
xyvFloat -> Float -> Float
forall a. Num a => a -> a -> a
-Float
zs) (Float
cFloat -> Float -> Float
forall a. Num a => a -> a -> a
+Float
yyv)  (Float
zyvFloat -> Float -> Float
forall a. Num a => a -> a -> a
+Float
xs) Float
0
    (Float
xzvFloat -> Float -> Float
forall a. Num a => a -> a -> a
+Float
ys) (Float
yzvFloat -> Float -> Float
forall a. Num a => a -> a -> a
-Float
xs) (Float
cFloat -> Float -> Float
forall a. Num a => a -> a -> a
+Float
zzv)  Float
0
     Float
0        Float
0        Float
0       Float
1
    where
      c :: Float
c = Float -> Float
forall a. Floating a => a -> a
cos Float
a
      v :: Float
v = Float
1 Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
c -- v for versine
      s :: Float
s = Float -> Float
forall a. Floating a => a -> a
sin Float
a
      xxv :: Float
xxv = Float
x Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
x Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
v
      xyv :: Float
xyv = Float
x Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
y Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
v
      xzv :: Float
xzv = Float
x Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
z Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
v
      yxv :: Float
yxv = Float
xyv
      yyv :: Float
yyv = Float
y Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
y Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
v
      yzv :: Float
yzv = Float
y Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
z Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
v
      zxv :: Float
zxv = Float
xzv
      zyv :: Float
zyv = Float
yzv
      zzv :: Float
zzv = Float
z Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
z Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
v
      xs :: Float
xs = Float
x Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
s
      ys :: Float
ys = Float
y Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
s
      zs :: Float
zs = Float
z Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
s

  {-# INLINE rotateEuler #-}
  rotateEuler :: Float -> Float -> Float -> Mat44f
rotateEuler Float
x Float
y Float
z = Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Mat44f
mkMat
    (Float
cyFloat -> Float -> Float
forall a. Num a => a -> a -> a
*Float
cz)  (Float
cxFloat -> Float -> Float
forall a. Num a => a -> a -> a
*Float
szFloat -> Float -> Float
forall a. Num a => a -> a -> a
+Float
sxFloat -> Float -> Float
forall a. Num a => a -> a -> a
*Float
syFloat -> Float -> Float
forall a. Num a => a -> a -> a
*Float
cz) (Float
sxFloat -> Float -> Float
forall a. Num a => a -> a -> a
*Float
szFloat -> Float -> Float
forall a. Num a => a -> a -> a
-Float
cxFloat -> Float -> Float
forall a. Num a => a -> a -> a
*Float
syFloat -> Float -> Float
forall a. Num a => a -> a -> a
*Float
cz) Float
0
    (-Float
cyFloat -> Float -> Float
forall a. Num a => a -> a -> a
*Float
sz) (Float
cxFloat -> Float -> Float
forall a. Num a => a -> a -> a
*Float
czFloat -> Float -> Float
forall a. Num a => a -> a -> a
-Float
sxFloat -> Float -> Float
forall a. Num a => a -> a -> a
*Float
syFloat -> Float -> Float
forall a. Num a => a -> a -> a
*Float
sz) (Float
sxFloat -> Float -> Float
forall a. Num a => a -> a -> a
*Float
czFloat -> Float -> Float
forall a. Num a => a -> a -> a
+Float
cxFloat -> Float -> Float
forall a. Num a => a -> a -> a
*Float
syFloat -> Float -> Float
forall a. Num a => a -> a -> a
*Float
sz) Float
0
     Float
sy      (-Float
sxFloat -> Float -> Float
forall a. Num a => a -> a -> a
*Float
cy)         (Float
cxFloat -> Float -> Float
forall a. Num a => a -> a -> a
*Float
cy)          Float
0
     Float
0        Float
0                Float
0               Float
1
    where
      cx :: Float
cx = Float -> Float
forall a. Floating a => a -> a
cos Float
x
      sx :: Float
sx = Float -> Float
forall a. Floating a => a -> a
sin Float
x
      cy :: Float
cy = Float -> Float
forall a. Floating a => a -> a
cos Float
y
      sy :: Float
sy = Float -> Float
forall a. Floating a => a -> a
sin Float
y
      cz :: Float
cz = Float -> Float
forall a. Floating a => a -> a
cos Float
z
      sz :: Float
sz = Float -> Float
forall a. Floating a => a -> a
sin Float
z

  {-# INLINE lookAt #-}
  lookAt :: Vector Float 3 -> Vector Float 3 -> Vector Float 3 -> Mat44f
lookAt Vector Float 3
up Vector Float 3
cam Vector Float 3
foc = Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Mat44f
mkMat
    Float
xb1 Float
yb1 Float
zb1 Float
0
    Float
xb2 Float
yb2 Float
zb2 Float
0
    Float
xb3 Float
yb3 Float
zb3 Float
0
    Float
tx  Float
ty  Float
tz  Float
1
    where
      (# Float
xb1, Float
xb2, Float
xb3 #) = Vector Float 3 -> (# Float, Float, Float #)
forall t. Vector3 t => Vector t 3 -> (# t, t, t #)
unpackV3# Vector Float 3
xb
      (# Float
yb1, Float
yb2, Float
yb3 #) = Vector Float 3 -> (# Float, Float, Float #)
forall t. Vector3 t => Vector t 3 -> (# t, t, t #)
unpackV3# Vector Float 3
yb
      (# Float
zb1, Float
zb2, Float
zb3 #) = Vector Float 3 -> (# Float, Float, Float #)
forall t. Vector3 t => Vector t 3 -> (# t, t, t #)
unpackV3# Vector Float 3
zb
      zb :: Vector Float 3
zb = Vector Float 3 -> Vector Float 3
forall k t (n :: k).
(Floating (DataFrame t '[]), SubSpace t '[n] '[] '[n]) =>
Vector t n -> Vector t n
normalized (Vector Float 3 -> Vector Float 3)
-> Vector Float 3 -> Vector Float 3
forall a b. (a -> b) -> a -> b
$ Vector Float 3
cam Vector Float 3 -> Vector Float 3 -> Vector Float 3
forall a. Num a => a -> a -> a
- Vector Float 3
foc -- Basis vector for "backward", since +Z is behind the camera
      xb :: Vector Float 3
xb = Vector Float 3 -> Vector Float 3
forall k t (n :: k).
(Floating (DataFrame t '[]), SubSpace t '[n] '[] '[n]) =>
Vector t n -> Vector t n
normalized (Vector Float 3 -> Vector Float 3)
-> Vector Float 3 -> Vector Float 3
forall a b. (a -> b) -> a -> b
$ Vector Float 3
up Vector Float 3 -> Vector Float 3 -> Vector Float 3
forall t.
(Num t, PrimBytes t) =>
Vector t 3 -> Vector t 3 -> Vector t 3
`cross` Vector Float 3
zb -- Basis vector for "right"
      yb :: Vector Float 3
yb = Vector Float 3
zb Vector Float 3 -> Vector Float 3 -> Vector Float 3
forall t.
(Num t, PrimBytes t) =>
Vector t 3 -> Vector t 3 -> Vector t 3
`cross` Vector Float 3
xb -- Basis vector for "up"
      ncam :: Vector Float 3
ncam = -Vector Float 3
cam
      tx :: Float
tx = DataFrame Float '[] -> Float
forall t. DataFrame t '[] -> t
unScalar (DataFrame Float '[] -> Float) -> DataFrame Float '[] -> Float
forall a b. (a -> b) -> a -> b
$ Vector Float 3
xb Vector Float 3 -> Vector Float 3 -> DataFrame Float '[]
forall t (n :: Nat).
(Num t, Num (Vector t n), SubSpace t '[n] '[] '[n]) =>
Vector t n -> Vector t n -> Scalar t
`dot` Vector Float 3
ncam
      ty :: Float
ty = DataFrame Float '[] -> Float
forall t. DataFrame t '[] -> t
unScalar (DataFrame Float '[] -> Float) -> DataFrame Float '[] -> Float
forall a b. (a -> b) -> a -> b
$ Vector Float 3
yb Vector Float 3 -> Vector Float 3 -> DataFrame Float '[]
forall t (n :: Nat).
(Num t, Num (Vector t n), SubSpace t '[n] '[] '[n]) =>
Vector t n -> Vector t n -> Scalar t
`dot` Vector Float 3
ncam
      tz :: Float
tz = DataFrame Float '[] -> Float
forall t. DataFrame t '[] -> t
unScalar (DataFrame Float '[] -> Float) -> DataFrame Float '[] -> Float
forall a b. (a -> b) -> a -> b
$ Vector Float 3
zb Vector Float 3 -> Vector Float 3 -> DataFrame Float '[]
forall t (n :: Nat).
(Num t, Num (Vector t n), SubSpace t '[n] '[] '[n]) =>
Vector t n -> Vector t n -> Scalar t
`dot` Vector Float 3
ncam

  {-# INLINE perspective #-}
  perspective :: Float -> Float -> Float -> Float -> Mat44f
perspective Float
n Float
f Float
fovy Float
aspect = Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Mat44f
mkMat
    Float
dpw Float
0   Float
0   Float
0
    Float
0   Float
dph Float
0   Float
0
    Float
0   Float
0   Float
a (-Float
1)
    Float
0   Float
0   Float
b   Float
0
    where
      hpd :: Float
hpd = Float -> Float
forall a. Floating a => a -> a
tan (Float
fovy Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
0.5) -- height/distance
      wpd :: Float
wpd = Float
aspect Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
hpd; -- width/distance
      dph :: Float
dph = Float -> Float
forall a. Fractional a => a -> a
recip Float
hpd -- distance/height
      dpw :: Float
dpw = Float -> Float
forall a. Fractional a => a -> a
recip Float
wpd -- distance/width
      nmf :: Float
nmf = Float
n Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
f
      a :: Float
a = (Float
n Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
f) Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
nmf
      b :: Float
b = Float
2 Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
n Float -> Float -> Float
forall a. Num a => a -> a -> a
* Float
f Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
nmf

  {-# INLINE orthogonal #-}
  orthogonal :: Float -> Float -> Float -> Float -> Mat44f
orthogonal Float
n Float
f Float
w Float
h = Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Float
-> Mat44f
mkMat
    Float
iw Float
0  Float
0 Float
0
    Float
0  Float
ih Float
0 Float
0
    Float
0  Float
0  Float
a Float
0
    Float
0  Float
0  Float
b Float
1
    where
      ih :: Float
ih = Float
2 Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
h
      iw :: Float
iw = Float
2 Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
w
      nmf :: Float
nmf = Float
n Float -> Float -> Float
forall a. Num a => a -> a -> a
- Float
f
      a :: Float
a = Float
2 Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
nmf
      b :: Float
b = (Float
n Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float
f) Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
nmf

  {-# INLINE toHomPoint #-}
  toHomPoint :: Vector Float 3 -> Vector Float 4
toHomPoint (Vector Float 3 -> (# Float, Float, Float #)
forall t. Vector3 t => Vector t 3 -> (# t, t, t #)
unpackV3# -> (# Float
x, Float
y, Float
z #)) = Float -> Float -> Float -> Float -> Vector Float 4
forall t. Vector4 t => t -> t -> t -> t -> Vector t 4
vec4 Float
x Float
y Float
z Float
1

  {-# INLINE toHomVector #-}
  toHomVector :: Vector Float 3 -> Vector Float 4
toHomVector (Vector Float 3 -> (# Float, Float, Float #)
forall t. Vector3 t => Vector t 3 -> (# t, t, t #)
unpackV3# -> (# Float
x, Float
y, Float
z #)) = Float -> Float -> Float -> Float -> Vector Float 4
forall t. Vector4 t => t -> t -> t -> t -> Vector t 4
vec4 Float
x Float
y Float
z Float
0

  {-# INLINE fromHom #-}
  fromHom :: Vector Float 4 -> Vector Float 3
fromHom (Vector Float 4 -> (# Float, Float, Float, Float #)
forall t. Vector4 t => Vector t 4 -> (# t, t, t, t #)
unpackV4# -> (# Float
x, Float
y, Float
z, Float
w #))
    | Float
w Float -> Float -> Bool
forall a. Eq a => a -> a -> Bool
== Float
0    = Float -> Float -> Float -> Vector Float 3
forall t. Vector3 t => t -> t -> t -> Vector t 3
vec3 Float
x Float
y Float
z
    | Bool
otherwise = Float -> Float -> Float -> Vector Float 3
forall t. Vector3 t => t -> t -> t -> Vector t 3
vec3 (Float
xFloat -> Float -> Float
forall a. Fractional a => a -> a -> a
/Float
w) (Float
yFloat -> Float -> Float
forall a. Fractional a => a -> a -> a
/Float
w) (Float
zFloat -> Float -> Float
forall a. Fractional a => a -> a -> a
/Float
w)

instance KnownDim n => MatrixInverse Float n where
    inverse :: Matrix Float n n -> Matrix Float n n
inverse = Matrix Float n n -> Matrix Float n n
forall t (n :: Nat). MatrixLU t n => Matrix t n n -> Matrix t n n
inverseViaLU

instance KnownDim n => MatrixDeterminant Float n where
    det :: Matrix Float n n -> DataFrame Float '[]
det = Matrix Float n n -> DataFrame Float '[]
forall t (n :: Nat). MatrixLU t n => Matrix t n n -> Scalar t
detViaLU