Vegastrike 0.5.1 rc1
1.0
Original sources for Vegastrike Evolved
Main Page
Related Pages
Modules
Namespaces
Classes
Files
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Groups
Pages
IceMatrix4x4.cpp
Go to the documentation of this file.
1
8
11
35
38
// Precompiled Header
39
#include "
Stdafx.h
"
40
41
42
using namespace
Opcode;
43
45
54
56
void
Opcode::InvertPRMatrix
(
Matrix4x4
& dest,
const
Matrix4x4
& src)
57
{
58
dest.
m
[0][0] = src.
m
[0][0];
59
dest.
m
[1][0] = src.
m
[0][1];
60
dest.
m
[2][0] = src.
m
[0][2];
61
dest.
m
[3][0] = -(src.
m
[3][0]*src.
m
[0][0] + src.
m
[3][1]*src.
m
[0][1] + src.
m
[3][2]*src.
m
[0][2]);
62
63
dest.
m
[0][1] = src.
m
[1][0];
64
dest.
m
[1][1] = src.
m
[1][1];
65
dest.
m
[2][1] = src.
m
[1][2];
66
dest.
m
[3][1] = -(src.
m
[3][0]*src.
m
[1][0] + src.
m
[3][1]*src.
m
[1][1] + src.
m
[3][2]*src.
m
[1][2]);
67
68
dest.
m
[0][2] = src.
m
[2][0];
69
dest.
m
[1][2] = src.
m
[2][1];
70
dest.
m
[2][2] = src.
m
[2][2];
71
dest.
m
[3][2] = -(src.
m
[3][0]*src.
m
[2][0] + src.
m
[3][1]*src.
m
[2][1] + src.
m
[3][2]*src.
m
[2][2]);
72
73
dest.
m
[0][3] = 0.0f;
74
dest.
m
[1][3] = 0.0f;
75
dest.
m
[2][3] = 0.0f;
76
dest.
m
[3][3] = 1.0f;
77
}
78
80
// Compute the cofactor of the Matrix at a specified location
82
float
Matrix4x4::CoFactor
(
udword
row,
udword
col)
const
83
{
84
return
((
m
[(row+1)&3][(col+1)&3]*
m
[(row+2)&3][(col+2)&3]*
m
[(row+3)&3][(col+3)&3] +
85
m
[(row+1)&3][(col+2)&3]*
m
[(row+2)&3][(col+3)&3]*
m
[(row+3)&3][(col+1)&3] +
86
m
[(row+1)&3][(col+3)&3]*
m
[(row+2)&3][(col+1)&3]*
m
[(row+3)&3][(col+2)&3])
87
- (
m
[(row+3)&3][(col+1)&3]*
m
[(row+2)&3][(col+2)&3]*
m
[(row+1)&3][(col+3)&3] +
88
m
[(row+3)&3][(col+2)&3]*
m
[(row+2)&3][(col+3)&3]*
m
[(row+1)&3][(col+1)&3] +
89
m
[(row+3)&3][(col+3)&3]*
m
[(row+2)&3][(col+1)&3]*
m
[(row+1)&3][(col+2)&3])) * ((row + col) & 1 ? -1.0
f
: +1.0
f
);
90
}
91
93
// Compute the determinant of the Matrix
95
float
Matrix4x4::Determinant
()
const
96
{
97
return
m
[0][0] *
CoFactor
(0, 0) +
98
m
[0][1] *
CoFactor
(0, 1) +
99
m
[0][2] *
CoFactor
(0, 2) +
100
m
[0][3] *
CoFactor
(0, 3);
101
}
102
104
// Compute the inverse of the matrix
106
Matrix4x4
&
Matrix4x4::Invert
()
107
{
108
float
Det =
Determinant
();
109
Matrix4x4
Temp;
110
111
if
(fabsf(Det) <
MATRIX4X4_EPSILON
)
112
return
*
this
;
// The matrix is not invertible! Singular case!
113
114
float
IDet = 1.0f / Det;
115
116
Temp.
m
[0][0] =
CoFactor
(0,0) * IDet;
117
Temp.
m
[1][0] =
CoFactor
(0,1) * IDet;
118
Temp.
m
[2][0] =
CoFactor
(0,2) * IDet;
119
Temp.
m
[3][0] =
CoFactor
(0,3) * IDet;
120
Temp.
m
[0][1] =
CoFactor
(1,0) * IDet;
121
Temp.
m
[1][1] =
CoFactor
(1,1) * IDet;
122
Temp.
m
[2][1] =
CoFactor
(1,2) * IDet;
123
Temp.
m
[3][1] =
CoFactor
(1,3) * IDet;
124
Temp.
m
[0][2] =
CoFactor
(2,0) * IDet;
125
Temp.
m
[1][2] =
CoFactor
(2,1) * IDet;
126
Temp.
m
[2][2] =
CoFactor
(2,2) * IDet;
127
Temp.
m
[3][2] =
CoFactor
(2,3) * IDet;
128
Temp.
m
[0][3] =
CoFactor
(3,0) * IDet;
129
Temp.
m
[1][3] =
CoFactor
(3,1) * IDet;
130
Temp.
m
[2][3] =
CoFactor
(3,2) * IDet;
131
Temp.
m
[3][3] =
CoFactor
(3,3) * IDet;
132
133
*
this
= Temp;
134
135
return
*
this
;
136
}
137
src
cmd
collide2
Ice
IceMatrix4x4.cpp
Generated on Fri May 29 2015 23:07:11 for Vegastrike 0.5.1 rc1 by
1.8.4