111 bool IsTrsDecomposable()
const;
119 double GetDeterminant()
const;
120 bool HasReflection()
const;
122 const TYPE *ValPtr()
const;
125 operator const TYPE*()
const;
126 unsigned int SizeOf()
const;
127 TYPE& operator()(
int i,
int j);
128 TYPE operator()(
int i,
int j)
const;
184 retpoint.x = matrix.matrix[0][0] *
point.x + matrix.matrix[0][1] *
point.y + matrix.matrix[0][2] *
point.z + matrix.matrix[0][3];
185 retpoint.y = matrix.matrix[1][0] *
point.x + matrix.matrix[1][1] *
point.y + matrix.matrix[1][2] *
point.z + matrix.matrix[1][3];
186 retpoint.z = matrix.matrix[2][0] *
point.x + matrix.matrix[2][1] *
point.y + matrix.matrix[2][2] *
point.z + matrix.matrix[2][3];
207 retvect.x = matrix.matrix[0][0]*vector.x + matrix.matrix[0][1]*vector.y + matrix.matrix[0][2]*vector.z;
208 retvect.y = matrix.matrix[1][0]*vector.x + matrix.matrix[1][1]*vector.y + matrix.matrix[1][2]*vector.z;
209 retvect.z = matrix.matrix[2][0]*vector.x + matrix.matrix[2][1]*vector.y + matrix.matrix[2][2]*vector.z;
232 retpoint.x = (
TYPE)(matrix.matrix[0][0] *
point.x + matrix.matrix[0][1] *
point.y + matrix.matrix[0][2] *
point.z + matrix.matrix[0][3]);
233 retpoint.y = (
TYPE)(matrix.matrix[1][0] *
point.x + matrix.matrix[1][1] *
point.y + matrix.matrix[1][2] *
point.z + matrix.matrix[1][3]);
234 retpoint.z = (
TYPE)(matrix.matrix[2][0] *
point.x + matrix.matrix[2][1] *
point.y + matrix.matrix[2][2] *
point.z + matrix.matrix[2][3]);
255 retvect.x = (
TYPE)(matrix.matrix[0][0] * vector.x + matrix.matrix[0][1] * vector.y + matrix.matrix[0][2] * vector.z);
256 retvect.y = (
TYPE)(matrix.matrix[1][0] * vector.x + matrix.matrix[1][1] * vector.y + matrix.matrix[1][2] * vector.z);
257 retvect.z = (
TYPE)(matrix.matrix[2][0] * vector.x + matrix.matrix[2][1] * vector.y + matrix.matrix[2][2] * vector.z);
280 for (
i = 0;
i < 4;
i++)
281 for (
j = 0;
j < 4;
j++)
337 return static_cast<unsigned int>(
sizeof(matrix));
357 for (
i = 0;
i < 4;
i++)
358 for (
j = 0;
j < 4;
j++)
418 matrix[3][0] = matrix[3][1] = matrix[3][2] = 0;
429 matrix[3][0] = matrix[3][1] = matrix[3][2] = 0;
443 matrix[1][2] = (real)(2.0 *(
tmp1 +
tmp2));
444 matrix[2][1] = (real)(2.0 *(
tmp1 -
tmp2));
447 matrix[0][2] = (real)(2.0 *(
tmp1 -
tmp2));
448 matrix[2][0] = (real)(2.0 *(
tmp1 +
tmp2));
451 matrix[0][1] = (real)(2.0 *(
tmp1 +
tmp2));
452 matrix[1][0] = (real)(2.0 *(
tmp1 -
tmp2));
468 matrix[3][0] = matrix[3][1] = matrix[3][2] = 0;
471 matrix[0][0] =
static_cast<real
>((
x2 -
y2 -
z2 +
w2)*
invs);
472 matrix[1][1] =
static_cast<real
>((-
x2 +
y2 -
z2 +
w2)*
invs);
473 matrix[2][2] =
static_cast<real
>((-
x2 -
y2 +
z2 +
w2)*
invs);
478 matrix[0][1] =
static_cast<real
>(2.0 * (
tmp1 +
tmp2)*
invs);
479 matrix[1][0] =
static_cast<real
>(2.0 * (
tmp1 -
tmp2)*
invs);
483 matrix[0][2] =
static_cast<real
>(2.0 * (
tmp1 -
tmp2)*
invs);
484 matrix[2][0] =
static_cast<real
>(2.0 * (
tmp1 +
tmp2)*
invs);
488 matrix[1][2] =
static_cast<real
>(2.0 * (
tmp1 +
tmp2)*
invs);
489 matrix[2][1] =
static_cast<real
>(2.0 * (
tmp1 -
tmp2)*
invs);
533 return mootools::IsTrsDecomposable(
matd);
538 return mootools::IsTrsDecomposable(*
this);
549#if defined(__WINDOWS__) && defined(__64BITS__)
550#pragma optimize("", off)
560 matrix[
j][
i] = matrix[
i][
j];
564#if defined(__WINDOWS__) && defined(__64BITS__)
565#pragma optimize("", on)
631 result.matrix[0][0] = this->matrix[0][0]*
matrix1.matrix[0][0]+this->matrix[0][1]*
matrix1.matrix[1][0]+this->matrix[0][2]*
matrix1.matrix[2][0]+this->matrix[0][3]*
matrix1.matrix[3][0];
632 result.matrix[0][1] = this->matrix[0][0]*
matrix1.matrix[0][1]+this->matrix[0][1]*
matrix1.matrix[1][1]+this->matrix[0][2]*
matrix1.matrix[2][1]+this->matrix[0][3]*
matrix1.matrix[3][1];
633 result.matrix[0][2] = this->matrix[0][0]*
matrix1.matrix[0][2]+this->matrix[0][1]*
matrix1.matrix[1][2]+this->matrix[0][2]*
matrix1.matrix[2][2]+this->matrix[0][3]*
matrix1.matrix[3][2];
634 result.matrix[0][3] = this->matrix[0][0]*
matrix1.matrix[0][3]+this->matrix[0][1]*
matrix1.matrix[1][3]+this->matrix[0][2]*
matrix1.matrix[2][3]+this->matrix[0][3]*
matrix1.matrix[3][3];
636 result.matrix[1][0] = this->matrix[1][0]*
matrix1.matrix[0][0]+this->matrix[1][1]*
matrix1.matrix[1][0]+this->matrix[1][2]*
matrix1.matrix[2][0]+this->matrix[1][3]*
matrix1.matrix[3][0];
637 result.matrix[1][1] = this->matrix[1][0]*
matrix1.matrix[0][1]+this->matrix[1][1]*
matrix1.matrix[1][1]+this->matrix[1][2]*
matrix1.matrix[2][1]+this->matrix[1][3]*
matrix1.matrix[3][1];
638 result.matrix[1][2] = this->matrix[1][0]*
matrix1.matrix[0][2]+this->matrix[1][1]*
matrix1.matrix[1][2]+this->matrix[1][2]*
matrix1.matrix[2][2]+this->matrix[1][3]*
matrix1.matrix[3][2];
639 result.matrix[1][3] = this->matrix[1][0]*
matrix1.matrix[0][3]+this->matrix[1][1]*
matrix1.matrix[1][3]+this->matrix[1][2]*
matrix1.matrix[2][3]+this->matrix[1][3]*
matrix1.matrix[3][3];
641 result.matrix[2][0] = this->matrix[2][0]*
matrix1.matrix[0][0]+this->matrix[2][1]*
matrix1.matrix[1][0]+this->matrix[2][2]*
matrix1.matrix[2][0]+this->matrix[2][3]*
matrix1.matrix[3][0];
642 result.matrix[2][1] = this->matrix[2][0]*
matrix1.matrix[0][1]+this->matrix[2][1]*
matrix1.matrix[1][1]+this->matrix[2][2]*
matrix1.matrix[2][1]+this->matrix[2][3]*
matrix1.matrix[3][1];
643 result.matrix[2][2] = this->matrix[2][0]*
matrix1.matrix[0][2]+this->matrix[2][1]*
matrix1.matrix[1][2]+this->matrix[2][2]*
matrix1.matrix[2][2]+this->matrix[2][3]*
matrix1.matrix[3][2];
644 result.matrix[2][3] = this->matrix[2][0]*
matrix1.matrix[0][3]+this->matrix[2][1]*
matrix1.matrix[1][3]+this->matrix[2][2]*
matrix1.matrix[2][3]+this->matrix[2][3]*
matrix1.matrix[3][3];
646 result.matrix[3][0] = this->matrix[3][0]*
matrix1.matrix[0][0]+this->matrix[3][1]*
matrix1.matrix[1][0]+this->matrix[3][2]*
matrix1.matrix[2][0]+this->matrix[3][3]*
matrix1.matrix[3][0];
647 result.matrix[3][1] = this->matrix[3][0]*
matrix1.matrix[0][1]+this->matrix[3][1]*
matrix1.matrix[1][1]+this->matrix[3][2]*
matrix1.matrix[2][1]+this->matrix[3][3]*
matrix1.matrix[3][1];
648 result.matrix[3][2] = this->matrix[3][0]*
matrix1.matrix[0][2]+this->matrix[3][1]*
matrix1.matrix[1][2]+this->matrix[3][2]*
matrix1.matrix[2][2]+this->matrix[3][3]*
matrix1.matrix[3][2];
649 result.matrix[3][3] = this->matrix[3][0]*
matrix1.matrix[0][3]+this->matrix[3][1]*
matrix1.matrix[1][3]+this->matrix[3][2]*
matrix1.matrix[2][3]+this->matrix[3][3]*
matrix1.matrix[3][3];
656 matrix[0][0] *= value;
657 matrix[0][1] *= value;
658 matrix[0][2] *= value;
659 matrix[0][3] *= value;
661 matrix[1][0] *= value;
662 matrix[1][1] *= value;
663 matrix[1][2] *= value;
664 matrix[1][3] *= value;
666 matrix[2][0] *= value;
667 matrix[2][1] *= value;
668 matrix[2][2] *= value;
669 matrix[2][3] *= value;
673template <
class TYPE2>
678 retvector.dir.x = matrix[0][0]*vector.dir.x + matrix[0][1]*vector.dir.y + matrix[0][2]*vector.dir.z + matrix[0][3]*vector.t;
679 retvector.dir.y = matrix[1][0]*vector.dir.x + matrix[1][1]*vector.dir.y + matrix[1][2]*vector.dir.z + matrix[1][3]*vector.t;
680 retvector.dir.z = matrix[2][0]*vector.dir.x + matrix[2][1]*vector.dir.y + matrix[2][2]*vector.dir.z + matrix[2][3]*vector.t;
681 retvector.t = matrix[3][0]*vector.dir.x + matrix[3][1]*vector.dir.y + matrix[3][2]*vector.dir.z + matrix[3][3]*vector.t;
693 matrix[
i][0] = vector.x;
694 matrix[
i][1] = vector.y;
695 matrix[
i][2] = vector.z;
705 matrix[0][
i] = vector.x;
706 matrix[1][
i] = vector.y;
707 matrix[2][
i] = vector.z;
715 retvector.dir.x = matrix[0][0]*x + matrix[0][1]*y + matrix[0][2]*z + matrix[0][3];
716 retvector.dir.y = matrix[1][0]*x + matrix[1][1]*y + matrix[1][2]*z + matrix[1][3];
717 retvector.dir.z = matrix[2][0]*x + matrix[2][1]*y + matrix[2][2]*z + matrix[2][3];
718 retvector.t = matrix[3][0]*x + matrix[3][1]*y + matrix[3][2]*z + matrix[3][3];
789 for (
i = 0;
i < 4;
i++)
790 for (
j = 0;
j < 4;
j++)
803 for (
i = 0;
i < 4;
i++)
804 for (
j = 0;
j < 4;
j++)
815 matrix[0][3] += (
TYPE)x;
816 matrix[1][3] += (
TYPE)y;
817 matrix[2][3] += (
TYPE)z;
821template <
class TYPE2>
831 matrix[0][3] = (
TYPE)x;
832 matrix[1][3] = (
TYPE)y;
833 matrix[2][3] = (
TYPE)z;
834 matrix[3][3] = (
TYPE)1.0;
843 matrix[3][3] = (
TYPE)1.0;
879 matrix[0][0] = (
TYPE)x;
880 matrix[1][1] = (
TYPE)y;
881 matrix[2][2] = (
TYPE)z;
932 C3DTVector<TYPE2> UU(1.0,0.0,0.0),
VV(0.0,1.0,0.0),
WW(0.0,0.0,1.0),
OO(0.0,0.0,0.0);
948 scale = scale.Invert();
953 if (
fabs(scale.x - 1.0f) > FLOAT_EPSILON ||
fabs(scale.y - 1.0f) > FLOAT_EPSILON ||
fabs(scale.z - 1.0f) > FLOAT_EPSILON)
954 XTRACE(
trace3DModule, 0,
"C4x4Matrix::NoScale lack of precision\n");
961 Rotate(
heading, 0.0, 1.0, 0.0);
962 Rotate(
pitch, 1.0, 0.0, 0.0);
963 Rotate(
bank, 0.0, 0.0, 1.0);
1010 if (HasReflection())
1012 XTRACE(
"C4x4TMatrix::GetHPBAngles matrix has reflection, angle might be false\n");