diff options
| -rw-r--r-- | Spear/Math/MatrixUtils.hs | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/Spear/Math/MatrixUtils.hs b/Spear/Math/MatrixUtils.hs index e6e498f..434e36a 100644 --- a/Spear/Math/MatrixUtils.hs +++ b/Spear/Math/MatrixUtils.hs | |||
| @@ -1,6 +1,10 @@ | |||
| 1 | module Spear.Math.MatrixUtils | 1 | module Spear.Math.MatrixUtils |
| 2 | ( | 2 | ( |
| 3 | fastNormalMatrix | 3 | fastNormalMatrix |
| 4 | , rpgTransform | ||
| 5 | , pltTransform | ||
| 6 | , rpgInverse | ||
| 7 | , pltInverse | ||
| 4 | ) | 8 | ) |
| 5 | where | 9 | where |
| 6 | 10 | ||
| @@ -21,6 +25,35 @@ fastNormalMatrix m = | |||
| 21 | (M4.m02 m') (M4.m12 m') (M4.m22 m') | 25 | (M4.m02 m') (M4.m12 m') (M4.m22 m') |
| 22 | 26 | ||
| 23 | 27 | ||
| 28 | -- | Maps the given 2D transformation matrix to a 3D transformation matrix. | ||
| 29 | rpgTransform :: Float -- ^ The height above the ground. | ||
| 30 | -> Matrix3 -> Matrix4 | ||
| 31 | rpgTransform h mat = | ||
| 32 | let r = let r' = M3.right mat in vec3 (V2.x r') (V2.y r') 0 | ||
| 33 | u = V3.unity | ||
| 34 | 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')) | ||
| 36 | in mat4 | ||
| 37 | (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) | ||
| 39 | (V3.z r) (V3.z u) (V3.z f) (V3.z t) | ||
| 40 | 0 0 0 1 | ||
| 41 | |||
| 42 | |||
| 43 | -- | Maps the given 2D transformation matrix to a 3D transformation matrix. | ||
| 44 | pltTransform :: Matrix3 -> Matrix4 | ||
| 45 | pltTransform mat = | ||
| 46 | let r = let r' = M3.right mat in vec3 (V2.x r') (V2.y r') 0 | ||
| 47 | u = let u' = M3.up mat in vec3 (V2.x u') (V2.y u') 0 | ||
| 48 | f = V3.unitz | ||
| 49 | t = let t' = M3.position mat in vec3 (V2.x t') (V2.y t') 0 | ||
| 50 | in mat4 | ||
| 51 | (V3.x r) (V3.x u) (V3.x f) (V3.x t) | ||
| 52 | (V3.y r) (V3.y u) (V3.y f) (V3.y t) | ||
| 53 | (V3.z r) (V3.z u) (V3.z f) (V3.z t) | ||
| 54 | 0 0 0 1 | ||
| 55 | |||
| 56 | |||
| 24 | -- | Compute the inverse transform of the given transformation matrix. | 57 | -- | Compute the inverse transform of the given transformation matrix. |
| 25 | -- | 58 | -- |
| 26 | -- This function maps an object's transform in 2D to the object's inverse in 3D. | 59 | -- This function maps an object's transform in 2D to the object's inverse in 3D. |
| @@ -34,12 +67,12 @@ rpgInverse h mat = | |||
| 34 | let r = let r' = M3.right mat in vec3 (V2.x r') (V2.y r') 0 | 67 | let r = let r' = M3.right mat in vec3 (V2.x r') (V2.y r') 0 |
| 35 | u = V3.unity | 68 | u = V3.unity |
| 36 | f = let f' = M3.forward mat in vec3 (V2.x f') 0 (-V2.y f') | 69 | f = let f' = M3.forward mat in vec3 (V2.x f') 0 (-V2.y f') |
| 37 | t = let t' = M3.position mat in -(vec3 (V2.x t') 0 (-V2.y t')) | 70 | t = (vec3 0 h 0) + let t' = M3.position mat in -(vec3 (V2.x t') 0 (-V2.y t')) |
| 38 | in mat4 | 71 | in mat4 |
| 39 | (V3.x r) (V3.y r) (V3.z r) (t `V3.dot` r) | 72 | (V3.x r) (V3.y r) (V3.z r) (t `V3.dot` r) |
| 40 | (V3.x u) (V3.y u) (V3.z u) (t `V3.dot` u) | 73 | (V3.x u) (V3.y u) (V3.z u) (t `V3.dot` u) |
| 41 | (V3.x f) (V3.y f) (V3.z f) (t `V3.dot` f) | 74 | (V3.x f) (V3.y f) (V3.z f) (t `V3.dot` f) |
| 42 | 0 0 0 1 | 75 | 0 0 0 1 |
| 43 | 76 | ||
| 44 | 77 | ||
| 45 | -- | Compute the inverse transform of the given transformation matrix. | 78 | -- | Compute the inverse transform of the given transformation matrix. |
| @@ -59,4 +92,4 @@ pltInverse mat = | |||
| 59 | (V3.x r) (V3.y r) (V3.z r) (t `V3.dot` r) | 92 | (V3.x r) (V3.y r) (V3.z r) (t `V3.dot` r) |
| 60 | (V3.x u) (V3.y u) (V3.z u) (t `V3.dot` u) | 93 | (V3.x u) (V3.y u) (V3.z u) (t `V3.dot` u) |
| 61 | (V3.x f) (V3.y f) (V3.z f) (t `V3.dot` f) | 94 | (V3.x f) (V3.y f) (V3.z f) (t `V3.dot` f) |
| 62 | 0 0 0 1 | 95 | 0 0 0 1 |
