4 #ifndef OPENVDB_MATH_MAT4_H_HAS_BEEN_INCLUDED 5 #define OPENVDB_MATH_MAT4_H_HAS_BEEN_INCLUDED 24 template<
typename T>
class Vec4;
48 template<
typename Source>
51 for (
int i = 0; i < 16; i++) {
52 MyBase::mm[i] =
static_cast<T
>(a[i]);
63 template<
typename Source>
64 Mat4(Source a, Source b, Source c, Source d,
65 Source e, Source f, Source g, Source h,
66 Source i, Source j, Source k, Source l,
67 Source m, Source n, Source o, Source p)
69 MyBase::mm[ 0] =
static_cast<T
>(a);
70 MyBase::mm[ 1] =
static_cast<T
>(b);
71 MyBase::mm[ 2] =
static_cast<T
>(c);
72 MyBase::mm[ 3] =
static_cast<T
>(d);
74 MyBase::mm[ 4] =
static_cast<T
>(e);
75 MyBase::mm[ 5] =
static_cast<T
>(f);
76 MyBase::mm[ 6] =
static_cast<T
>(g);
77 MyBase::mm[ 7] =
static_cast<T
>(h);
79 MyBase::mm[ 8] =
static_cast<T
>(i);
80 MyBase::mm[ 9] =
static_cast<T
>(j);
81 MyBase::mm[10] =
static_cast<T
>(k);
82 MyBase::mm[11] =
static_cast<T
>(l);
84 MyBase::mm[12] =
static_cast<T
>(m);
85 MyBase::mm[13] =
static_cast<T
>(n);
86 MyBase::mm[14] =
static_cast<T
>(o);
87 MyBase::mm[15] =
static_cast<T
>(p);
92 template<
typename Source>
97 this->setRows(v1, v2, v3, v4);
99 this->setColumns(v1, v2, v3, v4);
106 for (
int i = 0; i < 4; ++i) {
107 for (
int j = 0; j < 4; ++j) {
108 MyBase::mm[i*4 + j] = m[i][j];
114 template<
typename Source>
119 for (
int i=0; i<16; ++i) {
120 MyBase::mm[i] =
static_cast<T
>(src[i]);
151 MyBase::mm[i4+0] = v[0];
152 MyBase::mm[i4+1] = v[1];
153 MyBase::mm[i4+2] = v[2];
154 MyBase::mm[i4+3] = v[3];
161 return Vec4<T>((*this)(i,0), (*
this)(i,1), (*
this)(i,2), (*
this)(i,3));
168 MyBase::mm[ 0+j] = v[0];
169 MyBase::mm[ 4+j] = v[1];
170 MyBase::mm[ 8+j] = v[2];
171 MyBase::mm[12+j] = v[3];
178 return Vec4<T>((*this)(0,j), (*
this)(1,j), (*
this)(2,j), (*
this)(3,j));
188 return MyBase::mm[4*i+j];
198 return MyBase::mm[4*i+j];
205 MyBase::mm[ 0] = v1[0];
206 MyBase::mm[ 1] = v1[1];
207 MyBase::mm[ 2] = v1[2];
208 MyBase::mm[ 3] = v1[3];
210 MyBase::mm[ 4] = v2[0];
211 MyBase::mm[ 5] = v2[1];
212 MyBase::mm[ 6] = v2[2];
213 MyBase::mm[ 7] = v2[3];
215 MyBase::mm[ 8] = v3[0];
216 MyBase::mm[ 9] = v3[1];
217 MyBase::mm[10] = v3[2];
218 MyBase::mm[11] = v3[3];
220 MyBase::mm[12] = v4[0];
221 MyBase::mm[13] = v4[1];
222 MyBase::mm[14] = v4[2];
223 MyBase::mm[15] = v4[3];
230 MyBase::mm[ 0] = v1[0];
231 MyBase::mm[ 1] = v2[0];
232 MyBase::mm[ 2] = v3[0];
233 MyBase::mm[ 3] = v4[0];
235 MyBase::mm[ 4] = v1[1];
236 MyBase::mm[ 5] = v2[1];
237 MyBase::mm[ 6] = v3[1];
238 MyBase::mm[ 7] = v4[1];
240 MyBase::mm[ 8] = v1[2];
241 MyBase::mm[ 9] = v2[2];
242 MyBase::mm[10] = v3[2];
243 MyBase::mm[11] = v4[2];
245 MyBase::mm[12] = v1[3];
246 MyBase::mm[13] = v2[3];
247 MyBase::mm[14] = v3[3];
248 MyBase::mm[15] = v4[3];
300 for (
int i = 0; i < 3; i++)
301 for (
int j=0; j < 3; j++)
302 MyBase::mm[i*4+j] = m[i][j];
309 for (
int i = 0; i < 3; i++)
310 for (
int j = 0; j < 3; j++)
311 m[i][j] = MyBase::mm[i*4+j];
319 return Vec3<T>(MyBase::mm[12], MyBase::mm[13], MyBase::mm[14]);
324 MyBase::mm[12] = t[0];
325 MyBase::mm[13] = t[1];
326 MyBase::mm[14] = t[2];
330 template<
typename Source>
336 std::copy(src, (src + this->numElements()), MyBase::mm);
341 bool eq(
const Mat4 &m, T eps=1.0e-8)
const 343 for (
int i = 0; i < 16; i++) {
354 -MyBase::mm[ 0], -MyBase::mm[ 1], -MyBase::mm[ 2], -MyBase::mm[ 3],
355 -MyBase::mm[ 4], -MyBase::mm[ 5], -MyBase::mm[ 6], -MyBase::mm[ 7],
356 -MyBase::mm[ 8], -MyBase::mm[ 9], -MyBase::mm[10], -MyBase::mm[11],
357 -MyBase::mm[12], -MyBase::mm[13], -MyBase::mm[14], -MyBase::mm[15]
362 template <
typename S>
365 MyBase::mm[ 0] *= scalar;
366 MyBase::mm[ 1] *= scalar;
367 MyBase::mm[ 2] *= scalar;
368 MyBase::mm[ 3] *= scalar;
370 MyBase::mm[ 4] *= scalar;
371 MyBase::mm[ 5] *= scalar;
372 MyBase::mm[ 6] *= scalar;
373 MyBase::mm[ 7] *= scalar;
375 MyBase::mm[ 8] *= scalar;
376 MyBase::mm[ 9] *= scalar;
377 MyBase::mm[10] *= scalar;
378 MyBase::mm[11] *= scalar;
380 MyBase::mm[12] *= scalar;
381 MyBase::mm[13] *= scalar;
382 MyBase::mm[14] *= scalar;
383 MyBase::mm[15] *= scalar;
388 template <
typename S>
393 MyBase::mm[ 0] += s[ 0];
394 MyBase::mm[ 1] += s[ 1];
395 MyBase::mm[ 2] += s[ 2];
396 MyBase::mm[ 3] += s[ 3];
398 MyBase::mm[ 4] += s[ 4];
399 MyBase::mm[ 5] += s[ 5];
400 MyBase::mm[ 6] += s[ 6];
401 MyBase::mm[ 7] += s[ 7];
403 MyBase::mm[ 8] += s[ 8];
404 MyBase::mm[ 9] += s[ 9];
405 MyBase::mm[10] += s[10];
406 MyBase::mm[11] += s[11];
408 MyBase::mm[12] += s[12];
409 MyBase::mm[13] += s[13];
410 MyBase::mm[14] += s[14];
411 MyBase::mm[15] += s[15];
417 template <
typename S>
422 MyBase::mm[ 0] -= s[ 0];
423 MyBase::mm[ 1] -= s[ 1];
424 MyBase::mm[ 2] -= s[ 2];
425 MyBase::mm[ 3] -= s[ 3];
427 MyBase::mm[ 4] -= s[ 4];
428 MyBase::mm[ 5] -= s[ 5];
429 MyBase::mm[ 6] -= s[ 6];
430 MyBase::mm[ 7] -= s[ 7];
432 MyBase::mm[ 8] -= s[ 8];
433 MyBase::mm[ 9] -= s[ 9];
434 MyBase::mm[10] -= s[10];
435 MyBase::mm[11] -= s[11];
437 MyBase::mm[12] -= s[12];
438 MyBase::mm[13] -= s[13];
439 MyBase::mm[14] -= s[14];
440 MyBase::mm[15] -= s[15];
446 template <
typename S>
454 for (
int i = 0; i < 4; i++) {
456 MyBase::mm[i4+0] =
static_cast<T
>(s0[i4+0] * s1[ 0] +
461 MyBase::mm[i4+1] =
static_cast<T
>(s0[i4+0] * s1[ 1] +
466 MyBase::mm[i4+2] =
static_cast<T
>(s0[i4+0] * s1[ 2] +
471 MyBase::mm[i4+3] =
static_cast<T
>(s0[i4+0] * s1[ 3] +
483 MyBase::mm[ 0], MyBase::mm[ 4], MyBase::mm[ 8], MyBase::mm[12],
484 MyBase::mm[ 1], MyBase::mm[ 5], MyBase::mm[ 9], MyBase::mm[13],
485 MyBase::mm[ 2], MyBase::mm[ 6], MyBase::mm[10], MyBase::mm[14],
486 MyBase::mm[ 3], MyBase::mm[ 7], MyBase::mm[11], MyBase::mm[15]
516 T m0011 = m[0][0] * m[1][1];
517 T m0012 = m[0][0] * m[1][2];
518 T m0110 = m[0][1] * m[1][0];
519 T m0210 = m[0][2] * m[1][0];
520 T m0120 = m[0][1] * m[2][0];
521 T m0220 = m[0][2] * m[2][0];
523 T detA = m0011 * m[2][2] - m0012 * m[2][1] - m0110 * m[2][2]
524 + m0210 * m[2][1] + m0120 * m[1][2] - m0220 * m[1][1];
526 bool hasPerspective =
533 if (hasPerspective) {
534 det = m[0][3] * det3(m, 1,2,3, 0,2,1)
535 + m[1][3] * det3(m, 2,0,3, 0,2,1)
536 + m[2][3] * det3(m, 3,0,1, 0,2,1)
539 det = detA * m[3][3];
550 invertible = m.invert(inv, tolerance);
559 inv[0][0] = detA * ( m[1][1] * m[2][2] - m[1][2] * m[2][1]);
560 inv[0][1] = detA * (-m[0][1] * m[2][2] + m[0][2] * m[2][1]);
561 inv[0][2] = detA * ( m[0][1] * m[1][2] - m[0][2] * m[1][1]);
563 inv[1][0] = detA * (-m[1][0] * m[2][2] + m[1][2] * m[2][0]);
564 inv[1][1] = detA * ( m[0][0] * m[2][2] - m0220);
565 inv[1][2] = detA * ( m0210 - m0012);
567 inv[2][0] = detA * ( m[1][0] * m[2][1] - m[1][1] * m[2][0]);
568 inv[2][1] = detA * ( m0120 - m[0][0] * m[2][1]);
569 inv[2][2] = detA * ( m0011 - m0110);
571 if (hasPerspective) {
576 r[0] = m[3][0] * inv[0][0] + m[3][1] * inv[1][0]
577 + m[3][2] * inv[2][0];
578 r[1] = m[3][0] * inv[0][1] + m[3][1] * inv[1][1]
579 + m[3][2] * inv[2][1];
580 r[2] = m[3][0] * inv[0][2] + m[3][1] * inv[1][2]
581 + m[3][2] * inv[2][2];
584 p[0] = inv[0][0] * m[0][3] + inv[0][1] * m[1][3]
585 + inv[0][2] * m[2][3];
586 p[1] = inv[1][0] * m[0][3] + inv[1][1] * m[1][3]
587 + inv[1][2] * m[2][3];
588 p[2] = inv[2][0] * m[0][3] + inv[2][1] * m[1][3]
589 + inv[2][2] * m[2][3];
591 T h = m[3][3] - p.
dot(
Vec3<T>(m[3][0],m[3][1],m[3][2]));
602 inv[3][0] = -h * r[0];
603 inv[3][1] = -h * r[1];
604 inv[3][2] = -h * r[2];
606 inv[0][3] = -h * p[0];
607 inv[1][3] = -h * p[1];
608 inv[2][3] = -h * p[2];
614 inv[0][0] += p[0] * r[0];
615 inv[0][1] += p[0] * r[1];
616 inv[0][2] += p[0] * r[2];
617 inv[1][0] += p[1] * r[0];
618 inv[1][1] += p[1] * r[1];
619 inv[1][2] += p[1] * r[2];
620 inv[2][0] += p[2] * r[0];
621 inv[2][1] += p[2] * r[1];
622 inv[2][2] += p[2] * r[2];
626 inv[3][0] = - (m[3][0] * inv[0][0] + m[3][1] * inv[1][0]
627 + m[3][2] * inv[2][0]);
628 inv[3][1] = - (m[3][0] * inv[0][1] + m[3][1] * inv[1][1]
629 + m[3][2] * inv[2][1]);
630 inv[3][2] = - (m[3][0] * inv[0][2] + m[3][1] * inv[1][2]
631 + m[3][2] * inv[2][2]);
655 for (i = 0; i < 4; i++) {
656 ap = &MyBase::mm[ 0];
658 for (j = 0; j < 4; j++) {
659 for (k = 0; k < 4; k++) {
660 if ((k != i) && (j != 0)) {
667 det += T(sign) * MyBase::mm[i] * submat.
det();
678 T(1), T(0), T(0), T(0),
679 T(0), T(1), T(0), T(0),
680 T(0), T(0), T(1), T(0),
681 T(v.
x()), T(v.
y()),T(v.
z()), T(1));
685 template <
typename T0>
703 MyBase::mm[12] = v.
x();
704 MyBase::mm[13] = v.
y();
705 MyBase::mm[14] = v.
z();
710 template <
typename T0>
716 *
this = Tr * (*this);
721 template <
typename T0>
727 *
this = (*this) * Tr;
733 template <
typename T0>
737 MyBase::mm[ 0] = v.
x();
738 MyBase::mm[ 5] = v.
y();
739 MyBase::mm[10] = v.
z();
743 template <
typename T0>
746 MyBase::mm[ 0] *= v.
x();
747 MyBase::mm[ 1] *= v.
x();
748 MyBase::mm[ 2] *= v.
x();
749 MyBase::mm[ 3] *= v.
x();
751 MyBase::mm[ 4] *= v.
y();
752 MyBase::mm[ 5] *= v.
y();
753 MyBase::mm[ 6] *= v.
y();
754 MyBase::mm[ 7] *= v.
y();
756 MyBase::mm[ 8] *= v.
z();
757 MyBase::mm[ 9] *= v.
z();
758 MyBase::mm[10] *= v.
z();
759 MyBase::mm[11] *= v.
z();
765 template <
typename T0>
769 MyBase::mm[ 0] *= v.
x();
770 MyBase::mm[ 1] *= v.
y();
771 MyBase::mm[ 2] *= v.
z();
773 MyBase::mm[ 4] *= v.
x();
774 MyBase::mm[ 5] *= v.
y();
775 MyBase::mm[ 6] *= v.
z();
777 MyBase::mm[ 8] *= v.
x();
778 MyBase::mm[ 9] *= v.
y();
779 MyBase::mm[10] *= v.
z();
781 MyBase::mm[12] *= v.
x();
782 MyBase::mm[13] *= v.
y();
783 MyBase::mm[14] *= v.
z();
808 T c =
static_cast<T
>(cos(angle));
809 T s = -
static_cast<T
>(sin(angle));
816 a4 = c * MyBase::mm[ 4] - s * MyBase::mm[ 8];
817 a5 = c * MyBase::mm[ 5] - s * MyBase::mm[ 9];
818 a6 = c * MyBase::mm[ 6] - s * MyBase::mm[10];
819 a7 = c * MyBase::mm[ 7] - s * MyBase::mm[11];
822 MyBase::mm[ 8] = s * MyBase::mm[ 4] + c * MyBase::mm[ 8];
823 MyBase::mm[ 9] = s * MyBase::mm[ 5] + c * MyBase::mm[ 9];
824 MyBase::mm[10] = s * MyBase::mm[ 6] + c * MyBase::mm[10];
825 MyBase::mm[11] = s * MyBase::mm[ 7] + c * MyBase::mm[11];
838 a0 = c * MyBase::mm[ 0] + s * MyBase::mm[ 8];
839 a1 = c * MyBase::mm[ 1] + s * MyBase::mm[ 9];
840 a2 = c * MyBase::mm[ 2] + s * MyBase::mm[10];
841 a3 = c * MyBase::mm[ 3] + s * MyBase::mm[11];
843 MyBase::mm[ 8] = -s * MyBase::mm[ 0] + c * MyBase::mm[ 8];
844 MyBase::mm[ 9] = -s * MyBase::mm[ 1] + c * MyBase::mm[ 9];
845 MyBase::mm[10] = -s * MyBase::mm[ 2] + c * MyBase::mm[10];
846 MyBase::mm[11] = -s * MyBase::mm[ 3] + c * MyBase::mm[11];
860 a0 = c * MyBase::mm[ 0] - s * MyBase::mm[ 4];
861 a1 = c * MyBase::mm[ 1] - s * MyBase::mm[ 5];
862 a2 = c * MyBase::mm[ 2] - s * MyBase::mm[ 6];
863 a3 = c * MyBase::mm[ 3] - s * MyBase::mm[ 7];
865 MyBase::mm[ 4] = s * MyBase::mm[ 0] + c * MyBase::mm[ 4];
866 MyBase::mm[ 5] = s * MyBase::mm[ 1] + c * MyBase::mm[ 5];
867 MyBase::mm[ 6] = s * MyBase::mm[ 2] + c * MyBase::mm[ 6];
868 MyBase::mm[ 7] = s * MyBase::mm[ 3] + c * MyBase::mm[ 7];
888 T c =
static_cast<T
>(cos(angle));
889 T s = -
static_cast<T
>(sin(angle));
898 a2 = c * MyBase::mm[ 2] - s * MyBase::mm[ 1];
899 a6 = c * MyBase::mm[ 6] - s * MyBase::mm[ 5];
900 a10 = c * MyBase::mm[10] - s * MyBase::mm[ 9];
901 a14 = c * MyBase::mm[14] - s * MyBase::mm[13];
904 MyBase::mm[ 1] = c * MyBase::mm[ 1] + s * MyBase::mm[ 2];
905 MyBase::mm[ 5] = c * MyBase::mm[ 5] + s * MyBase::mm[ 6];
906 MyBase::mm[ 9] = c * MyBase::mm[ 9] + s * MyBase::mm[10];
907 MyBase::mm[13] = c * MyBase::mm[13] + s * MyBase::mm[14];
911 MyBase::mm[10] = a10;
912 MyBase::mm[14] = a14;
920 a2 = c * MyBase::mm[ 2] + s * MyBase::mm[ 0];
921 a6 = c * MyBase::mm[ 6] + s * MyBase::mm[ 4];
922 a10 = c * MyBase::mm[10] + s * MyBase::mm[ 8];
923 a14 = c * MyBase::mm[14] + s * MyBase::mm[12];
925 MyBase::mm[ 0] = c * MyBase::mm[ 0] - s * MyBase::mm[ 2];
926 MyBase::mm[ 4] = c * MyBase::mm[ 4] - s * MyBase::mm[ 6];
927 MyBase::mm[ 8] = c * MyBase::mm[ 8] - s * MyBase::mm[10];
928 MyBase::mm[12] = c * MyBase::mm[12] - s * MyBase::mm[14];
932 MyBase::mm[10] = a10;
933 MyBase::mm[14] = a14;
941 a1 = c * MyBase::mm[ 1] - s * MyBase::mm[ 0];
942 a5 = c * MyBase::mm[ 5] - s * MyBase::mm[ 4];
943 a9 = c * MyBase::mm[ 9] - s * MyBase::mm[ 8];
944 a13 = c * MyBase::mm[13] - s * MyBase::mm[12];
946 MyBase::mm[ 0] = c * MyBase::mm[ 0] + s * MyBase::mm[ 1];
947 MyBase::mm[ 4] = c * MyBase::mm[ 4] + s * MyBase::mm[ 5];
948 MyBase::mm[ 8] = c * MyBase::mm[ 8] + s * MyBase::mm[ 9];
949 MyBase::mm[12] = c * MyBase::mm[12] + s * MyBase::mm[13];
954 MyBase::mm[13] = a13;
970 *
this = shear<Mat4<T> >(axis0, axis1, shearby);
978 int index0 =
static_cast<int>(axis0);
979 int index1 =
static_cast<int>(axis1);
982 MyBase::mm[index1 * 4 + 0] += shear * MyBase::mm[index0 * 4 + 0];
983 MyBase::mm[index1 * 4 + 1] += shear * MyBase::mm[index0 * 4 + 1];
984 MyBase::mm[index1 * 4 + 2] += shear * MyBase::mm[index0 * 4 + 2];
985 MyBase::mm[index1 * 4 + 3] += shear * MyBase::mm[index0 * 4 + 3];
993 int index0 =
static_cast<int>(axis0);
994 int index1 =
static_cast<int>(axis1);
997 MyBase::mm[index0 + 0] += shear * MyBase::mm[index1 + 0];
998 MyBase::mm[index0 + 4] += shear * MyBase::mm[index1 + 4];
999 MyBase::mm[index0 + 8] += shear * MyBase::mm[index1 + 8];
1000 MyBase::mm[index0 + 12] += shear * MyBase::mm[index1 + 12];
1005 template<
typename T0>
1008 return static_cast< Vec4<T0> >(v * *
this);
1012 template<
typename T0>
1015 return static_cast< Vec3<T0> >(v * *
this);
1019 template<
typename T0>
1022 return static_cast< Vec4<T0> >(*
this * v);
1026 template<
typename T0>
1029 return static_cast< Vec3<T0> >(*
this * v);
1033 template<
typename T0>
1039 w =
static_cast<T0
>(p[0] * MyBase::mm[ 3] + p[1] * MyBase::mm[ 7]
1040 + p[2] * MyBase::mm[11] + MyBase::mm[15]);
1043 return Vec3<T0>(
static_cast<T0
>((p[0] * MyBase::mm[ 0] + p[1] * MyBase::mm[ 4] +
1044 p[2] * MyBase::mm[ 8] + MyBase::mm[12]) / w),
1045 static_cast<T0
>((p[0] * MyBase::mm[ 1] + p[1] * MyBase::mm[ 5] +
1046 p[2] * MyBase::mm[ 9] + MyBase::mm[13]) / w),
1047 static_cast<T0
>((p[0] * MyBase::mm[ 2] + p[1] * MyBase::mm[ 6] +
1048 p[2] * MyBase::mm[10] + MyBase::mm[14]) / w));
1055 template<
typename T0>
1061 w = p[0] * MyBase::mm[12] + p[1] * MyBase::mm[13] + p[2] * MyBase::mm[14] + MyBase::mm[15];
1064 return Vec3<T0>(
static_cast<T0
>((p[0] * MyBase::mm[ 0] + p[1] * MyBase::mm[ 1] +
1065 p[2] * MyBase::mm[ 2] + MyBase::mm[ 3]) / w),
1066 static_cast<T0
>((p[0] * MyBase::mm[ 4] + p[1] * MyBase::mm[ 5] +
1067 p[2] * MyBase::mm[ 6] + MyBase::mm[ 7]) / w),
1068 static_cast<T0
>((p[0] * MyBase::mm[ 8] + p[1] * MyBase::mm[ 9] +
1069 p[2] * MyBase::mm[10] + MyBase::mm[11]) / w));
1076 template<
typename T0>
1080 static_cast<T0
>(v[0] * MyBase::mm[ 0] + v[1] * MyBase::mm[ 4] + v[2] * MyBase::mm[ 8]),
1081 static_cast<T0>(v[0] * MyBase::mm[ 1] + v[1] * MyBase::mm[ 5] + v[2] * MyBase::mm[ 9]),
1082 static_cast<T0
>(v[0] * MyBase::mm[ 2] + v[1] * MyBase::mm[ 6] + v[2] * MyBase::mm[10]));
1087 bool invert(
Mat4<T> &inverse, T tolerance)
const;
1089 T det2(
const Mat4<T> &a,
int i0,
int i1,
int j0,
int j1)
const {
1092 return a.
mm[i0row+j0]*a.
mm[i1row+j1] - a.
mm[i0row+j1]*a.
mm[i1row+j0];
1095 T det3(
const Mat4<T> &a,
int i0,
int i1,
int i2,
1096 int j0,
int j1,
int j2)
const {
1098 return a.
mm[i0row+j0]*det2(a, i1,i2, j1,j2) +
1099 a.
mm[i0row+j1]*det2(a, i1,i2, j2,j0) +
1100 a.
mm[i0row+j2]*det2(a, i1,i2, j0,j1);
1107 template <
typename T0,
typename T1>
1113 for (
int i=0; i<16; ++i)
if (!
isExactlyEqual(t0[i], t1[i]))
return false;
1119 template <
typename T0,
typename T1>
1124 template <
typename S,
typename T>
1132 template <
typename S,
typename T>
1142 template<
typename T,
typename MT>
1149 _v[0]*m[0] + _v[1]*m[1] + _v[2]*m[2] + _v[3]*m[3],
1150 _v[0]*m[4] + _v[1]*m[5] + _v[2]*m[6] + _v[3]*m[7],
1151 _v[0]*m[8] + _v[1]*m[9] + _v[2]*m[10] + _v[3]*m[11],
1152 _v[0]*m[12] + _v[1]*m[13] + _v[2]*m[14] + _v[3]*m[15]);
1157 template<
typename T,
typename MT>
1164 _v[0]*m[0] + _v[1]*m[4] + _v[2]*m[8] + _v[3]*m[12],
1165 _v[0]*m[1] + _v[1]*m[5] + _v[2]*m[9] + _v[3]*m[13],
1166 _v[0]*m[2] + _v[1]*m[6] + _v[2]*m[10] + _v[3]*m[14],
1167 _v[0]*m[3] + _v[1]*m[7] + _v[2]*m[11] + _v[3]*m[15]);
1172 template<
typename T,
typename MT>
1178 _v[0]*m[0] + _v[1]*m[1] + _v[2]*m[2] + m[3],
1179 _v[0]*m[4] + _v[1]*m[5] + _v[2]*m[6] + m[7],
1180 _v[0]*m[8] + _v[1]*m[9] + _v[2]*m[10] + m[11]);
1185 template<
typename T,
typename MT>
1191 _v[0]*m[0] + _v[1]*m[4] + _v[2]*m[8] + m[12],
1192 _v[0]*m[1] + _v[1]*m[5] + _v[2]*m[9] + m[13],
1193 _v[0]*m[2] + _v[1]*m[6] + _v[2]*m[10] + m[14]);
1198 template <
typename T0,
typename T1>
1209 template <
typename T0,
typename T1>
1220 template <
typename T0,
typename T1>
1233 template<
typename T0,
typename T1>
1237 static_cast<T1
>(m[0][0]*n[0] + m[0][1]*n[1] + m[0][2]*n[2]),
1238 static_cast<T1>(m[1][0]*n[0] + m[1][1]*n[1] + m[1][2]*n[2]),
1239 static_cast<T1
>(m[2][0]*n[0] + m[2][1]*n[1] + m[2][2]*n[2]));
1244 template<
typename T>
1252 for (
int i = 0; i < 4; ++i) {
1254 double max = fabs(temp[i][i]);
1256 for (
int k = i+1; k < 4; ++k) {
1257 if (fabs(temp[k][i]) > max) {
1259 max = fabs(temp[k][i]);
1268 for (
int k = 0; k < 4; ++k) {
1269 std::swap(temp[row][k], temp[i][k]);
1270 std::swap(inverse[row][k], inverse[i][k]);
1274 double pivot = temp[i][i];
1278 for (
int k = 0; k < 4; ++k) {
1279 temp[i][k] /=
pivot;
1280 inverse[i][k] /=
pivot;
1284 for (
int j = i+1; j < 4; ++j) {
1285 double t = temp[j][i];
1288 for (
int k = 0; k < 4; ++k) {
1289 temp[j][k] -= temp[i][k] * t;
1290 inverse[j][k] -= inverse[i][k] * t;
1297 for (
int i = 3; i > 0; --i) {
1298 for (
int j = 0; j < i; ++j) {
1299 double t = temp[j][i];
1302 for (
int k = 0; k < 4; ++k) {
1303 inverse[j][k] -= inverse[i][k]*t;
1308 return det*det >= tolerance*tolerance;
1311 template <
typename T>
1316 template <
typename T>
1321 template<
typename T>
1328 for (
unsigned i = 0; i < 16; ++i, ++op, ++ip) *op =
math::Abs(*ip);
1332 template<
typename Type1,
typename Type2>
1339 for (
unsigned i = 0; i < 16; ++i, ++op, ++ip) {
1347 template<
typename T>
1351 return cwiseLessThan<4, T>(m0, m1);
1354 template<
typename T>
1358 return cwiseGreaterThan<4, T>(m0, m1);
1368 template<>
inline math::Mat4s zeroVal<math::Mat4s>() {
return math::Mat4s::zero(); }
1369 template<>
inline math::Mat4d zeroVal<math::Mat4d>() {
return math::Mat4d::zero(); }
1374 #endif // OPENVDB_UTIL_MAT4_H_HAS_BEEN_INCLUDED
T det() const
Determinant of matrix.
Definition: Mat4.h:645
bool operator!=(const Mat4< T0 > &m0, const Mat4< T1 > &m1)
Inequality operator, does exact floating point comparisons.
Definition: Mat4.h:1120
void preScale(const Vec3< T0 > &v)
Definition: Mat4.h:744
Vec3< T0 > pretransformH(const Vec3< T0 > &p) const
Transform a Vec3 by pre-multiplication, doing homogenous division.
Definition: Mat4.h:1056
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:202
Mat4(const Mat4< Source > &m)
Conversion constructor.
Definition: Mat4.h:115
T & z()
Definition: Vec3.h:85
static Mat4 translation(const Vec3d &v)
Sets the matrix to a matrix that translates by v.
Definition: Mat4.h:675
#define OPENVDB_THROW(exception, message)
Definition: openvdb/Exceptions.h:82
Mat4< typename promote< S, T >::type > operator*(S scalar, const Mat4< T > &m)
Multiply each element of the given matrix by scalar and return the result.
Definition: Mat4.h:1125
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
static const Mat4< T > & zero()
Predefined constant for zero matrix.
Definition: Mat4.h:136
Vec3< typename promote< T, MT >::type > operator*(const Vec3< T > &_v, const Mat4< MT > &_m)
Multiply _v by _m and return the resulting vector.
Definition: Mat4.h:1187
void preShear(Axis axis0, Axis axis1, T shear)
Left multiplies a shearing transformation into the matrix.
Definition: Mat4.h:976
T mm[SIZE *SIZE]
Definition: Mat.h:175
static const Mat4< T > & identity()
Predefined constant for identity matrix.
Definition: Mat4.h:125
void setMat3(const Mat3< T > &m)
Set upper left to a Mat3.
Definition: Mat4.h:298
Vec4< T > row(int i) const
Get ith row, e.g. Vec4f v = m.row(1);.
Definition: Mat4.h:158
Vec3< T1 > transformNormal(const Mat4< T0 > &m, const Vec3< T1 > &n)
Definition: Mat4.h:1234
void postScale(const Vec3< T0 > &v)
Definition: Mat4.h:766
Vec4< T0 > pretransform(const Vec4< T0 > &v) const
Transform a Vec4 by pre-multiplication.
Definition: Mat4.h:1020
bool operator==(const Mat4< T0 > &m0, const Mat4< T1 > &m1)
Equality operator, does exact floating point comparisons.
Definition: Mat4.h:1108
void setToShear(Axis axis0, Axis axis1, T shearby)
Sets the matrix to a shear along axis0 by a fraction of axis1.
Definition: Mat4.h:968
void preRotate(Axis axis, T angle)
Left multiplies by a rotation clock-wiseabout the given axis into this matrix.
Definition: Mat4.h:806
Mat4< double > Mat4d
Definition: Mat4.h:1362
void setCol(int j, const Vec4< T > &v)
Set jth column to vector v.
Definition: Mat4.h:165
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:800
T & y()
Definition: Vec3.h:84
Mat4(const Mat< 4, T > &m)
Copy constructor.
Definition: Mat4.h:104
T & operator()(int i, int j)
Definition: Mat4.h:184
4x4 -matrix class.
Definition: Mat3.h:22
Vec4< typename promote< T, MT >::type > operator*(const Vec4< T > &_v, const Mat4< MT > &_m)
Multiply _v by _m and return the resulting vector.
Definition: Mat4.h:1159
void setZero()
Definition: Mat4.h:252
Mat3< T > getMat3() const
Definition: Mat4.h:305
Vec4< typename promote< T, MT >::type > operator*(const Mat4< MT > &_m, const Vec4< T > &_v)
Multiply _m by _v and return the resulting vector.
Definition: Mat4.h:1144
Mat4< typename promote< T0, T1 >::type > operator-(const Mat4< T0 > &m0, const Mat4< T1 > &m1)
Subtract corresponding elements of m0 and m1 and return the result.
Definition: Mat4.h:1211
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:64
void setRow(int i, const Vec4< T > &v)
Set ith row to vector v.
Definition: Mat4.h:147
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:227
void pivot(int i, int j, Mat3< T > &S, Vec3< T > &D, Mat3< T > &Q)
Definition: Mat3.h:675
Vec4< T0 > transform(const Vec4< T0 > &v) const
Transform a Vec4 by post-multiplication.
Definition: Mat4.h:1006
bool isAffine(const Mat4< T > &m)
Definition: Mat4.h:1312
T dot(const Vec3< T > &v) const
Dot product.
Definition: Vec3.h:189
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition: version.h:94
Vec3< typename promote< T, MT >::type > operator*(const Mat4< MT > &_m, const Vec3< T > &_v)
Multiply _m by _v and return the resulting vector.
Definition: Mat4.h:1174
Mat4< T > operator-() const
Negation operator, for e.g. m1 = -m2;.
Definition: Mat4.h:351
Axis
Definition: Math.h:894
const Mat4< T > & operator*=(const Mat4< S > &m1)
Multiply this matrix by the given matrix.
Definition: Mat4.h:447
Mat4(Source *a)
Constructor given array of elements, the ordering is in row major form:
Definition: Mat4.h:49
void postTranslate(const Vec3< T0 > &tr)
Right multiplies by the specified translation matrix, i.e. (*this) * Trans.
Definition: Mat4.h:722
Mat4< T > Abs(const Mat4< T > &m)
Definition: Mat4.h:1323
Real value_type
Definition: Mat.h:29
const Mat4< T > & operator+=(const Mat4< S > &m1)
Add each element of the given matrix to the corresponding element of this matrix. ...
Definition: Mat4.h:389
Mat4 transpose() const
Definition: Mat4.h:480
3x3 matrix class.
Definition: Mat3.h:28
Definition: openvdb/Exceptions.h:13
Vec3< T0 > transformH(const Vec3< T0 > &p) const
Transform a Vec3 by post-multiplication, doing homogenous divison.
Definition: Mat4.h:1034
Vec4< T > col(int j) const
Get jth column, e.g. Vec4f v = m.col(0);.
Definition: Mat4.h:175
Mat4< Type1 > cwiseAdd(const Mat4< Type1 > &m, const Type2 s)
Definition: Mat4.h:1334
void setToRotation(Axis axis, T angle)
Sets the matrix to a rotation about the given axis.
Definition: Mat4.h:791
void setToRotation(const Vec3< T > &axis, T angle)
Sets the matrix to a rotation about an arbitrary axis.
Definition: Mat4.h:796
bool isExactlyEqual(const T0 &a, const T1 &b)
Return true if a is exactly equal to b.
Definition: Math.h:434
Vec3< T0 > transform3x3(const Vec3< T0 > &v) const
Transform a Vec3 by post-multiplication, without translation.
Definition: Mat4.h:1077
bool cwiseLessThan(const Mat4< T > &m0, const Mat4< T > &m1)
Definition: Mat4.h:1349
T det() const
Determinant of matrix.
Definition: Mat3.h:486
bool eq(const Mat4 &m, T eps=1.0e-8) const
Return true if this matrix is equivalent to m within a tolerance of eps.
Definition: Mat4.h:341
T & x()
Reference to the component, e.g. v.x() = 4.5f;.
Definition: Vec3.h:83
Mat4< typename promote< T0, T1 >::type > operator+(const Mat4< T0 > &m0, const Mat4< T1 > &m1)
Add corresponding elements of m0 and m1 and return the result.
Definition: Mat4.h:1200
Mat4< typename promote< T0, T1 >::type > operator*(const Mat4< T0 > &m0, const Mat4< T1 > &m1)
Multiply m0 by m1 and return the resulting matrix.
Definition: Mat4.h:1222
Vec3< T0 > transform(const Vec3< T0 > &v) const
Transform a Vec3 by post-multiplication, without homogenous division.
Definition: Mat4.h:1013
void setToTranslation(const Vec3< T0 > &v)
Sets the matrix to a matrix that translates by v.
Definition: Mat4.h:686
void preTranslate(const Vec3< T0 > &tr)
Left multiples by the specified translation, i.e. Trans * (*this)
Definition: Mat4.h:711
bool hasTranslation(const Mat4< T > &m)
Definition: Mat4.h:1317
Vec3< T0 > pretransform(const Vec3< T0 > &v) const
Transform a Vec3 by pre-multiplication, without homogenous division.
Definition: Mat4.h:1027
void postRotate(Axis axis, T angle)
Right multiplies by a rotation clock-wiseabout the given axis into this matrix.
Definition: Mat4.h:886
Real ValueType
Definition: Mat.h:30
bool cwiseGreaterThan(const Mat4< T > &m0, const Mat4< T > &m1)
Definition: Mat4.h:1356
Vec3< T > getTranslation() const
Return the translation component.
Definition: Mat4.h:317
Definition: openvdb/Exceptions.h:56
T * asPointer()
Direct access to the internal data.
Definition: Mat.h:116
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:146
const Mat4< T > & operator*=(S scalar)
Multiply each element of this matrix by scalar.
Definition: Mat4.h:363
Mat4 inverse(T tolerance=0) const
Definition: Mat4.h:493
const Mat4< T > & operator-=(const Mat4< S > &m1)
Subtract each element of the given matrix from the corresponding element of this matrix.
Definition: Mat4.h:418
void postShear(Axis axis0, Axis axis1, T shear)
Right multiplies a shearing transformation into the matrix.
Definition: Mat4.h:991
void setIdentity()
Set this matrix to identity.
Definition: Mat4.h:273
T angle(const Vec2< T > &v1, const Vec2< T > &v2)
Definition: Vec2.h:445
T operator()(int i, int j) const
Definition: Mat4.h:194
Mat4< typename promote< S, T >::type > operator*(const Mat4< T > &m, S scalar)
Multiply each element of the given matrix by scalar and return the result.
Definition: Mat4.h:1133
Mat4(const Vec4< Source > &v1, const Vec4< Source > &v2, const Vec4< Source > &v3, const Vec4< Source > &v4, bool rows=true)
Definition: Mat4.h:93
bool isApproxEqual(const Type &a, const Type &b, const Type &tolerance)
Return true if a is equal to b to within the given tolerance.
Definition: Math.h:397
void setToScale(const Vec3< T0 > &v)
Sets the matrix to a matrix that scales by v.
Definition: Mat4.h:734
const Mat4 & operator=(const Mat4< Source > &m)
Assignment operator.
Definition: Mat4.h:331
Mat4()
Trivial constructor, the matrix is NOT initialized.
Definition: Mat4.h:39
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:703
void setTranslation(const Vec3< T > &t)
Definition: Mat4.h:322