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.hs59
1 files changed, 31 insertions, 28 deletions
diff --git a/Spear/Math/MatrixUtils.hs b/Spear/Math/MatrixUtils.hs
index 68ad6cd..2c1d083 100644
--- a/Spear/Math/MatrixUtils.hs
+++ b/Spear/Math/MatrixUtils.hs
@@ -1,6 +1,7 @@
1module Spear.Math.MatrixUtils 1module Spear.Math.MatrixUtils
2( 2(
3 fastNormalMatrix 3 Rotation(..)
4, fastNormalMatrix
4, rpgTransform 5, rpgTransform
5, pltTransform 6, pltTransform
6, rpgInverse 7, rpgInverse
@@ -15,6 +16,9 @@ import Spear.Math.Vector2 as V2
15import Spear.Math.Vector3 as V3 16import Spear.Math.Vector3 as V3
16 17
17 18
19data Rotation = Yaw | Pitch | Roll deriving Eq
20
21
18-- | Compute the normal matrix of the given matrix. 22-- | Compute the normal matrix of the given matrix.
19fastNormalMatrix :: Matrix4 -> Matrix3 23fastNormalMatrix :: Matrix4 -> Matrix3
20fastNormalMatrix m = 24fastNormalMatrix m =
@@ -26,13 +30,26 @@ fastNormalMatrix m =
26 30
27 31
28-- | Maps the given 2D transformation matrix to a 3D transformation matrix. 32-- | Maps the given 2D transformation matrix to a 3D transformation matrix.
29rpgTransform :: Float -- ^ The height above the ground. 33rpgTransform
30 -> Matrix3 -> Matrix4 34 :: Float -- ^ The height above the ground.
31rpgTransform h mat = 35 -> Float -- ^ Angle of rotation.
32 let r = let r' = M3.right mat in vec3 (V2.x r') (V2.y r') 0 36 -> Rotation -- ^ How the 2D rotation should be interpreted in 3D.
37 -> Matrix3
38 -> Matrix4
39rpgTransform h a rtype mat =
40 {-let r = let r' = M3.right mat in vec3 (V2.x r') (V2.y r') 0
33 u = V3.unity 41 u = V3.unity
34 f = let f' = M3.forward mat in vec3 (V2.x f') 0 (V2.y f') 42 f = let f' = M3.forward mat in vec3 (V2.x f') 0 (V2.y f')
35 t = (vec3 0 h 0) + let t' = M3.position mat in vec3 (V2.x t') 0 (V2.y t') 43 t = (vec3 0 h 0) + let t' = M3.position mat in vec3 (V2.x t') 0 (V2.y t')-}
44 let rot = case rtype of
45 Yaw -> rotY
46 Pitch -> rotX
47 Roll -> rotZ
48 mat' = rot a
49 r = M4.right mat'
50 u = M4.up mat'
51 f = M4.forward mat'
52 t = vec3 0 h 0 + let t' = M3.position mat in vec3 (V2.x t') 0 (V2.y t')
36 in mat4 53 in mat4
37 (V3.x r) (V3.x u) (V3.x f) (V3.x t) 54 (V3.x r) (V3.x u) (V3.x f) (V3.x t)
38 (V3.y r) (V3.y u) (V3.y f) (V3.y t) 55 (V3.y r) (V3.y u) (V3.y f) (V3.y t)
@@ -61,18 +78,13 @@ pltTransform mat =
61-- The XY plane in 2D translates to the X(-Z) plane in 3D. 78-- The XY plane in 2D translates to the X(-Z) plane in 3D.
62-- 79--
63-- Use this in games such as RPGs and RTSs. 80-- Use this in games such as RPGs and RTSs.
64rpgInverse :: Float -- ^ Height above the ground. 81rpgInverse
65 -> Matrix3 -> Matrix4 82 :: Float -- ^ The height above the ground.
66rpgInverse h mat = 83 -> Float -- ^ Angle of rotation.
67 let r = let r' = M3.right mat in vec3 (V2.x r') (V2.y r') 0 84 -> Rotation -- ^ How the 2D rotation should be interpreted in 3D.
68 u = V3.unity 85 -> Matrix3
69 f = let f' = M3.forward mat in vec3 (V2.x f') 0 (-V2.y f') 86 -> Matrix4
70 t = (vec3 0 h 0) + let t' = M3.position mat in -(vec3 (V2.x t') 0 (-V2.y t')) 87rpgInverse h a rot = M4.inverseTransform . rpgTransform h a rot
71 in mat4
72 (V3.x r) (V3.y r) (V3.z r) (t `V3.dot` r)
73 (V3.x u) (V3.y u) (V3.z u) (t `V3.dot` u)
74 (V3.x f) (V3.y f) (V3.z f) (t `V3.dot` f)
75 0 0 0 1
76 88
77 89
78-- | Compute the inverse transform of the given transformation matrix. 90-- | Compute the inverse transform of the given transformation matrix.
@@ -83,13 +95,4 @@ rpgInverse h mat =
83-- 95--
84-- Use this in games like platformers and space invaders style games. 96-- Use this in games like platformers and space invaders style games.
85pltInverse :: Matrix3 -> Matrix4 97pltInverse :: Matrix3 -> Matrix4
86pltInverse mat = 98pltInverse = M4.inverseTransform . pltTransform
87 let r = let r' = M3.right mat in vec3 (V2.x r') (V2.y r') 0
88 u = let u' = M3.up mat in vec3 (V2.x u') (V2.y u') 0
89 f = V3.unitz
90 t = let t' = M3.position mat in vec3 (V2.x t') (V2.y t') 0
91 in mat4
92 (V3.x r) (V3.y r) (V3.z r) (t `V3.dot` r)
93 (V3.x u) (V3.y u) (V3.z u) (t `V3.dot` u)
94 (V3.x f) (V3.y f) (V3.z f) (t `V3.dot` f)
95 0 0 0 1