36 template<
typename T >
43 static const size_t DIM = 3;
78 Matrix33(
const T *dt,
bool srcIsRowMajor =
false );
81 Matrix33( T d0, T d1, T d2, T d3, T d4, T d5, T d6, T d7, T d8,
bool srcIsRowMajor =
false );
86 template<
typename FromT >
93 operator T*() {
return (T*)
m; }
94 operator const T*()
const {
return (
const T*)
m; }
99 template<
typename FromT >
131 T&
at(
int row,
int col );
132 const T&
at(
int row,
int col )
const;
135 void set(
const T *dt,
bool srcIsRowMajor = false );
137 void set( T d0, T d1, T d2, T d3, T d4, T d5, T d6, T d7, T d8,
bool srcIsRowMajor = false );
181 template <
template <
typename>
class VecT>
184 template <
template <
typename>
class VecT>
187 template <
template <
typename>
class VecT>
214 friend std::ostream& operator<<( std::ostream &lhs, const Matrix33<T> &rhs )
216 for(
int i = 0; i < 3; i++) {
218 for(
int j = 0; j < 3; j++) {
219 lhs << std::setw( 12 ) << std::setprecision( 5 ) << rhs.m[j*3+i];
221 lhs <<
"|" << std::endl;
228 template<
typename T >
234 template<
typename T >
237 for(
int i = 0; i < DIM_SQ; ++i ) {
242 template<
typename T >
245 set( dt, srcIsRowMajor );
248 template<
typename T >
253 d6, d7, d8, srcIsRowMajor );
256 template<
typename T >
259 m00 = vx.
x; m01 = vy.
x; m02 = vz.
x;
260 m10 = vx.
y; m11 = vy.
y; m12 = vz.
y;
261 m20 = vx.
z; m21 = vy.
z; m22 = vz.
z;
264 template<
typename T >
265 template<
typename FromT >
268 for(
int i = 0; i < DIM_SQ; ++i ) {
269 m[i] =
static_cast<T
>( src.
m[i] );
273 template<
typename T >
277 m00 = src.
m00; m01 = src.
m01;
278 m10 = src.
m10; m11 = src.
m11;
281 template<
typename T >
284 std::memcpy( m, src.
m, MEM_LEN );
287 template<
typename T >
290 memcpy( m, rhs.
m, MEM_LEN );
294 template<
typename T >
297 for(
int i = 0; i < DIM_SQ; ++i ) {
303 template<
typename T >
304 template<
typename FromT >
307 for(
int i = 0; i < DIM_SQ; i++ ) {
308 m[i] =
static_cast<T
>(rhs.
m[i]);
313 template<
typename T >
317 m00 = rhs.
m00; m01 = rhs.
m01;
318 m10 = rhs.
m10; m11 = rhs.
m11;
322 template<
typename T >
325 for(
int i = 0; i < DIM_SQ; ++i ) {
332 template<
typename T >
337 mat.
m[0] = m[0]*rhs.
m[0] + m[3]*rhs.
m[1] + m[6]*rhs.
m[2];
338 mat.
m[1] = m[1]*rhs.
m[0] + m[4]*rhs.
m[1] + m[7]*rhs.
m[2];
339 mat.
m[2] = m[2]*rhs.
m[0] + m[5]*rhs.
m[1] + m[8]*rhs.
m[2];
341 mat.
m[3] = m[0]*rhs.
m[3] + m[3]*rhs.
m[4] + m[6]*rhs.
m[5];
342 mat.
m[4] = m[1]*rhs.
m[3] + m[4]*rhs.
m[4] + m[7]*rhs.
m[5];
343 mat.
m[5] = m[2]*rhs.
m[3] + m[5]*rhs.
m[4] + m[8]*rhs.
m[5];
345 mat.
m[6] = m[0]*rhs.
m[6] + m[3]*rhs.
m[7] + m[6]*rhs.
m[8];
346 mat.
m[7] = m[1]*rhs.
m[6] + m[4]*rhs.
m[7] + m[7]*rhs.
m[8];
347 mat.
m[8] = m[2]*rhs.
m[6] + m[5]*rhs.
m[7] + m[8]*rhs.
m[8];
354 template<
typename T >
357 for(
int i = 0; i < DIM_SQ; ++i ) {
363 template<
typename T >
366 for(
int i = 0; i < DIM_SQ; ++i ) {
372 template<
typename T >
375 for(
int i = 0; i < DIM_SQ; ++i ) {
381 template<
typename T >
385 for(
int i = 0; i < DIM_SQ; ++i ) {
391 template<
typename T >
394 for(
int i = 0; i < DIM_SQ; ++i ) {
400 template<
typename T >
403 for(
int i = 0; i < DIM_SQ; ++i ) {
409 template<
typename T >
414 ret.
m[0] = m[0]*rhs.
m[0] + m[3]*rhs.
m[1] + m[6]*rhs.
m[2];
415 ret.
m[1] = m[1]*rhs.
m[0] + m[4]*rhs.
m[1] + m[7]*rhs.
m[2];
416 ret.
m[2] = m[2]*rhs.
m[0] + m[5]*rhs.
m[1] + m[8]*rhs.
m[2];
418 ret.
m[3] = m[0]*rhs.
m[3] + m[3]*rhs.
m[4] + m[6]*rhs.
m[5];
419 ret.
m[4] = m[1]*rhs.
m[3] + m[4]*rhs.
m[4] + m[7]*rhs.
m[5];
420 ret.
m[5] = m[2]*rhs.
m[3] + m[5]*rhs.
m[4] + m[8]*rhs.
m[5];
422 ret.
m[6] = m[0]*rhs.
m[6] + m[3]*rhs.
m[7] + m[6]*rhs.
m[8];
423 ret.
m[7] = m[1]*rhs.
m[6] + m[4]*rhs.
m[7] + m[7]*rhs.
m[8];
424 ret.
m[8] = m[2]*rhs.
m[6] + m[5]*rhs.
m[7] + m[8]*rhs.
m[8];
429 template<
typename T >
433 for(
int i = 0; i < DIM_SQ; ++i ) {
434 ret.
m[i] = m[i] + rhs.
m[i];
439 template<
typename T >
443 for(
int i = 0; i < DIM_SQ; ++i ) {
444 ret.
m[i] = m[i] - rhs.
m[i];
449 template<
typename T >
453 m[0]*rhs.
x + m[3]*rhs.
y + m[6]*rhs.
z,
454 m[1]*rhs.
x + m[4]*rhs.
y + m[7]*rhs.
z,
455 m[2]*rhs.
x + m[5]*rhs.
y + m[8]*rhs.
z
459 template<
typename T >
463 for(
int i = 0; i < DIM_SQ; ++i ) {
469 template<
typename T >
474 for(
int i = 0; i < DIM_SQ; ++i ) {
480 template<
typename T >
484 for(
int i = 0; i < DIM_SQ; ++i ) {
485 ret.
m[i] = m[i] + rhs;
490 template<
typename T >
494 for(
int i = 0; i < DIM_SQ; ++i ) {
495 ret.
m[i] = m[i] - rhs;
500 template<
typename T >
503 assert(row >= 0 && row < DIM);
504 assert(col >= 0 && col < DIM);
505 return m[col*DIM + row];
508 template<
typename T >
511 assert(row >= 0 && row < DIM);
512 assert(col >= 0 && col < DIM);
513 return m[col*DIM + row];
516 template<
typename T >
519 if( srcIsRowMajor ) {
520 m[0] = dt[0]; m[3] = dt[1]; m[6] = dt[2];
521 m[1] = dt[3]; m[4] = dt[4]; m[7] = dt[5];
522 m[2] = dt[6]; m[5] = dt[7]; m[8] = dt[8];
525 std::memcpy( m, dt, MEM_LEN );
529 template<
typename T >
530 void Matrix33<T>::set( T d0, T d1, T d2, T d3, T d4, T d5, T d6, T d7, T d8,
bool srcIsRowMajor )
532 if( srcIsRowMajor ) {
533 m[0] = d0; m[3] = d1; m[6] = d2;
534 m[1] = d3; m[4] = d4; m[7] = d5;
535 m[2] = d6; m[5] = d7; m[8] = d8;
538 m[0] = d0; m[3] = d3; m[6] = d6;
539 m[1] = d1; m[4] = d4; m[7] = d7;
540 m[2] = d2; m[5] = d5; m[8] = d8;
544 template<
typename T >
555 template<
typename T >
564 template<
typename T >
574 template<
typename T >
582 template<
typename T >
585 *c0 = getColumn( 0 );
586 *c1 = getColumn( 1 );
587 *c2 = getColumn( 2 );
590 template<
typename T >
598 template<
typename T >
606 template<
typename T >
614 template<
typename T >
620 for(
int i = 0; i < 2; ++i ) {
625 for(
int j = 0; j < 2; ++j ) {
630 ret.
at( i, j ) = at( r, c );
637 template<
typename T >
640 std::memset( m, 0, MEM_LEN );
643 template<
typename T >
646 m00 = 1; m01 = 0; m02 = 0;
647 m10 = 0; m11 = 1; m12 = 0;
648 m20 = 0; m21 = 0; m22 = 1;
651 template<
typename T >
654 T co00 = m[4]*m[8] - m[5]*m[7];
655 T co10 = m[5]*m[6] - m[3]*m[8];
656 T co20 = m[3]*m[7] - m[4]*m[6];
658 T det = m[0]*co00 + m[1]*co10 + m[2]*co20;
663 template<
typename T >
666 return m00 + m11 + m22;
669 template<
typename T >
679 template<
typename T >
684 ret.
m10 = m10; ret.
m11 = m11; ret.
m12 = 0;
685 ret.
m20 = m20; ret.
m21 = m21; ret.
m22 = m22;
689 template<
typename T >
693 ret.
m00 = m00; ret.
m01 = m01; ret.
m02 = m02;
694 ret.
m10 = 0; ret.
m11 = m11; ret.
m12 = m12;
699 template<
typename T >
703 t = m01; m01 = m10; m10 = t;
704 t = m02; m02 = m20; m20 = t;
705 t = m12; m12 = m21; m21 = t;
708 template<
typename T >
718 template<
typename T >
724 inv.
m[0] = m[4]*m[8] - m[5]*m[7];
725 inv.
m[1] = m[2]*m[7] - m[1]*m[8];
726 inv.
m[2] = m[1]*m[5] - m[2]*m[4];
727 inv.
m[3] = m[5]*m[6] - m[3]*m[8];
728 inv.
m[4] = m[0]*m[8] - m[2]*m[6];
729 inv.
m[5] = m[2]*m[3] - m[0]*m[5];
730 inv.
m[6] = m[3]*m[7] - m[4]*m[6];
731 inv.
m[7] = m[1]*m[6] - m[0]*m[7];
732 inv.
m[8] = m[0]*m[4] - m[1]*m[3];
734 T det = m[0]*inv.
m[0] + m[1]*inv.
m[3] + m[2]*inv.
m[6];
736 if( fabs( det ) > epsilon ) {
752 template<
typename T >
756 v.
x*m00 + v.
y*m10 + v.
z*m20,
757 v.
x*m01 + v.
y*m11 + v.
z*m21,
758 v.
x*m02 + v.
y*m12 + v.
z*m22
762 template<
typename T >
766 m00*v.
x + m01*v.
y + m02*v.
z,
767 m10*v.
x + m11*v.
y + m12*v.
z,
768 m20*v.
x + m21*v.
y + m22*v.
z
772 template<
typename T >
778 for(
int i = 0; i < DIM; i++ ) {
779 for(
int j = 0; j < DIM; j++ ) {
780 ret.
at( j, i ) = at( i, j );
803 Matrix33<T> zAxis2ToDir = alignZAxisWithTarget( to, worldUp );
804 return fromDir2zAxis * zAxis2ToDir;
817 ret.
m[0] = unit.x * unit.x * (1 - cosine) + cosine;
818 ret.
m[1] = unit.x * unit.y * (1 - cosine) + unit.z * sine;
819 ret.
m[2] = unit.x * unit.z * (1 - cosine) - unit.y * sine;
821 ret.
m[3] = unit.x * unit.y * (1 - cosine) - unit.z * sine;
822 ret.
m[4] = unit.y * unit.y * (1 - cosine) + cosine;
823 ret.
m[5] = unit.y * unit.z * (1 - cosine) + unit.x * sine;
825 ret.
m[6] = unit.x * unit.z * (1 - cosine) + unit.y * sine;
826 ret.
m[7] = unit.y * unit.z * (1 - cosine) - unit.x * sine;
827 ret.
m[8] = unit.z * unit.z * (1 - cosine) + cosine;
845 T cos_rz, sin_rz, cos_ry, sin_ry, cos_rx, sin_rx;
855 ret.
m[0] = cos_rz*cos_ry;
856 ret.
m[1] = sin_rz*cos_ry;
859 ret.
m[3] = -sin_rz*cos_rx + cos_rz*sin_ry*sin_rx;
860 ret.
m[4] = cos_rz*cos_rx + sin_rz*sin_ry*sin_rx;
861 ret.
m[5] = cos_ry*sin_rx;
863 ret.
m[6] = sin_rz*sin_rx + cos_rz*sin_ry*cos_rx;
864 ret.
m[7] = -cos_rz*sin_rx + sin_rz*sin_ry*cos_rx;
865 ret.
m[8] = cos_ry*cos_rx;
921 if( upDir.
cross( targetDir ).lengthSquared() == 0 ) {
942 row[0].x, row[0].y, row[0].z,
943 row[1].x, row[1].y, row[1].z,
944 row[2].x, row[2].y, row[2].z