31 #ifndef OPENVDB_MATH_MAT4_H_HAS_BEEN_INCLUDED 32 #define OPENVDB_MATH_MAT4_H_HAS_BEEN_INCLUDED 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)
96 MyBase::mm[ 0] = T(a);
97 MyBase::mm[ 1] = T(b);
98 MyBase::mm[ 2] = T(c);
99 MyBase::mm[ 3] = T(d);
101 MyBase::mm[ 4] = T(e);
102 MyBase::mm[ 5] = T(f);
103 MyBase::mm[ 6] = T(g);
104 MyBase::mm[ 7] = T(h);
106 MyBase::mm[ 8] = T(i);
107 MyBase::mm[ 9] = T(j);
108 MyBase::mm[10] = T(k);
109 MyBase::mm[11] = T(l);
111 MyBase::mm[12] = T(m);
112 MyBase::mm[13] = T(n);
113 MyBase::mm[14] = T(o);
114 MyBase::mm[15] = T(p);
119 template<
typename Source>
124 this->setRows(v1, v2, v3, v4);
126 this->setColumns(v1, v2, v3, v4);
133 for (
int i = 0; i < 4; ++i) {
134 for (
int j = 0; j < 4; ++j) {
135 MyBase::mm[i*4 + j] = m[i][j];
141 template<
typename Source>
146 for (
int i=0; i<16; ++i) {
147 MyBase::mm[i] =
static_cast<T
>(src[i]);
166 MyBase::mm[i4+0] = v[0];
167 MyBase::mm[i4+1] = v[1];
168 MyBase::mm[i4+2] = v[2];
169 MyBase::mm[i4+3] = v[3];
176 return Vec4<T>((*this)(i,0), (*
this)(i,1), (*
this)(i,2), (*
this)(i,3));
183 MyBase::mm[ 0+j] = v[0];
184 MyBase::mm[ 4+j] = v[1];
185 MyBase::mm[ 8+j] = v[2];
186 MyBase::mm[12+j] = v[3];
193 return Vec4<T>((*this)(0,j), (*
this)(1,j), (*
this)(2,j), (*
this)(3,j));
197 T* operator[](
int i) {
return &(MyBase::mm[i<<2]); }
200 const T*
operator[](
int i)
const {
return &(MyBase::mm[i<<2]); }
214 return MyBase::mm[4*i+j];
224 return MyBase::mm[4*i+j];
231 MyBase::mm[ 0] = v1[0];
232 MyBase::mm[ 1] = v1[1];
233 MyBase::mm[ 2] = v1[2];
234 MyBase::mm[ 3] = v1[3];
236 MyBase::mm[ 4] = v2[0];
237 MyBase::mm[ 5] = v2[1];
238 MyBase::mm[ 6] = v2[2];
239 MyBase::mm[ 7] = v2[3];
241 MyBase::mm[ 8] = v3[0];
242 MyBase::mm[ 9] = v3[1];
243 MyBase::mm[10] = v3[2];
244 MyBase::mm[11] = v3[3];
246 MyBase::mm[12] = v4[0];
247 MyBase::mm[13] = v4[1];
248 MyBase::mm[14] = v4[2];
249 MyBase::mm[15] = v4[3];
256 MyBase::mm[ 0] = v1[0];
257 MyBase::mm[ 1] = v2[0];
258 MyBase::mm[ 2] = v3[0];
259 MyBase::mm[ 3] = v4[0];
261 MyBase::mm[ 4] = v1[1];
262 MyBase::mm[ 5] = v2[1];
263 MyBase::mm[ 6] = v3[1];
264 MyBase::mm[ 7] = v4[1];
266 MyBase::mm[ 8] = v1[2];
267 MyBase::mm[ 9] = v2[2];
268 MyBase::mm[10] = v3[2];
269 MyBase::mm[11] = v4[2];
271 MyBase::mm[12] = v1[3];
272 MyBase::mm[13] = v2[3];
273 MyBase::mm[14] = v3[3];
274 MyBase::mm[15] = v4[3];
281 this->setRows(v1, v2, v3, v4);
334 for (
int i = 0; i < 3; i++)
335 for (
int j=0; j < 3; j++)
336 MyBase::mm[i*4+j] = m[i][j];
343 for (
int i = 0; i < 3; i++)
344 for (
int j = 0; j < 3; j++)
345 m[i][j] = MyBase::mm[i*4+j];
353 return Vec3<T>(MyBase::mm[12], MyBase::mm[13], MyBase::mm[14]);
358 MyBase::mm[12] = t[0];
359 MyBase::mm[13] = t[1];
360 MyBase::mm[14] = t[2];
364 template<
typename Source>
370 std::copy(src, (src + this->numElements()), MyBase::mm);
375 bool eq(
const Mat4 &m, T eps=1.0e-8)
const 377 for (
int i = 0; i < 16; i++) {
388 -MyBase::mm[ 0], -MyBase::mm[ 1], -MyBase::mm[ 2], -MyBase::mm[ 3],
389 -MyBase::mm[ 4], -MyBase::mm[ 5], -MyBase::mm[ 6], -MyBase::mm[ 7],
390 -MyBase::mm[ 8], -MyBase::mm[ 9], -MyBase::mm[10], -MyBase::mm[11],
391 -MyBase::mm[12], -MyBase::mm[13], -MyBase::mm[14], -MyBase::mm[15]
396 template <
typename S>
399 MyBase::mm[ 0] *= scalar;
400 MyBase::mm[ 1] *= scalar;
401 MyBase::mm[ 2] *= scalar;
402 MyBase::mm[ 3] *= scalar;
404 MyBase::mm[ 4] *= scalar;
405 MyBase::mm[ 5] *= scalar;
406 MyBase::mm[ 6] *= scalar;
407 MyBase::mm[ 7] *= scalar;
409 MyBase::mm[ 8] *= scalar;
410 MyBase::mm[ 9] *= scalar;
411 MyBase::mm[10] *= scalar;
412 MyBase::mm[11] *= scalar;
414 MyBase::mm[12] *= scalar;
415 MyBase::mm[13] *= scalar;
416 MyBase::mm[14] *= scalar;
417 MyBase::mm[15] *= scalar;
422 template <
typename S>
427 MyBase::mm[ 0] += s[ 0];
428 MyBase::mm[ 1] += s[ 1];
429 MyBase::mm[ 2] += s[ 2];
430 MyBase::mm[ 3] += s[ 3];
432 MyBase::mm[ 4] += s[ 4];
433 MyBase::mm[ 5] += s[ 5];
434 MyBase::mm[ 6] += s[ 6];
435 MyBase::mm[ 7] += s[ 7];
437 MyBase::mm[ 8] += s[ 8];
438 MyBase::mm[ 9] += s[ 9];
439 MyBase::mm[10] += s[10];
440 MyBase::mm[11] += s[11];
442 MyBase::mm[12] += s[12];
443 MyBase::mm[13] += s[13];
444 MyBase::mm[14] += s[14];
445 MyBase::mm[15] += s[15];
451 template <
typename S>
456 MyBase::mm[ 0] -= s[ 0];
457 MyBase::mm[ 1] -= s[ 1];
458 MyBase::mm[ 2] -= s[ 2];
459 MyBase::mm[ 3] -= s[ 3];
461 MyBase::mm[ 4] -= s[ 4];
462 MyBase::mm[ 5] -= s[ 5];
463 MyBase::mm[ 6] -= s[ 6];
464 MyBase::mm[ 7] -= s[ 7];
466 MyBase::mm[ 8] -= s[ 8];
467 MyBase::mm[ 9] -= s[ 9];
468 MyBase::mm[10] -= s[10];
469 MyBase::mm[11] -= s[11];
471 MyBase::mm[12] -= s[12];
472 MyBase::mm[13] -= s[13];
473 MyBase::mm[14] -= s[14];
474 MyBase::mm[15] -= s[15];
480 template <
typename S>
488 for (
int i = 0; i < 4; i++) {
490 MyBase::mm[i4+0] =
static_cast<T
>(s0[i4+0] * s1[ 0] +
495 MyBase::mm[i4+1] =
static_cast<T
>(s0[i4+0] * s1[ 1] +
500 MyBase::mm[i4+2] =
static_cast<T
>(s0[i4+0] * s1[ 2] +
505 MyBase::mm[i4+3] =
static_cast<T
>(s0[i4+0] * s1[ 3] +
517 MyBase::mm[ 0], MyBase::mm[ 4], MyBase::mm[ 8], MyBase::mm[12],
518 MyBase::mm[ 1], MyBase::mm[ 5], MyBase::mm[ 9], MyBase::mm[13],
519 MyBase::mm[ 2], MyBase::mm[ 6], MyBase::mm[10], MyBase::mm[14],
520 MyBase::mm[ 3], MyBase::mm[ 7], MyBase::mm[11], MyBase::mm[15]
550 T m0011 = m[0][0] * m[1][1];
551 T m0012 = m[0][0] * m[1][2];
552 T m0110 = m[0][1] * m[1][0];
553 T m0210 = m[0][2] * m[1][0];
554 T m0120 = m[0][1] * m[2][0];
555 T m0220 = m[0][2] * m[2][0];
557 T detA = m0011 * m[2][2] - m0012 * m[2][1] - m0110 * m[2][2]
558 + m0210 * m[2][1] + m0120 * m[1][2] - m0220 * m[1][1];
560 bool hasPerspective =
567 if (hasPerspective) {
568 det = m[0][3] * det3(m, 1,2,3, 0,2,1)
569 + m[1][3] * det3(m, 2,0,3, 0,2,1)
570 + m[2][3] * det3(m, 3,0,1, 0,2,1)
573 det = detA * m[3][3];
584 invertible = m.invert(inv, tolerance);
593 inv[0][0] = detA * ( m[1][1] * m[2][2] - m[1][2] * m[2][1]);
594 inv[0][1] = detA * (-m[0][1] * m[2][2] + m[0][2] * m[2][1]);
595 inv[0][2] = detA * ( m[0][1] * m[1][2] - m[0][2] * m[1][1]);
597 inv[1][0] = detA * (-m[1][0] * m[2][2] + m[1][2] * m[2][0]);
598 inv[1][1] = detA * ( m[0][0] * m[2][2] - m0220);
599 inv[1][2] = detA * ( m0210 - m0012);
601 inv[2][0] = detA * ( m[1][0] * m[2][1] - m[1][1] * m[2][0]);
602 inv[2][1] = detA * ( m0120 - m[0][0] * m[2][1]);
603 inv[2][2] = detA * ( m0011 - m0110);
605 if (hasPerspective) {
610 r[0] = m[3][0] * inv[0][0] + m[3][1] * inv[1][0]
611 + m[3][2] * inv[2][0];
612 r[1] = m[3][0] * inv[0][1] + m[3][1] * inv[1][1]
613 + m[3][2] * inv[2][1];
614 r[2] = m[3][0] * inv[0][2] + m[3][1] * inv[1][2]
615 + m[3][2] * inv[2][2];
618 p[0] = inv[0][0] * m[0][3] + inv[0][1] * m[1][3]
619 + inv[0][2] * m[2][3];
620 p[1] = inv[1][0] * m[0][3] + inv[1][1] * m[1][3]
621 + inv[1][2] * m[2][3];
622 p[2] = inv[2][0] * m[0][3] + inv[2][1] * m[1][3]
623 + inv[2][2] * m[2][3];
625 T h = m[3][3] - p.
dot(
Vec3<T>(m[3][0],m[3][1],m[3][2]));
636 inv[3][0] = -h * r[0];
637 inv[3][1] = -h * r[1];
638 inv[3][2] = -h * r[2];
640 inv[0][3] = -h * p[0];
641 inv[1][3] = -h * p[1];
642 inv[2][3] = -h * p[2];
648 inv[0][0] += p[0] * r[0];
649 inv[0][1] += p[0] * r[1];
650 inv[0][2] += p[0] * r[2];
651 inv[1][0] += p[1] * r[0];
652 inv[1][1] += p[1] * r[1];
653 inv[1][2] += p[1] * r[2];
654 inv[2][0] += p[2] * r[0];
655 inv[2][1] += p[2] * r[1];
656 inv[2][2] += p[2] * r[2];
660 inv[3][0] = - (m[3][0] * inv[0][0] + m[3][1] * inv[1][0]
661 + m[3][2] * inv[2][0]);
662 inv[3][1] = - (m[3][0] * inv[0][1] + m[3][1] * inv[1][1]
663 + m[3][2] * inv[2][1]);
664 inv[3][2] = - (m[3][0] * inv[0][2] + m[3][1] * inv[1][2]
665 + m[3][2] * inv[2][2]);
689 for (i = 0; i < 4; i++) {
690 ap = &MyBase::mm[ 0];
692 for (j = 0; j < 4; j++) {
693 for (k = 0; k < 4; k++) {
694 if ((k != i) && (j != 0)) {
701 det += sign * MyBase::mm[i] * submat.
det();
712 T(1), T(0), T(0), T(0),
713 T(0), T(1), T(0), T(0),
714 T(0), T(0), T(1), T(0),
715 T(v.
x()), T(v.
y()),T(v.
z()), T(1));
719 template <
typename T0>
737 MyBase::mm[12] = v.
x();
738 MyBase::mm[13] = v.
y();
739 MyBase::mm[14] = v.
z();
744 template <
typename T0>
750 *
this = Tr * (*this);
755 template <
typename T0>
761 *
this = (*this) * Tr;
767 template <
typename T0>
771 MyBase::mm[ 0] = v.
x();
772 MyBase::mm[ 5] = v.
y();
773 MyBase::mm[10] = v.
z();
777 template <
typename T0>
780 MyBase::mm[ 0] *= v.
x();
781 MyBase::mm[ 1] *= v.
x();
782 MyBase::mm[ 2] *= v.
x();
783 MyBase::mm[ 3] *= v.
x();
785 MyBase::mm[ 4] *= v.
y();
786 MyBase::mm[ 5] *= v.
y();
787 MyBase::mm[ 6] *= v.
y();
788 MyBase::mm[ 7] *= v.
y();
790 MyBase::mm[ 8] *= v.
z();
791 MyBase::mm[ 9] *= v.
z();
792 MyBase::mm[10] *= v.
z();
793 MyBase::mm[11] *= v.
z();
799 template <
typename T0>
803 MyBase::mm[ 0] *= v.
x();
804 MyBase::mm[ 1] *= v.
y();
805 MyBase::mm[ 2] *= v.
z();
807 MyBase::mm[ 4] *= v.
x();
808 MyBase::mm[ 5] *= v.
y();
809 MyBase::mm[ 6] *= v.
z();
811 MyBase::mm[ 8] *= v.
x();
812 MyBase::mm[ 9] *= v.
y();
813 MyBase::mm[10] *= v.
z();
815 MyBase::mm[12] *= v.
x();
816 MyBase::mm[13] *= v.
y();
817 MyBase::mm[14] *= v.
z();
842 T c =
static_cast<T
>(cos(angle));
843 T s = -
static_cast<T
>(sin(angle));
850 a4 = c * MyBase::mm[ 4] - s * MyBase::mm[ 8];
851 a5 = c * MyBase::mm[ 5] - s * MyBase::mm[ 9];
852 a6 = c * MyBase::mm[ 6] - s * MyBase::mm[10];
853 a7 = c * MyBase::mm[ 7] - s * MyBase::mm[11];
856 MyBase::mm[ 8] = s * MyBase::mm[ 4] + c * MyBase::mm[ 8];
857 MyBase::mm[ 9] = s * MyBase::mm[ 5] + c * MyBase::mm[ 9];
858 MyBase::mm[10] = s * MyBase::mm[ 6] + c * MyBase::mm[10];
859 MyBase::mm[11] = s * MyBase::mm[ 7] + c * MyBase::mm[11];
872 a0 = c * MyBase::mm[ 0] + s * MyBase::mm[ 8];
873 a1 = c * MyBase::mm[ 1] + s * MyBase::mm[ 9];
874 a2 = c * MyBase::mm[ 2] + s * MyBase::mm[10];
875 a3 = c * MyBase::mm[ 3] + s * MyBase::mm[11];
877 MyBase::mm[ 8] = -s * MyBase::mm[ 0] + c * MyBase::mm[ 8];
878 MyBase::mm[ 9] = -s * MyBase::mm[ 1] + c * MyBase::mm[ 9];
879 MyBase::mm[10] = -s * MyBase::mm[ 2] + c * MyBase::mm[10];
880 MyBase::mm[11] = -s * MyBase::mm[ 3] + c * MyBase::mm[11];
894 a0 = c * MyBase::mm[ 0] - s * MyBase::mm[ 4];
895 a1 = c * MyBase::mm[ 1] - s * MyBase::mm[ 5];
896 a2 = c * MyBase::mm[ 2] - s * MyBase::mm[ 6];
897 a3 = c * MyBase::mm[ 3] - s * MyBase::mm[ 7];
899 MyBase::mm[ 4] = s * MyBase::mm[ 0] + c * MyBase::mm[ 4];
900 MyBase::mm[ 5] = s * MyBase::mm[ 1] + c * MyBase::mm[ 5];
901 MyBase::mm[ 6] = s * MyBase::mm[ 2] + c * MyBase::mm[ 6];
902 MyBase::mm[ 7] = s * MyBase::mm[ 3] + c * MyBase::mm[ 7];
922 T c =
static_cast<T
>(cos(angle));
923 T s = -
static_cast<T
>(sin(angle));
932 a2 = c * MyBase::mm[ 2] - s * MyBase::mm[ 1];
933 a6 = c * MyBase::mm[ 6] - s * MyBase::mm[ 5];
934 a10 = c * MyBase::mm[10] - s * MyBase::mm[ 9];
935 a14 = c * MyBase::mm[14] - s * MyBase::mm[13];
938 MyBase::mm[ 1] = c * MyBase::mm[ 1] + s * MyBase::mm[ 2];
939 MyBase::mm[ 5] = c * MyBase::mm[ 5] + s * MyBase::mm[ 6];
940 MyBase::mm[ 9] = c * MyBase::mm[ 9] + s * MyBase::mm[10];
941 MyBase::mm[13] = c * MyBase::mm[13] + s * MyBase::mm[14];
945 MyBase::mm[10] = a10;
946 MyBase::mm[14] = a14;
954 a2 = c * MyBase::mm[ 2] + s * MyBase::mm[ 0];
955 a6 = c * MyBase::mm[ 6] + s * MyBase::mm[ 4];
956 a10 = c * MyBase::mm[10] + s * MyBase::mm[ 8];
957 a14 = c * MyBase::mm[14] + s * MyBase::mm[12];
959 MyBase::mm[ 0] = c * MyBase::mm[ 0] - s * MyBase::mm[ 2];
960 MyBase::mm[ 4] = c * MyBase::mm[ 4] - s * MyBase::mm[ 6];
961 MyBase::mm[ 8] = c * MyBase::mm[ 8] - s * MyBase::mm[10];
962 MyBase::mm[12] = c * MyBase::mm[12] - s * MyBase::mm[14];
966 MyBase::mm[10] = a10;
967 MyBase::mm[14] = a14;
975 a1 = c * MyBase::mm[ 1] - s * MyBase::mm[ 0];
976 a5 = c * MyBase::mm[ 5] - s * MyBase::mm[ 4];
977 a9 = c * MyBase::mm[ 9] - s * MyBase::mm[ 8];
978 a13 = c * MyBase::mm[13] - s * MyBase::mm[12];
980 MyBase::mm[ 0] = c * MyBase::mm[ 0] + s * MyBase::mm[ 1];
981 MyBase::mm[ 4] = c * MyBase::mm[ 4] + s * MyBase::mm[ 5];
982 MyBase::mm[ 8] = c * MyBase::mm[ 8] + s * MyBase::mm[ 9];
983 MyBase::mm[12] = c * MyBase::mm[12] + s * MyBase::mm[13];
988 MyBase::mm[13] = a13;
1004 *
this = shear<Mat4<T> >(axis0, axis1, shearby);
1012 int index0 =
static_cast<int>(axis0);
1013 int index1 =
static_cast<int>(axis1);
1016 MyBase::mm[index1 * 4 + 0] += shear * MyBase::mm[index0 * 4 + 0];
1017 MyBase::mm[index1 * 4 + 1] += shear * MyBase::mm[index0 * 4 + 1];
1018 MyBase::mm[index1 * 4 + 2] += shear * MyBase::mm[index0 * 4 + 2];
1019 MyBase::mm[index1 * 4 + 3] += shear * MyBase::mm[index0 * 4 + 3];
1027 int index0 =
static_cast<int>(axis0);
1028 int index1 =
static_cast<int>(axis1);
1031 MyBase::mm[index0 + 0] += shear * MyBase::mm[index1 + 0];
1032 MyBase::mm[index0 + 4] += shear * MyBase::mm[index1 + 4];
1033 MyBase::mm[index0 + 8] += shear * MyBase::mm[index1 + 8];
1034 MyBase::mm[index0 + 12] += shear * MyBase::mm[index1 + 12];
1039 template<
typename T0>
1042 return static_cast< Vec4<T0> >(v * *
this);
1046 template<
typename T0>
1049 return static_cast< Vec3<T0> >(v * *
this);
1053 template<
typename T0>
1056 return static_cast< Vec4<T0> >(*
this * v);
1060 template<
typename T0>
1063 return static_cast< Vec3<T0> >(*
this * v);
1067 template<
typename T0>
1073 w =
static_cast<T0
>(p[0] * MyBase::mm[ 3] + p[1] * MyBase::mm[ 7]
1074 + p[2] * MyBase::mm[11] + MyBase::mm[15]);
1077 return Vec3<T0>(
static_cast<T0
>((p[0] * MyBase::mm[ 0] + p[1] * MyBase::mm[ 4] +
1078 p[2] * MyBase::mm[ 8] + MyBase::mm[12]) / w),
1079 static_cast<T0
>((p[0] * MyBase::mm[ 1] + p[1] * MyBase::mm[ 5] +
1080 p[2] * MyBase::mm[ 9] + MyBase::mm[13]) / w),
1081 static_cast<T0
>((p[0] * MyBase::mm[ 2] + p[1] * MyBase::mm[ 6] +
1082 p[2] * MyBase::mm[10] + MyBase::mm[14]) / w));
1089 template<
typename T0>
1095 w = p[0] * MyBase::mm[12] + p[1] * MyBase::mm[13] + p[2] * MyBase::mm[14] + MyBase::mm[15];
1098 return Vec3<T0>(
static_cast<T0
>((p[0] * MyBase::mm[ 0] + p[1] * MyBase::mm[ 1] +
1099 p[2] * MyBase::mm[ 2] + MyBase::mm[ 3]) / w),
1100 static_cast<T0
>((p[0] * MyBase::mm[ 4] + p[1] * MyBase::mm[ 5] +
1101 p[2] * MyBase::mm[ 6] + MyBase::mm[ 7]) / w),
1102 static_cast<T0
>((p[0] * MyBase::mm[ 8] + p[1] * MyBase::mm[ 9] +
1103 p[2] * MyBase::mm[10] + MyBase::mm[11]) / w));
1110 template<
typename T0>
1114 static_cast<T0
>(v[0] * MyBase::mm[ 0] + v[1] * MyBase::mm[ 4] + v[2] * MyBase::mm[ 8]),
1115 static_cast<T0>(v[0] * MyBase::mm[ 1] + v[1] * MyBase::mm[ 5] + v[2] * MyBase::mm[ 9]),
1116 static_cast<T0
>(v[0] * MyBase::mm[ 2] + v[1] * MyBase::mm[ 6] + v[2] * MyBase::mm[10]));
1121 bool invert(
Mat4<T> &inverse, T tolerance)
const;
1123 T det2(
const Mat4<T> &a,
int i0,
int i1,
int j0,
int j1)
const {
1126 return a.
mm[i0row+j0]*a.
mm[i1row+j1] - a.
mm[i0row+j1]*a.
mm[i1row+j0];
1129 T det3(
const Mat4<T> &a,
int i0,
int i1,
int i2,
1130 int j0,
int j1,
int j2)
const {
1132 return a.
mm[i0row+j0]*det2(a, i1,i2, j1,j2) +
1133 a.
mm[i0row+j1]*det2(a, i1,i2, j2,j0) +
1134 a.
mm[i0row+j2]*det2(a, i1,i2, j0,j1);
1137 static const Mat4<T> sIdentity;
1142 template <
typename T>
1148 template <
typename T>
1156 template <
typename T0,
typename T1>
1162 for (
int i=0; i<16; ++i)
if (!
isExactlyEqual(t0[i], t1[i]))
return false;
1168 template <
typename T0,
typename T1>
1173 template <
typename S,
typename T>
1181 template <
typename S,
typename T>
1191 template<
typename T,
typename MT>
1198 _v[0]*m[0] + _v[1]*m[1] + _v[2]*m[2] + _v[3]*m[3],
1199 _v[0]*m[4] + _v[1]*m[5] + _v[2]*m[6] + _v[3]*m[7],
1200 _v[0]*m[8] + _v[1]*m[9] + _v[2]*m[10] + _v[3]*m[11],
1201 _v[0]*m[12] + _v[1]*m[13] + _v[2]*m[14] + _v[3]*m[15]);
1206 template<
typename T,
typename MT>
1213 _v[0]*m[0] + _v[1]*m[4] + _v[2]*m[8] + _v[3]*m[12],
1214 _v[0]*m[1] + _v[1]*m[5] + _v[2]*m[9] + _v[3]*m[13],
1215 _v[0]*m[2] + _v[1]*m[6] + _v[2]*m[10] + _v[3]*m[14],
1216 _v[0]*m[3] + _v[1]*m[7] + _v[2]*m[11] + _v[3]*m[15]);
1222 template<
typename T,
typename MT>
1229 _v[0]*m[0] + _v[1]*m[1] + _v[2]*m[2] + m[3],
1230 _v[0]*m[4] + _v[1]*m[5] + _v[2]*m[6] + m[7],
1231 _v[0]*m[8] + _v[1]*m[9] + _v[2]*m[10] + m[11]);
1237 template<
typename T,
typename MT>
1244 _v[0]*m[0] + _v[1]*m[4] + _v[2]*m[8] + m[12],
1245 _v[0]*m[1] + _v[1]*m[5] + _v[2]*m[9] + m[13],
1246 _v[0]*m[2] + _v[1]*m[6] + _v[2]*m[10] + m[14]);
1251 template <
typename T0,
typename T1>
1262 template <
typename T0,
typename T1>
1274 template <
typename T0,
typename T1>
1287 template<
typename T0,
typename T1>
1291 static_cast<T1
>(m[0][0]*n[0] + m[0][1]*n[1] + m[0][2]*n[2]),
1292 static_cast<T1>(m[1][0]*n[0] + m[1][1]*n[1] + m[1][2]*n[2]),
1293 static_cast<T1
>(m[2][0]*n[0] + m[2][1]*n[1] + m[2][2]*n[2]));
1298 template<
typename T>
1306 for (
int i = 0; i < 4; ++i) {
1308 double max = fabs(temp[i][i]);
1310 for (
int k = i+1; k < 4; ++k) {
1311 if (fabs(temp[k][i]) > max) {
1313 max = fabs(temp[k][i]);
1322 for (
int k = 0; k < 4; ++k) {
1323 std::swap(temp[row][k], temp[i][k]);
1324 std::swap(inverse[row][k], inverse[i][k]);
1328 double pivot = temp[i][i];
1332 for (
int k = 0; k < 4; ++k) {
1333 temp[i][k] /= pivot;
1334 inverse[i][k] /= pivot;
1338 for (
int j = i+1; j < 4; ++j) {
1339 double t = temp[j][i];
1342 for (
int k = 0; k < 4; ++k) {
1343 temp[j][k] -= temp[i][k] * t;
1344 inverse[j][k] -= inverse[i][k] * t;
1351 for (
int i = 3; i > 0; --i) {
1352 for (
int j = 0; j < i; ++j) {
1353 double t = temp[j][i];
1356 for (
int k = 0; k < 4; ++k) {
1357 inverse[j][k] -= inverse[i][k]*t;
1362 return det*det >= tolerance*tolerance;
1365 template <
typename T>
1370 template <
typename T>
1379 #if DWREAL_IS_DOUBLE == 1 1380 typedef Mat4d
Mat4f;
1383 #endif // DWREAL_IS_DOUBLE 1388 template<>
inline math::Mat4s zeroVal<math::Mat4s>() {
return math::Mat4s::identity(); }
1389 template<>
inline math::Mat4d zeroVal<math::Mat4d>() {
return math::Mat4d::identity(); }
1394 #endif // OPENVDB_UTIL_MAT4_H_HAS_BEEN_INCLUDED void setZero()
Definition: Mat4.h:286
void postShear(Axis axis0, Axis axis1, T shear)
Right multiplies a shearing transformation into the matrix.
Definition: Mat4.h:1025
void preShear(Axis axis0, Axis axis1, T shear)
Left multiplies a shearing transformation into the matrix.
Definition: Mat4.h:1010
Mat4< typename promote< T0, T1 >::type > operator-(const Mat4< T0 > &m0, const Mat4< T1 > &m1)
Returns M, where for .
Definition: Mat4.h:1264
T dot(const Vec3< T > &v) const
Dot product.
Definition: Vec3.h:203
const Mat4 & operator=(const Mat4< Source > &m)
Assignment operator.
Definition: Mat4.h:365
Mat4(const Vec4< Source > &v1, const Vec4< Source > &v2, const Vec4< Source > &v3, const Vec4< Source > &v4, bool rows=true)
Definition: Mat4.h:120
T & z()
Definition: Vec3.h:99
bool isExactlyEqual(const T0 &a, const T1 &b)
Return true if a is exactly equal to b.
Definition: Math.h:407
void postScale(const Vec3< T0 > &v)
Definition: Mat4.h:800
void setToRotation(Axis axis, T angle)
Sets the matrix to a rotation about the given axis.
Definition: Mat4.h:825
void setRow(int i, const Vec4< T > &v)
Set ith row to vector v.
Definition: Mat4.h:162
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
Vec3< T0 > pretransformH(const Vec3< T0 > &p) const
Transform a Vec3 by pre-multiplication, doing homogenous division.
Definition: Mat4.h:1090
const T * operator[](int i) const
Definition: Mat4.h:200
const Mat4< T > & operator*=(const Mat4< S > &m1)
Return m, where for .
Definition: Mat4.h:481
static const Mat4< T > & identity()
Predefined constant for identity matrix.
Definition: Mat4.h:152
Mat4(const Mat< 4, T > &m)
Copy constructor.
Definition: Mat4.h:131
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:97
T mm[SIZE *SIZE]
Definition: Mat.h:141
T operator()(int i, int j) const
Definition: Mat4.h:220
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:375
Definition: Exceptions.h:78
T * asPointer()
Direct access to the internal data.
Definition: Mat4.h:204
void setIdentity()
Set "this" matrix to identity.
Definition: Mat4.h:307
Vec3< typename promote< T, MT >::type > operator*(const Vec3< T > &_v, const Mat4< MT > &_m)
Returns v, where for .
Definition: Mat4.h:1239
T det() const
Determinant of matrix.
Definition: Mat4.h:679
Mat4< typename promote< S, T >::type > operator*(S scalar, const Mat4< T > &m)
Returns M, where for .
Definition: Mat4.h:1174
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:667
void setColumns(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:253
T ValueType
Definition: Mat4.h:62
OPENVDB_DEPRECATED void setBasis(const Vec4< T > &v1, const Vec4< T > &v2, const Vec4< T > &v3, const Vec4< T > &v4)
Set the rows of "this" matrix to the vectors v1, v2, v3, v4.
Definition: Mat4.h:278
Vec3< T0 > transformH(const Vec3< T0 > &p) const
Transform a Vec3 by post-multiplication, doing homogenous divison.
Definition: Mat4.h:1068
Mat4s Mat4f
Definition: Mat4.h:1382
void preRotate(Axis axis, T angle)
Left multiplies by a rotation clock-wiseabout the given axis into this matrix.
Definition: Mat4.h:840
4x4 -matrix class.
Definition: Mat3.h:48
void preTranslate(const Vec3< T0 > &tr)
Left multiples by the specified translation, i.e. Trans * (*this)
Definition: Mat4.h:745
bool isApproxEqual(const Type &a, const Type &b)
Return true if a is equal to b to within the default floating-point comparison tolerance.
Definition: Math.h:370
Vec4< typename promote< T, MT >::type > operator*(const Vec4< T > &_v, const Mat4< MT > &_m)
Returns v, where for .
Definition: Mat4.h:1208
const Mat4< T > & operator+=(const Mat4< S > &m1)
Returns m0, where for .
Definition: Mat4.h:423
Mat4(Source *a)
Constructor given array of elements, the ordering is in row major form:
Definition: Mat4.h:76
Vec3< T0 > pretransform(const Vec3< T0 > &v) const
Transform a Vec3 by pre-multiplication, without homogenous division.
Definition: Mat4.h:1061
void setToScale(const Vec3< T0 > &v)
Sets the matrix to a matrix that scales by v.
Definition: Mat4.h:768
Mat4 inverse(T tolerance=0) const
Definition: Mat4.h:527
#define OPENVDB_VERSION_NAME
Definition: version.h:43
Mat4 transpose() const
Definition: Mat4.h:514
void setMat3(const Mat3< T > &m)
Set upper left to a Mat3.
Definition: Mat4.h:332
bool operator==(const Mat4< T0 > &m0, const Mat4< T1 > &m1)
Equality operator, does exact floating point comparisons.
Definition: Mat4.h:1157
void postRotate(Axis axis, T angle)
Right multiplies by a rotation clock-wiseabout the given axis into this matrix.
Definition: Mat4.h:920
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
T & x()
Reference to the component, e.g. v.x() = 4.5f;.
Definition: Vec3.h:97
bool isAffine(const Mat4< T > &m)
Definition: Mat4.h:1366
Definition: Exceptions.h:39
Vec3< T0 > transform(const Vec3< T0 > &v) const
Transform a Vec3 by post-multiplication, without homogenous division.
Definition: Mat4.h:1047
Vec4< T > row(int i) const
Get ith row, e.g. Vec4f v = m.row(1);.
Definition: Mat4.h:173
3x3 matrix class.
Definition: Mat3.h:54
void setToShear(Axis axis0, Axis axis1, T shearby)
Sets the matrix to a shear along axis0 by a fraction of axis1.
Definition: Mat4.h:1002
T value_type
Data type held by the matrix.
Definition: Mat4.h:61
const Mat4< T > & operator-=(const Mat4< S > &m1)
Returns m0, where for .
Definition: Mat4.h:452
T angle(const Vec2< T > &v1, const Vec2< T > &v2)
Definition: Vec2.h:446
Mat4< float > Mat4s
Definition: Mat4.h:1376
Mat3< T > getMat3() const
Definition: Mat4.h:339
T & operator()(int i, int j)
Definition: Mat4.h:210
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:834
Mat< 4, T > MyBase
Definition: Mat4.h:63
const Mat4< T > & operator*=(S scalar)
Return m, where for .
Definition: Mat4.h:397
void setTranslation(const Vec3< T > &t)
Definition: Mat4.h:356
Mat4< double > Mat4d
Definition: Mat4.h:1377
Vec4< T0 > pretransform(const Vec4< T0 > &v) const
Transform a Vec4 by pre-multiplication.
Definition: Mat4.h:1054
T & y()
Definition: Vec3.h:98
void setToRotation(const Vec3< T > &axis, T angle)
Sets the matrix to a rotation about an arbitrary axis.
Definition: Mat4.h:830
static Mat4 translation(const Vec3d &v)
Sets the matrix to a matrix that translates by v.
Definition: Mat4.h:709
static const Mat4< T > & zero()
Predefined constant for zero matrix.
Definition: Mat4.h:157
bool hasTranslation(const Mat4< T > &m)
Definition: Mat4.h:1371
const T * asPointer() const
Definition: Mat4.h:205
Mat4()
Trivial constructor, the matrix is NOT initialized.
Definition: Mat4.h:66
Vec4< typename promote< T, MT >::type > operator*(const Mat4< MT > &_m, const Vec4< T > &_v)
Returns v, where for .
Definition: Mat4.h:1193
Vec3< T0 > transform3x3(const Vec3< T0 > &v) const
Transform a Vec3 by post-multiplication, without translation.
Definition: Mat4.h:1111
Mat4< typename promote< T0, T1 >::type > operator*(const Mat4< T0 > &m0, const Mat4< T1 > &m1)
Returns M, where for .
Definition: Mat4.h:1276
Vec3< typename promote< T, MT >::type > operator*(const Mat4< MT > &_m, const Vec3< T > &_v)
Returns v, where for .
Definition: Mat4.h:1224
Mat4< typename promote< T0, T1 >::type > operator+(const Mat4< T0 > &m0, const Mat4< T1 > &m1)
Returns M, where for .
Definition: Mat4.h:1253
void setToTranslation(const Vec3< T0 > &v)
Sets the matrix to a matrix that translates by v.
Definition: Mat4.h:720
Axis
Definition: Math.h:856
void setCol(int j, const Vec4< T > &v)
Set jth column to vector v.
Definition: Mat4.h:180
Mat4< typename promote< S, T >::type > operator*(const Mat4< T > &m, S scalar)
Returns M, where for .
Definition: Mat4.h:1182
T det() const
Determinant of matrix.
Definition: Mat3.h:523
Vec4< T > col(int j) const
Get jth column, e.g. Vec4f v = m.col(0);.
Definition: Mat4.h:190
Mat4< T > operator-() const
Negation operator, for e.g. m1 = -m2;.
Definition: Mat4.h:385
Vec4< T0 > transform(const Vec4< T0 > &v) const
Transform a Vec4 by post-multiplication.
Definition: Mat4.h:1040
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
void setRows(const Vec4< T > &v1, const Vec4< T > &v2, const Vec4< T > &v3, const Vec4< T > &v4)
Set the rows of "this" matrix to the vectors v1, v2, v3, v4.
Definition: Mat4.h:228
Vec3< T > getTranslation() const
Return the translation component.
Definition: Mat4.h:351
Mat4(const Mat4< Source > &m)
Conversion constructor.
Definition: Mat4.h:142
void preScale(const Vec3< T0 > &v)
Definition: Mat4.h:778
void postTranslate(const Vec3< T0 > &tr)
Right multiplies by the specified translation matrix, i.e. (*this) * Trans.
Definition: Mat4.h:756
bool operator!=(const Mat4< T0 > &m0, const Mat4< T1 > &m1)
Inequality operator, does exact floating point comparisons.
Definition: Mat4.h:1169
T * asPointer()
Definition: Mat3.h:208
Vec3< T1 > transformNormal(const Mat4< T0 > &m, const Vec3< T1 > &n)
Definition: Mat4.h:1288