4 #ifndef OPENVDB_MATH_MAT4_H_HAS_BEEN_INCLUDED
5 #define OPENVDB_MATH_MAT4_H_HAS_BEEN_INCLUDED
24 template<
typename T>
class Vec4;
30 class Mat4:
public Mat<4, T>
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>
117 const Source *src = m.asPointer();
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));
182 T* operator[](
int i) {
return &(MyBase::mm[i<<2]); }
185 const T*
operator[](
int i)
const {
return &(MyBase::mm[i<<2]); }
199 return MyBase::mm[4*i+j];
209 return MyBase::mm[4*i+j];
216 MyBase::mm[ 0] = v1[0];
217 MyBase::mm[ 1] = v1[1];
218 MyBase::mm[ 2] = v1[2];
219 MyBase::mm[ 3] = v1[3];
221 MyBase::mm[ 4] = v2[0];
222 MyBase::mm[ 5] = v2[1];
223 MyBase::mm[ 6] = v2[2];
224 MyBase::mm[ 7] = v2[3];
226 MyBase::mm[ 8] = v3[0];
227 MyBase::mm[ 9] = v3[1];
228 MyBase::mm[10] = v3[2];
229 MyBase::mm[11] = v3[3];
231 MyBase::mm[12] = v4[0];
232 MyBase::mm[13] = v4[1];
233 MyBase::mm[14] = v4[2];
234 MyBase::mm[15] = v4[3];
241 MyBase::mm[ 0] = v1[0];
242 MyBase::mm[ 1] = v2[0];
243 MyBase::mm[ 2] = v3[0];
244 MyBase::mm[ 3] = v4[0];
246 MyBase::mm[ 4] = v1[1];
247 MyBase::mm[ 5] = v2[1];
248 MyBase::mm[ 6] = v3[1];
249 MyBase::mm[ 7] = v4[1];
251 MyBase::mm[ 8] = v1[2];
252 MyBase::mm[ 9] = v2[2];
253 MyBase::mm[10] = v3[2];
254 MyBase::mm[11] = v4[2];
256 MyBase::mm[12] = v1[3];
257 MyBase::mm[13] = v2[3];
258 MyBase::mm[14] = v3[3];
259 MyBase::mm[15] = v4[3];
311 for (
int i = 0; i < 3; i++)
312 for (
int j=0; j < 3; j++)
313 MyBase::mm[i*4+j] = m[i][j];
320 for (
int i = 0; i < 3; i++)
321 for (
int j = 0; j < 3; j++)
322 m[i][j] = MyBase::mm[i*4+j];
330 return Vec3<T>(MyBase::mm[12], MyBase::mm[13], MyBase::mm[14]);
335 MyBase::mm[12] = t[0];
336 MyBase::mm[13] = t[1];
337 MyBase::mm[14] = t[2];
341 template<
typename Source>
344 const Source *src = m.asPointer();
347 std::copy(src, (src + this->numElements()), MyBase::mm);
352 bool eq(
const Mat4 &m, T eps=1.0e-8)
const
354 for (
int i = 0; i < 16; i++) {
365 -MyBase::mm[ 0], -MyBase::mm[ 1], -MyBase::mm[ 2], -MyBase::mm[ 3],
366 -MyBase::mm[ 4], -MyBase::mm[ 5], -MyBase::mm[ 6], -MyBase::mm[ 7],
367 -MyBase::mm[ 8], -MyBase::mm[ 9], -MyBase::mm[10], -MyBase::mm[11],
368 -MyBase::mm[12], -MyBase::mm[13], -MyBase::mm[14], -MyBase::mm[15]
373 template <
typename S>
376 MyBase::mm[ 0] *= scalar;
377 MyBase::mm[ 1] *= scalar;
378 MyBase::mm[ 2] *= scalar;
379 MyBase::mm[ 3] *= scalar;
381 MyBase::mm[ 4] *= scalar;
382 MyBase::mm[ 5] *= scalar;
383 MyBase::mm[ 6] *= scalar;
384 MyBase::mm[ 7] *= scalar;
386 MyBase::mm[ 8] *= scalar;
387 MyBase::mm[ 9] *= scalar;
388 MyBase::mm[10] *= scalar;
389 MyBase::mm[11] *= scalar;
391 MyBase::mm[12] *= scalar;
392 MyBase::mm[13] *= scalar;
393 MyBase::mm[14] *= scalar;
394 MyBase::mm[15] *= scalar;
399 template <
typename S>
402 const S* s = m1.asPointer();
404 MyBase::mm[ 0] += s[ 0];
405 MyBase::mm[ 1] += s[ 1];
406 MyBase::mm[ 2] += s[ 2];
407 MyBase::mm[ 3] += s[ 3];
409 MyBase::mm[ 4] += s[ 4];
410 MyBase::mm[ 5] += s[ 5];
411 MyBase::mm[ 6] += s[ 6];
412 MyBase::mm[ 7] += s[ 7];
414 MyBase::mm[ 8] += s[ 8];
415 MyBase::mm[ 9] += s[ 9];
416 MyBase::mm[10] += s[10];
417 MyBase::mm[11] += s[11];
419 MyBase::mm[12] += s[12];
420 MyBase::mm[13] += s[13];
421 MyBase::mm[14] += s[14];
422 MyBase::mm[15] += s[15];
428 template <
typename S>
431 const S* s = m1.asPointer();
433 MyBase::mm[ 0] -= s[ 0];
434 MyBase::mm[ 1] -= s[ 1];
435 MyBase::mm[ 2] -= s[ 2];
436 MyBase::mm[ 3] -= s[ 3];
438 MyBase::mm[ 4] -= s[ 4];
439 MyBase::mm[ 5] -= s[ 5];
440 MyBase::mm[ 6] -= s[ 6];
441 MyBase::mm[ 7] -= s[ 7];
443 MyBase::mm[ 8] -= s[ 8];
444 MyBase::mm[ 9] -= s[ 9];
445 MyBase::mm[10] -= s[10];
446 MyBase::mm[11] -= s[11];
448 MyBase::mm[12] -= s[12];
449 MyBase::mm[13] -= s[13];
450 MyBase::mm[14] -= s[14];
451 MyBase::mm[15] -= s[15];
457 template <
typename S>
462 const T* s0 = m0.asPointer();
463 const S* s1 = m1.asPointer();
465 for (
int i = 0; i < 4; i++) {
467 MyBase::mm[i4+0] =
static_cast<T
>(s0[i4+0] * s1[ 0] +
472 MyBase::mm[i4+1] =
static_cast<T
>(s0[i4+0] * s1[ 1] +
477 MyBase::mm[i4+2] =
static_cast<T
>(s0[i4+0] * s1[ 2] +
482 MyBase::mm[i4+3] =
static_cast<T
>(s0[i4+0] * s1[ 3] +
494 MyBase::mm[ 0], MyBase::mm[ 4], MyBase::mm[ 8], MyBase::mm[12],
495 MyBase::mm[ 1], MyBase::mm[ 5], MyBase::mm[ 9], MyBase::mm[13],
496 MyBase::mm[ 2], MyBase::mm[ 6], MyBase::mm[10], MyBase::mm[14],
497 MyBase::mm[ 3], MyBase::mm[ 7], MyBase::mm[11], MyBase::mm[15]
527 T m0011 = m[0][0] * m[1][1];
528 T m0012 = m[0][0] * m[1][2];
529 T m0110 = m[0][1] * m[1][0];
530 T m0210 = m[0][2] * m[1][0];
531 T m0120 = m[0][1] * m[2][0];
532 T m0220 = m[0][2] * m[2][0];
534 T detA = m0011 * m[2][2] - m0012 * m[2][1] - m0110 * m[2][2]
535 + m0210 * m[2][1] + m0120 * m[1][2] - m0220 * m[1][1];
537 bool hasPerspective =
544 if (hasPerspective) {
545 det = m[0][3] * det3(m, 1,2,3, 0,2,1)
546 + m[1][3] * det3(m, 2,0,3, 0,2,1)
547 + m[2][3] * det3(m, 3,0,1, 0,2,1)
550 det = detA * m[3][3];
561 invertible = m.invert(inv, tolerance);
570 inv[0][0] = detA * ( m[1][1] * m[2][2] - m[1][2] * m[2][1]);
571 inv[0][1] = detA * (-m[0][1] * m[2][2] + m[0][2] * m[2][1]);
572 inv[0][2] = detA * ( m[0][1] * m[1][2] - m[0][2] * m[1][1]);
574 inv[1][0] = detA * (-m[1][0] * m[2][2] + m[1][2] * m[2][0]);
575 inv[1][1] = detA * ( m[0][0] * m[2][2] - m0220);
576 inv[1][2] = detA * ( m0210 - m0012);
578 inv[2][0] = detA * ( m[1][0] * m[2][1] - m[1][1] * m[2][0]);
579 inv[2][1] = detA * ( m0120 - m[0][0] * m[2][1]);
580 inv[2][2] = detA * ( m0011 - m0110);
582 if (hasPerspective) {
587 r[0] = m[3][0] * inv[0][0] + m[3][1] * inv[1][0]
588 + m[3][2] * inv[2][0];
589 r[1] = m[3][0] * inv[0][1] + m[3][1] * inv[1][1]
590 + m[3][2] * inv[2][1];
591 r[2] = m[3][0] * inv[0][2] + m[3][1] * inv[1][2]
592 + m[3][2] * inv[2][2];
595 p[0] = inv[0][0] * m[0][3] + inv[0][1] * m[1][3]
596 + inv[0][2] * m[2][3];
597 p[1] = inv[1][0] * m[0][3] + inv[1][1] * m[1][3]
598 + inv[1][2] * m[2][3];
599 p[2] = inv[2][0] * m[0][3] + inv[2][1] * m[1][3]
600 + inv[2][2] * m[2][3];
602 T h = m[3][3] - p.
dot(
Vec3<T>(m[3][0],m[3][1],m[3][2]));
613 inv[3][0] = -h * r[0];
614 inv[3][1] = -h * r[1];
615 inv[3][2] = -h * r[2];
617 inv[0][3] = -h * p[0];
618 inv[1][3] = -h * p[1];
619 inv[2][3] = -h * p[2];
625 inv[0][0] += p[0] * r[0];
626 inv[0][1] += p[0] * r[1];
627 inv[0][2] += p[0] * r[2];
628 inv[1][0] += p[1] * r[0];
629 inv[1][1] += p[1] * r[1];
630 inv[1][2] += p[1] * r[2];
631 inv[2][0] += p[2] * r[0];
632 inv[2][1] += p[2] * r[1];
633 inv[2][2] += p[2] * r[2];
637 inv[3][0] = - (m[3][0] * inv[0][0] + m[3][1] * inv[1][0]
638 + m[3][2] * inv[2][0]);
639 inv[3][1] = - (m[3][0] * inv[0][1] + m[3][1] * inv[1][1]
640 + m[3][2] * inv[2][1]);
641 inv[3][2] = - (m[3][0] * inv[0][2] + m[3][1] * inv[1][2]
642 + m[3][2] * inv[2][2]);
666 for (i = 0; i < 4; i++) {
667 ap = &MyBase::mm[ 0];
669 for (j = 0; j < 4; j++) {
670 for (k = 0; k < 4; k++) {
671 if ((k != i) && (j != 0)) {
678 det += sign * MyBase::mm[i] * submat.
det();
689 T(1), T(0), T(0), T(0),
690 T(0), T(1), T(0), T(0),
691 T(0), T(0), T(1), T(0),
692 T(v.
x()), T(v.
y()),T(v.
z()), T(1));
696 template <
typename T0>
714 MyBase::mm[12] = v.
x();
715 MyBase::mm[13] = v.
y();
716 MyBase::mm[14] = v.
z();
721 template <
typename T0>
727 *
this = Tr * (*this);
732 template <
typename T0>
738 *
this = (*this) * Tr;
744 template <
typename T0>
748 MyBase::mm[ 0] = v.
x();
749 MyBase::mm[ 5] = v.
y();
750 MyBase::mm[10] = v.
z();
754 template <
typename T0>
757 MyBase::mm[ 0] *= v.
x();
758 MyBase::mm[ 1] *= v.
x();
759 MyBase::mm[ 2] *= v.
x();
760 MyBase::mm[ 3] *= v.
x();
762 MyBase::mm[ 4] *= v.
y();
763 MyBase::mm[ 5] *= v.
y();
764 MyBase::mm[ 6] *= v.
y();
765 MyBase::mm[ 7] *= v.
y();
767 MyBase::mm[ 8] *= v.
z();
768 MyBase::mm[ 9] *= v.
z();
769 MyBase::mm[10] *= v.
z();
770 MyBase::mm[11] *= v.
z();
776 template <
typename T0>
780 MyBase::mm[ 0] *= v.
x();
781 MyBase::mm[ 1] *= v.
y();
782 MyBase::mm[ 2] *= v.
z();
784 MyBase::mm[ 4] *= v.
x();
785 MyBase::mm[ 5] *= v.
y();
786 MyBase::mm[ 6] *= v.
z();
788 MyBase::mm[ 8] *= v.
x();
789 MyBase::mm[ 9] *= v.
y();
790 MyBase::mm[10] *= v.
z();
792 MyBase::mm[12] *= v.
x();
793 MyBase::mm[13] *= v.
y();
794 MyBase::mm[14] *= v.
z();
819 T c =
static_cast<T
>(cos(
angle));
820 T s = -
static_cast<T
>(sin(
angle));
827 a4 = c * MyBase::mm[ 4] - s * MyBase::mm[ 8];
828 a5 = c * MyBase::mm[ 5] - s * MyBase::mm[ 9];
829 a6 = c * MyBase::mm[ 6] - s * MyBase::mm[10];
830 a7 = c * MyBase::mm[ 7] - s * MyBase::mm[11];
833 MyBase::mm[ 8] = s * MyBase::mm[ 4] + c * MyBase::mm[ 8];
834 MyBase::mm[ 9] = s * MyBase::mm[ 5] + c * MyBase::mm[ 9];
835 MyBase::mm[10] = s * MyBase::mm[ 6] + c * MyBase::mm[10];
836 MyBase::mm[11] = s * MyBase::mm[ 7] + c * MyBase::mm[11];
849 a0 = c * MyBase::mm[ 0] + s * MyBase::mm[ 8];
850 a1 = c * MyBase::mm[ 1] + s * MyBase::mm[ 9];
851 a2 = c * MyBase::mm[ 2] + s * MyBase::mm[10];
852 a3 = c * MyBase::mm[ 3] + s * MyBase::mm[11];
854 MyBase::mm[ 8] = -s * MyBase::mm[ 0] + c * MyBase::mm[ 8];
855 MyBase::mm[ 9] = -s * MyBase::mm[ 1] + c * MyBase::mm[ 9];
856 MyBase::mm[10] = -s * MyBase::mm[ 2] + c * MyBase::mm[10];
857 MyBase::mm[11] = -s * MyBase::mm[ 3] + c * MyBase::mm[11];
871 a0 = c * MyBase::mm[ 0] - s * MyBase::mm[ 4];
872 a1 = c * MyBase::mm[ 1] - s * MyBase::mm[ 5];
873 a2 = c * MyBase::mm[ 2] - s * MyBase::mm[ 6];
874 a3 = c * MyBase::mm[ 3] - s * MyBase::mm[ 7];
876 MyBase::mm[ 4] = s * MyBase::mm[ 0] + c * MyBase::mm[ 4];
877 MyBase::mm[ 5] = s * MyBase::mm[ 1] + c * MyBase::mm[ 5];
878 MyBase::mm[ 6] = s * MyBase::mm[ 2] + c * MyBase::mm[ 6];
879 MyBase::mm[ 7] = s * MyBase::mm[ 3] + c * MyBase::mm[ 7];
899 T c =
static_cast<T
>(cos(
angle));
900 T s = -
static_cast<T
>(sin(
angle));
909 a2 = c * MyBase::mm[ 2] - s * MyBase::mm[ 1];
910 a6 = c * MyBase::mm[ 6] - s * MyBase::mm[ 5];
911 a10 = c * MyBase::mm[10] - s * MyBase::mm[ 9];
912 a14 = c * MyBase::mm[14] - s * MyBase::mm[13];
915 MyBase::mm[ 1] = c * MyBase::mm[ 1] + s * MyBase::mm[ 2];
916 MyBase::mm[ 5] = c * MyBase::mm[ 5] + s * MyBase::mm[ 6];
917 MyBase::mm[ 9] = c * MyBase::mm[ 9] + s * MyBase::mm[10];
918 MyBase::mm[13] = c * MyBase::mm[13] + s * MyBase::mm[14];
922 MyBase::mm[10] = a10;
923 MyBase::mm[14] = a14;
931 a2 = c * MyBase::mm[ 2] + s * MyBase::mm[ 0];
932 a6 = c * MyBase::mm[ 6] + s * MyBase::mm[ 4];
933 a10 = c * MyBase::mm[10] + s * MyBase::mm[ 8];
934 a14 = c * MyBase::mm[14] + s * MyBase::mm[12];
936 MyBase::mm[ 0] = c * MyBase::mm[ 0] - s * MyBase::mm[ 2];
937 MyBase::mm[ 4] = c * MyBase::mm[ 4] - s * MyBase::mm[ 6];
938 MyBase::mm[ 8] = c * MyBase::mm[ 8] - s * MyBase::mm[10];
939 MyBase::mm[12] = c * MyBase::mm[12] - s * MyBase::mm[14];
943 MyBase::mm[10] = a10;
944 MyBase::mm[14] = a14;
952 a1 = c * MyBase::mm[ 1] - s * MyBase::mm[ 0];
953 a5 = c * MyBase::mm[ 5] - s * MyBase::mm[ 4];
954 a9 = c * MyBase::mm[ 9] - s * MyBase::mm[ 8];
955 a13 = c * MyBase::mm[13] - s * MyBase::mm[12];
957 MyBase::mm[ 0] = c * MyBase::mm[ 0] + s * MyBase::mm[ 1];
958 MyBase::mm[ 4] = c * MyBase::mm[ 4] + s * MyBase::mm[ 5];
959 MyBase::mm[ 8] = c * MyBase::mm[ 8] + s * MyBase::mm[ 9];
960 MyBase::mm[12] = c * MyBase::mm[12] + s * MyBase::mm[13];
965 MyBase::mm[13] = a13;
981 *
this = shear<Mat4<T> >(axis0, axis1, shearby);
989 int index0 =
static_cast<int>(axis0);
990 int index1 =
static_cast<int>(axis1);
993 MyBase::mm[index1 * 4 + 0] +=
shear * MyBase::mm[index0 * 4 + 0];
994 MyBase::mm[index1 * 4 + 1] +=
shear * MyBase::mm[index0 * 4 + 1];
995 MyBase::mm[index1 * 4 + 2] +=
shear * MyBase::mm[index0 * 4 + 2];
996 MyBase::mm[index1 * 4 + 3] +=
shear * MyBase::mm[index0 * 4 + 3];
1004 int index0 =
static_cast<int>(axis0);
1005 int index1 =
static_cast<int>(axis1);
1008 MyBase::mm[index0 + 0] +=
shear * MyBase::mm[index1 + 0];
1009 MyBase::mm[index0 + 4] +=
shear * MyBase::mm[index1 + 4];
1010 MyBase::mm[index0 + 8] +=
shear * MyBase::mm[index1 + 8];
1011 MyBase::mm[index0 + 12] +=
shear * MyBase::mm[index1 + 12];
1016 template<
typename T0>
1019 return static_cast< Vec4<T0> >(v * *
this);
1023 template<
typename T0>
1026 return static_cast< Vec3<T0> >(v * *
this);
1030 template<
typename T0>
1033 return static_cast< Vec4<T0> >(*
this * v);
1037 template<
typename T0>
1040 return static_cast< Vec3<T0> >(*
this * v);
1044 template<
typename T0>
1050 w =
static_cast<T0
>(p[0] * MyBase::mm[ 3] + p[1] * MyBase::mm[ 7]
1051 + p[2] * MyBase::mm[11] + MyBase::mm[15]);
1054 return Vec3<T0>(
static_cast<T0
>((p[0] * MyBase::mm[ 0] + p[1] * MyBase::mm[ 4] +
1055 p[2] * MyBase::mm[ 8] + MyBase::mm[12]) / w),
1056 static_cast<T0
>((p[0] * MyBase::mm[ 1] + p[1] * MyBase::mm[ 5] +
1057 p[2] * MyBase::mm[ 9] + MyBase::mm[13]) / w),
1058 static_cast<T0
>((p[0] * MyBase::mm[ 2] + p[1] * MyBase::mm[ 6] +
1059 p[2] * MyBase::mm[10] + MyBase::mm[14]) / w));
1066 template<
typename T0>
1072 w = p[0] * MyBase::mm[12] + p[1] * MyBase::mm[13] + p[2] * MyBase::mm[14] + MyBase::mm[15];
1075 return Vec3<T0>(
static_cast<T0
>((p[0] * MyBase::mm[ 0] + p[1] * MyBase::mm[ 1] +
1076 p[2] * MyBase::mm[ 2] + MyBase::mm[ 3]) / w),
1077 static_cast<T0
>((p[0] * MyBase::mm[ 4] + p[1] * MyBase::mm[ 5] +
1078 p[2] * MyBase::mm[ 6] + MyBase::mm[ 7]) / w),
1079 static_cast<T0
>((p[0] * MyBase::mm[ 8] + p[1] * MyBase::mm[ 9] +
1080 p[2] * MyBase::mm[10] + MyBase::mm[11]) / w));
1087 template<
typename T0>
1091 static_cast<T0
>(v[0] * MyBase::mm[ 0] + v[1] * MyBase::mm[ 4] + v[2] * MyBase::mm[ 8]),
1092 static_cast<T0
>(v[0] * MyBase::mm[ 1] + v[1] * MyBase::mm[ 5] + v[2] * MyBase::mm[ 9]),
1093 static_cast<T0
>(v[0] * MyBase::mm[ 2] + v[1] * MyBase::mm[ 6] + v[2] * MyBase::mm[10]));
1098 bool invert(
Mat4<T> &inverse, T tolerance)
const;
1100 T det2(
const Mat4<T> &a,
int i0,
int i1,
int j0,
int j1)
const {
1103 return a.mm[i0row+j0]*a.mm[i1row+j1] - a.mm[i0row+j1]*a.mm[i1row+j0];
1106 T det3(
const Mat4<T> &a,
int i0,
int i1,
int i2,
1107 int j0,
int j1,
int j2)
const {
1109 return a.mm[i0row+j0]*det2(a, i1,i2, j1,j2) +
1110 a.mm[i0row+j1]*det2(a, i1,i2, j2,j0) +
1111 a.mm[i0row+j2]*det2(a, i1,i2, j0,j1);
1118 template <
typename T0,
typename T1>
1121 const T0 *t0 = m0.asPointer();
1122 const T1 *t1 = m1.asPointer();
1124 for (
int i=0; i<16; ++i)
if (!
isExactlyEqual(t0[i], t1[i]))
return false;
1130 template <
typename T0,
typename T1>
1135 template <
typename S,
typename T>
1143 template <
typename S,
typename T>
1153 template<
typename T,
typename MT>
1158 MT
const *m = _m.asPointer();
1160 _v[0]*m[0] + _v[1]*m[1] + _v[2]*m[2] + _v[3]*m[3],
1161 _v[0]*m[4] + _v[1]*m[5] + _v[2]*m[6] + _v[3]*m[7],
1162 _v[0]*m[8] + _v[1]*m[9] + _v[2]*m[10] + _v[3]*m[11],
1163 _v[0]*m[12] + _v[1]*m[13] + _v[2]*m[14] + _v[3]*m[15]);
1168 template<
typename T,
typename MT>
1173 MT
const *m = _m.asPointer();
1175 _v[0]*m[0] + _v[1]*m[4] + _v[2]*m[8] + _v[3]*m[12],
1176 _v[0]*m[1] + _v[1]*m[5] + _v[2]*m[9] + _v[3]*m[13],
1177 _v[0]*m[2] + _v[1]*m[6] + _v[2]*m[10] + _v[3]*m[14],
1178 _v[0]*m[3] + _v[1]*m[7] + _v[2]*m[11] + _v[3]*m[15]);
1183 template<
typename T,
typename MT>
1187 MT
const *m = _m.asPointer();
1189 _v[0]*m[0] + _v[1]*m[1] + _v[2]*m[2] + m[3],
1190 _v[0]*m[4] + _v[1]*m[5] + _v[2]*m[6] + m[7],
1191 _v[0]*m[8] + _v[1]*m[9] + _v[2]*m[10] + m[11]);
1196 template<
typename T,
typename MT>
1200 MT
const *m = _m.asPointer();
1202 _v[0]*m[0] + _v[1]*m[4] + _v[2]*m[8] + m[12],
1203 _v[0]*m[1] + _v[1]*m[5] + _v[2]*m[9] + m[13],
1204 _v[0]*m[2] + _v[1]*m[6] + _v[2]*m[10] + m[14]);
1209 template <
typename T0,
typename T1>
1220 template <
typename T0,
typename T1>
1231 template <
typename T0,
typename T1>
1244 template<
typename T0,
typename T1>
1248 static_cast<T1
>(m[0][0]*n[0] + m[0][1]*n[1] + m[0][2]*n[2]),
1249 static_cast<T1
>(m[1][0]*n[0] + m[1][1]*n[1] + m[1][2]*n[2]),
1250 static_cast<T1
>(m[2][0]*n[0] + m[2][1]*n[1] + m[2][2]*n[2]));
1255 template<
typename T>
1259 inverse.setIdentity();
1263 for (
int i = 0; i < 4; ++i) {
1265 double max = fabs(temp[i][i]);
1267 for (
int k = i+1; k < 4; ++k) {
1268 if (fabs(temp[k][i]) >
max) {
1270 max = fabs(temp[k][i]);
1279 for (
int k = 0; k < 4; ++k) {
1280 std::swap(temp[row][k], temp[i][k]);
1281 std::swap(inverse[row][k], inverse[i][k]);
1285 double pivot = temp[i][i];
1289 for (
int k = 0; k < 4; ++k) {
1290 temp[i][k] /=
pivot;
1291 inverse[i][k] /=
pivot;
1295 for (
int j = i+1; j < 4; ++j) {
1296 double t = temp[j][i];
1299 for (
int k = 0; k < 4; ++k) {
1300 temp[j][k] -= temp[i][k] * t;
1301 inverse[j][k] -= inverse[i][k] * t;
1308 for (
int i = 3; i > 0; --i) {
1309 for (
int j = 0; j < i; ++j) {
1310 double t = temp[j][i];
1313 for (
int k = 0; k < 4; ++k) {
1314 inverse[j][k] -= inverse[i][k]*t;
1319 return det*det >= tolerance*tolerance;
1322 template <
typename T>
1324 return (m.col(3) ==
Vec4<T>(0, 0, 0, 1));
1327 template <
typename T>
1329 return (m.row(3) !=
Vec4<T>(0, 0, 0, 1));
1340 template<>
inline math::Mat4s zeroVal<math::Mat4s>() {
return math::Mat4s::zero(); }
1341 template<>
inline math::Mat4d zeroVal<math::Mat4d>() {
return math::Mat4d::zero(); }
1346 #endif // OPENVDB_UTIL_MAT4_H_HAS_BEEN_INCLUDED