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.hs49
1 files changed, 24 insertions, 25 deletions
diff --git a/Spear/Math/MatrixUtils.hs b/Spear/Math/MatrixUtils.hs
index 629b73c..79bd049 100644
--- a/Spear/Math/MatrixUtils.hs
+++ b/Spear/Math/MatrixUtils.hs
@@ -15,8 +15,7 @@ where
15import Spear.Math.Camera as Cam 15import Spear.Math.Camera as Cam
16import Spear.Math.Matrix3 as M3 16import Spear.Math.Matrix3 as M3
17import Spear.Math.Matrix4 as M4 17import Spear.Math.Matrix4 as M4
18import Spear.Math.Vector2 as V2 18import Spear.Math.Vector as V
19import Spear.Math.Vector3 as V3
20 19
21 20
22-- | Compute the normal matrix of the given matrix. 21-- | Compute the normal matrix of the given matrix.
@@ -39,14 +38,14 @@ unproject :: Matrix4 -- ^ Inverse projection matrix
39 -> Float -- ^ Window x 38 -> Float -- ^ Window x
40 -> Float -- ^ Window y 39 -> Float -- ^ Window y
41 -> Float -- ^ Window z 40 -> Float -- ^ Window z
42 -> V3.Vector3 41 -> Vector3
43unproject projI modelviewI vpx vpy w h x y z = 42unproject projI modelviewI vpx vpy w h x y z =
44 let 43 let
45 xmouse = 2*(x-vpx)/w - 1 44 xmouse = 2*(x-vpx)/w - 1
46 ymouse = 2*(y-vpy)/h - 1 45 ymouse = 2*(y-vpy)/h - 1
47 zmouse = 2*z - 1 46 zmouse = 2*z - 1
48 in 47 in
49 (modelviewI * projI) `M4.mulp` V3.vec3 xmouse ymouse zmouse 48 (modelviewI * projI) `M4.mulp` vec3 xmouse ymouse zmouse
50 49
51 50
52-- | Transform the given point in window coordinates to 2d coordinates. 51-- | Transform the given point in window coordinates to 2d coordinates.
@@ -63,14 +62,14 @@ rpgUnproject
63 -> Float -- ^ Window x 62 -> Float -- ^ Window x
64 -> Float -- ^ Window y 63 -> Float -- ^ Window y
65 -> Vector2 64 -> Vector2
66rpgUnproject projI viewI vpx vpy w h x y = 65rpgUnproject projI viewI vpx vpy w h wx wy =
67 let 66 let
68 p1 = unproject projI viewI vpx vpy w h x y 0 67 p1 = unproject projI viewI vpx vpy w h wx wy 0
69 p2 = unproject projI viewI vpx vpy w h x y (-1) 68 p2 = unproject projI viewI vpx vpy w h wx wy (-1)
70 lambda = (V3.y p1 / (V3.y p1 - V3.y p2)) 69 lambda = (y p1 / (y p1 - y p2))
71 p' = p1 + V3.scale lambda (p2 - p1) 70 p' = p1 + V.scale lambda (p2 - p1)
72 in 71 in
73 vec2 (V3.x p') (-V3.z p') 72 vec2 (x p') (-(z p'))
74 73
75 74
76-- | Map an object's transform in view space to world space. 75-- | Map an object's transform in view space to world space.
@@ -82,33 +81,33 @@ rpgTransform
82 -> Matrix4 -- ^ Inverse view matrix 81 -> Matrix4 -- ^ Inverse view matrix
83 -> Matrix4 82 -> Matrix4
84rpgTransform h a axis pos viewI = 83rpgTransform h a axis pos viewI =
85 let p1 = viewI `M4.mulp` (vec3 (V2.x pos) (V2.y pos) 0) 84 let p1 = viewI `M4.mulp` (vec3 (x pos) (y pos) 0)
86 p2 = viewI `M4.mulp` (vec3 (V2.x pos) (V2.y pos) (-1)) 85 p2 = viewI `M4.mulp` (vec3 (x pos) (y pos) (-1))
87 lambda = (V3.y p1 / (V3.y p1 - V3.y p2)) 86 lambda = (y p1 / (y p1 - y p2))
88 p = p1 + V3.scale lambda (p2 - p1) 87 p = p1 + V.scale lambda (p2 - p1)
89 mat' = axisAngle axis a 88 mat' = axisAngle axis a
90 r = M4.right mat' 89 r = M4.right mat'
91 u = M4.up mat' 90 u = M4.up mat'
92 f = M4.forward mat' 91 f = M4.forward mat'
93 t = p + vec3 0 h 0 92 t = p + vec3 0 h 0
94 in mat4 93 in mat4
95 (V3.x r) (V3.x u) (V3.x f) (V3.x t) 94 (x r) (x u) (x f) (x t)
96 (V3.y r) (V3.y u) (V3.y f) (V3.y t) 95 (y r) (y u) (y f) (y t)
97 (V3.z r) (V3.z u) (V3.z f) (V3.z t) 96 (z r) (z u) (z f) (z t)
98 0 0 0 1 97 0 0 0 1
99 98
100 99
101-- | Map an object's transform in view space to world space. 100-- | Map an object's transform in view space to world space.
102pltTransform :: Matrix3 -> Matrix4 101pltTransform :: Matrix3 -> Matrix4
103pltTransform mat = 102pltTransform mat =
104 let r = let r' = M3.right mat in vec3 (V2.x r') (V2.y r') 0 103 let r = let r' = M3.right mat in vec3 (x r') (y r') 0
105 u = let u' = M3.up mat in vec3 (V2.x u') (V2.y u') 0 104 u = let u' = M3.up mat in vec3 (x u') (y u') 0
106 f = V3.unitz 105 f = unitz3
107 t = let t' = M3.position mat in vec3 (V2.x t') (V2.y t') 0 106 t = let t' = M3.position mat in vec3 (x t') (y t') 0
108 in mat4 107 in mat4
109 (V3.x r) (V3.x u) (V3.x f) (V3.x t) 108 (x r) (x u) (x f) (x t)
110 (V3.y r) (V3.y u) (V3.y f) (V3.y t) 109 (y r) (y u) (y f) (y t)
111 (V3.z r) (V3.z u) (V3.z f) (V3.z t) 110 (z r) (z u) (z f) (z t)
112 0 0 0 1 111 0 0 0 1
113 112
114 113
@@ -147,4 +146,4 @@ objToClip cam model p =
147 proj = Cam.projection cam 146 proj = Cam.projection cam
148 p' = (proj * view * model) `M4.mulp` p 147 p' = (proj * view * model) `M4.mulp` p
149 in 148 in
150 vec2 (V3.x p') (V3.y p') 149 vec2 (x p') (y p')