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]);
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]); }
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];
293 this->setRows(v1, v2, v3, v4);
346 for (
int i = 0;
i < 3;
i++)
347 for (
int j=0; j < 3; j++)
348 MyBase::mm[
i*4+j] = m[
i][j];
355 for (
int i = 0;
i < 3;
i++)
356 for (
int j = 0; j < 3; j++)
357 m[
i][j] = MyBase::mm[
i*4+j];
365 return Vec3<T>(MyBase::mm[12], MyBase::mm[13], MyBase::mm[14]);
370 MyBase::mm[12] = t[0];
371 MyBase::mm[13] = t[1];
372 MyBase::mm[14] = t[2];
376 template<
typename Source>
382 std::copy(src, (src + this->numElements()), MyBase::mm);
387 bool eq(
const Mat4 &m, T eps=1.0e-8)
const 389 for (
int i = 0;
i < 16;
i++) {
400 -MyBase::mm[ 0], -MyBase::mm[ 1], -MyBase::mm[ 2], -MyBase::mm[ 3],
401 -MyBase::mm[ 4], -MyBase::mm[ 5], -MyBase::mm[ 6], -MyBase::mm[ 7],
402 -MyBase::mm[ 8], -MyBase::mm[ 9], -MyBase::mm[10], -MyBase::mm[11],
403 -MyBase::mm[12], -MyBase::mm[13], -MyBase::mm[14], -MyBase::mm[15]
408 template <
typename S>
411 MyBase::mm[ 0] *= scalar;
412 MyBase::mm[ 1] *= scalar;
413 MyBase::mm[ 2] *= scalar;
414 MyBase::mm[ 3] *= scalar;
416 MyBase::mm[ 4] *= scalar;
417 MyBase::mm[ 5] *= scalar;
418 MyBase::mm[ 6] *= scalar;
419 MyBase::mm[ 7] *= scalar;
421 MyBase::mm[ 8] *= scalar;
422 MyBase::mm[ 9] *= scalar;
423 MyBase::mm[10] *= scalar;
424 MyBase::mm[11] *= scalar;
426 MyBase::mm[12] *= scalar;
427 MyBase::mm[13] *= scalar;
428 MyBase::mm[14] *= scalar;
429 MyBase::mm[15] *= scalar;
434 template <
typename S>
439 MyBase::mm[ 0] += s[ 0];
440 MyBase::mm[ 1] += s[ 1];
441 MyBase::mm[ 2] += s[ 2];
442 MyBase::mm[ 3] += s[ 3];
444 MyBase::mm[ 4] += s[ 4];
445 MyBase::mm[ 5] += s[ 5];
446 MyBase::mm[ 6] += s[ 6];
447 MyBase::mm[ 7] += s[ 7];
449 MyBase::mm[ 8] += s[ 8];
450 MyBase::mm[ 9] += s[ 9];
451 MyBase::mm[10] += s[10];
452 MyBase::mm[11] += s[11];
454 MyBase::mm[12] += s[12];
455 MyBase::mm[13] += s[13];
456 MyBase::mm[14] += s[14];
457 MyBase::mm[15] += s[15];
463 template <
typename S>
468 MyBase::mm[ 0] -= s[ 0];
469 MyBase::mm[ 1] -= s[ 1];
470 MyBase::mm[ 2] -= s[ 2];
471 MyBase::mm[ 3] -= s[ 3];
473 MyBase::mm[ 4] -= s[ 4];
474 MyBase::mm[ 5] -= s[ 5];
475 MyBase::mm[ 6] -= s[ 6];
476 MyBase::mm[ 7] -= s[ 7];
478 MyBase::mm[ 8] -= s[ 8];
479 MyBase::mm[ 9] -= s[ 9];
480 MyBase::mm[10] -= s[10];
481 MyBase::mm[11] -= s[11];
483 MyBase::mm[12] -= s[12];
484 MyBase::mm[13] -= s[13];
485 MyBase::mm[14] -= s[14];
486 MyBase::mm[15] -= s[15];
492 template <
typename S>
500 for (
int i = 0;
i < 4;
i++) {
502 MyBase::mm[i4+0] =
static_cast<T
>(s0[i4+0] * s1[ 0] +
507 MyBase::mm[i4+1] =
static_cast<T
>(s0[i4+0] * s1[ 1] +
512 MyBase::mm[i4+2] =
static_cast<T
>(s0[i4+0] * s1[ 2] +
517 MyBase::mm[i4+3] =
static_cast<T
>(s0[i4+0] * s1[ 3] +
529 MyBase::mm[ 0], MyBase::mm[ 4], MyBase::mm[ 8], MyBase::mm[12],
530 MyBase::mm[ 1], MyBase::mm[ 5], MyBase::mm[ 9], MyBase::mm[13],
531 MyBase::mm[ 2], MyBase::mm[ 6], MyBase::mm[10], MyBase::mm[14],
532 MyBase::mm[ 3], MyBase::mm[ 7], MyBase::mm[11], MyBase::mm[15]
562 T m0011 = m[0][0] * m[1][1];
563 T m0012 = m[0][0] * m[1][2];
564 T m0110 = m[0][1] * m[1][0];
565 T m0210 = m[0][2] * m[1][0];
566 T m0120 = m[0][1] * m[2][0];
567 T m0220 = m[0][2] * m[2][0];
569 T detA = m0011 * m[2][2] - m0012 * m[2][1] - m0110 * m[2][2]
570 + m0210 * m[2][1] + m0120 * m[1][2] - m0220 * m[1][1];
572 bool hasPerspective =
579 if (hasPerspective) {
580 det = m[0][3] * det3(m, 1,2,3, 0,2,1)
581 + m[1][3] * det3(m, 2,0,3, 0,2,1)
582 + m[2][3] * det3(m, 3,0,1, 0,2,1)
585 det = detA * m[3][3];
596 invertible = m.invert(inv, tolerance);
605 inv[0][0] = detA * ( m[1][1] * m[2][2] - m[1][2] * m[2][1]);
606 inv[0][1] = detA * (-m[0][1] * m[2][2] + m[0][2] * m[2][1]);
607 inv[0][2] = detA * ( m[0][1] * m[1][2] - m[0][2] * m[1][1]);
609 inv[1][0] = detA * (-m[1][0] * m[2][2] + m[1][2] * m[2][0]);
610 inv[1][1] = detA * ( m[0][0] * m[2][2] - m0220);
611 inv[1][2] = detA * ( m0210 - m0012);
613 inv[2][0] = detA * ( m[1][0] * m[2][1] - m[1][1] * m[2][0]);
614 inv[2][1] = detA * ( m0120 - m[0][0] * m[2][1]);
615 inv[2][2] = detA * ( m0011 - m0110);
617 if (hasPerspective) {
622 r[0] = m[3][0] * inv[0][0] + m[3][1] * inv[1][0]
623 + m[3][2] * inv[2][0];
624 r[1] = m[3][0] * inv[0][1] + m[3][1] * inv[1][1]
625 + m[3][2] * inv[2][1];
626 r[2] = m[3][0] * inv[0][2] + m[3][1] * inv[1][2]
627 + m[3][2] * inv[2][2];
630 p[0] = inv[0][0] * m[0][3] + inv[0][1] * m[1][3]
631 + inv[0][2] * m[2][3];
632 p[1] = inv[1][0] * m[0][3] + inv[1][1] * m[1][3]
633 + inv[1][2] * m[2][3];
634 p[2] = inv[2][0] * m[0][3] + inv[2][1] * m[1][3]
635 + inv[2][2] * m[2][3];
637 T h = m[3][3] - p.
dot(
Vec3<T>(m[3][0],m[3][1],m[3][2]));
648 inv[3][0] = -h * r[0];
649 inv[3][1] = -h * r[1];
650 inv[3][2] = -h * r[2];
652 inv[0][3] = -h * p[0];
653 inv[1][3] = -h * p[1];
654 inv[2][3] = -h * p[2];
660 inv[0][0] += p[0] * r[0];
661 inv[0][1] += p[0] * r[1];
662 inv[0][2] += p[0] * r[2];
663 inv[1][0] += p[1] * r[0];
664 inv[1][1] += p[1] * r[1];
665 inv[1][2] += p[1] * r[2];
666 inv[2][0] += p[2] * r[0];
667 inv[2][1] += p[2] * r[1];
668 inv[2][2] += p[2] * r[2];
672 inv[3][0] = - (m[3][0] * inv[0][0] + m[3][1] * inv[1][0]
673 + m[3][2] * inv[2][0]);
674 inv[3][1] = - (m[3][0] * inv[0][1] + m[3][1] * inv[1][1]
675 + m[3][2] * inv[2][1]);
676 inv[3][2] = - (m[3][0] * inv[0][2] + m[3][1] * inv[1][2]
677 + m[3][2] * inv[2][2]);
701 for (
i = 0;
i < 4;
i++) {
702 ap = &MyBase::mm[ 0];
704 for (j = 0; j < 4; j++) {
705 for (k = 0; k < 4; k++) {
706 if ((k !=
i) && (j != 0)) {
713 det += sign * MyBase::mm[
i] * submat.
det();
724 T(1), T(0), T(0), T(0),
725 T(0), T(1), T(0), T(0),
726 T(0), T(0), T(1), T(0),
727 T(v.
x()), T(v.
y()),T(v.
z()), T(1));
731 template <
typename T0>
749 MyBase::mm[12] = v.
x();
750 MyBase::mm[13] = v.
y();
751 MyBase::mm[14] = v.
z();
756 template <
typename T0>
762 *
this = Tr * (*this);
767 template <
typename T0>
773 *
this = (*this) * Tr;
779 template <
typename T0>
783 MyBase::mm[ 0] = v.
x();
784 MyBase::mm[ 5] = v.
y();
785 MyBase::mm[10] = v.
z();
789 template <
typename T0>
792 MyBase::mm[ 0] *= v.
x();
793 MyBase::mm[ 1] *= v.
x();
794 MyBase::mm[ 2] *= v.
x();
795 MyBase::mm[ 3] *= v.
x();
797 MyBase::mm[ 4] *= v.
y();
798 MyBase::mm[ 5] *= v.
y();
799 MyBase::mm[ 6] *= v.
y();
800 MyBase::mm[ 7] *= v.
y();
802 MyBase::mm[ 8] *= v.
z();
803 MyBase::mm[ 9] *= v.
z();
804 MyBase::mm[10] *= v.
z();
805 MyBase::mm[11] *= v.
z();
811 template <
typename T0>
815 MyBase::mm[ 0] *= v.
x();
816 MyBase::mm[ 1] *= v.
y();
817 MyBase::mm[ 2] *= v.
z();
819 MyBase::mm[ 4] *= v.
x();
820 MyBase::mm[ 5] *= v.
y();
821 MyBase::mm[ 6] *= v.
z();
823 MyBase::mm[ 8] *= v.
x();
824 MyBase::mm[ 9] *= v.
y();
825 MyBase::mm[10] *= v.
z();
827 MyBase::mm[12] *= v.
x();
828 MyBase::mm[13] *= v.
y();
829 MyBase::mm[14] *= v.
z();
854 T c =
static_cast<T
>(cos(
angle));
855 T s = -
static_cast<T
>(sin(
angle));
862 a4 = c * MyBase::mm[ 4] - s * MyBase::mm[ 8];
863 a5 = c * MyBase::mm[ 5] - s * MyBase::mm[ 9];
864 a6 = c * MyBase::mm[ 6] - s * MyBase::mm[10];
865 a7 = c * MyBase::mm[ 7] - s * MyBase::mm[11];
868 MyBase::mm[ 8] = s * MyBase::mm[ 4] + c * MyBase::mm[ 8];
869 MyBase::mm[ 9] = s * MyBase::mm[ 5] + c * MyBase::mm[ 9];
870 MyBase::mm[10] = s * MyBase::mm[ 6] + c * MyBase::mm[10];
871 MyBase::mm[11] = s * MyBase::mm[ 7] + c * MyBase::mm[11];
884 a0 = c * MyBase::mm[ 0] + s * MyBase::mm[ 8];
885 a1 = c * MyBase::mm[ 1] + s * MyBase::mm[ 9];
886 a2 = c * MyBase::mm[ 2] + s * MyBase::mm[10];
887 a3 = c * MyBase::mm[ 3] + s * MyBase::mm[11];
889 MyBase::mm[ 8] = -s * MyBase::mm[ 0] + c * MyBase::mm[ 8];
890 MyBase::mm[ 9] = -s * MyBase::mm[ 1] + c * MyBase::mm[ 9];
891 MyBase::mm[10] = -s * MyBase::mm[ 2] + c * MyBase::mm[10];
892 MyBase::mm[11] = -s * MyBase::mm[ 3] + c * MyBase::mm[11];
906 a0 = c * MyBase::mm[ 0] - s * MyBase::mm[ 4];
907 a1 = c * MyBase::mm[ 1] - s * MyBase::mm[ 5];
908 a2 = c * MyBase::mm[ 2] - s * MyBase::mm[ 6];
909 a3 = c * MyBase::mm[ 3] - s * MyBase::mm[ 7];
911 MyBase::mm[ 4] = s * MyBase::mm[ 0] + c * MyBase::mm[ 4];
912 MyBase::mm[ 5] = s * MyBase::mm[ 1] + c * MyBase::mm[ 5];
913 MyBase::mm[ 6] = s * MyBase::mm[ 2] + c * MyBase::mm[ 6];
914 MyBase::mm[ 7] = s * MyBase::mm[ 3] + c * MyBase::mm[ 7];
934 T c =
static_cast<T
>(cos(
angle));
935 T s = -
static_cast<T
>(sin(
angle));
944 a2 = c * MyBase::mm[ 2] - s * MyBase::mm[ 1];
945 a6 = c * MyBase::mm[ 6] - s * MyBase::mm[ 5];
946 a10 = c * MyBase::mm[10] - s * MyBase::mm[ 9];
947 a14 = c * MyBase::mm[14] - s * MyBase::mm[13];
950 MyBase::mm[ 1] = c * MyBase::mm[ 1] + s * MyBase::mm[ 2];
951 MyBase::mm[ 5] = c * MyBase::mm[ 5] + s * MyBase::mm[ 6];
952 MyBase::mm[ 9] = c * MyBase::mm[ 9] + s * MyBase::mm[10];
953 MyBase::mm[13] = c * MyBase::mm[13] + s * MyBase::mm[14];
957 MyBase::mm[10] = a10;
958 MyBase::mm[14] = a14;
966 a2 = c * MyBase::mm[ 2] + s * MyBase::mm[ 0];
967 a6 = c * MyBase::mm[ 6] + s * MyBase::mm[ 4];
968 a10 = c * MyBase::mm[10] + s * MyBase::mm[ 8];
969 a14 = c * MyBase::mm[14] + s * MyBase::mm[12];
971 MyBase::mm[ 0] = c * MyBase::mm[ 0] - s * MyBase::mm[ 2];
972 MyBase::mm[ 4] = c * MyBase::mm[ 4] - s * MyBase::mm[ 6];
973 MyBase::mm[ 8] = c * MyBase::mm[ 8] - s * MyBase::mm[10];
974 MyBase::mm[12] = c * MyBase::mm[12] - s * MyBase::mm[14];
978 MyBase::mm[10] = a10;
979 MyBase::mm[14] = a14;
987 a1 = c * MyBase::mm[ 1] - s * MyBase::mm[ 0];
988 a5 = c * MyBase::mm[ 5] - s * MyBase::mm[ 4];
989 a9 = c * MyBase::mm[ 9] - s * MyBase::mm[ 8];
990 a13 = c * MyBase::mm[13] - s * MyBase::mm[12];
992 MyBase::mm[ 0] = c * MyBase::mm[ 0] + s * MyBase::mm[ 1];
993 MyBase::mm[ 4] = c * MyBase::mm[ 4] + s * MyBase::mm[ 5];
994 MyBase::mm[ 8] = c * MyBase::mm[ 8] + s * MyBase::mm[ 9];
995 MyBase::mm[12] = c * MyBase::mm[12] + s * MyBase::mm[13];
1000 MyBase::mm[13] = a13;
1016 *
this = shear<Mat4<T> >(axis0, axis1, shearby);
1024 int index0 =
static_cast<int>(axis0);
1025 int index1 =
static_cast<int>(axis1);
1028 MyBase::mm[index1 * 4 + 0] +=
shear * MyBase::mm[index0 * 4 + 0];
1029 MyBase::mm[index1 * 4 + 1] +=
shear * MyBase::mm[index0 * 4 + 1];
1030 MyBase::mm[index1 * 4 + 2] +=
shear * MyBase::mm[index0 * 4 + 2];
1031 MyBase::mm[index1 * 4 + 3] +=
shear * MyBase::mm[index0 * 4 + 3];
1039 int index0 =
static_cast<int>(axis0);
1040 int index1 =
static_cast<int>(axis1);
1043 MyBase::mm[index0 + 0] +=
shear * MyBase::mm[index1 + 0];
1044 MyBase::mm[index0 + 4] +=
shear * MyBase::mm[index1 + 4];
1045 MyBase::mm[index0 + 8] +=
shear * MyBase::mm[index1 + 8];
1046 MyBase::mm[index0 + 12] +=
shear * MyBase::mm[index1 + 12];
1051 template<
typename T0>
1054 return static_cast< Vec4<T0> >(v * *
this);
1058 template<
typename T0>
1061 return static_cast< Vec3<T0> >(v * *
this);
1065 template<
typename T0>
1068 return static_cast< Vec4<T0> >(*
this * v);
1072 template<
typename T0>
1075 return static_cast< Vec3<T0> >(*
this * v);
1079 template<
typename T0>
1085 w =
static_cast<T0
>(p[0] * MyBase::mm[ 3] + p[1] * MyBase::mm[ 7]
1086 + p[2] * MyBase::mm[11] + MyBase::mm[15]);
1089 return Vec3<T0>(
static_cast<T0
>((p[0] * MyBase::mm[ 0] + p[1] * MyBase::mm[ 4] +
1090 p[2] * MyBase::mm[ 8] + MyBase::mm[12]) / w),
1091 static_cast<T0
>((p[0] * MyBase::mm[ 1] + p[1] * MyBase::mm[ 5] +
1092 p[2] * MyBase::mm[ 9] + MyBase::mm[13]) / w),
1093 static_cast<T0
>((p[0] * MyBase::mm[ 2] + p[1] * MyBase::mm[ 6] +
1094 p[2] * MyBase::mm[10] + MyBase::mm[14]) / w));
1101 template<
typename T0>
1107 w = p[0] * MyBase::mm[12] + p[1] * MyBase::mm[13] + p[2] * MyBase::mm[14] + MyBase::mm[15];
1110 return Vec3<T0>(
static_cast<T0
>((p[0] * MyBase::mm[ 0] + p[1] * MyBase::mm[ 1] +
1111 p[2] * MyBase::mm[ 2] + MyBase::mm[ 3]) / w),
1112 static_cast<T0
>((p[0] * MyBase::mm[ 4] + p[1] * MyBase::mm[ 5] +
1113 p[2] * MyBase::mm[ 6] + MyBase::mm[ 7]) / w),
1114 static_cast<T0
>((p[0] * MyBase::mm[ 8] + p[1] * MyBase::mm[ 9] +
1115 p[2] * MyBase::mm[10] + MyBase::mm[11]) / w));
1122 template<
typename T0>
1126 static_cast<T0
>(v[0] * MyBase::mm[ 0] + v[1] * MyBase::mm[ 4] + v[2] * MyBase::mm[ 8]),
1127 static_cast<T0>(v[0] * MyBase::mm[ 1] + v[1] * MyBase::mm[ 5] + v[2] * MyBase::mm[ 9]),
1128 static_cast<T0
>(v[0] * MyBase::mm[ 2] + v[1] * MyBase::mm[ 6] + v[2] * MyBase::mm[10]));
1133 bool invert(
Mat4<T> &inverse, T tolerance)
const;
1135 T det2(
const Mat4<T> &a,
int i0,
int i1,
int j0,
int j1)
const {
1138 return a.
mm[i0row+j0]*a.
mm[i1row+j1] - a.
mm[i0row+j1]*a.
mm[i1row+j0];
1141 T det3(
const Mat4<T> &a,
int i0,
int i1,
int i2,
1142 int j0,
int j1,
int j2)
const {
1144 return a.mm[i0row+j0]*det2(a, i1,i2, j1,j2) +
1145 a.mm[i0row+j1]*det2(a, i1,i2, j2,j0) +
1146 a.mm[i0row+j2]*det2(a, i1,i2, j0,j1);
1153 template <
typename T0,
typename T1>
1165 template <
typename T0,
typename T1>
1170 template <
typename S,
typename T>
1178 template <
typename S,
typename T>
1188 template<
typename T,
typename MT>
1195 _v[0]*m[0] + _v[1]*m[1] + _v[2]*m[2] + _v[3]*m[3],
1196 _v[0]*m[4] + _v[1]*m[5] + _v[2]*m[6] + _v[3]*m[7],
1197 _v[0]*m[8] + _v[1]*m[9] + _v[2]*m[10] + _v[3]*m[11],
1198 _v[0]*m[12] + _v[1]*m[13] + _v[2]*m[14] + _v[3]*m[15]);
1203 template<
typename T,
typename MT>
1210 _v[0]*m[0] + _v[1]*m[4] + _v[2]*m[8] + _v[3]*m[12],
1211 _v[0]*m[1] + _v[1]*m[5] + _v[2]*m[9] + _v[3]*m[13],
1212 _v[0]*m[2] + _v[1]*m[6] + _v[2]*m[10] + _v[3]*m[14],
1213 _v[0]*m[3] + _v[1]*m[7] + _v[2]*m[11] + _v[3]*m[15]);
1219 template<
typename T,
typename MT>
1226 _v[0]*m[0] + _v[1]*m[1] + _v[2]*m[2] + m[3],
1227 _v[0]*m[4] + _v[1]*m[5] + _v[2]*m[6] + m[7],
1228 _v[0]*m[8] + _v[1]*m[9] + _v[2]*m[10] + m[11]);
1234 template<
typename T,
typename MT>
1241 _v[0]*m[0] + _v[1]*m[4] + _v[2]*m[8] + m[12],
1242 _v[0]*m[1] + _v[1]*m[5] + _v[2]*m[9] + m[13],
1243 _v[0]*m[2] + _v[1]*m[6] + _v[2]*m[10] + m[14]);
1248 template <
typename T0,
typename T1>
1259 template <
typename T0,
typename T1>
1271 template <
typename T0,
typename T1>
1284 template<
typename T0,
typename T1>
1288 static_cast<T1
>(m[0][0]*n[0] + m[0][1]*n[1] + m[0][2]*n[2]),
1289 static_cast<T1>(m[1][0]*n[0] + m[1][1]*n[1] + m[1][2]*n[2]),
1290 static_cast<T1
>(m[2][0]*n[0] + m[2][1]*n[1] + m[2][2]*n[2]));
1295 template<
typename T>
1296 bool Mat4<T>::invert(Mat4<T> &inverse, T tolerance)
const 1298 Mat4<T> temp(*
this);
1299 inverse.setIdentity();
1303 for (
int i = 0;
i < 4; ++
i) {
1305 double max = fabs(temp[
i][
i]);
1307 for (
int k =
i+1; k < 4; ++k) {
1308 if (fabs(temp[k][
i]) >
max) {
1310 max = fabs(temp[k][
i]);
1319 for (
int k = 0; k < 4; ++k) {
1320 std::swap(temp[row][k], temp[
i][k]);
1321 std::swap(inverse[row][k], inverse[
i][k]);
1325 double pivot = temp[
i][
i];
1329 for (
int k = 0; k < 4; ++k) {
1330 temp[
i][k] /= pivot;
1331 inverse[
i][k] /= pivot;
1335 for (
int j =
i+1; j < 4; ++j) {
1336 double t = temp[j][
i];
1339 for (
int k = 0; k < 4; ++k) {
1340 temp[j][k] -= temp[
i][k] * t;
1341 inverse[j][k] -= inverse[
i][k] * t;
1348 for (
int i = 3;
i > 0; --
i) {
1349 for (
int j = 0; j <
i; ++j) {
1350 double t = temp[j][
i];
1353 for (
int k = 0; k < 4; ++k) {
1354 inverse[j][k] -= inverse[
i][k]*t;
1359 return det*det >= tolerance*tolerance;
1362 template <
typename T>
1367 template <
typename T>
1380 template<>
inline math::Mat4s zeroVal<math::Mat4s>() {
return math::Mat4s::identity(); }
1381 template<>
inline math::Mat4d zeroVal<math::Mat4d>() {
return math::Mat4d::identity(); }
1386 #endif // OPENVDB_UTIL_MAT4_H_HAS_BEEN_INCLUDED 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
4x4 -matrix class.
Definition: Mat3.h:48
Vec3< T > getTranslation() const
Return the translation component.
Definition: Mat4.h:363
void postTranslate(const Vec3< T0 > &tr)
Right multiplies by the specified translation matrix, i.e. (*this) * Trans.
Definition: Mat4.h:768
Vec3< T0 > transform(const Vec3< T0 > &v) const
Transform a Vec3 by post-multiplication, without homogenous division.
Definition: Mat4.h:1059
Mat4(const Mat< 4, T > &m)
Copy constructor.
Definition: Mat4.h:131
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:387
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
Mat3< T > getMat3() const
Definition: Mat4.h:351
T angle(const Vec2< T > &v1, const Vec2< T > &v2)
Definition: Vec2.h:471
Mat4()
Trivial constructor, the matrix is NOT initialized.
Definition: Mat4.h:66
bool isAffine(const Mat4< T > &m)
Definition: Mat4.h:1363
T dot(const Vec3< T > &v) const
Dot product.
Definition: Vec3.h:215
Vec3< typename promote< T, MT >::type > operator*(const Vec3< T > &_v, const Mat4< MT > &_m)
Returns v, where for .
Definition: Mat4.h:1236
Mat4 inverse(T tolerance=0) const
Definition: Mat4.h:539
T & z()
Definition: Vec3.h:111
#define OPENVDB_THROW(exception, message)
Definition: Exceptions.h:101
bool isExactlyEqual(const T0 &a, const T1 &b)
Return true if a is exactly equal to b.
Definition: Math.h:391
tbb::atomic< Index32 > i
Definition: LeafBuffer.h:71
Definition: Exceptions.h:82
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:354
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:290
void setRow(int i, const Vec4< T > &v)
Set ith row to vector v.
Definition: Mat4.h:174
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:1014
Mat4< float > Mat4s
Definition: Mat4.h:1373
const Mat4< T > & operator-=(const Mat4< S > &m1)
Returns m0, where for .
Definition: Mat4.h:464
bool hasTranslation(const Mat4< T > &m)
Definition: Mat4.h:1368
void setZero()
Definition: Mat4.h:298
Mat4< typename promote< T0, T1 >::type > operator+(const Mat4< T0 > &m0, const Mat4< T1 > &m1)
Returns M, where for .
Definition: Mat4.h:1250
void setCol(int j, const Vec4< T > &v)
Set jth column to vector v.
Definition: Mat4.h:192
Mat4< typename promote< T0, T1 >::type > operator-(const Mat4< T0 > &m0, const Mat4< T1 > &m1)
Returns M, where for .
Definition: Mat4.h:1261
Vec3< typename promote< T, MT >::type > operator*(const Mat4< MT > &_m, const Vec3< T > &_v)
Returns v, where for .
Definition: Mat4.h:1221
Mat< 4, T > MyBase
Definition: Mat4.h:63
void setToTranslation(const Vec3< T0 > &v)
Sets the matrix to a matrix that translates by v.
Definition: Mat4.h:732
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:846
T ValueType
Definition: Mat4.h:62
bool operator==(const Mat4< T0 > &m0, const Mat4< T1 > &m1)
Equality operator, does exact floating point comparisons.
Definition: Mat4.h:1154
void preScale(const Vec3< T0 > &v)
Definition: Mat4.h:790
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
Mat4d Mat4f
Definition: Mat4.h:1375
#define OPENVDB_VERSION_NAME
Definition: version.h:43
T mm[SIZE *SIZE]
Definition: Mat.h:190
static const Mat4< T > & zero()
Predefined constant for zero matrix.
Definition: Mat4.h:163
static Mat4 translation(const Vec3d &v)
Sets the matrix to a matrix that translates by v.
Definition: Mat4.h:721
void preRotate(Axis axis, T angle)
Left multiplies by a rotation clock-wiseabout the given axis into this matrix.
Definition: Mat4.h:852
T * asPointer()
Definition: Mat3.h:218
T value_type
Data type held by the matrix.
Definition: Mat4.h:61
Mat4(Source *a)
Constructor given array of elements, the ordering is in row major form:
Definition: Mat4.h:76
Vec4< typename promote< T, MT >::type > operator*(const Vec4< T > &_v, const Mat4< MT > &_m)
Returns v, where for .
Definition: Mat4.h:1205
Vec3< T0 > pretransform(const Vec3< T0 > &v) const
Transform a Vec3 by pre-multiplication, without homogenous division.
Definition: Mat4.h:1073
T det() const
Determinant of matrix.
Definition: Mat3.h:533
Vec3< T0 > transform3x3(const Vec3< T0 > &v) const
Transform a Vec3 by post-multiplication, without translation.
Definition: Mat4.h:1123
Mat4(const Vec4< Source > &v1, const Vec4< Source > &v2, const Vec4< Source > &v3, const Vec4< Source > &v4, bool rows=true)
Definition: Mat4.h:120
void postRotate(Axis axis, T angle)
Right multiplies by a rotation clock-wiseabout the given axis into this matrix.
Definition: Mat4.h:932
Definition: Exceptions.h:39
const Mat4 & operator=(const Mat4< Source > &m)
Assignment operator.
Definition: Mat4.h:377
T & x()
Reference to the component, e.g. v.x() = 4.5f;.
Definition: Vec3.h:109
T & y()
Definition: Vec3.h:110
const Mat4< T > & operator*=(const Mat4< S > &m1)
Return m, where for .
Definition: Mat4.h:493
Vec3< T0 > pretransformH(const Vec3< T0 > &p) const
Transform a Vec3 by pre-multiplication, doing homogenous division.
Definition: Mat4.h:1102
Vec3< T1 > transformNormal(const Mat4< T0 > &m, const Vec3< T1 > &n)
Definition: Mat4.h:1285
void preTranslate(const Vec3< T0 > &tr)
Left multiples by the specified translation, i.e. Trans * (*this)
Definition: Mat4.h:757
Mat4< double > Mat4d
Definition: Mat4.h:1374
void preShear(Axis axis0, Axis axis1, T shear)
Left multiplies a shearing transformation into the matrix.
Definition: Mat4.h:1022
T * asPointer()
Direct access to the internal data.
Definition: Mat4.h:216
T operator()(int i, int j) const
Definition: Mat4.h:232
const Mat4< T > & operator*=(S scalar)
Return m, where for .
Definition: Mat4.h:409
Vec4< typename promote< T, MT >::type > operator*(const Mat4< MT > &_m, const Vec4< T > &_v)
Returns v, where for .
Definition: Mat4.h:1190
Mat4< typename promote< S, T >::type > operator*(S scalar, const Mat4< T > &m)
Returns M, where for .
Definition: Mat4.h:1171
Mat4< T > operator-() const
Negation operator, for e.g. m1 = -m2;.
Definition: Mat4.h:397
T & operator()(int i, int j)
Definition: Mat4.h:222
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
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:716
void setToRotation(Axis axis, T angle)
Sets the matrix to a rotation about the given axis.
Definition: Mat4.h:837
void setToRotation(const Vec3< T > &axis, T angle)
Sets the matrix to a rotation about an arbitrary axis.
Definition: Mat4.h:842
Vec4< T0 > pretransform(const Vec4< T0 > &v) const
Transform a Vec4 by pre-multiplication.
Definition: Mat4.h:1066
static const Mat4< T > & identity()
Predefined constant for identity matrix.
Definition: Mat4.h:152
const T * operator[](int i) const
Definition: Mat4.h:212
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:71
Axis
Definition: Math.h:852
Mat4(const Mat4< Source > &m)
Conversion constructor.
Definition: Mat4.h:142
const Mat4< T > & operator+=(const Mat4< S > &m1)
Returns m0, where for .
Definition: Mat4.h:435
Vec4< T > row(int i) const
Get ith row, e.g. Vec4f v = m.row(1);.
Definition: Mat4.h:185
bool operator!=(const Mat4< T0 > &m0, const Mat4< T1 > &m1)
Inequality operator, does exact floating point comparisons.
Definition: Mat4.h:1166
const T * asPointer() const
Definition: Mat4.h:217
Mat4< typename promote< T0, T1 >::type > operator*(const Mat4< T0 > &m0, const Mat4< T1 > &m1)
Returns M, where for .
Definition: Mat4.h:1273
void setToScale(const Vec3< T0 > &v)
Sets the matrix to a matrix that scales by v.
Definition: Mat4.h:780
Vec4< T0 > transform(const Vec4< T0 > &v) const
Transform a Vec4 by post-multiplication.
Definition: Mat4.h:1052
void postShear(Axis axis0, Axis axis1, T shear)
Right multiplies a shearing transformation into the matrix.
Definition: Mat4.h:1037
T det() const
Determinant of matrix.
Definition: Mat4.h:691
Mat4 transpose() const
Definition: Mat4.h:526
Mat4< typename promote< S, T >::type > operator*(const Mat4< T > &m, S scalar)
Returns M, where for .
Definition: Mat4.h:1179
void setTranslation(const Vec3< T > &t)
Definition: Mat4.h:368
Vec4< T > col(int j) const
Get jth column, e.g. Vec4f v = m.col(0);.
Definition: Mat4.h:202
void setMat3(const Mat3< T > &m)
Set upper left to a Mat3.
Definition: Mat4.h:344
void postScale(const Vec3< T0 > &v)
Definition: Mat4.h:812
void setIdentity()
Set "this" matrix to identity.
Definition: Mat4.h:319
Vec3< T0 > transformH(const Vec3< T0 > &p) const
Transform a Vec3 by post-multiplication, doing homogenous divison.
Definition: Mat4.h:1080