{-# LINE 1 "src/Box3D/MathTypes.hsc" #-}
-- | Low-level bindings to the value types in @box3d/math_functions.h@.
--
-- These are the small POD math structs that the Box3D API passes and returns
-- by value. Field order matches the C layout; 'Storable' offsets come straight
-- from the header via @hsc2hs@. Fields are 'Float' because C @float@ maps to
-- the Haskell FFI 'Float' with an identical representation.
--
-- In single-precision builds (the default) @b3Pos@ and @b3WorldTransform@ are
-- typedefs for @b3Vec3@ and @b3Transform@, so 'Pos' and 'WorldTransform' are
-- type synonyms here.
module Box3D.MathTypes
  ( Vec2 (..)
  , Vec3 (..)
  , CosSin (..)
  , Quat (..)
  , Transform (..)
  , Matrix3 (..)
  , AABB (..)
  , Plane (..)
  , Pos
  , WorldTransform

    -- * Constants
  , vec3Zero
  , vec3One
  , vec3AxisX
  , vec3AxisY
  , vec3AxisZ
  , quatIdentity
  , transformIdentity
  , matrix3Zero
  , matrix3Identity
  ) where

import Foreign



-- | A 2D vector.
data Vec2 = Vec2 Float Float
  deriving (Vec2 -> Vec2 -> Bool
(Vec2 -> Vec2 -> Bool) -> (Vec2 -> Vec2 -> Bool) -> Eq Vec2
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Vec2 -> Vec2 -> Bool
== :: Vec2 -> Vec2 -> Bool
$c/= :: Vec2 -> Vec2 -> Bool
/= :: Vec2 -> Vec2 -> Bool
Eq, Int -> Vec2 -> ShowS
[Vec2] -> ShowS
Vec2 -> String
(Int -> Vec2 -> ShowS)
-> (Vec2 -> String) -> ([Vec2] -> ShowS) -> Show Vec2
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Vec2 -> ShowS
showsPrec :: Int -> Vec2 -> ShowS
$cshow :: Vec2 -> String
show :: Vec2 -> String
$cshowList :: [Vec2] -> ShowS
showList :: [Vec2] -> ShowS
Show)

-- | A 3D vector.
data Vec3 = Vec3 Float Float Float
  deriving (Vec3 -> Vec3 -> Bool
(Vec3 -> Vec3 -> Bool) -> (Vec3 -> Vec3 -> Bool) -> Eq Vec3
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Vec3 -> Vec3 -> Bool
== :: Vec3 -> Vec3 -> Bool
$c/= :: Vec3 -> Vec3 -> Bool
/= :: Vec3 -> Vec3 -> Bool
Eq, Int -> Vec3 -> ShowS
[Vec3] -> ShowS
Vec3 -> String
(Int -> Vec3 -> ShowS)
-> (Vec3 -> String) -> ([Vec3] -> ShowS) -> Show Vec3
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Vec3 -> ShowS
showsPrec :: Int -> Vec3 -> ShowS
$cshow :: Vec3 -> String
show :: Vec3 -> String
$cshowList :: [Vec3] -> ShowS
showList :: [Vec3] -> ShowS
Show)

-- | Cosine and sine pair (@cosine@, @sine@).
data CosSin = CosSin Float Float
  deriving (CosSin -> CosSin -> Bool
(CosSin -> CosSin -> Bool)
-> (CosSin -> CosSin -> Bool) -> Eq CosSin
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CosSin -> CosSin -> Bool
== :: CosSin -> CosSin -> Bool
$c/= :: CosSin -> CosSin -> Bool
/= :: CosSin -> CosSin -> Bool
Eq, Int -> CosSin -> ShowS
[CosSin] -> ShowS
CosSin -> String
(Int -> CosSin -> ShowS)
-> (CosSin -> String) -> ([CosSin] -> ShowS) -> Show CosSin
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CosSin -> ShowS
showsPrec :: Int -> CosSin -> ShowS
$cshow :: CosSin -> String
show :: CosSin -> String
$cshowList :: [CosSin] -> ShowS
showList :: [CosSin] -> ShowS
Show)

-- | A quaternion: vector part @v@ and scalar part @s@.
data Quat = Quat Vec3 Float
  deriving (Quat -> Quat -> Bool
(Quat -> Quat -> Bool) -> (Quat -> Quat -> Bool) -> Eq Quat
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Quat -> Quat -> Bool
== :: Quat -> Quat -> Bool
$c/= :: Quat -> Quat -> Bool
/= :: Quat -> Quat -> Bool
Eq, Int -> Quat -> ShowS
[Quat] -> ShowS
Quat -> String
(Int -> Quat -> ShowS)
-> (Quat -> String) -> ([Quat] -> ShowS) -> Show Quat
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Quat -> ShowS
showsPrec :: Int -> Quat -> ShowS
$cshow :: Quat -> String
show :: Quat -> String
$cshowList :: [Quat] -> ShowS
showList :: [Quat] -> ShowS
Show)

-- | A rigid transform: position @p@ and rotation @q@.
data Transform = Transform Vec3 Quat
  deriving (Transform -> Transform -> Bool
(Transform -> Transform -> Bool)
-> (Transform -> Transform -> Bool) -> Eq Transform
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Transform -> Transform -> Bool
== :: Transform -> Transform -> Bool
$c/= :: Transform -> Transform -> Bool
/= :: Transform -> Transform -> Bool
Eq, Int -> Transform -> ShowS
[Transform] -> ShowS
Transform -> String
(Int -> Transform -> ShowS)
-> (Transform -> String)
-> ([Transform] -> ShowS)
-> Show Transform
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Transform -> ShowS
showsPrec :: Int -> Transform -> ShowS
$cshow :: Transform -> String
show :: Transform -> String
$cshowList :: [Transform] -> ShowS
showList :: [Transform] -> ShowS
Show)

-- | A 3x3 column-major matrix (columns @cx@, @cy@, @cz@).
data Matrix3 = Matrix3 Vec3 Vec3 Vec3
  deriving (Matrix3 -> Matrix3 -> Bool
(Matrix3 -> Matrix3 -> Bool)
-> (Matrix3 -> Matrix3 -> Bool) -> Eq Matrix3
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Matrix3 -> Matrix3 -> Bool
== :: Matrix3 -> Matrix3 -> Bool
$c/= :: Matrix3 -> Matrix3 -> Bool
/= :: Matrix3 -> Matrix3 -> Bool
Eq, Int -> Matrix3 -> ShowS
[Matrix3] -> ShowS
Matrix3 -> String
(Int -> Matrix3 -> ShowS)
-> (Matrix3 -> String) -> ([Matrix3] -> ShowS) -> Show Matrix3
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Matrix3 -> ShowS
showsPrec :: Int -> Matrix3 -> ShowS
$cshow :: Matrix3 -> String
show :: Matrix3 -> String
$cshowList :: [Matrix3] -> ShowS
showList :: [Matrix3] -> ShowS
Show)

-- | Axis-aligned bounding box (@lowerBound@, @upperBound@).
data AABB = AABB Vec3 Vec3
  deriving (AABB -> AABB -> Bool
(AABB -> AABB -> Bool) -> (AABB -> AABB -> Bool) -> Eq AABB
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: AABB -> AABB -> Bool
== :: AABB -> AABB -> Bool
$c/= :: AABB -> AABB -> Bool
/= :: AABB -> AABB -> Bool
Eq, Int -> AABB -> ShowS
[AABB] -> ShowS
AABB -> String
(Int -> AABB -> ShowS)
-> (AABB -> String) -> ([AABB] -> ShowS) -> Show AABB
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> AABB -> ShowS
showsPrec :: Int -> AABB -> ShowS
$cshow :: AABB -> String
show :: AABB -> String
$cshowList :: [AABB] -> ShowS
showList :: [AABB] -> ShowS
Show)

-- | A plane: @normal@ and @offset@ where @separation = dot(normal, point) - offset@.
data Plane = Plane Vec3 Float
  deriving (Plane -> Plane -> Bool
(Plane -> Plane -> Bool) -> (Plane -> Plane -> Bool) -> Eq Plane
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Plane -> Plane -> Bool
== :: Plane -> Plane -> Bool
$c/= :: Plane -> Plane -> Bool
/= :: Plane -> Plane -> Bool
Eq, Int -> Plane -> ShowS
[Plane] -> ShowS
Plane -> String
(Int -> Plane -> ShowS)
-> (Plane -> String) -> ([Plane] -> ShowS) -> Show Plane
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Plane -> ShowS
showsPrec :: Int -> Plane -> ShowS
$cshow :: Plane -> String
show :: Plane -> String
$cshowList :: [Plane] -> ShowS
showList :: [Plane] -> ShowS
Show)

-- | World position. In single-precision builds this is 'Vec3'.
type Pos = Vec3

-- | World transform. In single-precision builds this is 'Transform'.
type WorldTransform = Transform

instance Storable Vec2 where
  sizeOf :: Vec2 -> Int
sizeOf Vec2
_ = (Int
8)
{-# LINE 79 "src/Box3D/MathTypes.hsc" #-}
  alignment _ = 4
{-# LINE 80 "src/Box3D/MathTypes.hsc" #-}
  peek p = Vec2 <$> (\hsc_ptr -> peekByteOff hsc_ptr 0) p <*> (\hsc_ptr -> peekByteOff hsc_ptr 4) p
{-# LINE 81 "src/Box3D/MathTypes.hsc" #-}
  poke p (Vec2 x y) = do
    (\hsc_ptr -> pokeByteOff hsc_ptr 0) p x
{-# LINE 83 "src/Box3D/MathTypes.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 4) p y
{-# LINE 84 "src/Box3D/MathTypes.hsc" #-}

instance Storable Vec3 where
  sizeOf :: Vec3 -> Int
sizeOf Vec3
_ = (Int
12)
{-# LINE 87 "src/Box3D/MathTypes.hsc" #-}
  alignment _ = 4
{-# LINE 88 "src/Box3D/MathTypes.hsc" #-}
  peek p = Vec3 <$> (\hsc_ptr -> peekByteOff hsc_ptr 0) p <*> (\hsc_ptr -> peekByteOff hsc_ptr 4) p <*> (\hsc_ptr -> peekByteOff hsc_ptr 8) p
{-# LINE 89 "src/Box3D/MathTypes.hsc" #-}
  poke p (Vec3 x y z) = do
    (\hsc_ptr -> pokeByteOff hsc_ptr 0) p x
{-# LINE 91 "src/Box3D/MathTypes.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 4) p y
{-# LINE 92 "src/Box3D/MathTypes.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 8) p z
{-# LINE 93 "src/Box3D/MathTypes.hsc" #-}

instance Storable CosSin where
  sizeOf :: CosSin -> Int
sizeOf CosSin
_ = (Int
8)
{-# LINE 96 "src/Box3D/MathTypes.hsc" #-}
  alignment _ = 4
{-# LINE 97 "src/Box3D/MathTypes.hsc" #-}
  peek p = CosSin <$> (\hsc_ptr -> peekByteOff hsc_ptr 0) p <*> (\hsc_ptr -> peekByteOff hsc_ptr 4) p
{-# LINE 98 "src/Box3D/MathTypes.hsc" #-}
  poke p (CosSin c s) = do
    (\hsc_ptr -> pokeByteOff hsc_ptr 0) p c
{-# LINE 100 "src/Box3D/MathTypes.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 4) p s
{-# LINE 101 "src/Box3D/MathTypes.hsc" #-}

instance Storable Quat where
  sizeOf :: Quat -> Int
sizeOf Quat
_ = (Int
16)
{-# LINE 104 "src/Box3D/MathTypes.hsc" #-}
  alignment _ = 4
{-# LINE 105 "src/Box3D/MathTypes.hsc" #-}
  peek p = Quat <$> (\hsc_ptr -> peekByteOff hsc_ptr 0) p <*> (\hsc_ptr -> peekByteOff hsc_ptr 12) p
{-# LINE 106 "src/Box3D/MathTypes.hsc" #-}
  poke p (Quat v s) = do
    (\hsc_ptr -> pokeByteOff hsc_ptr 0) p v
{-# LINE 108 "src/Box3D/MathTypes.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 12) p s
{-# LINE 109 "src/Box3D/MathTypes.hsc" #-}

instance Storable Transform where
  sizeOf :: Transform -> Int
sizeOf Transform
_ = (Int
28)
{-# LINE 112 "src/Box3D/MathTypes.hsc" #-}
  alignment _ = 4
{-# LINE 113 "src/Box3D/MathTypes.hsc" #-}
  peek p = Transform <$> (\hsc_ptr -> peekByteOff hsc_ptr 0) p <*> (\hsc_ptr -> peekByteOff hsc_ptr 12) p
{-# LINE 114 "src/Box3D/MathTypes.hsc" #-}
  poke ptr (Transform p q) = do
    (\hsc_ptr -> pokeByteOff hsc_ptr 0) ptr p
{-# LINE 116 "src/Box3D/MathTypes.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 12) ptr q
{-# LINE 117 "src/Box3D/MathTypes.hsc" #-}

instance Storable Matrix3 where
  sizeOf :: Matrix3 -> Int
sizeOf Matrix3
_ = (Int
36)
{-# LINE 120 "src/Box3D/MathTypes.hsc" #-}
  alignment _ = 4
{-# LINE 121 "src/Box3D/MathTypes.hsc" #-}
  peek p = Matrix3 <$> (\hsc_ptr -> peekByteOff hsc_ptr 0) p <*> (\hsc_ptr -> peekByteOff hsc_ptr 12) p <*> (\hsc_ptr -> peekByteOff hsc_ptr 24) p
{-# LINE 122 "src/Box3D/MathTypes.hsc" #-}
  poke p (Matrix3 cx cy cz) = do
    (\hsc_ptr -> pokeByteOff hsc_ptr 0) p cx
{-# LINE 124 "src/Box3D/MathTypes.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 12) p cy
{-# LINE 125 "src/Box3D/MathTypes.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 24) p cz
{-# LINE 126 "src/Box3D/MathTypes.hsc" #-}

instance Storable AABB where
  sizeOf :: AABB -> Int
sizeOf AABB
_ = (Int
24)
{-# LINE 129 "src/Box3D/MathTypes.hsc" #-}
  alignment _ = 4
{-# LINE 130 "src/Box3D/MathTypes.hsc" #-}
  peek p = AABB <$> (\hsc_ptr -> peekByteOff hsc_ptr 0) p <*> (\hsc_ptr -> peekByteOff hsc_ptr 12) p
{-# LINE 131 "src/Box3D/MathTypes.hsc" #-}
  poke p (AABB lo hi) = do
    (\hsc_ptr -> pokeByteOff hsc_ptr 0) p lo
{-# LINE 133 "src/Box3D/MathTypes.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 12) p hi
{-# LINE 134 "src/Box3D/MathTypes.hsc" #-}

instance Storable Plane where
  sizeOf :: Plane -> Int
sizeOf Plane
_ = (Int
16)
{-# LINE 137 "src/Box3D/MathTypes.hsc" #-}
  alignment _ = 4
{-# LINE 138 "src/Box3D/MathTypes.hsc" #-}
  peek p = Plane <$> (\hsc_ptr -> peekByteOff hsc_ptr 0) p <*> (\hsc_ptr -> peekByteOff hsc_ptr 12) p
{-# LINE 139 "src/Box3D/MathTypes.hsc" #-}
  poke p (Plane n o) = do
    (\hsc_ptr -> pokeByteOff hsc_ptr 0) p n
{-# LINE 141 "src/Box3D/MathTypes.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 12) p o
{-# LINE 142 "src/Box3D/MathTypes.hsc" #-}

vec3Zero :: Vec3
vec3Zero :: Vec3
vec3Zero = Float -> Float -> Float -> Vec3
Vec3 Float
0 Float
0 Float
0

vec3One :: Vec3
vec3One :: Vec3
vec3One = Float -> Float -> Float -> Vec3
Vec3 Float
1 Float
1 Float
1

vec3AxisX :: Vec3
vec3AxisX :: Vec3
vec3AxisX = Float -> Float -> Float -> Vec3
Vec3 Float
1 Float
0 Float
0

vec3AxisY :: Vec3
vec3AxisY :: Vec3
vec3AxisY = Float -> Float -> Float -> Vec3
Vec3 Float
0 Float
1 Float
0

vec3AxisZ :: Vec3
vec3AxisZ :: Vec3
vec3AxisZ = Float -> Float -> Float -> Vec3
Vec3 Float
0 Float
0 Float
1

quatIdentity :: Quat
quatIdentity :: Quat
quatIdentity = Vec3 -> Float -> Quat
Quat Vec3
vec3Zero Float
1

transformIdentity :: Transform
transformIdentity :: Transform
transformIdentity = Vec3 -> Quat -> Transform
Transform Vec3
vec3Zero Quat
quatIdentity

matrix3Zero :: Matrix3
matrix3Zero :: Matrix3
matrix3Zero = Vec3 -> Vec3 -> Vec3 -> Matrix3
Matrix3 Vec3
vec3Zero Vec3
vec3Zero Vec3
vec3Zero

matrix3Identity :: Matrix3
matrix3Identity :: Matrix3
matrix3Identity = Vec3 -> Vec3 -> Vec3 -> Matrix3
Matrix3 Vec3
vec3AxisX Vec3
vec3AxisY Vec3
vec3AxisZ