aboutsummaryrefslogtreecommitdiff
path: root/Spear/Math/MatrixUtils.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Spear/Math/MatrixUtils.hs')
-rw-r--r--Spear/Math/MatrixUtils.hs50
1 files changed, 23 insertions, 27 deletions
diff --git a/Spear/Math/MatrixUtils.hs b/Spear/Math/MatrixUtils.hs
index 44af2c0..87d84e5 100644
--- a/Spear/Math/MatrixUtils.hs
+++ b/Spear/Math/MatrixUtils.hs
@@ -5,7 +5,7 @@ module Spear.Math.MatrixUtils
5, pltTransform 5, pltTransform
6, rpgInverse 6, rpgInverse
7, pltInverse 7, pltInverse
8, toClip 8, objToClip
9) 9)
10where 10where
11 11
@@ -27,31 +27,28 @@ fastNormalMatrix m =
27 (M4.m02 m') (M4.m12 m') (M4.m22 m') 27 (M4.m02 m') (M4.m12 m') (M4.m22 m')
28 28
29 29
30-- | Maps the given 2D transformation matrix to a 3D transformation matrix. 30-- | Map an object's transform in view space to world space.
31rpgTransform 31rpgTransform
32 :: Float -- ^ The height above the ground 32 :: Float -- ^ The height above the ground
33 -> Float -- ^ Angle of rotation 33 -> Float -- ^ Angle of rotation
34 -> Vector3 -- ^ Axis of rotation 34 -> Vector3 -- ^ Axis of rotation
35 -> Vector2 -- ^ Object's position. 35 -> Vector2 -- ^ Object's position.
36 -> Matrix4 -- ^ Inverse view matrix.
36 -> Matrix4 37 -> Matrix4
37rpgTransform h a axis pos = 38rpgTransform h a axis pos viewInverse =
38 {-let r = let r' = M3.right mat in vec3 (V2.x r') (V2.y r') 0
39 u = V3.unity
40 f = let f' = M3.forward mat in vec3 (V2.x f') 0 (V2.y f')
41 t = (vec3 0 h 0) + let t' = M3.position mat in vec3 (V2.x t') 0 (V2.y t')-}
42 let mat' = axisAngle axis a 39 let mat' = axisAngle axis a
43 r = M4.right mat' 40 r = M4.right mat'
44 u = M4.up mat' 41 u = M4.up mat'
45 f = M4.forward mat' 42 f = M4.forward mat'
46 t = vec3 0 h 0 + vec3 (V2.x pos) 0 (-V2.y pos) 43 t = vec3 0 h 0 + vec3 (V2.x pos) 0 (-V2.y pos)
47 in mat4 44 in mat4
48 (V3.x r) (V3.x u) (V3.x f) (V3.x t) 45 (V3.x r) (V3.x u) (V3.x f) (V3.x t)
49 (V3.y r) (V3.y u) (V3.y f) (V3.y t) 46 (V3.y r) (V3.y u) (V3.y f) (V3.y t)
50 (V3.z r) (V3.z u) (V3.z f) (V3.z t) 47 (V3.z r) (V3.z u) (V3.z f) (V3.z t)
51 0 0 0 1 48 0 0 0 1
52 49
53 50
54-- | Maps the given 2D transformation matrix to a 3D transformation matrix. 51-- | Map an object's transform in view space to world space.
55pltTransform :: Matrix3 -> Matrix4 52pltTransform :: Matrix3 -> Matrix4
56pltTransform mat = 53pltTransform mat =
57 let r = let r' = M3.right mat in vec3 (V2.x r') (V2.y r') 0 54 let r = let r' = M3.right mat in vec3 (V2.x r') (V2.y r') 0
@@ -65,23 +62,22 @@ pltTransform mat =
65 0 0 0 1 62 0 0 0 1
66 63
67 64
68-- | Compute the inverse transform of the given transformation matrix. 65-- | Map an object's transform in world space to view space.
69--
70-- This function maps an object's transform in 2D to the object's inverse in 3D.
71-- 66--
72-- The XY plane in 2D translates to the X(-Z) plane in 3D. 67-- The XY plane in 2D translates to the X(-Z) plane in 3D.
73-- 68--
74-- Use this in games such as RPGs and RTSs. 69-- Use this in games such as RPGs and RTSs.
75rpgInverse 70rpgInverse
76 :: Float -- ^ The height above the ground 71 :: Float -- ^ The height above the ground
77 -> Float -- ^ Angle of rotation 72 -> Float -- ^ Angle of rotation
78 -> Vector3 -- ^ Axis of rotation 73 -> Vector3 -- ^ Axis of rotation
79 -> Vector2 74 -> Vector2 -- ^ Object's position.
75 -> Matrix4 -- ^ Inverse view matrix.
80 -> Matrix4 76 -> Matrix4
81rpgInverse h a rot pos = M4.inverseTransform $ rpgTransform h a rot pos 77rpgInverse h a rot pos viewInv = M4.inverseTransform $ rpgTransform h a rot pos viewInv
82 78
83 79
84-- | Compute the inverse transform of the given transformation matrix. 80-- | Map an object's transform in world space to view space.
85-- 81--
86-- This function maps an object's transform in 2D to the object's inverse in 3D. 82-- This function maps an object's transform in 2D to the object's inverse in 3D.
87-- 83--
@@ -93,8 +89,8 @@ pltInverse = M4.inverseTransform . pltTransform
93 89
94 90
95-- | Transform an object from object to clip space coordinates. 91-- | Transform an object from object to clip space coordinates.
96toClip :: Camera -> Matrix4 -> Vector3 -> Vector2 92objToClip :: Camera -> Matrix4 -> Vector3 -> Vector2
97toClip cam model p = 93objToClip cam model p =
98 let 94 let
99 view = M4.inverseTransform $ Cam.transform cam 95 view = M4.inverseTransform $ Cam.transform cam
100 proj = Cam.projection cam 96 proj = Cam.projection cam