22726e4d |
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 | } |