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)
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]);
178 MyBase::mm[i4+0] = v[0];
179 MyBase::mm[i4+1] = v[1];
180 MyBase::mm[i4+2] = v[2];
181 MyBase::mm[i4+3] = v[3];
188 return Vec4<T>((*this)(i,0), (*
this)(i,1), (*
this)(i,2), (*
this)(i,3));
195 MyBase::mm[ 0+j] = v[0];
196 MyBase::mm[ 4+j] = v[1];
197 MyBase::mm[ 8+j] = v[2];
198 MyBase::mm[12+j] = v[3];
205 return Vec4<T>((*this)(0,j), (*
this)(1,j), (*
this)(2,j), (*
this)(3,j));
209 T* operator[](
int i) {
return &(MyBase::mm[i<<2]); }
212 const T*
operator[](
int i)
const {
return &(MyBase::mm[i<<2]); }
226 return MyBase::mm[4*i+j];
236 return MyBase::mm[4*i+j];
243 MyBase::mm[ 0] = v1[0];
244 MyBase::mm[ 1] = v1[1];
245 MyBase::mm[ 2] = v1[2];
246 MyBase::mm[ 3] = v1[3];
248 MyBase::mm[ 4] = v2[0];
249 MyBase::mm[ 5] = v2[1];
250 MyBase::mm[ 6] = v2[2];
251 MyBase::mm[ 7] = v2[3];
253 MyBase::mm[ 8] = v3[0];
254 MyBase::mm[ 9] = v3[1];
255 MyBase::mm[10] = v3[2];
256 MyBase::mm[11] = v3[3];
258 MyBase::mm[12] = v4[0];
259 MyBase::mm[13] = v4[1];
260 MyBase::mm[14] = v4[2];
261 MyBase::mm[15] = v4[3];
268 MyBase::mm[ 0] = v1[0];
269 MyBase::mm[ 1] = v2[0];
270 MyBase::mm[ 2] = v3[0];
271 MyBase::mm[ 3] = v4[0];
273 MyBase::mm[ 4] = v1[1];
274 MyBase::mm[ 5] = v2[1];
275 MyBase::mm[ 6] = v3[1];
276 MyBase::mm[ 7] = v4[1];
278 MyBase::mm[ 8] = v1[2];
279 MyBase::mm[ 9] = v2[2];
280 MyBase::mm[10] = v3[2];
281 MyBase::mm[11] = v4[2];
283 MyBase::mm[12] = v1[3];
284 MyBase::mm[13] = v2[3];
285 MyBase::mm[14] = v3[3];
286 MyBase::mm[15] = v4[3];
338 for (
int i = 0; i < 3; i++)
339 for (
int j=0; j < 3; j++)
340 MyBase::mm[i*4+j] = m[i][j];
347 for (
int i = 0; i < 3; i++)
348 for (
int j = 0; j < 3; j++)
349 m[i][j] = MyBase::mm[i*4+j];
357 return Vec3<T>(MyBase::mm[12], MyBase::mm[13], MyBase::mm[14]);
362 MyBase::mm[12] = t[0];
363 MyBase::mm[13] = t[1];
364 MyBase::mm[14] = t[2];
368 template<
typename Source>
374 std::copy(src, (src + this->numElements()), MyBase::mm);
379 bool eq(
const Mat4 &m, T eps=1.0e-8)
const 381 for (
int i = 0; i < 16; i++) {
392 -MyBase::mm[ 0], -MyBase::mm[ 1], -MyBase::mm[ 2], -MyBase::mm[ 3],
393 -MyBase::mm[ 4], -MyBase::mm[ 5], -MyBase::mm[ 6], -MyBase::mm[ 7],
394 -MyBase::mm[ 8], -MyBase::mm[ 9], -MyBase::mm[10], -MyBase::mm[11],
395 -MyBase::mm[12], -MyBase::mm[13], -MyBase::mm[14], -MyBase::mm[15]
400 template <
typename S>
403 MyBase::mm[ 0] *= scalar;
404 MyBase::mm[ 1] *= scalar;
405 MyBase::mm[ 2] *= scalar;
406 MyBase::mm[ 3] *= scalar;
408 MyBase::mm[ 4] *= scalar;
409 MyBase::mm[ 5] *= scalar;
410 MyBase::mm[ 6] *= scalar;
411 MyBase::mm[ 7] *= scalar;
413 MyBase::mm[ 8] *= scalar;
414 MyBase::mm[ 9] *= scalar;
415 MyBase::mm[10] *= scalar;
416 MyBase::mm[11] *= scalar;
418 MyBase::mm[12] *= scalar;
419 MyBase::mm[13] *= scalar;
420 MyBase::mm[14] *= scalar;
421 MyBase::mm[15] *= scalar;
426 template <
typename S>
431 MyBase::mm[ 0] += s[ 0];
432 MyBase::mm[ 1] += s[ 1];
433 MyBase::mm[ 2] += s[ 2];
434 MyBase::mm[ 3] += s[ 3];
436 MyBase::mm[ 4] += s[ 4];
437 MyBase::mm[ 5] += s[ 5];
438 MyBase::mm[ 6] += s[ 6];
439 MyBase::mm[ 7] += s[ 7];
441 MyBase::mm[ 8] += s[ 8];
442 MyBase::mm[ 9] += s[ 9];
443 MyBase::mm[10] += s[10];
444 MyBase::mm[11] += s[11];
446 MyBase::mm[12] += s[12];
447 MyBase::mm[13] += s[13];
448 MyBase::mm[14] += s[14];
449 MyBase::mm[15] += s[15];
455 template <
typename S>
460 MyBase::mm[ 0] -= s[ 0];
461 MyBase::mm[ 1] -= s[ 1];
462 MyBase::mm[ 2] -= s[ 2];
463 MyBase::mm[ 3] -= s[ 3];
465 MyBase::mm[ 4] -= s[ 4];
466 MyBase::mm[ 5] -= s[ 5];
467 MyBase::mm[ 6] -= s[ 6];
468 MyBase::mm[ 7] -= s[ 7];
470 MyBase::mm[ 8] -= s[ 8];
471 MyBase::mm[ 9] -= s[ 9];
472 MyBase::mm[10] -= s[10];
473 MyBase::mm[11] -= s[11];
475 MyBase::mm[12] -= s[12];
476 MyBase::mm[13] -= s[13];
477 MyBase::mm[14] -= s[14];
478 MyBase::mm[15] -= s[15];
484 template <
typename S>
492 for (
int i = 0; i < 4; i++) {
494 MyBase::mm[i4+0] =
static_cast<T
>(s0[i4+0] * s1[ 0] +
499 MyBase::mm[i4+1] =
static_cast<T
>(s0[i4+0] * s1[ 1] +
504 MyBase::mm[i4+2] =
static_cast<T
>(s0[i4+0] * s1[ 2] +
509 MyBase::mm[i4+3] =
static_cast<T
>(s0[i4+0] * s1[ 3] +
521 MyBase::mm[ 0], MyBase::mm[ 4], MyBase::mm[ 8], MyBase::mm[12],
522 MyBase::mm[ 1], MyBase::mm[ 5], MyBase::mm[ 9], MyBase::mm[13],
523 MyBase::mm[ 2], MyBase::mm[ 6], MyBase::mm[10], MyBase::mm[14],
524 MyBase::mm[ 3], MyBase::mm[ 7], MyBase::mm[11], MyBase::mm[15]
554 T m0011 = m[0][0] * m[1][1];
555 T m0012 = m[0][0] * m[1][2];
556 T m0110 = m[0][1] * m[1][0];
557 T m0210 = m[0][2] * m[1][0];
558 T m0120 = m[0][1] * m[2][0];
559 T m0220 = m[0][2] * m[2][0];
561 T detA = m0011 * m[2][2] - m0012 * m[2][1] - m0110 * m[2][2]
562 + m0210 * m[2][1] + m0120 * m[1][2] - m0220 * m[1][1];
564 bool hasPerspective =
571 if (hasPerspective) {
572 det = m[0][3] * det3(m, 1,2,3, 0,2,1)
573 + m[1][3] * det3(m, 2,0,3, 0,2,1)
574 + m[2][3] * det3(m, 3,0,1, 0,2,1)
577 det = detA * m[3][3];
588 invertible = m.invert(inv, tolerance);
597 inv[0][0] = detA * ( m[1][1] * m[2][2] - m[1][2] * m[2][1]);
598 inv[0][1] = detA * (-m[0][1] * m[2][2] + m[0][2] * m[2][1]);
599 inv[0][2] = detA * ( m[0][1] * m[1][2] - m[0][2] * m[1][1]);
601 inv[1][0] = detA * (-m[1][0] * m[2][2] + m[1][2] * m[2][0]);
602 inv[1][1] = detA * ( m[0][0] * m[2][2] - m0220);
603 inv[1][2] = detA * ( m0210 - m0012);
605 inv[2][0] = detA * ( m[1][0] * m[2][1] - m[1][1] * m[2][0]);
606 inv[2][1] = detA * ( m0120 - m[0][0] * m[2][1]);
607 inv[2][2] = detA * ( m0011 - m0110);
609 if (hasPerspective) {
614 r[0] = m[3][0] * inv[0][0] + m[3][1] * inv[1][0]
615 + m[3][2] * inv[2][0];
616 r[1] = m[3][0] * inv[0][1] + m[3][1] * inv[1][1]
617 + m[3][2] * inv[2][1];
618 r[2] = m[3][0] * inv[0][2] + m[3][1] * inv[1][2]
619 + m[3][2] * inv[2][2];
622 p[0] = inv[0][0] * m[0][3] + inv[0][1] * m[1][3]
623 + inv[0][2] * m[2][3];
624 p[1] = inv[1][0] * m[0][3] + inv[1][1] * m[1][3]
625 + inv[1][2] * m[2][3];
626 p[2] = inv[2][0] * m[0][3] + inv[2][1] * m[1][3]
627 + inv[2][2] * m[2][3];
629 T h = m[3][3] - p.
dot(
Vec3<T>(m[3][0],m[3][1],m[3][2]));
640 inv[3][0] = -h * r[0];
641 inv[3][1] = -h * r[1];
642 inv[3][2] = -h * r[2];
644 inv[0][3] = -h * p[0];
645 inv[1][3] = -h * p[1];
646 inv[2][3] = -h * p[2];
652 inv[0][0] += p[0] * r[0];
653 inv[0][1] += p[0] * r[1];
654 inv[0][2] += p[0] * r[2];
655 inv[1][0] += p[1] * r[0];
656 inv[1][1] += p[1] * r[1];
657 inv[1][2] += p[1] * r[2];
658 inv[2][0] += p[2] * r[0];
659 inv[2][1] += p[2] * r[1];
660 inv[2][2] += p[2] * r[2];
664 inv[3][0] = - (m[3][0] * inv[0][0] + m[3][1] * inv[1][0]
665 + m[3][2] * inv[2][0]);
666 inv[3][1] = - (m[3][0] * inv[0][1] + m[3][1] * inv[1][1]
667 + m[3][2] * inv[2][1]);
668 inv[3][2] = - (m[3][0] * inv[0][2] + m[3][1] * inv[1][2]
669 + m[3][2] * inv[2][2]);
693 for (i = 0; i < 4; i++) {
694 ap = &MyBase::mm[ 0];
696 for (j = 0; j < 4; j++) {
697 for (k = 0; k < 4; k++) {
698 if ((k != i) && (j != 0)) {
705 det += sign * MyBase::mm[i] * submat.
det();
716 T(1), T(0), T(0), T(0),
717 T(0), T(1), T(0), T(0),
718 T(0), T(0), T(1), T(0),
719 T(v.
x()), T(v.
y()),T(v.
z()), T(1));
723 template <
typename T0>
741 MyBase::mm[12] = v.
x();
742 MyBase::mm[13] = v.
y();
743 MyBase::mm[14] = v.
z();
748 template <
typename T0>
754 *
this = Tr * (*this);
759 template <
typename T0>
765 *
this = (*this) * Tr;
771 template <
typename T0>
775 MyBase::mm[ 0] = v.
x();
776 MyBase::mm[ 5] = v.
y();
777 MyBase::mm[10] = v.
z();
781 template <
typename T0>
784 MyBase::mm[ 0] *= v.
x();
785 MyBase::mm[ 1] *= v.
x();
786 MyBase::mm[ 2] *= v.
x();
787 MyBase::mm[ 3] *= v.
x();
789 MyBase::mm[ 4] *= v.
y();
790 MyBase::mm[ 5] *= v.
y();
791 MyBase::mm[ 6] *= v.
y();
792 MyBase::mm[ 7] *= v.
y();
794 MyBase::mm[ 8] *= v.
z();
795 MyBase::mm[ 9] *= v.
z();
796 MyBase::mm[10] *= v.
z();
797 MyBase::mm[11] *= v.
z();
803 template <
typename T0>
807 MyBase::mm[ 0] *= v.
x();
808 MyBase::mm[ 1] *= v.
y();
809 MyBase::mm[ 2] *= v.
z();
811 MyBase::mm[ 4] *= v.
x();
812 MyBase::mm[ 5] *= v.
y();
813 MyBase::mm[ 6] *= v.
z();
815 MyBase::mm[ 8] *= v.
x();
816 MyBase::mm[ 9] *= v.
y();
817 MyBase::mm[10] *= v.
z();
819 MyBase::mm[12] *= v.
x();
820 MyBase::mm[13] *= v.
y();
821 MyBase::mm[14] *= v.
z();
846 T c =
static_cast<T
>(cos(angle));
847 T s = -
static_cast<T
>(sin(angle));
854 a4 = c * MyBase::mm[ 4] - s * MyBase::mm[ 8];
855 a5 = c * MyBase::mm[ 5] - s * MyBase::mm[ 9];
856 a6 = c * MyBase::mm[ 6] - s * MyBase::mm[10];
857 a7 = c * MyBase::mm[ 7] - s * MyBase::mm[11];
860 MyBase::mm[ 8] = s * MyBase::mm[ 4] + c * MyBase::mm[ 8];
861 MyBase::mm[ 9] = s * MyBase::mm[ 5] + c * MyBase::mm[ 9];
862 MyBase::mm[10] = s * MyBase::mm[ 6] + c * MyBase::mm[10];
863 MyBase::mm[11] = s * MyBase::mm[ 7] + c * MyBase::mm[11];
876 a0 = c * MyBase::mm[ 0] + s * MyBase::mm[ 8];
877 a1 = c * MyBase::mm[ 1] + s * MyBase::mm[ 9];
878 a2 = c * MyBase::mm[ 2] + s * MyBase::mm[10];
879 a3 = c * MyBase::mm[ 3] + s * MyBase::mm[11];
881 MyBase::mm[ 8] = -s * MyBase::mm[ 0] + c * MyBase::mm[ 8];
882 MyBase::mm[ 9] = -s * MyBase::mm[ 1] + c * MyBase::mm[ 9];
883 MyBase::mm[10] = -s * MyBase::mm[ 2] + c * MyBase::mm[10];
884 MyBase::mm[11] = -s * MyBase::mm[ 3] + c * MyBase::mm[11];
898 a0 = c * MyBase::mm[ 0] - s * MyBase::mm[ 4];
899 a1 = c * MyBase::mm[ 1] - s * MyBase::mm[ 5];
900 a2 = c * MyBase::mm[ 2] - s * MyBase::mm[ 6];
901 a3 = c * MyBase::mm[ 3] - s * MyBase::mm[ 7];
903 MyBase::mm[ 4] = s * MyBase::mm[ 0] + c * MyBase::mm[ 4];
904 MyBase::mm[ 5] = s * MyBase::mm[ 1] + c * MyBase::mm[ 5];
905 MyBase::mm[ 6] = s * MyBase::mm[ 2] + c * MyBase::mm[ 6];
906 MyBase::mm[ 7] = s * MyBase::mm[ 3] + c * MyBase::mm[ 7];
926 T c =
static_cast<T
>(cos(angle));
927 T s = -
static_cast<T
>(sin(angle));
936 a2 = c * MyBase::mm[ 2] - s * MyBase::mm[ 1];
937 a6 = c * MyBase::mm[ 6] - s * MyBase::mm[ 5];
938 a10 = c * MyBase::mm[10] - s * MyBase::mm[ 9];
939 a14 = c * MyBase::mm[14] - s * MyBase::mm[13];
942 MyBase::mm[ 1] = c * MyBase::mm[ 1] + s * MyBase::mm[ 2];
943 MyBase::mm[ 5] = c * MyBase::mm[ 5] + s * MyBase::mm[ 6];
944 MyBase::mm[ 9] = c * MyBase::mm[ 9] + s * MyBase::mm[10];
945 MyBase::mm[13] = c * MyBase::mm[13] + s * MyBase::mm[14];
949 MyBase::mm[10] = a10;
950 MyBase::mm[14] = a14;
958 a2 = c * MyBase::mm[ 2] + s * MyBase::mm[ 0];
959 a6 = c * MyBase::mm[ 6] + s * MyBase::mm[ 4];
960 a10 = c * MyBase::mm[10] + s * MyBase::mm[ 8];
961 a14 = c * MyBase::mm[14] + s * MyBase::mm[12];
963 MyBase::mm[ 0] = c * MyBase::mm[ 0] - s * MyBase::mm[ 2];
964 MyBase::mm[ 4] = c * MyBase::mm[ 4] - s * MyBase::mm[ 6];
965 MyBase::mm[ 8] = c * MyBase::mm[ 8] - s * MyBase::mm[10];
966 MyBase::mm[12] = c * MyBase::mm[12] - s * MyBase::mm[14];
970 MyBase::mm[10] = a10;
971 MyBase::mm[14] = a14;
979 a1 = c * MyBase::mm[ 1] - s * MyBase::mm[ 0];
980 a5 = c * MyBase::mm[ 5] - s * MyBase::mm[ 4];
981 a9 = c * MyBase::mm[ 9] - s * MyBase::mm[ 8];
982 a13 = c * MyBase::mm[13] - s * MyBase::mm[12];
984 MyBase::mm[ 0] = c * MyBase::mm[ 0] + s * MyBase::mm[ 1];
985 MyBase::mm[ 4] = c * MyBase::mm[ 4] + s * MyBase::mm[ 5];
986 MyBase::mm[ 8] = c * MyBase::mm[ 8] + s * MyBase::mm[ 9];
987 MyBase::mm[12] = c * MyBase::mm[12] + s * MyBase::mm[13];
992 MyBase::mm[13] = a13;
1008 *
this = shear<Mat4<T> >(axis0, axis1, shearby);
1016 int index0 =
static_cast<int>(axis0);
1017 int index1 =
static_cast<int>(axis1);
1020 MyBase::mm[index1 * 4 + 0] += shear * MyBase::mm[index0 * 4 + 0];
1021 MyBase::mm[index1 * 4 + 1] += shear * MyBase::mm[index0 * 4 + 1];
1022 MyBase::mm[index1 * 4 + 2] += shear * MyBase::mm[index0 * 4 + 2];
1023 MyBase::mm[index1 * 4 + 3] += shear * MyBase::mm[index0 * 4 + 3];
1031 int index0 =
static_cast<int>(axis0);
1032 int index1 =
static_cast<int>(axis1);
1035 MyBase::mm[index0 + 0] += shear * MyBase::mm[index1 + 0];
1036 MyBase::mm[index0 + 4] += shear * MyBase::mm[index1 + 4];
1037 MyBase::mm[index0 + 8] += shear * MyBase::mm[index1 + 8];
1038 MyBase::mm[index0 + 12] += shear * MyBase::mm[index1 + 12];
1043 template<
typename T0>
1046 return static_cast< Vec4<T0> >(v * *
this);
1050 template<
typename T0>
1053 return static_cast< Vec3<T0> >(v * *
this);
1057 template<
typename T0>
1060 return static_cast< Vec4<T0> >(*
this * v);
1064 template<
typename T0>
1067 return static_cast< Vec3<T0> >(*
this * v);
1071 template<
typename T0>
1077 w =
static_cast<T0
>(p[0] * MyBase::mm[ 3] + p[1] * MyBase::mm[ 7]
1078 + p[2] * MyBase::mm[11] + MyBase::mm[15]);
1081 return Vec3<T0>(
static_cast<T0
>((p[0] * MyBase::mm[ 0] + p[1] * MyBase::mm[ 4] +
1082 p[2] * MyBase::mm[ 8] + MyBase::mm[12]) / w),
1083 static_cast<T0
>((p[0] * MyBase::mm[ 1] + p[1] * MyBase::mm[ 5] +
1084 p[2] * MyBase::mm[ 9] + MyBase::mm[13]) / w),
1085 static_cast<T0
>((p[0] * MyBase::mm[ 2] + p[1] * MyBase::mm[ 6] +
1086 p[2] * MyBase::mm[10] + MyBase::mm[14]) / w));
1093 template<
typename T0>
1099 w = p[0] * MyBase::mm[12] + p[1] * MyBase::mm[13] + p[2] * MyBase::mm[14] + MyBase::mm[15];
1102 return Vec3<T0>(
static_cast<T0
>((p[0] * MyBase::mm[ 0] + p[1] * MyBase::mm[ 1] +
1103 p[2] * MyBase::mm[ 2] + MyBase::mm[ 3]) / w),
1104 static_cast<T0
>((p[0] * MyBase::mm[ 4] + p[1] * MyBase::mm[ 5] +
1105 p[2] * MyBase::mm[ 6] + MyBase::mm[ 7]) / w),
1106 static_cast<T0
>((p[0] * MyBase::mm[ 8] + p[1] * MyBase::mm[ 9] +
1107 p[2] * MyBase::mm[10] + MyBase::mm[11]) / w));
1114 template<
typename T0>
1118 static_cast<T0
>(v[0] * MyBase::mm[ 0] + v[1] * MyBase::mm[ 4] + v[2] * MyBase::mm[ 8]),
1119 static_cast<T0>(v[0] * MyBase::mm[ 1] + v[1] * MyBase::mm[ 5] + v[2] * MyBase::mm[ 9]),
1120 static_cast<T0
>(v[0] * MyBase::mm[ 2] + v[1] * MyBase::mm[ 6] + v[2] * MyBase::mm[10]));
1125 bool invert(
Mat4<T> &inverse, T tolerance)
const;
1127 T det2(
const Mat4<T> &a,
int i0,
int i1,
int j0,
int j1)
const {
1130 return a.
mm[i0row+j0]*a.
mm[i1row+j1] - a.
mm[i0row+j1]*a.
mm[i1row+j0];
1133 T det3(
const Mat4<T> &a,
int i0,
int i1,
int i2,
1134 int j0,
int j1,
int j2)
const {
1136 return a.
mm[i0row+j0]*det2(a, i1,i2, j1,j2) +
1137 a.
mm[i0row+j1]*det2(a, i1,i2, j2,j0) +
1138 a.
mm[i0row+j2]*det2(a, i1,i2, j0,j1);
1145 template <
typename T0,
typename T1>
1151 for (
int i=0; i<16; ++i)
if (!
isExactlyEqual(t0[i], t1[i]))
return false;
1157 template <
typename T0,
typename T1>
1162 template <
typename S,
typename T>
1170 template <
typename S,
typename T>
1180 template<
typename T,
typename MT>
1187 _v[0]*m[0] + _v[1]*m[1] + _v[2]*m[2] + _v[3]*m[3],
1188 _v[0]*m[4] + _v[1]*m[5] + _v[2]*m[6] + _v[3]*m[7],
1189 _v[0]*m[8] + _v[1]*m[9] + _v[2]*m[10] + _v[3]*m[11],
1190 _v[0]*m[12] + _v[1]*m[13] + _v[2]*m[14] + _v[3]*m[15]);
1195 template<
typename T,
typename MT>
1202 _v[0]*m[0] + _v[1]*m[4] + _v[2]*m[8] + _v[3]*m[12],
1203 _v[0]*m[1] + _v[1]*m[5] + _v[2]*m[9] + _v[3]*m[13],
1204 _v[0]*m[2] + _v[1]*m[6] + _v[2]*m[10] + _v[3]*m[14],
1205 _v[0]*m[3] + _v[1]*m[7] + _v[2]*m[11] + _v[3]*m[15]);
1210 template<
typename T,
typename MT>
1216 _v[0]*m[0] + _v[1]*m[1] + _v[2]*m[2] + m[3],
1217 _v[0]*m[4] + _v[1]*m[5] + _v[2]*m[6] + m[7],
1218 _v[0]*m[8] + _v[1]*m[9] + _v[2]*m[10] + m[11]);
1223 template<
typename T,
typename MT>
1229 _v[0]*m[0] + _v[1]*m[4] + _v[2]*m[8] + m[12],
1230 _v[0]*m[1] + _v[1]*m[5] + _v[2]*m[9] + m[13],
1231 _v[0]*m[2] + _v[1]*m[6] + _v[2]*m[10] + m[14]);
1236 template <
typename T0,
typename T1>
1247 template <
typename T0,
typename T1>
1258 template <
typename T0,
typename T1>
1271 template<
typename T0,
typename T1>
1275 static_cast<T1
>(m[0][0]*n[0] + m[0][1]*n[1] + m[0][2]*n[2]),
1276 static_cast<T1>(m[1][0]*n[0] + m[1][1]*n[1] + m[1][2]*n[2]),
1277 static_cast<T1
>(m[2][0]*n[0] + m[2][1]*n[1] + m[2][2]*n[2]));
1282 template<
typename T>
1290 for (
int i = 0; i < 4; ++i) {
1292 double max = fabs(temp[i][i]);
1294 for (
int k = i+1; k < 4; ++k) {
1295 if (fabs(temp[k][i]) > max) {
1297 max = fabs(temp[k][i]);
1306 for (
int k = 0; k < 4; ++k) {
1307 std::swap(temp[row][k], temp[i][k]);
1308 std::swap(inverse[row][k], inverse[i][k]);
1312 double pivot = temp[i][i];
1316 for (
int k = 0; k < 4; ++k) {
1317 temp[i][k] /=
pivot;
1318 inverse[i][k] /=
pivot;
1322 for (
int j = i+1; j < 4; ++j) {
1323 double t = temp[j][i];
1326 for (
int k = 0; k < 4; ++k) {
1327 temp[j][k] -= temp[i][k] * t;
1328 inverse[j][k] -= inverse[i][k] * t;
1335 for (
int i = 3; i > 0; --i) {
1336 for (
int j = 0; j < i; ++j) {
1337 double t = temp[j][i];
1340 for (
int k = 0; k < 4; ++k) {
1341 inverse[j][k] -= inverse[i][k]*t;
1346 return det*det >= tolerance*tolerance;
1349 template <
typename T>
1354 template <
typename T>
1367 template<>
inline math::Mat4s zeroVal<math::Mat4s>() {
return math::Mat4s::zero(); }
1368 template<>
inline math::Mat4d zeroVal<math::Mat4d>() {
return math::Mat4d::zero(); }
1373 #endif // OPENVDB_UTIL_MAT4_H_HAS_BEEN_INCLUDED T & y()
Definition: Vec3.h:111
void setIdentity()
Set this matrix to identity.
Definition: Mat4.h:311
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:1171
Mat4(const Vec4< Source > &v1, const Vec4< Source > &v2, const Vec4< Source > &v3, const Vec4< Source > &v4, bool rows=true)
Definition: Mat4.h:120
Real value_type
Definition: Mat.h:56
void pivot(int i, int j, Mat3< T > &S, Vec3< T > &D, Mat3< T > &Q)
Definition: Mat3.h:716
Vec3< T0 > transform3x3(const Vec3< T0 > &v) const
Transform a Vec3 by post-multiplication, without translation.
Definition: Mat4.h:1115
void setTranslation(const Vec3< T > &t)
Definition: Mat4.h:360
static const Mat4< T > & identity()
Predefined constant for identity matrix.
Definition: Mat4.h:152
bool isExactlyEqual(const T0 &a, const T1 &b)
Return true if a is exactly equal to b.
Definition: Math.h:395
Mat4 inverse(T tolerance=0) const
Definition: Mat4.h:531
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
void postScale(const Vec3< T0 > &v)
Definition: Mat4.h:804
bool operator==(const Mat4< T0 > &m0, const Mat4< T1 > &m1)
Equality operator, does exact floating point comparisons.
Definition: Mat4.h:1146
void preScale(const Vec3< T0 > &v)
Definition: Mat4.h:782
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:109
static Mat4 translation(const Vec3d &v)
Sets the matrix to a matrix that translates by v.
Definition: Mat4.h:713
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:1163
static const Mat4< T > & zero()
Predefined constant for zero matrix.
Definition: Mat4.h:163
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:1225
Mat4< T > operator-() const
Negation operator, for e.g. m1 = -m2;.
Definition: Mat4.h:389
void preShear(Axis axis0, Axis axis1, T shear)
Left multiplies a shearing transformation into the matrix.
Definition: Mat4.h:1014
void setZero()
Definition: Mat4.h:290
bool hasTranslation(const Mat4< T > &m)
Definition: Mat4.h:1355
bool isAffine(const Mat4< T > &m)
Definition: Mat4.h:1350
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:1182
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:1249
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
Vec3< T0 > pretransformH(const Vec3< T0 > &p) const
Transform a Vec3 by pre-multiplication, doing homogenous division.
Definition: Mat4.h:1094
void setMat3(const Mat3< T > &m)
Set upper left to a Mat3.
Definition: Mat4.h:336
Mat4< double > Mat4d
Definition: Mat4.h:1361
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:265
void setToShear(Axis axis0, Axis axis1, T shearby)
Sets the matrix to a shear along axis0 by a fraction of axis1.
Definition: Mat4.h:1006
void preRotate(Axis axis, T angle)
Left multiplies by a rotation clock-wiseabout the given axis into this matrix.
Definition: Mat4.h:844
Vec4< T > row(int i) const
Get ith row, e.g. Vec4f v = m.row(1);.
Definition: Mat4.h:185
T mm[SIZE *SIZE]
Definition: Mat.h:192
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:1212
void setCol(int j, const Vec4< T > &v)
Set jth column to vector v.
Definition: Mat4.h:192
T * asPointer()
Definition: Mat3.h:219
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:838
Mat4(const Mat< 4, T > &m)
Copy constructor.
Definition: Mat4.h:131
T & operator()(int i, int j)
Definition: Mat4.h:222
4x4 -matrix class.
Definition: Mat3.h:49
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:1197
T det() const
Determinant of matrix.
Definition: Mat3.h:527
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition: version.h:136
Vec3< T0 > pretransform(const Vec3< T0 > &v) const
Transform a Vec3 by pre-multiplication, without homogenous division.
Definition: Mat4.h:1065
T dot(const Vec3< T > &v) const
Dot product.
Definition: Vec3.h:216
T angle(const Vec2< T > &v1, const Vec2< T > &v2)
Definition: Vec2.h:472
void setRow(int i, const Vec4< T > &v)
Set ith row to vector v.
Definition: Mat4.h:174
T & x()
Reference to the component, e.g. v.x() = 4.5f;.
Definition: Vec3.h:110
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:1238
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:1260
Definition: Exceptions.h:40
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:379
const Mat4< T > & operator*=(const Mat4< S > &m1)
Multiply this matrix by the given matrix.
Definition: Mat4.h:485
Vec3< T > getTranslation() const
Return the translation component.
Definition: Mat4.h:355
Mat4(Source *a)
Constructor given array of elements, the ordering is in row major form:
Definition: Mat4.h:76
void postTranslate(const Vec3< T0 > &tr)
Right multiplies by the specified translation matrix, i.e. (*this) * Trans.
Definition: Mat4.h:760
Mat4 transpose() const
Definition: Mat4.h:518
T * asPointer()
Direct access to the internal data.
Definition: Mat4.h:216
void setToTranslation(const Vec3< T0 > &v)
Sets the matrix to a matrix that translates by v.
Definition: Mat4.h:724
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:427
Axis
Definition: Math.h:856
Real ValueType
Definition: Mat.h:57
3x3 matrix class.
Definition: Mat3.h:55
void preTranslate(const Vec3< T0 > &tr)
Left multiples by the specified translation, i.e. Trans * (*this)
Definition: Mat4.h:749
Vec3< T0 > transformH(const Vec3< T0 > &p) const
Transform a Vec3 by post-multiplication, doing homogenous divison.
Definition: Mat4.h:1072
void setToRotation(Axis axis, T angle)
Sets the matrix to a rotation about the given axis.
Definition: Mat4.h:829
void setToRotation(const Vec3< T > &axis, T angle)
Sets the matrix to a rotation about an arbitrary axis.
Definition: Mat4.h:834
Vec3< T1 > transformNormal(const Mat4< T0 > &m, const Vec3< T1 > &n)
Definition: Mat4.h:1272
Mat3< T > getMat3() const
Definition: Mat4.h:343
void postShear(Axis axis0, Axis axis1, T shear)
Right multiplies a shearing transformation into the matrix.
Definition: Mat4.h:1029
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:720
Vec4< T > col(int j) const
Get jth column, e.g. Vec4f v = m.col(0);.
Definition: Mat4.h:202
T operator()(int i, int j) const
Definition: Mat4.h:232
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:358
T det() const
Determinant of matrix.
Definition: Mat4.h:683
void setToScale(const Vec3< T0 > &v)
Sets the matrix to a matrix that scales by v.
Definition: Mat4.h:772
const Mat4 & operator=(const Mat4< Source > &m)
Assignment operator.
Definition: Mat4.h:369
Mat4()
Trivial constructor, the matrix is NOT initialized.
Definition: Mat4.h:66
Vec4< T0 > pretransform(const Vec4< T0 > &v) const
Transform a Vec4 by pre-multiplication.
Definition: Mat4.h:1058
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:188
Vec4< T0 > transform(const Vec4< T0 > &v) const
Transform a Vec4 by post-multiplication.
Definition: Mat4.h:1044
void postRotate(Axis axis, T angle)
Right multiplies by a rotation clock-wiseabout the given axis into this matrix.
Definition: Mat4.h:924
const T * asPointer() const
Definition: Mat4.h:217
Definition: Exceptions.h:83
bool operator!=(const Mat4< T0 > &m0, const Mat4< T1 > &m1)
Inequality operator, does exact floating point comparisons.
Definition: Mat4.h:1158
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:240
Vec3< T0 > transform(const Vec3< T0 > &v) const
Transform a Vec3 by post-multiplication, without homogenous division.
Definition: Mat4.h:1051
Mat4(const Mat4< Source > &m)
Conversion constructor.
Definition: Mat4.h:142
const Mat4< T > & operator*=(S scalar)
Multiply each element of this matrix by scalar.
Definition: Mat4.h:401
const T * operator[](int i) const
Definition: Mat4.h:212
T & z()
Definition: Vec3.h:112
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:456