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

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

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

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

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

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

  {-# INLINE rotate #-}
  rotate :: Vector Double 3 -> Double -> Mat44d
rotate (Vector Double 3 -> (# Double, Double, Double #)
forall t. Vector3 t => Vector t 3 -> (# t, t, t #)
unpackV3# -> (# Double
x, Double
y, Double
z #)) Double
a = Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Mat44d
mkMat
    (Double
cDouble -> Double -> Double
forall a. Num a => a -> a -> a
+Double
xxv)  (Double
yxvDouble -> Double -> Double
forall a. Num a => a -> a -> a
+Double
zs) (Double
zxvDouble -> Double -> Double
forall a. Num a => a -> a -> a
-Double
ys) Double
0
    (Double
xyvDouble -> Double -> Double
forall a. Num a => a -> a -> a
-Double
zs) (Double
cDouble -> Double -> Double
forall a. Num a => a -> a -> a
+Double
yyv)  (Double
zyvDouble -> Double -> Double
forall a. Num a => a -> a -> a
+Double
xs) Double
0
    (Double
xzvDouble -> Double -> Double
forall a. Num a => a -> a -> a
+Double
ys) (Double
yzvDouble -> Double -> Double
forall a. Num a => a -> a -> a
-Double
xs) (Double
cDouble -> Double -> Double
forall a. Num a => a -> a -> a
+Double
zzv)  Double
0
     Double
0        Double
0        Double
0       Double
1
    where
      c :: Double
c = Double -> Double
forall a. Floating a => a -> a
cos Double
a
      v :: Double
v = Double
1 Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
c -- v for versine
      s :: Double
s = Double -> Double
forall a. Floating a => a -> a
sin Double
a
      xxv :: Double
xxv = Double
x Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
x Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
v
      xyv :: Double
xyv = Double
x Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
y Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
v
      xzv :: Double
xzv = Double
x Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
z Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
v
      yxv :: Double
yxv = Double
xyv
      yyv :: Double
yyv = Double
y Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
y Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
v
      yzv :: Double
yzv = Double
y Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
z Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
v
      zxv :: Double
zxv = Double
xzv
      zyv :: Double
zyv = Double
yzv
      zzv :: Double
zzv = Double
z Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
z Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
v
      xs :: Double
xs = Double
x Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
s
      ys :: Double
ys = Double
y Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
s
      zs :: Double
zs = Double
z Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
s

  {-# INLINE rotateEuler #-}
  rotateEuler :: Double -> Double -> Double -> Mat44d
rotateEuler Double
x Double
y Double
z = Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Double
-> Mat44d
mkMat
    (Double
cyDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
cz)  (Double
cxDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
szDouble -> Double -> Double
forall a. Num a => a -> a -> a
+Double
sxDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
syDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
cz) (Double
sxDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
szDouble -> Double -> Double
forall a. Num a => a -> a -> a
-Double
cxDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
syDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
cz) Double
0
    (-Double
cyDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
sz) (Double
cxDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
czDouble -> Double -> Double
forall a. Num a => a -> a -> a
-Double
sxDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
syDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
sz) (Double
sxDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
czDouble -> Double -> Double
forall a. Num a => a -> a -> a
+Double
cxDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
syDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
sz) Double
0
     Double
sy      (-Double
sxDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
cy)         (Double
cxDouble -> Double -> Double
forall a. Num a => a -> a -> a
*Double
cy)          Double
0
     Double
0        Double
0                Double
0               Double
1
    where
      cx :: Double
cx = Double -> Double
forall a. Floating a => a -> a
cos Double
x
      sx :: Double
sx = Double -> Double
forall a. Floating a => a -> a
sin Double
x
      cy :: Double
cy = Double -> Double
forall a. Floating a => a -> a
cos Double
y
      sy :: Double
sy = Double -> Double
forall a. Floating a => a -> a
sin Double
y
      cz :: Double
cz = Double -> Double
forall a. Floating a => a -> a
cos Double
z
      sz :: Double
sz = Double -> Double
forall a. Floating a => a -> a
sin Double
z

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

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

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

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

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

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

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

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