diff options
| -rw-r--r-- | Spear/Math/Matrix4.hs | 56 |
1 files changed, 28 insertions, 28 deletions
diff --git a/Spear/Math/Matrix4.hs b/Spear/Math/Matrix4.hs index 1424b28..e1b1d04 100644 --- a/Spear/Math/Matrix4.hs +++ b/Spear/Math/Matrix4.hs | |||
| @@ -66,7 +66,7 @@ data Matrix4 = Matrix4 | |||
| 66 | 66 | ||
| 67 | 67 | ||
| 68 | instance Show Matrix4 where | 68 | instance Show Matrix4 where |
| 69 | 69 | ||
| 70 | show (Matrix4 m00 m10 m20 m30 m01 m11 m21 m31 m02 m12 m22 m32 m03 m13 m23 m33) = | 70 | show (Matrix4 m00 m10 m20 m30 m01 m11 m21 m31 m02 m12 m22 m32 m03 m13 m23 m33) = |
| 71 | show' m00 ++ ", " ++ show' m10 ++ ", " ++ show' m20 ++ ", " ++ show' m30 ++ "\n" ++ | 71 | show' m00 ++ ", " ++ show' m10 ++ ", " ++ show' m20 ++ ", " ++ show' m30 ++ "\n" ++ |
| 72 | show' m01 ++ ", " ++ show' m11 ++ ", " ++ show' m21 ++ ", " ++ show' m31 ++ "\n" ++ | 72 | show' m01 ++ ", " ++ show' m11 ++ ", " ++ show' m21 ++ ", " ++ show' m31 ++ "\n" ++ |
| @@ -83,58 +83,58 @@ instance Num Matrix4 where | |||
| 83 | (a04 + b04) (a05 + b05) (a06 + b06) (a07 + b07) | 83 | (a04 + b04) (a05 + b05) (a06 + b06) (a07 + b07) |
| 84 | (a08 + b08) (a09 + b09) (a10 + b10) (a11 + b11) | 84 | (a08 + b08) (a09 + b09) (a10 + b10) (a11 + b11) |
| 85 | (a12 + b12) (a13 + b13) (a14 + b14) (a15 + b15) | 85 | (a12 + b12) (a13 + b13) (a14 + b14) (a15 + b15) |
| 86 | 86 | ||
| 87 | (Matrix4 a00 a01 a02 a03 a04 a05 a06 a07 a08 a09 a10 a11 a12 a13 a14 a15) | 87 | (Matrix4 a00 a01 a02 a03 a04 a05 a06 a07 a08 a09 a10 a11 a12 a13 a14 a15) |
| 88 | - (Matrix4 b00 b01 b02 b03 b04 b05 b06 b07 b08 b09 b10 b11 b12 b13 b14 b15) | 88 | - (Matrix4 b00 b01 b02 b03 b04 b05 b06 b07 b08 b09 b10 b11 b12 b13 b14 b15) |
| 89 | = Matrix4 (a00 - b00) (a01 - b01) (a02 - b02) (a03 - b03) | 89 | = Matrix4 (a00 - b00) (a01 - b01) (a02 - b02) (a03 - b03) |
| 90 | (a04 - b04) (a05 - b05) (a06 - b06) (a07 - b07) | 90 | (a04 - b04) (a05 - b05) (a06 - b06) (a07 - b07) |
| 91 | (a08 - b08) (a09 - b09) (a10 - b10) (a11 - b11) | 91 | (a08 - b08) (a09 - b09) (a10 - b10) (a11 - b11) |
| 92 | (a12 - b12) (a13 - b13) (a14 - b14) (a15 - b15) | 92 | (a12 - b12) (a13 - b13) (a14 - b14) (a15 - b15) |
| 93 | 93 | ||
| 94 | (Matrix4 a00 a10 a20 a30 a01 a11 a21 a31 a02 a12 a22 a32 a03 a13 a23 a33) | 94 | (Matrix4 a00 a10 a20 a30 a01 a11 a21 a31 a02 a12 a22 a32 a03 a13 a23 a33) |
| 95 | * (Matrix4 b00 b10 b20 b30 b01 b11 b21 b31 b02 b12 b22 b32 b03 b13 b23 b33) | 95 | * (Matrix4 b00 b10 b20 b30 b01 b11 b21 b31 b02 b12 b22 b32 b03 b13 b23 b33) |
| 96 | = Matrix4 (a00 * b00 + a10 * b01 + a20 * b02 + a30 * b03) | 96 | = Matrix4 (a00 * b00 + a10 * b01 + a20 * b02 + a30 * b03) |
| 97 | (a00 * b10 + a10 * b11 + a20 * b12 + a30 * b13) | 97 | (a00 * b10 + a10 * b11 + a20 * b12 + a30 * b13) |
| 98 | (a00 * b20 + a10 * b21 + a20 * b22 + a30 * b23) | 98 | (a00 * b20 + a10 * b21 + a20 * b22 + a30 * b23) |
| 99 | (a00 * b30 + a10 * b31 + a20 * b32 + a30 * b33) | 99 | (a00 * b30 + a10 * b31 + a20 * b32 + a30 * b33) |
| 100 | 100 | ||
| 101 | (a01 * b00 + a11 * b01 + a21 * b02 + a31 * b03) | 101 | (a01 * b00 + a11 * b01 + a21 * b02 + a31 * b03) |
| 102 | (a01 * b10 + a11 * b11 + a21 * b12 + a31 * b13) | 102 | (a01 * b10 + a11 * b11 + a21 * b12 + a31 * b13) |
| 103 | (a01 * b20 + a11 * b21 + a21 * b22 + a31 * b23) | 103 | (a01 * b20 + a11 * b21 + a21 * b22 + a31 * b23) |
| 104 | (a01 * b30 + a11 * b31 + a21 * b32 + a31 * b33) | 104 | (a01 * b30 + a11 * b31 + a21 * b32 + a31 * b33) |
| 105 | 105 | ||
| 106 | (a02 * b00 + a12 * b01 + a22 * b02 + a32 * b03) | 106 | (a02 * b00 + a12 * b01 + a22 * b02 + a32 * b03) |
| 107 | (a02 * b10 + a12 * b11 + a22 * b12 + a32 * b13) | 107 | (a02 * b10 + a12 * b11 + a22 * b12 + a32 * b13) |
| 108 | (a02 * b20 + a12 * b21 + a22 * b22 + a32 * b23) | 108 | (a02 * b20 + a12 * b21 + a22 * b22 + a32 * b23) |
| 109 | (a02 * b30 + a12 * b31 + a22 * b32 + a32 * b33) | 109 | (a02 * b30 + a12 * b31 + a22 * b32 + a32 * b33) |
| 110 | 110 | ||
| 111 | (a03 * b00 + a13 * b01 + a23 * b02 + a33 * b03) | 111 | (a03 * b00 + a13 * b01 + a23 * b02 + a33 * b03) |
| 112 | (a03 * b10 + a13 * b11 + a23 * b12 + a33 * b13) | 112 | (a03 * b10 + a13 * b11 + a23 * b12 + a33 * b13) |
| 113 | (a03 * b20 + a13 * b21 + a23 * b22 + a33 * b23) | 113 | (a03 * b20 + a13 * b21 + a23 * b22 + a33 * b23) |
| 114 | (a03 * b30 + a13 * b31 + a23 * b32 + a33 * b33) | 114 | (a03 * b30 + a13 * b31 + a23 * b32 + a33 * b33) |
| 115 | 115 | ||
| 116 | abs = Spear.Math.Matrix4.map abs | 116 | abs = Spear.Math.Matrix4.map abs |
| 117 | 117 | ||
| 118 | signum = Spear.Math.Matrix4.map signum | 118 | signum = Spear.Math.Matrix4.map signum |
| 119 | 119 | ||
| 120 | fromInteger i = mat4 i' i' i' i' i' i' i' i' i' i' i' i' i' i' i' i' where i' = fromInteger i | 120 | fromInteger i = mat4 i' i' i' i' i' i' i' i' i' i' i' i' i' i' i' i' where i' = fromInteger i |
| 121 | 121 | ||
| 122 | 122 | ||
| 123 | instance Storable Matrix4 where | 123 | instance Storable Matrix4 where |
| 124 | sizeOf _ = 64 | 124 | sizeOf _ = 64 |
| 125 | alignment _ = 4 | 125 | alignment _ = 4 |
| 126 | 126 | ||
| 127 | peek ptr = do | 127 | peek ptr = do |
| 128 | a00 <- peekByteOff ptr 0; a01 <- peekByteOff ptr 4; a02 <- peekByteOff ptr 8; a03 <- peekByteOff ptr 12; | 128 | a00 <- peekByteOff ptr 0; a01 <- peekByteOff ptr 4; a02 <- peekByteOff ptr 8; a03 <- peekByteOff ptr 12; |
| 129 | a10 <- peekByteOff ptr 16; a11 <- peekByteOff ptr 20; a12 <- peekByteOff ptr 24; a13 <- peekByteOff ptr 28; | 129 | a10 <- peekByteOff ptr 16; a11 <- peekByteOff ptr 20; a12 <- peekByteOff ptr 24; a13 <- peekByteOff ptr 28; |
| 130 | a20 <- peekByteOff ptr 32; a21 <- peekByteOff ptr 36; a22 <- peekByteOff ptr 40; a23 <- peekByteOff ptr 44; | 130 | a20 <- peekByteOff ptr 32; a21 <- peekByteOff ptr 36; a22 <- peekByteOff ptr 40; a23 <- peekByteOff ptr 44; |
| 131 | a30 <- peekByteOff ptr 48; a31 <- peekByteOff ptr 52; a32 <- peekByteOff ptr 56; a33 <- peekByteOff ptr 60; | 131 | a30 <- peekByteOff ptr 48; a31 <- peekByteOff ptr 52; a32 <- peekByteOff ptr 56; a33 <- peekByteOff ptr 60; |
| 132 | 132 | ||
| 133 | return $ Matrix4 a00 a10 a20 a30 | 133 | return $ Matrix4 a00 a10 a20 a30 |
| 134 | a01 a11 a21 a31 | 134 | a01 a11 a21 a31 |
| 135 | a02 a12 a22 a32 | 135 | a02 a12 a22 a32 |
| 136 | a03 a13 a23 a33 | 136 | a03 a13 a23 a33 |
| 137 | 137 | ||
| 138 | poke ptr (Matrix4 a00 a10 a20 a30 | 138 | poke ptr (Matrix4 a00 a10 a20 a30 |
| 139 | a01 a11 a21 a31 | 139 | a01 a11 a21 a31 |
| 140 | a02 a12 a22 a32 | 140 | a02 a12 a22 a32 |
| @@ -187,7 +187,7 @@ transform right up fwd pos = mat4 | |||
| 187 | (x right) (x up) (x fwd) (x pos) | 187 | (x right) (x up) (x fwd) (x pos) |
| 188 | (y right) (y up) (y fwd) (y pos) | 188 | (y right) (y up) (y fwd) (y pos) |
| 189 | (z right) (z up) (z fwd) (z pos) | 189 | (z right) (z up) (z fwd) (z pos) |
| 190 | 0 0 0 1 | 190 | 0 0 0 1 |
| 191 | 191 | ||
| 192 | 192 | ||
| 193 | -- | Get the translation part of the given transformation matrix. | 193 | -- | Get the translation part of the given transformation matrix. |
| @@ -201,7 +201,7 @@ translation (Matrix4 | |||
| 201 | 1 0 0 a30 | 201 | 1 0 0 a30 |
| 202 | 0 1 0 a31 | 202 | 0 1 0 a31 |
| 203 | 0 0 1 a32 | 203 | 0 0 1 a32 |
| 204 | 0 0 0 a33 | 204 | 0 0 0 a33 |
| 205 | 205 | ||
| 206 | 206 | ||
| 207 | -- | Get the rotation part of the given transformation matrix. | 207 | -- | Get the rotation part of the given transformation matrix. |
| @@ -215,7 +215,7 @@ rotation (Matrix4 | |||
| 215 | a00 a10 a20 0 | 215 | a00 a10 a20 0 |
| 216 | a01 a11 a21 0 | 216 | a01 a11 a21 0 |
| 217 | a02 a12 a22 0 | 217 | a02 a12 a22 0 |
| 218 | a03 a13 a23 1 | 218 | a03 a13 a23 1 |
| 219 | 219 | ||
| 220 | 220 | ||
| 221 | -- | Build a transformation 'Matrix4' defined by the given position and target. | 221 | -- | Build a transformation 'Matrix4' defined by the given position and target. |
| @@ -345,8 +345,8 @@ scale sx sy sz = mat4 | |||
| 345 | 0 sy 0 0 | 345 | 0 sy 0 0 |
| 346 | 0 0 sz 0 | 346 | 0 0 sz 0 |
| 347 | 0 0 0 1 | 347 | 0 0 0 1 |
| 348 | 348 | ||
| 349 | 349 | ||
| 350 | -- | Create a scale matrix. | 350 | -- | Create a scale matrix. |
| 351 | scalev :: Vector3 -> Matrix4 | 351 | scalev :: Vector3 -> Matrix4 |
| 352 | scalev v = mat4 | 352 | scalev v = mat4 |
| @@ -437,10 +437,10 @@ planeProj n d l = | |||
| 437 | ly = y l | 437 | ly = y l |
| 438 | lz = z l | 438 | lz = z l |
| 439 | in mat4 | 439 | in mat4 |
| 440 | (d + c - nx*lx) (-ny*lx) (-nz*lx) (-lx*d) | 440 | (d + c - nx*lx) (-ny*lx) (-nz*lx) (-lx*d) |
| 441 | (-nx*ly) (d + c - ny*ly) (-nz*ly) (-ly*d) | 441 | (-nx*ly) (d + c - ny*ly) (-nz*ly) (-ly*d) |
| 442 | (-nx*lz) (-ny*lz) (d + c - nz*lz) (-lz*d) | 442 | (-nx*lz) (-ny*lz) (d + c - nz*lz) (-lz*d) |
| 443 | (-nx) (-ny) (-nz) c | 443 | (-nx) (-ny) (-nz) c |
| 444 | 444 | ||
| 445 | 445 | ||
| 446 | -- | Transpose the specified matrix. | 446 | -- | Transpose the specified matrix. |
| @@ -470,7 +470,7 @@ inverseTransform mat = | |||
| 470 | 470 | ||
| 471 | -- | Invert the given matrix. | 471 | -- | Invert the given matrix. |
| 472 | inverse :: Matrix4 -> Matrix4 | 472 | inverse :: Matrix4 -> Matrix4 |
| 473 | inverse mat = | 473 | inverse mat = |
| 474 | let | 474 | let |
| 475 | a00 = m00 mat | 475 | a00 = m00 mat |
| 476 | a01 = m01 mat | 476 | a01 = m01 mat |
| @@ -488,14 +488,14 @@ inverse mat = | |||
| 488 | a13 = m31 mat | 488 | a13 = m31 mat |
| 489 | a14 = m32 mat | 489 | a14 = m32 mat |
| 490 | a15 = m33 mat | 490 | a15 = m33 mat |
| 491 | 491 | ||
| 492 | m00' = a05 * a10 * a15 | 492 | m00' = a05 * a10 * a15 |
| 493 | - a05 * a11 * a14 | 493 | - a05 * a11 * a14 |
| 494 | - a09 * a06 * a15 | 494 | - a09 * a06 * a15 |
| 495 | + a09 * a07 * a14 | 495 | + a09 * a07 * a14 |
| 496 | + a13 * a06 * a11 | 496 | + a13 * a06 * a11 |
| 497 | - a13 * a07 * a10 | 497 | - a13 * a07 * a10 |
| 498 | 498 | ||
| 499 | m04' = -a04 * a10 * a15 | 499 | m04' = -a04 * a10 * a15 |
| 500 | + a04 * a11 * a14 | 500 | + a04 * a11 * a14 |
| 501 | + a08 * a06 * a15 | 501 | + a08 * a06 * a15 |
| @@ -530,7 +530,7 @@ inverse mat = | |||
| 530 | + a08 * a03 * a14 | 530 | + a08 * a03 * a14 |
| 531 | + a12 * a02 * a11 | 531 | + a12 * a02 * a11 |
| 532 | - a12 * a03 * a10 | 532 | - a12 * a03 * a10 |
| 533 | 533 | ||
| 534 | m09' = -a00 * a09 * a15 | 534 | m09' = -a00 * a09 * a15 |
| 535 | + a00 * a11 * a13 | 535 | + a00 * a11 * a13 |
| 536 | + a08 * a01 * a15 | 536 | + a08 * a01 * a15 |
| @@ -600,7 +600,7 @@ inverse mat = | |||
| 600 | + a04 * a02 * a09 | 600 | + a04 * a02 * a09 |
| 601 | + a08 * a01 * a06 | 601 | + a08 * a01 * a06 |
| 602 | - a08 * a02 * a05 | 602 | - a08 * a02 * a05 |
| 603 | 603 | ||
| 604 | det' = a00 * m00' + a01 * m04' + a02 * m08' + a03 * m12' | 604 | det' = a00 * m00' + a01 * m04' + a02 * m08' + a03 * m12' |
| 605 | in | 605 | in |
| 606 | if det' == 0 then Spear.Math.Matrix4.id | 606 | if det' == 0 then Spear.Math.Matrix4.id |
