source: trunk/packages/vizservers/nanovis/vrmath/vrMatrix4x4f.cpp @ 2842

Last change on this file since 2842 was 2842, checked in by ldelgass, 13 years ago

Some additions to quat/rotation classes in vrmath lib

File size: 31.7 KB
Line 
1/* -*- mode: c++; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2#include <vrmath/vrVector3f.h>
3#include <vrmath/vrRotation.h>
4#include <vrmath/vrMatrix4x4f.h>
5
6void vrMatrix4x4f::makeIdentity()
7{
8    _data[1] = _data[2] = _data[3] = _data[4] =
9        _data[6] = _data[7] = _data[8] = _data[9] =
10        _data[11] = _data[12] = _data[13] = _data[14] = 0.0f;
11    _data[0] = _data[5] = _data[10] = _data[15] = 1.0f;
12}
13
14void vrMatrix4x4f::makeTranslation(const vrVector3f& translation)
15{
16    _data[1] = _data[2] = _data[3] = _data[4] =
17        _data[6] = _data[7] = _data[8] = _data[9] =
18        _data[11] = 0.0f;
19    _data[0] = _data[5] = _data[10] = _data[15] = 1.0f;
20    _data[12] = translation.x;
21    _data[13] = translation.y;
22    _data[14] = translation.z;
23}
24
25void vrMatrix4x4f::makeTranslation(float x, float y, float z)
26{
27    _data[1] = _data[2] = _data[3] = _data[4] =
28        _data[6] = _data[7] = _data[8] = _data[9] =
29        _data[11] = 0.0f;
30    _data[0] = _data[5] = _data[10] = _data[15] = 1.0f;
31    _data[12] = x;
32    _data[13] = y;
33    _data[14] = z;
34}
35
36void vrMatrix4x4f::makeRotation(const vrRotation& rotation)
37{
38    if (rotation.getAngle() == 0.0f ||
39        (rotation.getX() == 0.0f &&
40         rotation.getY() == 0.0f &&
41         rotation.getZ() == 0.0f)) {
42        makeIdentity();
43        return;
44    }
45
46    float xAxis = rotation.getX(), yAxis = rotation.getY(), zAxis = rotation.getZ();
47    float invLen = 1.0f / sqrt(xAxis * xAxis + yAxis * yAxis + zAxis * zAxis);
48    float cosine = cos(rotation.getAngle());
49    float sine = sin(rotation.getAngle());
50
51    xAxis *= invLen;
52    yAxis *= invLen;
53    zAxis *= invLen;
54
55    float oneMinusCosine = 1.0f - cosine;
56
57    _data[3] = _data[7] = _data[11] = _data[12] = _data[13] = _data[14] = 0.0f;
58    _data[15] = 1.0f;
59
60    _data[0] = xAxis * xAxis * oneMinusCosine + cosine;
61    _data[1] = yAxis * xAxis * oneMinusCosine + zAxis * sine;
62    _data[2] = xAxis * zAxis * oneMinusCosine - yAxis * sine;
63
64    _data[4] = xAxis * yAxis * oneMinusCosine - zAxis * sine;
65    _data[5] = yAxis * yAxis * oneMinusCosine + cosine;
66    _data[6] = yAxis * zAxis * oneMinusCosine + xAxis * sine;
67
68    _data[8] = xAxis * zAxis * oneMinusCosine + yAxis * sine;
69    _data[9] = yAxis * zAxis * oneMinusCosine - xAxis * sine;
70    _data[10] = zAxis * zAxis * oneMinusCosine + cosine;
71}
72
73void vrMatrix4x4f::makeRotation(float xAxis, float yAxis, float zAxis, float angle)
74{
75    if (angle == 0.0f ||
76        (xAxis == 0.0f &&
77         yAxis == 0.0f &&
78         zAxis == 0.0f)) {
79        makeIdentity();
80        return;
81    }
82
83    float invLen = 1.0f / sqrt(xAxis * xAxis + yAxis * yAxis + zAxis * zAxis);
84    float cosine = cos(angle);
85    float sine = sin(angle);
86
87    xAxis *= invLen;
88    yAxis *= invLen;
89    zAxis *= invLen;
90
91    float oneMinusCosine = 1.0f - cosine;
92
93    _data[3] = _data[7] = _data[11] = _data[12] = _data[13] = _data[14] = 0.0f;
94    _data[15] = 1.0f;
95
96    _data[0] = xAxis * xAxis * oneMinusCosine + cosine;
97    _data[1] = yAxis * xAxis * oneMinusCosine + zAxis * sine;
98    _data[2] = xAxis * zAxis * oneMinusCosine - yAxis * sine;
99
100    _data[4] = xAxis * yAxis * oneMinusCosine - zAxis * sine;
101    _data[5] = yAxis * yAxis * oneMinusCosine + cosine;
102    _data[6] = yAxis * zAxis * oneMinusCosine + xAxis * sine;
103
104    _data[8] = xAxis * zAxis * oneMinusCosine + yAxis * sine;
105    _data[9] = yAxis * zAxis * oneMinusCosine - xAxis * sine;
106    _data[10] = zAxis * zAxis * oneMinusCosine + cosine;
107}
108
109void vrMatrix4x4f::makeScale(const vrVector3f& scale)
110{
111    _data[1] = _data[2] = _data[3] = _data[4] =
112        _data[6] = _data[7] = _data[8] = _data[9] =
113        _data[11] = 0.0f;
114
115    _data[0] = scale.x;
116    _data[5] = scale.y;
117    _data[10] = scale.z;
118
119    _data[15] = 1.0f;
120    _data[12] = _data[13] = _data[14] = 0.0f;
121}
122
123void vrMatrix4x4f::multiply(const vrMatrix4x4f& m1)
124{
125    float mat[16];
126    float *mat1 = (float *)m1._data;
127
128    // 1 row
129    mat[0] = float(_data[0] * mat1[0] + _data[4] * mat1[1] +
130                   _data[8] * mat1[2] + _data[12] * mat1[3]);
131    mat[4] = float(_data[0] * mat1[4] + _data[4] * mat1[5] +
132                   _data[8] * mat1[6] + _data[12] * mat1[7]);
133    mat[8] = float(_data[0] * mat1[8] + _data[4] * mat1[9] +
134                   _data[8] * mat1[10] + _data[12] * mat1[11]);
135    mat[12] = float(_data[0] * mat1[12] + _data[4] * mat1[13] +
136                    _data[8] * mat1[14] + _data[12] * mat1[15]);
137
138    // 2 row
139    mat[1] = float(_data[1] * mat1[0] + _data[5] * mat1[1] +
140                   _data[9] * mat1[2] + _data[13] * mat1[3]);
141    mat[5] = float(_data[1] * mat1[4] + _data[5] * mat1[5] +
142                   _data[9] * mat1[6] + _data[13] * mat1[7]);
143    mat[9] = float(_data[1] * mat1[8] + _data[5] * mat1[9] +
144                   _data[9] * mat1[10] + _data[13] * mat1[11]);
145    mat[13] = float(_data[1] * mat1[12] + _data[5] * mat1[13] +
146                    _data[9] * mat1[14] + _data[13] * mat1[15]);
147
148    // 3 row
149    mat[2] = float(_data[2] * mat1[0] + _data[6] * mat1[1] +
150                   _data[10] * mat1[2] + _data[14] * mat1[3]);
151
152    mat[6] = float(_data[2] * mat1[4] + _data[6] * mat1[5] +
153                   _data[10] * mat1[6] + _data[14] * mat1[7]);
154    mat[10] = float(_data[2] * mat1[8] + _data[6] * mat1[9] +
155                    _data[10] * mat1[10] + _data[14] * mat1[11]);
156    mat[14] = float(_data[2] * mat1[12] + _data[6] * mat1[13] +
157                    _data[10] * mat1[14] + _data[14] * mat1[15]);
158
159    // 4 row
160    mat[3] = float(_data[3] * mat1[0] + _data[7] * mat1[1] +
161                   _data[11] * mat1[2] + _data[15] * mat1[3]);
162    mat[7] = float(_data[3] * mat1[4] + _data[7] * mat1[5] +
163                   _data[11] * mat1[6] + _data[15] * mat1[7]);
164    mat[11] = float(_data[3] * mat1[8] + _data[7] * mat1[9] +
165                    _data[11] * mat1[10] + _data[15] * mat1[11]);
166    mat[15] = float(_data[3] * mat1[12] + _data[7] * mat1[13] +
167                    _data[11] * mat1[14] + _data[15] * mat1[15]);
168
169    // set matrix
170    set(mat);
171}
172
173void vrMatrix4x4f::multiply(const vrMatrix4x4f& m1, const vrMatrix4x4f& m2)
174{
175    float mat[16];
176    float *mat1 = (float *)m1._data;
177    float *mat2 = (float *)m2._data;
178
179    // 1 row
180    mat[0] = float(mat1[0] * mat2[0] + mat1[4] * mat2[1] +
181                   mat1[8] * mat2[2] + mat1[12] * mat2[3]);
182    mat[4] = float(mat1[0] * mat2[4] + mat1[4] * mat2[5] +
183                   mat1[8] * mat2[6] + mat1[12] * mat2[7]);
184    mat[8] = float(mat1[0] * mat2[8] + mat1[4] * mat2[9] +
185                   mat1[8] * mat2[10] + mat1[12] * mat2[11]);
186    mat[12] = float(mat1[0] * mat2[12] + mat1[4] * mat2[13] +
187                    mat1[8] * mat2[14] + mat1[12] * mat2[15]);
188
189    // 2 row
190    mat[1] = float(mat1[1] * mat2[0] + mat1[5] * mat2[1] +
191                   mat1[9] * mat2[2] + mat1[13] * mat2[3]);
192    mat[5] = float(mat1[1] * mat2[4] + mat1[5] * mat2[5] +
193                   mat1[9] * mat2[6] + mat1[13] * mat2[7]);
194    mat[9] = float(mat1[1] * mat2[8] + mat1[5] * mat2[9] +
195                   mat1[9] * mat2[10] + mat1[13] * mat2[11]);
196    mat[13] = float(mat1[1] * mat2[12] + mat1[5] * mat2[13] +
197                    mat1[9] * mat2[14] + mat1[13] * mat2[15]);
198
199    // 3 row
200    mat[2] = float(mat1[2] * mat2[0] + mat1[6] * mat2[1] +
201                   mat1[10] * mat2[2] + mat1[14] * mat2[3]);
202    mat[6] = float(mat1[2] * mat2[4] + mat1[6] * mat2[5] +
203                   mat1[10] * mat2[6] + mat1[14] * mat2[7]);
204    mat[10] = float(mat1[2] * mat2[8] + mat1[6] * mat2[9] +
205                    mat1[10] * mat2[10] + mat1[14] * mat2[11]);
206    mat[14] = float(mat1[2] * mat2[12] + mat1[6] * mat2[13] +
207                    mat1[10] * mat2[14] + mat1[14] * mat2[15]);
208
209    // 4 row
210    mat[3] = float(mat1[3] * mat2[0] + mat1[7] * mat2[1] +
211                   mat1[11] * mat2[2] + mat1[15] * mat2[3]);
212    mat[7] = float(mat1[3] * mat2[4] + mat1[7] * mat2[5] +
213                   mat1[11] * mat2[6] + mat1[15] * mat2[7]);
214    mat[11] = float(mat1[3] * mat2[8] + mat1[7] * mat2[9] +
215                    mat1[11] * mat2[10] + mat1[15] * mat2[11]);
216    mat[15] = float(mat1[3] * mat2[12] + mat1[7] * mat2[13] +
217                    mat1[11] * mat2[14] + mat1[15] * mat2[15]);
218
219    // set matrix
220    set(mat);
221}
222
223void vrMatrix4x4f::multiplyFast(const vrMatrix4x4f& m1, const vrMatrix4x4f& m2)
224{
225    float *mat1 = (float *)m1._data;
226    float *mat2 = (float *)m2._data;
227
228    // 1 row
229    _data[0] = float(mat1[0] * mat2[0] + mat1[4] * mat2[1] +
230                     mat1[8] * mat2[2] + mat1[12] * mat2[3]);
231    _data[4] = float(mat1[0] * mat2[4] + mat1[4] * mat2[5] +
232                     mat1[8] * mat2[6] + mat1[12] * mat2[7]);
233    _data[8] = float(mat1[0] * mat2[8] + mat1[4] * mat2[9] +
234                     mat1[8] * mat2[10] + mat1[12] * mat2[11]);
235    _data[12] = float(mat1[0] * mat2[12] + mat1[4] * mat2[13] +
236                      mat1[8] * mat2[14] + mat1[12] * mat2[15]);
237
238    // 2 row
239    _data[1] = float(mat1[1] * mat2[0] + mat1[5] * mat2[1] +
240                     mat1[9] * mat2[2] + mat1[13] * mat2[3]);
241    _data[5] = float(mat1[1] * mat2[4] + mat1[5] * mat2[5] +
242                     mat1[9] * mat2[6] + mat1[13] * mat2[7]);
243    _data[9] = float(mat1[1] * mat2[8] + mat1[5] * mat2[9] +
244                     mat1[9] * mat2[10] + mat1[13] * mat2[11]);
245    _data[13] = float(mat1[1] * mat2[12] + mat1[5] * mat2[13] +
246                      mat1[9] * mat2[14] + mat1[13] * mat2[15]);
247
248    // 3 row
249    _data[2] = float(mat1[2] * mat2[0] + mat1[6] * mat2[1] +
250                     mat1[10] * mat2[2] + mat1[14] * mat2[3]);
251    _data[6] = float(mat1[2] * mat2[4] + mat1[6] * mat2[5] +
252                     mat1[10] * mat2[6] + mat1[14] * mat2[7]);
253    _data[10] = float(mat1[2] * mat2[8] + mat1[6] * mat2[9] +
254                      mat1[10] * mat2[10] + mat1[14] * mat2[11]);
255    _data[14] = float(mat1[2] * mat2[12] + mat1[6] * mat2[13] +
256                      mat1[10] * mat2[14] + mat1[14] * mat2[15]);
257
258    // 4 row
259    _data[3] = float(mat1[3] * mat2[0] + mat1[7] * mat2[1] +
260                     mat1[11] * mat2[2] + mat1[15] * mat2[3]);
261    _data[7] = float(mat1[3] * mat2[4] + mat1[7] * mat2[5] +
262                     mat1[11] * mat2[6] + mat1[15] * mat2[7]);
263    _data[11] = float(mat1[3] * mat2[8] + mat1[7] * mat2[9] +
264                      mat1[11] * mat2[10] + mat1[15] * mat2[11]);
265    _data[15] = float(mat1[3] * mat2[12] + mat1[7] * mat2[13] +
266                      mat1[11] * mat2[14] + mat1[15] * mat2[15]);
267}
268
269void vrMatrix4x4f::getRotation(vrRotation& rotation)
270{
271    float c = (_data[0] + _data[5] + _data[10] - 1.0f) * 0.5f;
272
273    rotation.setAxis(_data[6] - _data[9], _data[8] - _data[2], _data[1] - _data[4]);
274
275    float len = sqrt(rotation.getX() * rotation.getX() +
276                     rotation.getY() * rotation.getY() + rotation.getZ() * rotation.getZ());
277
278    float s = 0.5f * len;
279
280    rotation.setAngle((float)atan2(s, c));
281
282    if ( rotation.getX() == 0.0f && rotation.getY() == 0.0f && rotation.getZ() == 0.0f ) {
283        rotation.set(0.0f, 1.0f, 0.0f, 0.0f);
284    } else {
285        len = 1.0f / len;
286        rotation.setAxis(rotation.getX() * len, rotation.getY() * len, rotation.getZ() * len);
287    }
288}
289
290void vrMatrix4x4f::invert()
291{
292    float det =
293        _data[12] * _data[9] * _data[6] * _data[3]-
294        _data[8] * _data[13] * _data[6] * _data[3]-
295        _data[12] * _data[5] * _data[10] * _data[3]+
296        _data[4] * _data[13] * _data[10] * _data[3]+
297        _data[8] * _data[5] * _data[14] * _data[3]-
298        _data[4] * _data[9] * _data[14] * _data[3]-
299        _data[12] * _data[9] * _data[2] * _data[7]+
300        _data[8] * _data[13] * _data[2] * _data[7]+
301        _data[12] * _data[1] * _data[10] * _data[7]-
302        _data[0] * _data[13] * _data[10] * _data[7]-
303        _data[8] * _data[1] * _data[14] * _data[7]+
304        _data[0] * _data[9] * _data[14] * _data[7]+
305        _data[12] * _data[5] * _data[2] * _data[11]-
306        _data[4] * _data[13] * _data[2] * _data[11]-
307        _data[12] * _data[1] * _data[6] * _data[11]+
308        _data[0] * _data[13] * _data[6] * _data[11]+
309        _data[4] * _data[1] * _data[14] * _data[11]-
310        _data[0] * _data[5] * _data[14] * _data[11]-
311        _data[8] * _data[5] * _data[2] * _data[15]+
312        _data[4] * _data[9] * _data[2] * _data[15]+
313        _data[8] * _data[1] * _data[6] * _data[15]-
314        _data[0] * _data[9] * _data[6] * _data[15]-
315        _data[4] * _data[1] * _data[10] * _data[15]+
316        _data[0] * _data[5] * _data[10] * _data[15];
317
318    if ( det == 0.0f ) return;
319    det = 1 / det;
320
321    float mat[16];
322
323    mat[0] = (_data[9]*_data[14]*_data[7] -
324              _data[13]*_data[10]*_data[7] +
325              _data[13]*_data[6]*_data[11] -
326              _data[5]*_data[14]*_data[11] -
327              _data[9]*_data[6]*_data[15] +
328              _data[5]*_data[10]*_data[15]) * det;
329
330    mat[4] = (_data[12]*_data[10]*_data[7] -
331              _data[8]*_data[14]*_data[7] -
332              _data[12]*_data[6]*_data[11] +
333              _data[4]*_data[14]*_data[11] +
334              _data[8]*_data[6]*_data[15] -
335              _data[4]*_data[10]*_data[15]) * det;
336
337    mat[8] = (_data[8]*_data[13]*_data[7] -
338              _data[12]*_data[9]*_data[7] +
339              _data[12]*_data[5]*_data[11] -
340              _data[4]*_data[13]*_data[11] -
341              _data[8]*_data[5]*_data[15] +
342              _data[4]*_data[9]*_data[15]) * det;
343
344    mat[12] = (_data[12]*_data[9]*_data[6] -
345               _data[8]*_data[13]*_data[6] -
346               _data[12]*_data[5]*_data[10] +
347               _data[4]*_data[13]*_data[10] +
348               _data[8]*_data[5]*_data[14] -
349               _data[4]*_data[9]*_data[14]) * det;
350
351    mat[1] = (_data[13]*_data[10]*_data[3] -
352              _data[9]*_data[14]*_data[3] -
353              _data[13]*_data[2]*_data[11] +
354              _data[1]*_data[14]*_data[11] +
355              _data[9]*_data[2]*_data[15] -
356              _data[1]*_data[10]*_data[15]) * det;
357
358    mat[5] = (_data[8]*_data[14]*_data[3] -
359              _data[12]*_data[10]*_data[3] +
360              _data[12]*_data[2]*_data[11] -
361              _data[0]*_data[14]*_data[11] -
362              _data[8]*_data[2]*_data[15] +
363              _data[0]*_data[10]*_data[15]) * det;
364
365    mat[9] = (_data[12]*_data[9]*_data[3] -
366              _data[8]*_data[13]*_data[3] -
367              _data[12]*_data[1]*_data[11] +
368              _data[0]*_data[13]*_data[11] +
369              _data[8]*_data[1]*_data[15] -
370              _data[0]*_data[9]*_data[15]) * det;
371
372    mat[13] = (_data[8]*_data[13]*_data[2] -
373               _data[12]*_data[9]*_data[2] +
374               _data[12]*_data[1]*_data[10] -
375               _data[0]*_data[13]*_data[10] -
376               _data[8]*_data[1]*_data[14] +
377               _data[0]*_data[9]*_data[14]) * det;
378
379    mat[2] = (_data[5]*_data[14]*_data[3] -
380              _data[13]*_data[6]*_data[3] +
381              _data[13]*_data[2]*_data[7] -
382              _data[1]*_data[14]*_data[7] -
383              _data[5]*_data[2]*_data[15] +
384              _data[1]*_data[6]*_data[15]) * det;
385
386    mat[6] = (_data[12]*_data[6]*_data[3] -
387              _data[4]*_data[14]*_data[3] -
388              _data[12]*_data[2]*_data[7] +
389              _data[0]*_data[14]*_data[7] +
390              _data[4]*_data[2]*_data[15] -
391              _data[0]*_data[6]*_data[15]) * det;
392
393    mat[10] = (_data[4]*_data[13]*_data[3] -
394               _data[12]*_data[5]*_data[3] +
395               _data[12]*_data[1]*_data[7] -
396               _data[0]*_data[13]*_data[7] -
397               _data[4]*_data[1]*_data[15] +
398               _data[0]*_data[5]*_data[15]) * det;
399
400    mat[14] = (_data[12]*_data[5]*_data[2] -
401               _data[4]*_data[13]*_data[2] -
402               _data[12]*_data[1]*_data[6] +
403               _data[0]*_data[13]*_data[6] +
404               _data[4]*_data[1]*_data[14] -
405               _data[0]*_data[5]*_data[14]) * det;
406
407    mat[3] = (_data[9]*_data[6]*_data[3] -
408              _data[5]*_data[10]*_data[3] -
409              _data[9]*_data[2]*_data[7] +
410              _data[1]*_data[10]*_data[7] +
411              _data[5]*_data[2]*_data[11] -
412              _data[1]*_data[6]*_data[11]) * det;
413
414    mat[7] = (_data[4]*_data[10]*_data[3] -
415              _data[8]*_data[6]*_data[3] +
416              _data[8]*_data[2]*_data[7] -
417              _data[0]*_data[10]*_data[7] -
418              _data[4]*_data[2]*_data[11] +
419              _data[0]*_data[6]*_data[11]) * det;
420
421    mat[11] = (_data[8]*_data[5]*_data[3] -
422               _data[4]*_data[9]*_data[3] -
423               _data[8]*_data[1]*_data[7] +
424               _data[0]*_data[9]*_data[7] +
425               _data[4]*_data[1]*_data[11] -
426               _data[0]*_data[5]*_data[11]) * det;
427
428    mat[15] = (_data[4]*_data[9]*_data[2] -
429               _data[8]*_data[5]*_data[2] +
430               _data[8]*_data[1]*_data[6] -
431               _data[0]*_data[9]*_data[6] -
432               _data[4]*_data[1]*_data[10] +
433               _data[0]*_data[5]*_data[10]) * det;
434
435    set(mat);
436}
437
438void vrMatrix4x4f::invert(const vrMatrix4x4f& mat)
439{
440    float *data = (float *)mat._data;
441
442    float det =
443        data[12] * data[9] * data[6] * data[3]-
444        data[8] * data[13] * data[6] * data[3]-
445        data[12] * data[5] * data[10] * data[3]+
446        data[4] * data[13] * data[10] * data[3]+
447        data[8] * data[5] * data[14] * data[3]-
448        data[4] * data[9] * data[14] * data[3]-
449        data[12] * data[9] * data[2] * data[7]+
450        data[8] * data[13] * data[2] * data[7]+
451        data[12] * data[1] * data[10] * data[7]-
452        data[0] * data[13] * data[10] * data[7]-
453        data[8] * data[1] * data[14] * data[7]+
454        data[0] * data[9] * data[14] * data[7]+
455        data[12] * data[5] * data[2] * data[11]-
456        data[4] * data[13] * data[2] * data[11]-
457        data[12] * data[1] * data[6] * data[11]+
458        data[0] * data[13] * data[6] * data[11]+
459        data[4] * data[1] * data[14] * data[11]-
460        data[0] * data[5] * data[14] * data[11]-
461        data[8] * data[5] * data[2] * data[15]+
462        data[4] * data[9] * data[2] * data[15]+
463        data[8] * data[1] * data[6] * data[15]-
464        data[0] * data[9] * data[6] * data[15]-
465        data[4] * data[1] * data[10] * data[15]+
466        data[0] * data[5] * data[10] * data[15];
467
468    if ( det == 0.0f ) return;
469    det = 1 / det;
470
471    float dstData[16];
472
473    dstData[0] = (data[9]*data[14]*data[7] -
474                  data[13]*data[10]*data[7] +
475                  data[13]*data[6]*data[11] -
476                  data[5]*data[14]*data[11] -
477                  data[9]*data[6]*data[15] +
478                  data[5]*data[10]*data[15]) * det;
479
480    dstData[4] = (data[12]*data[10]*data[7] -
481                  data[8]*data[14]*data[7] -
482                  data[12]*data[6]*data[11] +
483                  data[4]*data[14]*data[11] +
484                  data[8]*data[6]*data[15] -
485                  data[4]*data[10]*data[15]) * det;
486
487    dstData[8] = (data[8]*data[13]*data[7] -
488                  data[12]*data[9]*data[7] +
489                  data[12]*data[5]*data[11] -
490                  data[4]*data[13]*data[11] -
491                  data[8]*data[5]*data[15] +
492                  data[4]*data[9]*data[15]) * det;
493
494    dstData[12] = (data[12]*data[9]*data[6] -
495                   data[8]*data[13]*data[6] -
496                   data[12]*data[5]*data[10] +
497                   data[4]*data[13]*data[10] +
498                   data[8]*data[5]*data[14] -
499                   data[4]*data[9]*data[14]) * det;
500
501    dstData[1] = (data[13]*data[10]*data[3] -
502                  data[9]*data[14]*data[3] -
503                  data[13]*data[2]*data[11] +
504                  data[1]*data[14]*data[11] +
505                  data[9]*data[2]*data[15] -
506                  data[1]*data[10]*data[15]) * det;
507
508    dstData[5] = (data[8]*data[14]*data[3] -
509                  data[12]*data[10]*data[3] +
510                  data[12]*data[2]*data[11] -
511                  data[0]*data[14]*data[11] -
512                  data[8]*data[2]*data[15] +
513                  data[0]*data[10]*data[15]) * det;
514
515    dstData[9] = (data[12]*data[9]*data[3] -
516                  data[8]*data[13]*data[3] -
517                  data[12]*data[1]*data[11] +
518                  data[0]*data[13]*data[11] +
519                  data[8]*data[1]*data[15] -
520                  data[0]*data[9]*data[15]) * det;
521
522    dstData[13] = (data[8]*data[13]*data[2] -
523                   data[12]*data[9]*data[2] +
524                   data[12]*data[1]*data[10] -
525                   data[0]*data[13]*data[10] -
526                   data[8]*data[1]*data[14] +
527                   data[0]*data[9]*data[14]) * det;
528
529    dstData[2] = (data[5]*data[14]*data[3] -
530                  data[13]*data[6]*data[3] +
531                  data[13]*data[2]*data[7] -
532                  data[1]*data[14]*data[7] -
533                  data[5]*data[2]*data[15] +
534                  data[1]*data[6]*data[15]) * det;
535
536    dstData[6] = (data[12]*data[6]*data[3] -
537                  data[4]*data[14]*data[3] -
538                  data[12]*data[2]*data[7] +
539                  data[0]*data[14]*data[7] +
540                  data[4]*data[2]*data[15] -
541                  data[0]*data[6]*data[15]) * det;
542
543    dstData[10] = (data[4]*data[13]*data[3] -
544                   data[12]*data[5]*data[3] +
545                   data[12]*data[1]*data[7] -
546                   data[0]*data[13]*data[7] -
547                   data[4]*data[1]*data[15] +
548                   data[0]*data[5]*data[15]) * det;
549
550    dstData[14] = (data[12]*data[5]*data[2] -
551                   data[4]*data[13]*data[2] -
552                   data[12]*data[1]*data[6] +
553                   data[0]*data[13]*data[6] +
554                   data[4]*data[1]*data[14] -
555                   data[0]*data[5]*data[14]) * det;
556
557    dstData[3] = (data[9]*data[6]*data[3] -
558                  data[5]*data[10]*data[3] -
559                  data[9]*data[2]*data[7] +
560                  data[1]*data[10]*data[7] +
561                  data[5]*data[2]*data[11] -
562                  data[1]*data[6]*data[11]) * det;
563
564    dstData[7] = (data[4]*data[10]*data[3] -
565                  data[8]*data[6]*data[3] +
566                  data[8]*data[2]*data[7] -
567                  data[0]*data[10]*data[7] -
568                  data[4]*data[2]*data[11] +
569                  data[0]*data[6]*data[11]) * det;
570
571    dstData[11] = (data[8]*data[5]*data[3] -
572                   data[4]*data[9]*data[3] -
573                   data[8]*data[1]*data[7] +
574                   data[0]*data[9]*data[7] +
575                   data[4]*data[1]*data[11] -
576                   data[0]*data[5]*data[11]) * det;
577
578    dstData[15] = (data[4]*data[9]*data[2] -
579                   data[8]*data[5]*data[2] +
580                   data[8]*data[1]*data[6] -
581                   data[0]*data[9]*data[6] -
582                   data[4]*data[1]*data[10] +
583                   data[0]*data[5]*data[10]) * det;
584
585    set(dstData);
586}
587
588void vrMatrix4x4f::invertFast(const vrMatrix4x4f& mat)
589{
590    float *srcData = (float *)mat._data;
591
592    float det =
593        srcData[12] * srcData[9] * srcData[6] * srcData[3]-
594        srcData[8] * srcData[13] * srcData[6] * srcData[3]-
595        srcData[12] * srcData[5] * srcData[10] * srcData[3]+
596        srcData[4] * srcData[13] * srcData[10] * srcData[3]+
597        srcData[8] * srcData[5] * srcData[14] * srcData[3]-
598        srcData[4] * srcData[9] * srcData[14] * srcData[3]-
599        srcData[12] * srcData[9] * srcData[2] * srcData[7]+
600        srcData[8] * srcData[13] * srcData[2] * srcData[7]+
601        srcData[12] * srcData[1] * srcData[10] * srcData[7]-
602        srcData[0] * srcData[13] * srcData[10] * srcData[7]-
603        srcData[8] * srcData[1] * srcData[14] * srcData[7]+
604        srcData[0] * srcData[9] * srcData[14] * srcData[7]+
605        srcData[12] * srcData[5] * srcData[2] * srcData[11]-
606        srcData[4] * srcData[13] * srcData[2] * srcData[11]-
607        srcData[12] * srcData[1] * srcData[6] * srcData[11]+
608        srcData[0] * srcData[13] * srcData[6] * srcData[11]+
609        srcData[4] * srcData[1] * srcData[14] * srcData[11]-
610        srcData[0] * srcData[5] * srcData[14] * srcData[11]-
611        srcData[8] * srcData[5] * srcData[2] * srcData[15]+
612        srcData[4] * srcData[9] * srcData[2] * srcData[15]+
613        srcData[8] * srcData[1] * srcData[6] * srcData[15]-
614        srcData[0] * srcData[9] * srcData[6] * srcData[15]-
615        srcData[4] * srcData[1] * srcData[10] * srcData[15]+
616        srcData[0] * srcData[5] * srcData[10] * srcData[15];
617
618    if ( det == 0.0f ) return;
619    det = 1 / det;
620
621    _data[0] = (srcData[9]*srcData[14]*srcData[7] -
622                srcData[13]*srcData[10]*srcData[7] +
623                srcData[13]*srcData[6]*srcData[11] -
624                srcData[5]*srcData[14]*srcData[11] -
625                srcData[9]*srcData[6]*srcData[15] +
626                srcData[5]*srcData[10]*srcData[15]) * det;
627
628    _data[4] = (srcData[12]*srcData[10]*srcData[7] -
629                srcData[8]*srcData[14]*srcData[7] -
630                srcData[12]*srcData[6]*srcData[11] +
631                srcData[4]*srcData[14]*srcData[11] +
632                srcData[8]*srcData[6]*srcData[15] -
633                srcData[4]*srcData[10]*srcData[15]) * det;
634
635    _data[8] = (srcData[8]*srcData[13]*srcData[7] -
636                srcData[12]*srcData[9]*srcData[7] +
637                srcData[12]*srcData[5]*srcData[11] -
638                srcData[4]*srcData[13]*srcData[11] -
639                srcData[8]*srcData[5]*srcData[15] +
640                srcData[4]*srcData[9]*srcData[15]) * det;
641
642    _data[12] = (srcData[12]*srcData[9]*srcData[6] -
643                 srcData[8]*srcData[13]*srcData[6] -
644                 srcData[12]*srcData[5]*srcData[10] +
645                 srcData[4]*srcData[13]*srcData[10] +
646                 srcData[8]*srcData[5]*srcData[14] -
647                 srcData[4]*srcData[9]*srcData[14]) * det;
648
649    _data[1] = (srcData[13]*srcData[10]*srcData[3] -
650                srcData[9]*srcData[14]*srcData[3] -
651                srcData[13]*srcData[2]*srcData[11] +
652                srcData[1]*srcData[14]*srcData[11] +
653                srcData[9]*srcData[2]*srcData[15] -
654                srcData[1]*srcData[10]*srcData[15]) * det;
655
656    _data[5] = (srcData[8]*srcData[14]*srcData[3] -
657                srcData[12]*srcData[10]*srcData[3] +
658                srcData[12]*srcData[2]*srcData[11] -
659                srcData[0]*srcData[14]*srcData[11] -
660                srcData[8]*srcData[2]*srcData[15] +
661                srcData[0]*srcData[10]*srcData[15]) * det;
662
663    _data[9] = (srcData[12]*srcData[9]*srcData[3] -
664                srcData[8]*srcData[13]*srcData[3] -
665                srcData[12]*srcData[1]*srcData[11] +
666                srcData[0]*srcData[13]*srcData[11] +
667                srcData[8]*srcData[1]*srcData[15] -
668                srcData[0]*srcData[9]*srcData[15]) * det;
669
670    _data[13] = (srcData[8]*srcData[13]*srcData[2] -
671                 srcData[12]*srcData[9]*srcData[2] +
672                 srcData[12]*srcData[1]*srcData[10] -
673                 srcData[0]*srcData[13]*srcData[10] -
674                 srcData[8]*srcData[1]*srcData[14] +
675                 srcData[0]*srcData[9]*srcData[14]) * det;
676
677    _data[2] = (srcData[5]*srcData[14]*srcData[3] -
678                srcData[13]*srcData[6]*srcData[3] +
679                srcData[13]*srcData[2]*srcData[7] -
680                srcData[1]*srcData[14]*srcData[7] -
681                srcData[5]*srcData[2]*srcData[15] +
682                srcData[1]*srcData[6]*srcData[15]) * det;
683
684    _data[6] = (srcData[12]*srcData[6]*srcData[3] -
685                srcData[4]*srcData[14]*srcData[3] -
686                srcData[12]*srcData[2]*srcData[7] +
687                srcData[0]*srcData[14]*srcData[7] +
688                srcData[4]*srcData[2]*srcData[15] -
689                srcData[0]*srcData[6]*srcData[15]) * det;
690
691    _data[10] = (srcData[4]*srcData[13]*srcData[3] -
692                 srcData[12]*srcData[5]*srcData[3] +
693                 srcData[12]*srcData[1]*srcData[7] -
694                 srcData[0]*srcData[13]*srcData[7] -
695                 srcData[4]*srcData[1]*srcData[15] +
696                 srcData[0]*srcData[5]*srcData[15]) * det;
697
698    _data[14] = (srcData[12]*srcData[5]*srcData[2] -
699                 srcData[4]*srcData[13]*srcData[2] -
700                 srcData[12]*srcData[1]*srcData[6] +
701                 srcData[0]*srcData[13]*srcData[6] +
702                 srcData[4]*srcData[1]*srcData[14] -
703                 srcData[0]*srcData[5]*srcData[14]) * det;
704
705    _data[3] = (srcData[9]*srcData[6]*srcData[3] -
706                srcData[5]*srcData[10]*srcData[3] -
707                srcData[9]*srcData[2]*srcData[7] +
708                srcData[1]*srcData[10]*srcData[7] +
709                srcData[5]*srcData[2]*srcData[11] -
710                srcData[1]*srcData[6]*srcData[11]) * det;
711
712    _data[7] = (srcData[4]*srcData[10]*srcData[3] -
713                srcData[8]*srcData[6]*srcData[3] +
714                srcData[8]*srcData[2]*srcData[7] -
715                srcData[0]*srcData[10]*srcData[7] -
716                srcData[4]*srcData[2]*srcData[11] +
717                srcData[0]*srcData[6]*srcData[11]) * det;
718
719    _data[11] = (srcData[8]*srcData[5]*srcData[3] -
720                 srcData[4]*srcData[9]*srcData[3] -
721                 srcData[8]*srcData[1]*srcData[7] +
722                 srcData[0]*srcData[9]*srcData[7] +
723                 srcData[4]*srcData[1]*srcData[11] -
724                 srcData[0]*srcData[5]*srcData[11]) * det;
725
726    _data[15] = (srcData[4]*srcData[9]*srcData[2] -
727                 srcData[8]*srcData[5]*srcData[2] +
728                 srcData[8]*srcData[1]*srcData[6] -
729                 srcData[0]*srcData[9]*srcData[6] -
730                 srcData[4]*srcData[1]*srcData[10] +
731                 srcData[0]*srcData[5]*srcData[10]) * det;
732}
733
734void vrMatrix4x4f::transpose()
735{
736    float m[16];
737
738    m[0] = _data[0];
739    m[1] = _data[4];
740    m[2] = _data[8];
741    m[3] = _data[12];
742
743    m[4] = _data[1];
744    m[5] = _data[5];
745    m[6] = _data[9];
746    m[7] = _data[13];
747
748    m[8] = _data[2];
749    m[9] = _data[6];
750    m[10] = _data[10];
751    m[11] = _data[14];
752
753    m[12] = _data[3];
754    m[13] = _data[7];
755    m[14] = _data[11];
756    m[15] = _data[15];
757
758    set(m);
759}
760
761void vrMatrix4x4f::transposeFast(const vrMatrix4x4f& mat)
762{
763    _data[0] = mat._data[0];
764    _data[1] = mat._data[4];
765    _data[2] = mat._data[8];
766    _data[3] = mat._data[12];
767
768    _data[4] = mat._data[1];
769    _data[5] = mat._data[5];
770    _data[6] = mat._data[9];
771    _data[7] = mat._data[13];
772
773    _data[8] = mat._data[2];
774    _data[9] = mat._data[6];
775    _data[10] = mat._data[10];
776    _data[11] = mat._data[14];
777
778    _data[12] = mat._data[3];
779    _data[13] = mat._data[7];
780    _data[14] = mat._data[11];
781    _data[15] = mat._data[15];
782}
783
784void vrMatrix4x4f::transpose(const vrMatrix4x4f& mat)
785{
786    float m[16];
787
788    m[0] = mat._data[0];
789    m[1] = mat._data[4];
790    m[2] = mat._data[8];
791    m[3] = mat._data[12];
792
793    m[4] = mat._data[1];
794    m[5] = mat._data[5];
795    m[6] = mat._data[9];
796    m[7] = mat._data[13];
797
798    m[8] = mat._data[2];
799    m[9] = mat._data[6];
800    m[10] = mat._data[10];
801    m[11] = mat._data[14];
802
803    m[12] = mat._data[3];
804    m[13] = mat._data[7];
805    m[14] = mat._data[11];
806    m[15] = mat._data[15];
807
808    set(m);
809}
810
811void vrMatrix4x4f::set(double* m)
812{
813    for (int i = 0; i < 16; ++i) {
814        _data[i] = (float)m[i];
815    }
816}
817
818void vrMatrix4x4f::multiply(const vrMatrix4x4f& mat1, const vrVector3f& position)
819{
820    vrMatrix4x4f mat;
821    mat.makeTranslation(position);
822    multiply(mat1, mat);
823}
824
825void vrMatrix4x4f::multiply(const vrMatrix4x4f& mat1, const vrRotation& rotation)
826{
827    vrMatrix4x4f mat;
828    mat.makeRotation(rotation);
829    multiply(mat1, mat);
830}
831
832void vrMatrix4x4f::multiply(const vrVector3f& position, const vrMatrix4x4f& mat1)
833{
834    vrMatrix4x4f mat;
835    mat.makeTranslation(position);
836    multiply(mat, mat1);
837}
838
839void vrMatrix4x4f::multiply(const vrRotation& rotation, const vrMatrix4x4f& mat1)
840{
841    vrMatrix4x4f mat;
842    mat.makeRotation(rotation);
843    multiply(mat, mat1);
844}
845
846void vrMatrix4x4f::makeVecRotVec(const vrVector3f& vec1, const vrVector3f& vec2)
847{
848    vrVector3f axis;
849    axis.cross(vec1, vec2);
850
851    float angle = atan2(axis.length(), vec1.dot(vec2));
852    if (axis.normalize() == 0.0f) {
853        makeIdentity();
854    } else {
855        makeRotation(axis.x, axis.y, axis.z, angle);
856    }
857}
858
859void vrMatrix4x4f::multiplyScale(const vrMatrix4x4f& mat1, const vrVector3f& scale)
860{
861    vrMatrix4x4f mat;
862    mat.makeScale(scale);
863    multiply(mat1, mat);
864}
865
866void vrMatrix4x4f::multiplyScale(const vrVector3f& scale, const vrMatrix4x4f& mat1)
867{
868    vrMatrix4x4f mat;
869    mat.makeScale(scale);
870    multiply(mat, mat1);
871}
Note: See TracBrowser for help on using the repository browser.