{-# 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