31 #ifndef OPENVDB_MATH_MAT4_H_HAS_BEEN_INCLUDED
32 #define OPENVDB_MATH_MAT4_H_HAS_BEEN_INCLUDED
34 #include <openvdb/Exceptions.h>
35 #include <openvdb/Platform.h>
51 template<
typename T>
class Vec4;
75 template<
typename Source>
78 for (
int i = 0; i < 16; i++) {
90 template<
typename Source>
91 Mat4(Source a, Source b, Source c, Source d,
92 Source e, Source f, Source g, Source h,
93 Source i, Source j, Source k, Source l,
94 Source m, Source n, Source o, Source p)
118 template<
typename Source>
122 setBasis(v1, v2, v3, v4);
128 for (
int i = 0; i < 4; ++i) {
129 for (
int j = 0; j < 4; ++j) {
130 MyBase::mm[i*4 + j] = m[i][j];
136 template<
typename Source>
141 for (
int i=0; i<16; ++i) {
142 MyBase::mm[i] =
static_cast<T
>(src[i]);
161 MyBase::mm[i4+0] = v[0];
162 MyBase::mm[i4+1] = v[1];
163 MyBase::mm[i4+2] = v[2];
164 MyBase::mm[i4+3] = v[3];
171 return Vec4<T>((*this)(i,0), (*
this)(i,1), (*
this)(i,2), (*
this)(i,3));
178 MyBase::mm[ 0+j] = v[0];
179 MyBase::mm[ 4+j] = v[1];
180 MyBase::mm[ 8+j] = v[2];
181 MyBase::mm[12+j] = v[3];
188 return Vec4<T>((*this)(0,j), (*
this)(1,j), (*
this)(2,j), (*
this)(3,j));
192 T* operator[](
int i) {
return &(MyBase::mm[i<<2]); }
195 const T*
operator[](
int i)
const {
return &(MyBase::mm[i<<2]); }
209 return MyBase::mm[4*i+j];
219 return MyBase::mm[4*i+j];
226 MyBase::mm[ 0] = v1[0];
227 MyBase::mm[ 1] = v1[1];
228 MyBase::mm[ 2] = v1[2];
229 MyBase::mm[ 3] = v1[3];
231 MyBase::mm[ 4] = v2[0];
232 MyBase::mm[ 5] = v2[1];
233 MyBase::mm[ 6] = v2[2];
234 MyBase::mm[ 7] = v2[3];
236 MyBase::mm[ 8] = v3[0];
237 MyBase::mm[ 9] = v3[1];
238 MyBase::mm[10] = v3[2];
239 MyBase::mm[11] = v3[3];
241 MyBase::mm[12] = v4[0];
242 MyBase::mm[13] = v4[1];
243 MyBase::mm[14] = v4[2];
244 MyBase::mm[15] = v4[3];
297 for (
int i = 0; i < 3; i++)
298 for (
int j=0; j < 3; j++)
299 MyBase::mm[i*4+j] = m[i][j];
306 for (
int i = 0; i < 3; i++)
307 for (
int j = 0; j < 3; j++)
308 m[i][j] = MyBase::mm[i*4+j];
316 return Vec3<T>(MyBase::mm[12], MyBase::mm[13], MyBase::mm[14]);
321 MyBase::mm[12] = t[0];
322 MyBase::mm[13] = t[1];
323 MyBase::mm[14] = t[2];
327 template<
typename Source>
333 std::copy(src, (src + this->numElements()), MyBase::mm);
338 bool eq(
const Mat4 &m, T eps=1.0e-8)
const
340 for (
int i = 0; i < 16; i++) {
351 -MyBase::mm[ 0], -MyBase::mm[ 1], -MyBase::mm[ 2], -MyBase::mm[ 3],
352 -MyBase::mm[ 4], -MyBase::mm[ 5], -MyBase::mm[ 6], -MyBase::mm[ 7],
353 -MyBase::mm[ 8], -MyBase::mm[ 9], -MyBase::mm[10], -MyBase::mm[11],
354 -MyBase::mm[12], -MyBase::mm[13], -MyBase::mm[14], -MyBase::mm[15]
359 template <
typename S>
362 MyBase::mm[ 0] *= scalar;
363 MyBase::mm[ 1] *= scalar;
364 MyBase::mm[ 2] *= scalar;
365 MyBase::mm[ 3] *= scalar;
367 MyBase::mm[ 4] *= scalar;
368 MyBase::mm[ 5] *= scalar;
369 MyBase::mm[ 6] *= scalar;
370 MyBase::mm[ 7] *= scalar;
372 MyBase::mm[ 8] *= scalar;
373 MyBase::mm[ 9] *= scalar;
374 MyBase::mm[10] *= scalar;
375 MyBase::mm[11] *= scalar;
377 MyBase::mm[12] *= scalar;
378 MyBase::mm[13] *= scalar;
379 MyBase::mm[14] *= scalar;
380 MyBase::mm[15] *= scalar;
385 template <
typename S>
390 MyBase::mm[ 0] += s[ 0];
391 MyBase::mm[ 1] += s[ 1];
392 MyBase::mm[ 2] += s[ 2];
393 MyBase::mm[ 3] += s[ 3];
395 MyBase::mm[ 4] += s[ 4];
396 MyBase::mm[ 5] += s[ 5];
397 MyBase::mm[ 6] += s[ 6];
398 MyBase::mm[ 7] += s[ 7];
400 MyBase::mm[ 8] += s[ 8];
401 MyBase::mm[ 9] += s[ 9];
402 MyBase::mm[10] += s[10];
403 MyBase::mm[11] += s[11];
405 MyBase::mm[12] += s[12];
406 MyBase::mm[13] += s[13];
407 MyBase::mm[14] += s[14];
408 MyBase::mm[15] += s[15];
414 template <
typename S>
419 MyBase::mm[ 0] -= s[ 0];
420 MyBase::mm[ 1] -= s[ 1];
421 MyBase::mm[ 2] -= s[ 2];
422 MyBase::mm[ 3] -= s[ 3];
424 MyBase::mm[ 4] -= s[ 4];
425 MyBase::mm[ 5] -= s[ 5];
426 MyBase::mm[ 6] -= s[ 6];
427 MyBase::mm[ 7] -= s[ 7];
429 MyBase::mm[ 8] -= s[ 8];
430 MyBase::mm[ 9] -= s[ 9];
431 MyBase::mm[10] -= s[10];
432 MyBase::mm[11] -= s[11];
434 MyBase::mm[12] -= s[12];
435 MyBase::mm[13] -= s[13];
436 MyBase::mm[14] -= s[14];
437 MyBase::mm[15] -= s[15];
443 template <
typename S>
451 for (
int i = 0; i < 4; i++) {
453 MyBase::mm[i4+0] =
static_cast<T
>(s0[i4+0] * s1[ 0] +
458 MyBase::mm[i4+1] =
static_cast<T
>(s0[i4+0] * s1[ 1] +
463 MyBase::mm[i4+2] =
static_cast<T
>(s0[i4+0] * s1[ 2] +
468 MyBase::mm[i4+3] =
static_cast<T
>(s0[i4+0] * s1[ 3] +
480 MyBase::mm[ 0], MyBase::mm[ 4], MyBase::mm[ 8], MyBase::mm[12],
481 MyBase::mm[ 1], MyBase::mm[ 5], MyBase::mm[ 9], MyBase::mm[13],
482 MyBase::mm[ 2], MyBase::mm[ 6], MyBase::mm[10], MyBase::mm[14],
483 MyBase::mm[ 3], MyBase::mm[ 7], MyBase::mm[11], MyBase::mm[15]
513 T m0011 = m[0][0] * m[1][1];
514 T m0012 = m[0][0] * m[1][2];
515 T m0110 = m[0][1] * m[1][0];
516 T m0210 = m[0][2] * m[1][0];
517 T m0120 = m[0][1] * m[2][0];
518 T m0220 = m[0][2] * m[2][0];
520 T detA = m0011 * m[2][2] - m0012 * m[2][1] - m0110 * m[2][2]
521 + m0210 * m[2][1] + m0120 * m[1][2] - m0220 * m[1][1];
523 bool hasPerspective =
530 if (hasPerspective) {
531 det = m[0][3] * det3(m, 1,2,3, 0,2,1)
532 + m[1][3] * det3(m, 2,0,3, 0,2,1)
533 + m[2][3] * det3(m, 3,0,1, 0,2,1)
536 det = detA * m[3][3];
547 invertible = m.invert(inv, tolerance);
556 inv[0][0] = detA * ( m[1][1] * m[2][2] - m[1][2] * m[2][1]);
557 inv[0][1] = detA * (-m[0][1] * m[2][2] + m[0][2] * m[2][1]);
558 inv[0][2] = detA * ( m[0][1] * m[1][2] - m[0][2] * m[1][1]);
560 inv[1][0] = detA * (-m[1][0] * m[2][2] + m[1][2] * m[2][0]);
561 inv[1][1] = detA * ( m[0][0] * m[2][2] - m0220);
562 inv[1][2] = detA * ( m0210 - m0012);
564 inv[2][0] = detA * ( m[1][0] * m[2][1] - m[1][1] * m[2][0]);
565 inv[2][1] = detA * ( m0120 - m[0][0] * m[2][1]);
566 inv[2][2] = detA * ( m0011 - m0110);
568 if (hasPerspective) {
573 r[0] = m[3][0] * inv[0][0] + m[3][1] * inv[1][0]
574 + m[3][2] * inv[2][0];
575 r[1] = m[3][0] * inv[0][1] + m[3][1] * inv[1][1]
576 + m[3][2] * inv[2][1];
577 r[2] = m[3][0] * inv[0][2] + m[3][1] * inv[1][2]
578 + m[3][2] * inv[2][2];
581 p[0] = inv[0][0] * m[0][3] + inv[0][1] * m[1][3]
582 + inv[0][2] * m[2][3];
583 p[1] = inv[1][0] * m[0][3] + inv[1][1] * m[1][3]
584 + inv[1][2] * m[2][3];
585 p[2] = inv[2][0] * m[0][3] + inv[2][1] * m[1][3]
586 + inv[2][2] * m[2][3];
588 T h = m[3][3] - p.
dot(
Vec3<T>(m[3][0],m[3][1],m[3][2]));
599 inv[3][0] = -h * r[0];
600 inv[3][1] = -h * r[1];
601 inv[3][2] = -h * r[2];
603 inv[0][3] = -h * p[0];
604 inv[1][3] = -h * p[1];
605 inv[2][3] = -h * p[2];
611 inv[0][0] += p[0] * r[0];
612 inv[0][1] += p[0] * r[1];
613 inv[0][2] += p[0] * r[2];
614 inv[1][0] += p[1] * r[0];
615 inv[1][1] += p[1] * r[1];
616 inv[1][2] += p[1] * r[2];
617 inv[2][0] += p[2] * r[0];
618 inv[2][1] += p[2] * r[1];
619 inv[2][2] += p[2] * r[2];
623 inv[3][0] = - (m[3][0] * inv[0][0] + m[3][1] * inv[1][0]
624 + m[3][2] * inv[2][0]);
625 inv[3][1] = - (m[3][0] * inv[0][1] + m[3][1] * inv[1][1]
626 + m[3][2] * inv[2][1]);
627 inv[3][2] = - (m[3][0] * inv[0][2] + m[3][1] * inv[1][2]
628 + m[3][2] * inv[2][2]);
652 for (i = 0; i < 4; i++) {
653 ap = &MyBase::mm[ 0];
655 for (j = 0; j < 4; j++) {
656 for (k = 0; k < 4; k++) {
657 if ((k != i) && (j != 0)) {
664 det += sign * MyBase::mm[i] * submat.
det();
676 {
return snapBasis(*
this, axis, direction);}
682 T(1), T(0), T(0), T(0),
683 T(0), T(1), T(0), T(0),
684 T(0), T(0), T(1), T(0),
685 T(v.
x()), T(v.
y()),T(v.
z()), T(1));
689 template <
typename T0>
707 MyBase::mm[12] = v.
x();
708 MyBase::mm[13] = v.
y();
709 MyBase::mm[14] = v.
z();
714 template <
typename T0>
720 *
this = Tr * (*this);
725 template <
typename T0>
731 *
this = (*this) * Tr;
737 template <
typename T0>
741 MyBase::mm[ 0] = v.
x();
742 MyBase::mm[ 5] = v.
y();
743 MyBase::mm[10] = v.
z();
747 template <
typename T0>
750 MyBase::mm[ 0] *= v.
x();
751 MyBase::mm[ 1] *= v.
x();
752 MyBase::mm[ 2] *= v.
x();
753 MyBase::mm[ 3] *= v.
x();
755 MyBase::mm[ 4] *= v.
y();
756 MyBase::mm[ 5] *= v.
y();
757 MyBase::mm[ 6] *= v.
y();
758 MyBase::mm[ 7] *= v.
y();
760 MyBase::mm[ 8] *= v.
z();
761 MyBase::mm[ 9] *= v.
z();
762 MyBase::mm[10] *= v.
z();
763 MyBase::mm[11] *= v.
z();
769 template <
typename T0>
773 MyBase::mm[ 0] *= v.
x();
774 MyBase::mm[ 1] *= v.
y();
775 MyBase::mm[ 2] *= v.
z();
777 MyBase::mm[ 4] *= v.
x();
778 MyBase::mm[ 5] *= v.
y();
779 MyBase::mm[ 6] *= v.
z();
781 MyBase::mm[ 8] *= v.
x();
782 MyBase::mm[ 9] *= v.
y();
783 MyBase::mm[10] *= v.
z();
785 MyBase::mm[12] *= v.
x();
786 MyBase::mm[13] *= v.
y();
787 MyBase::mm[14] *= v.
z();
812 T c =
static_cast<T
>(cos(angle));
813 T s = -
static_cast<T
>(sin(angle));
820 a4 = c * MyBase::mm[ 4] - s * MyBase::mm[ 8];
821 a5 = c * MyBase::mm[ 5] - s * MyBase::mm[ 9];
822 a6 = c * MyBase::mm[ 6] - s * MyBase::mm[10];
823 a7 = c * MyBase::mm[ 7] - s * MyBase::mm[11];
826 MyBase::mm[ 8] = s * MyBase::mm[ 4] + c * MyBase::mm[ 8];
827 MyBase::mm[ 9] = s * MyBase::mm[ 5] + c * MyBase::mm[ 9];
828 MyBase::mm[10] = s * MyBase::mm[ 6] + c * MyBase::mm[10];
829 MyBase::mm[11] = s * MyBase::mm[ 7] + c * MyBase::mm[11];
842 a0 = c * MyBase::mm[ 0] + s * MyBase::mm[ 8];
843 a1 = c * MyBase::mm[ 1] + s * MyBase::mm[ 9];
844 a2 = c * MyBase::mm[ 2] + s * MyBase::mm[10];
845 a3 = c * MyBase::mm[ 3] + s * MyBase::mm[11];
847 MyBase::mm[ 8] = -s * MyBase::mm[ 0] + c * MyBase::mm[ 8];
848 MyBase::mm[ 9] = -s * MyBase::mm[ 1] + c * MyBase::mm[ 9];
849 MyBase::mm[10] = -s * MyBase::mm[ 2] + c * MyBase::mm[10];
850 MyBase::mm[11] = -s * MyBase::mm[ 3] + c * MyBase::mm[11];
864 a0 = c * MyBase::mm[ 0] - s * MyBase::mm[ 4];
865 a1 = c * MyBase::mm[ 1] - s * MyBase::mm[ 5];
866 a2 = c * MyBase::mm[ 2] - s * MyBase::mm[ 6];
867 a3 = c * MyBase::mm[ 3] - s * MyBase::mm[ 7];
869 MyBase::mm[ 4] = s * MyBase::mm[ 0] + c * MyBase::mm[ 4];
870 MyBase::mm[ 5] = s * MyBase::mm[ 1] + c * MyBase::mm[ 5];
871 MyBase::mm[ 6] = s * MyBase::mm[ 2] + c * MyBase::mm[ 6];
872 MyBase::mm[ 7] = s * MyBase::mm[ 3] + c * MyBase::mm[ 7];
892 T c =
static_cast<T
>(cos(angle));
893 T s = -
static_cast<T
>(sin(angle));
902 a2 = c * MyBase::mm[ 2] - s * MyBase::mm[ 1];
903 a6 = c * MyBase::mm[ 6] - s * MyBase::mm[ 5];
904 a10 = c * MyBase::mm[10] - s * MyBase::mm[ 9];
905 a14 = c * MyBase::mm[14] - s * MyBase::mm[13];
908 MyBase::mm[ 1] = c * MyBase::mm[ 1] + s * MyBase::mm[ 2];
909 MyBase::mm[ 5] = c * MyBase::mm[ 5] + s * MyBase::mm[ 6];
910 MyBase::mm[ 9] = c * MyBase::mm[ 9] + s * MyBase::mm[10];
911 MyBase::mm[13] = c * MyBase::mm[13] + s * MyBase::mm[14];
915 MyBase::mm[10] = a10;
916 MyBase::mm[14] = a14;
924 a2 = c * MyBase::mm[ 2] + s * MyBase::mm[ 0];
925 a6 = c * MyBase::mm[ 6] + s * MyBase::mm[ 4];
926 a10 = c * MyBase::mm[10] + s * MyBase::mm[ 8];
927 a14 = c * MyBase::mm[14] + s * MyBase::mm[12];
929 MyBase::mm[ 0] = c * MyBase::mm[ 0] - s * MyBase::mm[ 2];
930 MyBase::mm[ 4] = c * MyBase::mm[ 4] - s * MyBase::mm[ 6];
931 MyBase::mm[ 8] = c * MyBase::mm[ 8] - s * MyBase::mm[10];
932 MyBase::mm[12] = c * MyBase::mm[12] - s * MyBase::mm[14];
936 MyBase::mm[10] = a10;
937 MyBase::mm[14] = a14;
945 a1 = c * MyBase::mm[ 1] - s * MyBase::mm[ 0];
946 a5 = c * MyBase::mm[ 5] - s * MyBase::mm[ 4];
947 a9 = c * MyBase::mm[ 9] - s * MyBase::mm[ 8];
948 a13 = c * MyBase::mm[13] - s * MyBase::mm[12];
950 MyBase::mm[ 0] = c * MyBase::mm[ 0] + s * MyBase::mm[ 1];
951 MyBase::mm[ 4] = c * MyBase::mm[ 4] + s * MyBase::mm[ 5];
952 MyBase::mm[ 8] = c * MyBase::mm[ 8] + s * MyBase::mm[ 9];
953 MyBase::mm[12] = c * MyBase::mm[12] + s * MyBase::mm[13];
958 MyBase::mm[13] = a13;
974 *
this = shear<Mat4<T> >(axis0, axis1, shearby);
982 int index0 =
static_cast<int>(axis0);
983 int index1 =
static_cast<int>(axis1);
986 MyBase::mm[index1 * 4 + 0] += shear * MyBase::mm[index0 * 4 + 0];
987 MyBase::mm[index1 * 4 + 1] += shear * MyBase::mm[index0 * 4 + 1];
988 MyBase::mm[index1 * 4 + 2] += shear * MyBase::mm[index0 * 4 + 2];
989 MyBase::mm[index1 * 4 + 3] += shear * MyBase::mm[index0 * 4 + 3];
997 int index0 =
static_cast<int>(axis0);
998 int index1 =
static_cast<int>(axis1);
1001 MyBase::mm[index0 + 0] += shear * MyBase::mm[index1 + 0];
1002 MyBase::mm[index0 + 4] += shear * MyBase::mm[index1 + 4];
1003 MyBase::mm[index0 + 8] += shear * MyBase::mm[index1 + 8];
1004 MyBase::mm[index0 + 12] += shear * MyBase::mm[index1 + 12];
1009 template<
typename T0>
1012 return static_cast< Vec4<T0> >(v * *
this);
1016 template<
typename T0>
1019 return static_cast< Vec3<T0> >(v * *
this);
1023 template<
typename T0>
1026 return static_cast< Vec4<T0> >(*
this * v);
1030 template<
typename T0>
1033 return static_cast< Vec3<T0> >(*
this * v);
1037 template<
typename T0>
1043 w = p[0] * MyBase::mm[ 3] + p[1] * MyBase::mm[ 7] + p[2] * MyBase::mm[11] + MyBase::mm[15];
1046 return Vec3<T0>(
static_cast<T0
>((p[0] * MyBase::mm[ 0] + p[1] * MyBase::mm[ 4] +
1047 p[2] * MyBase::mm[ 8] + MyBase::mm[12]) / w),
1048 static_cast<T0
>((p[0] * MyBase::mm[ 1] + p[1] * MyBase::mm[ 5] +
1049 p[2] * MyBase::mm[ 9] + MyBase::mm[13]) / w),
1050 static_cast<T0
>((p[0] * MyBase::mm[ 2] + p[1] * MyBase::mm[ 6] +
1051 p[2] * MyBase::mm[10] + MyBase::mm[14]) / w));
1058 template<
typename T0>
1064 w = p[0] * MyBase::mm[12] + p[1] * MyBase::mm[13] + p[2] * MyBase::mm[14] + MyBase::mm[15];
1067 return Vec3<T0>(
static_cast<T0
>((p[0] * MyBase::mm[ 0] + p[1] * MyBase::mm[ 1] +
1068 p[2] * MyBase::mm[ 2] + MyBase::mm[ 3]) / w),
1069 static_cast<T0
>((p[0] * MyBase::mm[ 4] + p[1] * MyBase::mm[ 5] +
1070 p[2] * MyBase::mm[ 6] + MyBase::mm[ 7]) / w),
1071 static_cast<T0
>((p[0] * MyBase::mm[ 8] + p[1] * MyBase::mm[ 9] +
1072 p[2] * MyBase::mm[10] + MyBase::mm[11]) / w));
1079 template<
typename T0>
1083 static_cast<T0
>(v[0] * MyBase::mm[ 0] + v[1] * MyBase::mm[ 4] + v[2] * MyBase::mm[ 8]),
1084 static_cast<T0>(v[0] * MyBase::mm[ 1] + v[1] * MyBase::mm[ 5] + v[2] * MyBase::mm[ 9]),
1085 static_cast<T0
>(v[0] * MyBase::mm[ 2] + v[1] * MyBase::mm[ 6] + v[2] * MyBase::mm[10]));
1090 bool invert(
Mat4<T> &inverse, T tolerance)
const;
1092 T det2(
const Mat4<T> &a,
int i0,
int i1,
int j0,
int j1)
const {
1095 return a.
mm[i0row+j0]*a.
mm[i1row+j1] - a.
mm[i0row+j1]*a.
mm[i1row+j0];
1098 T det3(
const Mat4<T> &a,
int i0,
int i1,
int i2,
1099 int j0,
int j1,
int j2)
const {
1101 return a.mm[i0row+j0]*det2(a, i1,i2, j1,j2) +
1102 a.mm[i0row+j1]*det2(a, i1,i2, j2,j0) +
1103 a.mm[i0row+j2]*det2(a, i1,i2, j0,j1);
1106 static const Mat4<T> sIdentity;
1107 static const Mat4<T> sZero;
1111 template <
typename T>
1112 const Mat4<T> Mat4<T>::sIdentity = Mat4<T>(1, 0, 0, 0,
1117 template <
typename T>
1118 const Mat4<T> Mat4<T>::sZero = Mat4<T>(0, 0, 0, 0,
1125 template <
typename T0,
typename T1>
1131 for (
int i=0; i<16; ++i)
if (!
isExactlyEqual(t0[i], t1[i]))
return false;
1137 template <
typename T0,
typename T1>
1142 template <
typename S,
typename T>
1150 template <
typename S,
typename T>
1160 template<
typename T,
typename MT>
1167 _v[0]*m[0] + _v[1]*m[1] + _v[2]*m[2] + _v[3]*m[3],
1168 _v[0]*m[4] + _v[1]*m[5] + _v[2]*m[6] + _v[3]*m[7],
1169 _v[0]*m[8] + _v[1]*m[9] + _v[2]*m[10] + _v[3]*m[11],
1170 _v[0]*m[12] + _v[1]*m[13] + _v[2]*m[14] + _v[3]*m[15]);
1175 template<
typename T,
typename MT>
1182 _v[0]*m[0] + _v[1]*m[4] + _v[2]*m[8] + _v[3]*m[12],
1183 _v[0]*m[1] + _v[1]*m[5] + _v[2]*m[9] + _v[3]*m[13],
1184 _v[0]*m[2] + _v[1]*m[6] + _v[2]*m[10] + _v[3]*m[14],
1185 _v[0]*m[3] + _v[1]*m[7] + _v[2]*m[11] + _v[3]*m[15]);
1191 template<
typename T,
typename MT>
1198 _v[0]*m[0] + _v[1]*m[1] + _v[2]*m[2] + m[3],
1199 _v[0]*m[4] + _v[1]*m[5] + _v[2]*m[6] + m[7],
1200 _v[0]*m[8] + _v[1]*m[9] + _v[2]*m[10] + m[11]);
1206 template<
typename T,
typename MT>
1213 _v[0]*m[0] + _v[1]*m[4] + _v[2]*m[8] + m[12],
1214 _v[0]*m[1] + _v[1]*m[5] + _v[2]*m[9] + m[13],
1215 _v[0]*m[2] + _v[1]*m[6] + _v[2]*m[10] + m[14]);
1220 template <
typename T0,
typename T1>
1231 template <
typename T0,
typename T1>
1243 template <
typename T0,
typename T1>
1256 template<
typename T0,
typename T1>
1260 static_cast<T1
>(m[0][0]*n[0] + m[0][1]*n[1] + m[0][2]*n[2]),
1261 static_cast<T1>(m[1][0]*n[0] + m[1][1]*n[1] + m[1][2]*n[2]),
1262 static_cast<T1
>(m[2][0]*n[0] + m[2][1]*n[1] + m[2][2]*n[2]));
1267 template<
typename T>
1268 bool Mat4<T>::invert(Mat4<T> &inverse, T tolerance)
const
1270 Mat4<T> temp(*
this);
1271 inverse.setIdentity();
1275 for (
int i = 0; i < 4; ++i) {
1277 double max = fabs(temp[i][i]);
1279 for (
int k = i+1; k < 4; ++k) {
1280 if (fabs(temp[k][i]) > max) {
1282 max = fabs(temp[k][i]);
1291 for (
int k = 0; k < 4; ++k) {
1292 std::swap(temp[row][k], temp[i][k]);
1293 std::swap(inverse[row][k], inverse[i][k]);
1297 double pivot = temp[i][i];
1301 for (
int k = 0; k < 4; ++k) {
1302 temp[i][k] /= pivot;
1303 inverse[i][k] /= pivot;
1307 for (
int j = i+1; j < 4; ++j) {
1308 double t = temp[j][i];
1311 for (
int k = 0; k < 4; ++k) {
1312 temp[j][k] -= temp[i][k] * t;
1313 inverse[j][k] -= inverse[i][k] * t;
1320 for (
int i = 3; i > 0; --i) {
1321 for (
int j = 0; j < i; ++j) {
1322 double t = temp[j][i];
1325 for (
int k = 0; k < 4; ++k) {
1326 inverse[j][k] -= inverse[i][k]*t;
1331 return det*det >= tolerance*tolerance;
1334 template <
typename T>
1339 template <
typename T>
1348 #if DWREAL_IS_DOUBLE == 1
1352 #endif // DWREAL_IS_DOUBLE
1357 template<>
inline math::Mat4s zeroVal<math::Mat4s>() {
return math::Mat4s::identity(); }
1358 template<>
inline math::Mat4d zeroVal<math::Mat4d>() {
return math::Mat4d::identity(); }
1363 #endif // OPENVDB_UTIL_MAT4_H_HAS_BEEN_INCLUDED
Vec4< T > row(int i) const
Get ith row, e.g. Vec4f v = m.row(1);.
Definition: Mat4.h:168
4x4 -matrix class.
Definition: Mat3.h:48
Mat4< double > Mat4d
Definition: Mat4.h:1346
Mat4(const Vec4< Source > &v1, const Vec4< Source > &v2, const Vec4< Source > &v3, const Vec4< Source > &v4)
Construct matrix given basis vectors (columns)
Definition: Mat4.h:119
Mat3< T > getMat3() const
Definition: Mat4.h:302
void postRotate(Axis axis, T angle)
Right multiplies by a rotation clock-wiseabout the given axis into this matrix.
Definition: Mat4.h:890
T * asPointer()
Direct access to the internal data.
Definition: Mat4.h:199
static const Mat4< T > & zero()
Predefined constant for zero matrix.
Definition: Mat4.h:152
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
Mat4 snapBasis(Axis axis, const Vec3< T > &direction)
Definition: Mat4.h:675
T & z()
Definition: Vec3.h:96
Vec4< T0 > transform(const Vec4< T0 > &v) const
Transform a Vec4 by post-multiplication.
Definition: Mat4.h:1010
Definition: Exceptions.h:78
Vec3< T0 > transform3x3(const Vec3< T0 > &v) const
Transform a Vec3 by post-multiplication, without translation.
Definition: Mat4.h:1080
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:97
void setBasis(const Vec4< T > &v1, const Vec4< T > &v2, const Vec4< T > &v3, const Vec4< T > &v4)
Set the columns of "this" matrix to the vectors v1, v2, v3, v4.
Definition: Mat4.h:223
const Mat4< T > & operator*=(S scalar)
Return m, where for .
Definition: Mat4.h:360
void setToRotation(Axis axis, T angle)
Sets the matrix to a rotation about the given axis.
Definition: Mat4.h:795
Mat4< typename promote< S, T >::type > operator*(S scalar, const Mat4< T > &m)
Returns M, where for .
Definition: Mat4.h:1143
const Mat4< T > & operator*=(const Mat4< S > &m1)
Return m, where for .
Definition: Mat4.h:444
T angle(const Vec2< T > &v1, const Vec2< T > &v2)
Definition: Vec2.h:446
3x3 matrix class.
Definition: Mat3.h:54
Mat4 inverse(T tolerance=0) const
Definition: Mat4.h:490
static const Mat4< T > & identity()
Predefined constant for identity matrix.
Definition: Mat4.h:147
void preTranslate(const Vec3< T0 > &tr)
Left multiples by the specified translation, i.e. Trans * (*this)
Definition: Mat4.h:715
void preShear(Axis axis0, Axis axis1, T shear)
Left multiplies a shearing transformation into the matrix.
Definition: Mat4.h:980
T det() const
Determinant of matrix.
Definition: Mat4.h:642
void setToScale(const Vec3< T0 > &v)
Sets the matrix to a matrix that scales by v.
Definition: Mat4.h:738
Vec3< T > getTranslation() const
Return the translation component.
Definition: Mat4.h:314
void setToRotation(const Vec3< T > &axis, T angle)
Sets the matrix to a rotation about an arbitrary axis.
Definition: Mat4.h:800
void setMat3(const Mat3< T > &m)
Set upper left to a Mat3.
Definition: Mat4.h:295
Vec4< T > col(int j) const
Get jth column, e.g. Vec4f v = m.col(0);.
Definition: Mat4.h:185
const Mat4< T > & operator+=(const Mat4< S > &m1)
Returns m0, where for .
Definition: Mat4.h:386
T operator()(int i, int j) const
Definition: Mat4.h:215
T & y()
Definition: Vec3.h:95
Vec4< typename promote< T, MT >::type > operator*(const Mat4< MT > &_m, const Vec4< T > &_v)
Returns v, where for .
Definition: Mat4.h:1162
Mat4< typename promote< T0, T1 >::type > operator*(const Mat4< T0 > &m0, const Mat4< T1 > &m1)
Returns M, where for .
Definition: Mat4.h:1245
T & operator()(int i, int j)
Definition: Mat4.h:205
Vec3< T0 > pretransform(const Vec3< T0 > &v) const
Transform a Vec3 by pre-multiplication, without homogenous division.
Definition: Mat4.h:1031
Mat4(const Mat4< Source > &m)
Conversion constructor.
Definition: Mat4.h:137
Mat4(Source a, Source b, Source c, Source d, Source e, Source f, Source g, Source h, Source i, Source j, Source k, Source l, Source m, Source n, Source o, Source p)
Constructor given array of elements, the ordering is in row major form:
Definition: Mat4.h:91
MatType shear(Axis axis0, Axis axis1, typename MatType::value_type shear)
Set the matrix to a shear along axis0 by a fraction of axis1.
Definition: Mat.h:666
const T * operator[](int i) const
Definition: Mat4.h:195
Vec3< T0 > transformH(const Vec3< T0 > &p) const
Transform a Vec3 by post-multiplication, doing homogenous divison.
Definition: Mat4.h:1038
void setTranslation(const Vec3< T > &t)
Definition: Mat4.h:319
#define OPENVDB_VERSION_NAME
Definition: version.h:45
void postScale(const Vec3< T0 > &v)
Definition: Mat4.h:770
bool operator!=(const Mat4< T0 > &m0, const Mat4< T1 > &m1)
Inequality operator, does exact floating point comparisons.
Definition: Mat4.h:1138
bool isAffine(const Mat4< T > &m)
Definition: Mat4.h:1335
T dot(const Vec3< T > &v) const
Dot product.
Definition: Vec3.h:199
OPENVDB_API Hermite max(const Hermite &, const Hermite &)
min and max operations done directly on the compressed data.
void setIdentity()
Set "this" matrix to identity.
Definition: Mat4.h:270
bool isExactlyEqual(const T0 &a, const T1 &b)
Return true if a is exactly equal to b.
Definition: Math.h:351
Mat4< T > operator-() const
Negation operator, for e.g. m1 = -m2;.
Definition: Mat4.h:348
Mat4< typename promote< S, T >::type > operator*(const Mat4< T > &m, S scalar)
Returns M, where for .
Definition: Mat4.h:1151
Mat4(const Mat< 4, T > &m)
Copy constructor.
Definition: Mat4.h:126
void postShear(Axis axis0, Axis axis1, T shear)
Right multiplies a shearing transformation into the matrix.
Definition: Mat4.h:995
Vec4< T0 > pretransform(const Vec4< T0 > &v) const
Transform a Vec4 by pre-multiplication.
Definition: Mat4.h:1024
void postTranslate(const Vec3< T0 > &tr)
Right multiplies by the specified translation matrix, i.e. (*this) * Trans.
Definition: Mat4.h:726
Mat4< float > Mat4s
Definition: Mat4.h:1345
Vec3< T0 > pretransformH(const Vec3< T0 > &p) const
Transform a Vec3 by pre-multiplication, doing homogenous division.
Definition: Mat4.h:1059
void setRow(int i, const Vec4< T > &v)
Set ith row to vector v.
Definition: Mat4.h:157
Vec3< T1 > transformNormal(const Mat4< T0 > &m, const Vec3< T1 > &n)
Definition: Mat4.h:1257
Vec3< typename promote< T, MT >::type > operator*(const Vec3< T > &_v, const Mat4< MT > &_m)
Returns v, where for .
Definition: Mat4.h:1208
Mat4()
Trivial constructor, the matrix is NOT initialized.
Definition: Mat4.h:66
bool isApproxEqual(const Hermite &lhs, const Hermite &rhs)
Definition: Hermite.h:470
Axis
Definition: Math.h:767
Vec3< T0 > transform(const Vec3< T0 > &v) const
Transform a Vec3 by post-multiplication, without homogenous division.
Definition: Mat4.h:1017
Vec3< typename promote< T, MT >::type > operator*(const Mat4< MT > &_m, const Vec3< T > &_v)
Returns v, where for .
Definition: Mat4.h:1193
void setZero()
Definition: Mat4.h:249
Mat4s Mat4f
Definition: Mat4.h:1351
bool operator==(const Mat4< T0 > &m0, const Mat4< T1 > &m1)
Equality operator, does exact floating point comparisons.
Definition: Mat4.h:1126
void setCol(int j, const Vec4< T > &v)
Set jth column to vector v.
Definition: Mat4.h:175
const Mat4< T > & operator-=(const Mat4< S > &m1)
Returns m0, where for .
Definition: Mat4.h:415
const T * asPointer() const
Definition: Mat4.h:200
T * asPointer()
Definition: Mat3.h:201
T mm[SIZE *SIZE]
Definition: Mat.h:141
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:67
T det() const
Determinant of matrix.
Definition: Mat3.h:481
Mat4(Source *a)
Constructor given array of elements, the ordering is in row major form:
Definition: Mat4.h:76
void preScale(const Vec3< T0 > &v)
Definition: Mat4.h:748
void setToTranslation(const Vec3< T0 > &v)
Sets the matrix to a matrix that translates by v.
Definition: Mat4.h:690
Mat4< typename promote< T0, T1 >::type > operator-(const Mat4< T0 > &m0, const Mat4< T1 > &m1)
Returns M, where for .
Definition: Mat4.h:1233
void setToShear(Axis axis0, Axis axis1, T shearby)
Sets the matrix to a shear along axis0 by a fraction of axis1.
Definition: Mat4.h:972
bool hasTranslation(const Mat4< T > &m)
Definition: Mat4.h:1340
T & x()
Reference to the component, e.g. v.x() = 4.5f;.
Definition: Vec3.h:94
Mat< 4, T > MyBase
Definition: Mat4.h:63
T ValueType
Definition: Mat4.h:62
T value_type
Data type held by the matrix.
Definition: Mat4.h:61
Mat4< typename promote< T0, T1 >::type > operator+(const Mat4< T0 > &m0, const Mat4< T1 > &m1)
Returns M, where for .
Definition: Mat4.h:1222
static Mat4 translation(const Vec3d &v)
Sets the matrix to a matrix that translates by v.
Definition: Mat4.h:679
void preRotate(Axis axis, T angle)
Left multiplies by a rotation clock-wiseabout the given axis into this matrix.
Definition: Mat4.h:810
Vec4< typename promote< T, MT >::type > operator*(const Vec4< T > &_v, const Mat4< MT > &_m)
Returns v, where for .
Definition: Mat4.h:1177
bool eq(const Mat4 &m, T eps=1.0e-8) const
Test if "this" is equivalent to m with tolerance of eps value.
Definition: Mat4.h:338
const Mat4 & operator=(const Mat4< Source > &m)
Assignment operator.
Definition: Mat4.h:328
Mat4 transpose() const
Definition: Mat4.h:477
void setToRotation(const Vec3< T > &v1, const Vec3< T > &v2)
Sets the matrix to a rotation that maps v1 onto v2 about the cross product of v1 and v2...
Definition: Mat4.h:804