diff options
-rw-r--r-- | Spear/Math/Matrix4.hs | 72 |
1 files changed, 36 insertions, 36 deletions
diff --git a/Spear/Math/Matrix4.hs b/Spear/Math/Matrix4.hs index a03f1da..85ab39f 100644 --- a/Spear/Math/Matrix4.hs +++ b/Spear/Math/Matrix4.hs | |||
@@ -46,8 +46,8 @@ module Spear.Math.Matrix4 | |||
46 | where | 46 | where |
47 | 47 | ||
48 | 48 | ||
49 | import Spear.Math.Vector3 as Vector3 | 49 | import Spear.Math.Vector3 as V3 |
50 | import Spear.Math.Vector4 as Vector4 | 50 | import Spear.Math.Vector4 as V4 |
51 | 51 | ||
52 | import Foreign.Storable | 52 | import Foreign.Storable |
53 | 53 | ||
@@ -166,10 +166,10 @@ mat4 = Matrix4 | |||
166 | -- | Build a matrix from four vectors in 4D. | 166 | -- | Build a matrix from four vectors in 4D. |
167 | mat4fromVec :: Vector4 -> Vector4 -> Vector4 -> Vector4 -> Matrix4 | 167 | mat4fromVec :: Vector4 -> Vector4 -> Vector4 -> Vector4 -> Matrix4 |
168 | mat4fromVec v0 v1 v2 v3 = Matrix4 | 168 | mat4fromVec v0 v1 v2 v3 = Matrix4 |
169 | (Vector4.x v0) (Vector4.x v1) (Vector4.x v2) (Vector4.x v3) | 169 | (V4.x v0) (V4.x v1) (V4.x v2) (V4.x v3) |
170 | (Vector4.y v0) (Vector4.y v1) (Vector4.y v2) (Vector4.y v3) | 170 | (V4.y v0) (V4.y v1) (V4.y v2) (V4.y v3) |
171 | (Vector4.z v0) (Vector4.z v1) (Vector4.z v2) (Vector4.z v3) | 171 | (V4.z v0) (V4.z v1) (V4.z v2) (V4.z v3) |
172 | (Vector4.w v0) (Vector4.w v1) (Vector4.w v2) (Vector4.w v3) | 172 | (V4.w v0) (V4.w v1) (V4.w v2) (V4.w v3) |
173 | 173 | ||
174 | 174 | ||
175 | -- | Build a transformation 'Matrix4' from the given vectors. | 175 | -- | Build a transformation 'Matrix4' from the given vectors. |
@@ -180,9 +180,9 @@ transform :: Vector3 -- ^ Right vector. | |||
180 | -> Matrix4 | 180 | -> Matrix4 |
181 | 181 | ||
182 | transform right up fwd pos = mat4 | 182 | transform right up fwd pos = mat4 |
183 | (Vector3.x right) (Vector3.x up) (Vector3.x fwd) (Vector3.x pos) | 183 | (V3.x right) (V3.x up) (V3.x fwd) (V3.x pos) |
184 | (Vector3.y right) (Vector3.y up) (Vector3.y fwd) (Vector3.y pos) | 184 | (V3.y right) (V3.y up) (V3.y fwd) (V3.y pos) |
185 | (Vector3.z right) (Vector3.z up) (Vector3.z fwd) (Vector3.z pos) | 185 | (V3.z right) (V3.z up) (V3.z fwd) (V3.z pos) |
186 | 0 0 0 1 | 186 | 0 0 0 1 |
187 | 187 | ||
188 | 188 | ||
@@ -192,8 +192,8 @@ lookAt :: Vector3 -- ^ Eye position. | |||
192 | -> Matrix4 | 192 | -> Matrix4 |
193 | 193 | ||
194 | lookAt pos target = | 194 | lookAt pos target = |
195 | let fwd = Vector3.normalise $ target - pos | 195 | let fwd = V3.normalise $ target - pos |
196 | r = fwd `cross` Vector3.unity | 196 | r = fwd `cross` V3.unity |
197 | u = r `cross` fwd | 197 | u = r `cross` fwd |
198 | in | 198 | in |
199 | transform r u (-fwd) pos | 199 | transform r u (-fwd) pos |
@@ -238,9 +238,9 @@ transl x y z = mat4 | |||
238 | -- | Create a translation matrix. | 238 | -- | Create a translation matrix. |
239 | translv :: Vector3 -> Matrix4 | 239 | translv :: Vector3 -> Matrix4 |
240 | translv v = mat4 | 240 | translv v = mat4 |
241 | 1 0 0 (Vector3.x v) | 241 | 1 0 0 (V3.x v) |
242 | 0 1 0 (Vector3.y v) | 242 | 0 1 0 (V3.y v) |
243 | 0 0 1 (Vector3.z v) | 243 | 0 0 1 (V3.z v) |
244 | 0 0 0 1 | 244 | 0 0 0 1 |
245 | 245 | ||
246 | 246 | ||
@@ -292,9 +292,9 @@ axisAngle v angle = mat4 | |||
292 | (omc*xz-sy) (omc*yz+sx) (c+omc*z^2) 0 | 292 | (omc*xz-sy) (omc*yz+sx) (c+omc*z^2) 0 |
293 | 0 0 0 1 | 293 | 0 0 0 1 |
294 | where | 294 | where |
295 | x = Vector3.x v | 295 | x = V3.x v |
296 | y = Vector3.y v | 296 | y = V3.y v |
297 | z = Vector3.z v | 297 | z = V3.z v |
298 | s = sin . toRAD $ angle | 298 | s = sin . toRAD $ angle |
299 | c = cos . toRAD $ angle | 299 | c = cos . toRAD $ angle |
300 | xy = x*y | 300 | xy = x*y |
@@ -323,9 +323,9 @@ scalev v = mat4 | |||
323 | 0 0 sz 0 | 323 | 0 0 sz 0 |
324 | 0 0 0 1 | 324 | 0 0 0 1 |
325 | where | 325 | where |
326 | sx = Vector3.x v | 326 | sx = V3.x v |
327 | sy = Vector3.y v | 327 | sy = V3.y v |
328 | sz = Vector3.z v | 328 | sz = V3.z v |
329 | 329 | ||
330 | 330 | ||
331 | -- | Create an X reflection matrix. | 331 | -- | Create an X reflection matrix. |
@@ -402,28 +402,28 @@ transpose m = mat4 | |||
402 | 402 | ||
403 | -- | Invert the given transformation matrix. | 403 | -- | Invert the given transformation matrix. |
404 | inverseTransform :: Matrix4 -> Matrix4 | 404 | inverseTransform :: Matrix4 -> Matrix4 |
405 | inverseTransform mat = mat4fromVec u v w p where | 405 | inverseTransform mat = |
406 | v0 = row0 mat | 406 | let |
407 | v1 = row1 mat | 407 | r = right mat |
408 | v2 = row2 mat | 408 | u = up mat |
409 | u = vec4 (Vector4.x v0) (Vector4.y v0) (Vector4.z v0) 0 | 409 | f = forward mat |
410 | v = vec4 (Vector4.x v1) (Vector4.y v1) (Vector4.z v1) 0 | 410 | t = position mat |
411 | w = vec4 (Vector4.x v2) (Vector4.y v2) (Vector4.z v2) 0 | 411 | in |
412 | p = vec4 tdotu tdotv tdotw 1 | 412 | mat4 |
413 | t = -(col3 mat) | 413 | (V3.x r) (V3.y r) (V3.z r) (-t `V3.dot` r) |
414 | tdotu = t `Vector4.dot` col0 mat | 414 | (V3.x u) (V3.y u) (V3.z u) (-t `V3.dot` u) |
415 | tdotv = t `Vector4.dot` col1 mat | 415 | (V3.x f) (V3.y f) (V3.z f) (-t `V3.dot` f) |
416 | tdotw = t `Vector4.dot` col2 mat | 416 | 0 0 0 1 |
417 | 417 | ||
418 | 418 | ||
419 | -- | Transform the given vector in 3D space with the given matrix. | 419 | -- | Transform the given vector in 3D space with the given matrix. |
420 | mul :: Float -> Matrix4 -> Vector3 -> Vector3 | 420 | mul :: Float -> Matrix4 -> Vector3 -> Vector3 |
421 | mul w m v = vec3 x' y' z' | 421 | mul w m v = vec3 x' y' z' |
422 | where | 422 | where |
423 | v' = vec4 (Vector3.x v) (Vector3.y v) (Vector3.z v) w | 423 | v' = vec4 (V3.x v) (V3.y v) (V3.z v) w |
424 | x' = row0 m `Vector4.dot` v' | 424 | x' = row0 m `V4.dot` v' |
425 | y' = row1 m `Vector4.dot` v' | 425 | y' = row1 m `V4.dot` v' |
426 | z' = row2 m `Vector4.dot` v' | 426 | z' = row2 m `V4.dot` v' |
427 | 427 | ||
428 | 428 | ||
429 | -- | Transform the given point vector in 3D space with the given matrix. | 429 | -- | Transform the given point vector in 3D space with the given matrix. |