2
* Copyright (C) 1999-2005 Terence M. Welsh
4
* This file is part of rsMath.
6
* rsMath is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU Lesser General Public
8
* License version 2.1 as published by the Free Software Foundation.
10
* rsMath is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU Lesser General Public
16
* License along with this program; if not, write to the Free Software
17
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21
#include <rsMath/rsMath.h>
29
rsMatrix::~rsMatrix(){
33
void rsMatrix::identity(){
53
void rsMatrix::set(const float * const mat){
60
void rsMatrix::get(float* mat) const{
67
void rsMatrix::copy(const rsMatrix &mat){
74
void rsMatrix::preMult(const rsMatrix &postMat){
94
m[0] = preMat[0]*postMat[0] + preMat[4]*postMat[1] + preMat[8]*postMat[2] + preMat[12]*postMat[3];
95
m[1] = preMat[1]*postMat[0] + preMat[5]*postMat[1] + preMat[9]*postMat[2] + preMat[13]*postMat[3];
96
m[2] = preMat[2]*postMat[0] + preMat[6]*postMat[1] + preMat[10]*postMat[2] + preMat[14]*postMat[3];
97
m[3] = preMat[3]*postMat[0] + preMat[7]*postMat[1] + preMat[11]*postMat[2] + preMat[15]*postMat[3];
98
m[4] = preMat[0]*postMat[4] + preMat[4]*postMat[5] + preMat[8]*postMat[6] + preMat[12]*postMat[7];
99
m[5] = preMat[1]*postMat[4] + preMat[5]*postMat[5] + preMat[9]*postMat[6] + preMat[13]*postMat[7];
100
m[6] = preMat[2]*postMat[4] + preMat[6]*postMat[5] + preMat[10]*postMat[6] + preMat[14]*postMat[7];
101
m[7] = preMat[3]*postMat[4] + preMat[7]*postMat[5] + preMat[11]*postMat[6] + preMat[15]*postMat[7];
102
m[8] = preMat[0]*postMat[8] + preMat[4]*postMat[9] + preMat[8]*postMat[10] + preMat[12]*postMat[11];
103
m[9] = preMat[1]*postMat[8] + preMat[5]*postMat[9] + preMat[9]*postMat[10] + preMat[13]*postMat[11];
104
m[10] = preMat[2]*postMat[8] + preMat[6]*postMat[9] + preMat[10]*postMat[10] + preMat[14]*postMat[11];
105
m[11] = preMat[3]*postMat[8] + preMat[7]*postMat[9] + preMat[11]*postMat[10] + preMat[15]*postMat[11];
106
m[12] = preMat[0]*postMat[12] + preMat[4]*postMat[13] + preMat[8]*postMat[14] + preMat[12]*postMat[15];
107
m[13] = preMat[1]*postMat[12] + preMat[5]*postMat[13] + preMat[9]*postMat[14] + preMat[13]*postMat[15];
108
m[14] = preMat[2]*postMat[12] + preMat[6]*postMat[13] + preMat[10]*postMat[14] + preMat[14]*postMat[15];
109
m[15] = preMat[3]*postMat[12] + preMat[7]*postMat[13] + preMat[11]*postMat[14] + preMat[15]*postMat[15];
113
void rsMatrix::postMult(const rsMatrix &preMat){
133
m[0] = preMat[0]*postMat[0] + preMat[4]*postMat[1] + preMat[8]*postMat[2] + preMat[12]*postMat[3];
134
m[1] = preMat[1]*postMat[0] + preMat[5]*postMat[1] + preMat[9]*postMat[2] + preMat[13]*postMat[3];
135
m[2] = preMat[2]*postMat[0] + preMat[6]*postMat[1] + preMat[10]*postMat[2] + preMat[14]*postMat[3];
136
m[3] = preMat[3]*postMat[0] + preMat[7]*postMat[1] + preMat[11]*postMat[2] + preMat[15]*postMat[3];
137
m[4] = preMat[0]*postMat[4] + preMat[4]*postMat[5] + preMat[8]*postMat[6] + preMat[12]*postMat[7];
138
m[5] = preMat[1]*postMat[4] + preMat[5]*postMat[5] + preMat[9]*postMat[6] + preMat[13]*postMat[7];
139
m[6] = preMat[2]*postMat[4] + preMat[6]*postMat[5] + preMat[10]*postMat[6] + preMat[14]*postMat[7];
140
m[7] = preMat[3]*postMat[4] + preMat[7]*postMat[5] + preMat[11]*postMat[6] + preMat[15]*postMat[7];
141
m[8] = preMat[0]*postMat[8] + preMat[4]*postMat[9] + preMat[8]*postMat[10] + preMat[12]*postMat[11];
142
m[9] = preMat[1]*postMat[8] + preMat[5]*postMat[9] + preMat[9]*postMat[10] + preMat[13]*postMat[11];
143
m[10] = preMat[2]*postMat[8] + preMat[6]*postMat[9] + preMat[10]*postMat[10] + preMat[14]*postMat[11];
144
m[11] = preMat[3]*postMat[8] + preMat[7]*postMat[9] + preMat[11]*postMat[10] + preMat[15]*postMat[11];
145
m[12] = preMat[0]*postMat[12] + preMat[4]*postMat[13] + preMat[8]*postMat[14] + preMat[12]*postMat[15];
146
m[13] = preMat[1]*postMat[12] + preMat[5]*postMat[13] + preMat[9]*postMat[14] + preMat[13]*postMat[15];
147
m[14] = preMat[2]*postMat[12] + preMat[6]*postMat[13] + preMat[10]*postMat[14] + preMat[14]*postMat[15];
148
m[15] = preMat[3]*postMat[12] + preMat[7]*postMat[13] + preMat[11]*postMat[14] + preMat[15]*postMat[15];
152
float rsMatrix::determinant() const{
153
return(m[0] * m[5] * m[10] * m[15]
154
+ m[4] * m[9] * m[14] * m[3]
155
+ m[8] * m[13] * m[2] * m[7]
156
+ m[12] * m[1] * m[6] * m[11]
157
- m[3] * m[6] * m[9] * m[12]
158
- m[7] * m[10] * m[13] * m[0]
159
- m[11] * m[14] * m[1] * m[4]
160
- m[15] * m[2] * m[5] * m[8]);
164
void rsMatrix::makeTrans(const float &x, const float &y, const float &z){
183
void rsMatrix::makeTrans(const float * const p){
202
void rsMatrix::makeTrans(const rsVec &vec){
222
void rsMatrix::makeScale(const float &s){
241
void rsMatrix::makeScale(const float &x, const float &y, const float &z){
260
void rsMatrix::makeScale(const float * const s){
279
void rsMatrix::makeScale(const rsVec &vec){
299
void rsMatrix::makeRot(float a, const float &x, const float &y, const float &z){
305
void rsMatrix::makeRot(float a, const rsVec &v){
311
void rsMatrix::makeRot(const rsQuat &q){
316
int rsMatrix::invert(const rsMatrix &mat){
321
// initialize reduction matrix
332
rmat[2][2] = mat[10];
333
rmat[3][2] = mat[11];
334
rmat[0][3] = mat[12];
335
rmat[1][3] = mat[13];
336
rmat[2][3] = mat[14];
337
rmat[3][3] = mat[15];
355
// perform reductions
358
if(a == 0.0f) // matrix is singular, can't be reduced
363
rmat[i][j] = rmat[i][j] * a;
368
rmat[k][j] = rmat[k][j] - b * rmat[i][j];
374
// extract the inverted matrix
396
void rsMatrix::rotationInvert(const rsMatrix &mat){
397
float det = mat[0] * mat[5] * mat[10]
398
+ mat[4] * mat[9] * mat[2]
399
+ mat[8] * mat[1] * mat[6]
400
- mat[2] * mat[5] * mat[8]
401
- mat[6] * mat[9] * mat[0]
402
- mat[10] * mat[1] * mat[4];
404
m[0] = (mat[5] * mat[10] - mat[6] * mat[9]) / det;
405
m[1] = (mat[6] * mat[8] - mat[4] * mat[10]) / det;
406
m[2] = (mat[4] * mat[9] - mat[5] * mat[8]) / det;
407
m[4] = (mat[9] * mat[2] - mat[10] * mat[1]) / det;
408
m[5] = (mat[10] * mat[0] - mat[8] * mat[2]) / det;
409
m[6] = (mat[8] * mat[1] - mat[9] * mat[0]) / det;
410
m[8] = (mat[1] * mat[6] - mat[2] * mat[5]) / det;
411
m[9] = (mat[2] * mat[4] - mat[0] * mat[6]) / det;
412
m[10] = (mat[0] * mat[5] - mat[1] * mat[4]) / det;
413
m[3] = m[7] = m[11] = m[12] = m[13] = m[14] = 0.0f;
418
void rsMatrix::fromQuat(const rsQuat &q){
420
if(q[0] == 0.0f && q[1] == 0.0f && q[2] == 0.0f){
425
const float s = 2.0f / (q[0] * q[0] + q[1] * q[1] + q[2] * q[2] + q[3] * q[3]);
426
const float xs = q[0] * s;
427
const float ys = q[1] * s;
428
const float zs = q[2] * s;
429
const float wx = q[3] * xs;
430
const float wy = q[3] * ys;
431
const float wz = q[3] * zs;
432
const float xx = q[0] * xs;
433
const float xy = q[0] * ys;
434
const float xz = q[0] * zs;
435
const float yy = q[1] * ys;
436
const float yz = q[1] * zs;
437
const float zz = q[2] * zs;
439
m[0] = 1.0f - yy - zz;
444
m[5] = 1.0f - xx - zz;
449
m[10] = 1.0f - xx - yy;
459
rsMatrix & rsMatrix::operator = (const rsMatrix &mat){
460
m[0]=mat[0]; m[1]=mat[1]; m[2]=mat[2]; m[3]=mat[3];
461
m[4]=mat[4]; m[5]=mat[5]; m[6]=mat[6]; m[7]=mat[7];
462
m[8]=mat[8]; m[9]=mat[9]; m[10]=mat[10]; m[11]=mat[11];
463
m[12]=mat[12]; m[13]=mat[13]; m[14]=mat[14]; m[15]=mat[15];