| 1 | /****************************************************************************** |
| 2 | * Arachnoid Graphics Plugin for Mupen64Plus |
| 3 | * http://bitbucket.org/wahrhaft/mupen64plus-video-arachnoid/ |
| 4 | * |
| 5 | * Copyright (C) 2007 Kristofer Karlsson, Rickard Niklasson |
| 6 | * |
| 7 | * This program is free software; you can redistribute it and/or |
| 8 | * modify it under the terms of the GNU General Public License |
| 9 | * as published by the Free Software Foundation; either version 2 |
| 10 | * of the License, or (at your option) any later version. |
| 11 | * |
| 12 | * This program is distributed in the hope that it will be useful, |
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 15 | * GNU General Public License for more details. |
| 16 | * |
| 17 | * You should have received a copy of the GNU General Public License |
| 18 | * along with this program; if not, write to the Free Software |
| 19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| 20 | *****************************************************************************/ |
| 21 | |
| 22 | #include "Matrix4.h" |
| 23 | |
| 24 | const Matrix4 Matrix4::ZERO( 0, 0, 0, 0, |
| 25 | 0, 0, 0, 0, |
| 26 | 0, 0, 0, 0, |
| 27 | 0, 0, 0, 0 ); |
| 28 | |
| 29 | const Matrix4 Matrix4::IDENTITY( 1, 0, 0, 0, |
| 30 | 0, 1, 0, 0, |
| 31 | 0, 0, 1, 0, |
| 32 | 0, 0, 0, 1 ); |
| 33 | |
| 34 | const Matrix4 Matrix4::CLIPSPACE2DTOIMAGESPACE( 0.5, 0, 0, 0.5, |
| 35 | 0, -0.5, 0, 0.5, |
| 36 | 0, 0, 1, 0, |
| 37 | 0, 0, 0, 1); |
| 38 | |
| 39 | |
| 40 | //----------------------------------------------------------------------- |
| 41 | //! Calclate and returns the deteminant of the matrix |
| 42 | //----------------------------------------------------------------------- |
| 43 | float Matrix4::determinant() const |
| 44 | { |
| 45 | return (_m[0]*(_m[4]*_m[8] - _m[7]*_m[5])) - (_m[1]*(_m[3]*_m[8] - _m[6]*_m[5])) + (_m[2]*(_m[3]*_m[7] - _m[6]*_m[4])); |
| 46 | } |
| 47 | |
| 48 | //----------------------------------------------------------------------- |
| 49 | //! Inverse Matrix |
| 50 | //----------------------------------------------------------------------- |
| 51 | Matrix4 Matrix4::inverse() const |
| 52 | { |
| 53 | float m00 = m[0][0], m01 = m[0][1], m02 = m[0][2], m03 = m[0][3]; |
| 54 | float m10 = m[1][0], m11 = m[1][1], m12 = m[1][2], m13 = m[1][3]; |
| 55 | float m20 = m[2][0], m21 = m[2][1], m22 = m[2][2], m23 = m[2][3]; |
| 56 | float m30 = m[3][0], m31 = m[3][1], m32 = m[3][2], m33 = m[3][3]; |
| 57 | |
| 58 | float v0 = m20 * m31 - m21 * m30; |
| 59 | float v1 = m20 * m32 - m22 * m30; |
| 60 | float v2 = m20 * m33 - m23 * m30; |
| 61 | float v3 = m21 * m32 - m22 * m31; |
| 62 | float v4 = m21 * m33 - m23 * m31; |
| 63 | float v5 = m22 * m33 - m23 * m32; |
| 64 | |
| 65 | float t00 = + (v5 * m11 - v4 * m12 + v3 * m13); |
| 66 | float t10 = - (v5 * m10 - v2 * m12 + v1 * m13); |
| 67 | float t20 = + (v4 * m10 - v2 * m11 + v0 * m13); |
| 68 | float t30 = - (v3 * m10 - v1 * m11 + v0 * m12); |
| 69 | |
| 70 | float invDet = 1 / (t00 * m00 + t10 * m01 + t20 * m02 + t30 * m03); |
| 71 | |
| 72 | float d00 = t00 * invDet; |
| 73 | float d10 = t10 * invDet; |
| 74 | float d20 = t20 * invDet; |
| 75 | float d30 = t30 * invDet; |
| 76 | |
| 77 | float d01 = - (v5 * m01 - v4 * m02 + v3 * m03) * invDet; |
| 78 | float d11 = + (v5 * m00 - v2 * m02 + v1 * m03) * invDet; |
| 79 | float d21 = - (v4 * m00 - v2 * m01 + v0 * m03) * invDet; |
| 80 | float d31 = + (v3 * m00 - v1 * m01 + v0 * m02) * invDet; |
| 81 | |
| 82 | v0 = m10 * m31 - m11 * m30; |
| 83 | v1 = m10 * m32 - m12 * m30; |
| 84 | v2 = m10 * m33 - m13 * m30; |
| 85 | v3 = m11 * m32 - m12 * m31; |
| 86 | v4 = m11 * m33 - m13 * m31; |
| 87 | v5 = m12 * m33 - m13 * m32; |
| 88 | |
| 89 | float d02 = + (v5 * m01 - v4 * m02 + v3 * m03) * invDet; |
| 90 | float d12 = - (v5 * m00 - v2 * m02 + v1 * m03) * invDet; |
| 91 | float d22 = + (v4 * m00 - v2 * m01 + v0 * m03) * invDet; |
| 92 | float d32 = - (v3 * m00 - v1 * m01 + v0 * m02) * invDet; |
| 93 | |
| 94 | v0 = m21 * m10 - m20 * m11; |
| 95 | v1 = m22 * m10 - m20 * m12; |
| 96 | v2 = m23 * m10 - m20 * m13; |
| 97 | v3 = m22 * m11 - m21 * m12; |
| 98 | v4 = m23 * m11 - m21 * m13; |
| 99 | v5 = m23 * m12 - m22 * m13; |
| 100 | |
| 101 | float d03 = - (v5 * m01 - v4 * m02 + v3 * m03) * invDet; |
| 102 | float d13 = + (v5 * m00 - v2 * m02 + v1 * m03) * invDet; |
| 103 | float d23 = - (v4 * m00 - v2 * m01 + v0 * m03) * invDet; |
| 104 | float d33 = + (v3 * m00 - v1 * m01 + v0 * m02) * invDet; |
| 105 | |
| 106 | return Matrix4( |
| 107 | d00, d01, d02, d03, |
| 108 | d10, d11, d12, d13, |
| 109 | d20, d21, d22, d23, |
| 110 | d30, d31, d32, d33); |
| 111 | } |