aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Spear/Math/Matrix4.hs44
1 files changed, 40 insertions, 4 deletions
diff --git a/Spear/Math/Matrix4.hs b/Spear/Math/Matrix4.hs
index ac2761f..a4ad651 100644
--- a/Spear/Math/Matrix4.hs
+++ b/Spear/Math/Matrix4.hs
@@ -35,7 +35,8 @@ module Spear.Math.Matrix4
35, reflectZ 35, reflectZ
36 -- ** Projection 36 -- ** Projection
37, ortho 37, ortho
38, perspective 38, perspective
39, planeProj
39 -- * Operations 40 -- * Operations
40, Spear.Math.Matrix4.zipWith 41, Spear.Math.Matrix4.zipWith
41, Spear.Math.Matrix4.map 42, Spear.Math.Matrix4.map
@@ -44,7 +45,8 @@ module Spear.Math.Matrix4
44, inverse 45, inverse
45, mul 46, mul
46, mulp 47, mulp
47, muld 48, muld
49, mul'
48) 50)
49where 51where
50 52
@@ -420,8 +422,28 @@ perspective fovy r near far =
420 0 f 0 0 422 0 f 0 0
421 0 0 ((near+far)/a) (2*near*far/a) 423 0 0 ((near+far)/a) (2*near*far/a)
422 0 0 (-1) 0 424 0 0 (-1) 0
425
426
427-- | Create a plane projection matrix.
428planeProj :: Vector3 -- ^ Plane normal
429 -> Float -- ^ Plane distance from the origin
430 -> Vector3 -- ^ Projection direction
431 -> Matrix4
432planeProj n d l =
433 let c = n `V3.dot` l
434 nx = V3.x n
435 ny = V3.y n
436 nz = V3.z n
437 lx = V3.x l
438 ly = V3.y l
439 lz = V3.z l
440 in mat4
441 (d + c - nx*lx) (-ny*lx) (-nz*lx) (-lx*d)
442 (-nx*ly) (d + c - ny*ly) (-nz*ly) (-ly*d)
443 (-nx*lz) (-ny*lz) (d + c - nz*lz) (-lz*d)
444 (-nx) (-ny) (-nz) c
445
423 446
424
425-- | Transpose the specified matrix. 447-- | Transpose the specified matrix.
426transpose :: Matrix4 -> Matrix4 448transpose :: Matrix4 -> Matrix4
427transpose m = mat4 449transpose m = mat4
@@ -609,7 +631,21 @@ mulp = mul 1
609 631
610-- | Transform the given directional vector in 3D space with the given matrix. 632-- | Transform the given directional vector in 3D space with the given matrix.
611muld :: Matrix4 -> Vector3 -> Vector3 633muld :: Matrix4 -> Vector3 -> Vector3
612muld = mul 0 634muld = mul 0
635
636
637-- | Transform the given vector with the given matrix.
638--
639-- The vector is brought from homogeneous space to 3D space by performing a
640-- perspective divide.
641mul' :: Float -> Matrix4 -> Vector3 -> Vector3
642mul' w m v = vec3 (x'/w') (y'/w') (z'/w')
643 where
644 v' = vec4 (V3.x v) (V3.y v) (V3.z v) w
645 x' = row0 m `V4.dot` v'
646 y' = row1 m `V4.dot` v'
647 z' = row2 m `V4.dot` v'
648 w' = row3 m `V4.dot` v'
613 649
614 650
615toRAD = (*pi) . (/180) 651toRAD = (*pi) . (/180)