packages feed

geomancy-0.4.0.0: test/Support/Linear.hs

{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE ImportQualifiedPost #-}

module Support.Linear
  ( toM44
  , toM44D
  , toV3
  , toV3D
  , toV4
  , toV4D
  , toQ
  , toQD
  , entries
  ) where

import Geomancy

import Data.Foldable (toList)
import Linear qualified

import Geomancy.DMat4 qualified
import Geomancy.Mat4 (withRowMajor)

toM44 :: Geomancy.Mat4 -> Linear.M44 Float
toM44 mat4 =
  withRowMajor mat4
    \ m00 m10 m20 m30
      m01 m11 m21 m31
      m02 m12 m22 m32
      m03 m13 m23 m33 ->
        Linear.V4
          (Linear.V4 m00 m10 m20 m30)
          (Linear.V4 m01 m11 m21 m31)
          (Linear.V4 m02 m12 m22 m32)
          (Linear.V4 m03 m13 m23 m33)

toM44D :: Geomancy.DMat4.DMat4 -> Linear.M44 Double
toM44D dmat4 =
  Geomancy.DMat4.withRowMajor dmat4
    \ m00 m10 m20 m30
      m01 m11 m21 m31
      m02 m12 m22 m32
      m03 m13 m23 m33 ->
        Linear.V4
          (Linear.V4 m00 m10 m20 m30)
          (Linear.V4 m01 m11 m21 m31)
          (Linear.V4 m02 m12 m22 m32)
          (Linear.V4 m03 m13 m23 m33)

toV3 :: Vec3 -> Linear.V3 Float
toV3 v = withVec3 v Linear.V3

toV3D :: DVec3 -> Linear.V3 Double
toV3D v = withDVec3 v Linear.V3

toV4 :: Vec4 -> Linear.V4 Float
toV4 v = withVec4 v Linear.V4

toV4D :: DVec4 -> Linear.V4 Double
toV4D v = withDVec4 v Linear.V4

toQ :: Geomancy.Quaternion -> Linear.Quaternion Float
toQ q = withQuaternion q \s x y z -> Linear.Quaternion s (Linear.V3 x y z)

toQD :: DQuaternion -> Linear.Quaternion Double
toQD q = withDQuaternion q \s x y z -> Linear.Quaternion s (Linear.V3 x y z)

entries :: (Foldable f, Foldable g) => f (g a) -> [a]
entries = concatMap toList