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));
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>
333 const Source *src = m.asPointer();
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>
391 const S* s = m1.asPointer();
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>
420 const S* s = m1.asPointer();
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>
451 const T* s0 = m0.asPointer();
452 const S* s1 = m1.asPointer();
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>
1110 const T0 *t0 = m0.asPointer();
1111 const T1 *t1 = m1.asPointer();
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>
1147 MT
const *m = _m.asPointer();
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>
1162 MT
const *m = _m.asPointer();
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>
1176 MT
const *m = _m.asPointer();
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>
1189 MT
const *m = _m.asPointer();
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>
1248 inverse.setIdentity();
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>
1313 return (m.col(3) ==
Vec4<T>(0, 0, 0, 1));
1316 template <
typename T>
1318 return (m.row(3) !=
Vec4<T>(0, 0, 0, 1));
1321 template<
typename T>
1326 const T* ip = m.asPointer();
1327 T* op = out.asPointer();
1328 for (
unsigned i = 0; i < 16; ++i, ++op, ++ip) *op =
math::Abs(*ip);
1332 template<
typename Type1,
typename Type2>
1337 const Type1* ip = m.asPointer();
1338 Type1* op = out.asPointer();
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