4 #ifndef OPENVDB_MATH_MAT4_H_HAS_BEEN_INCLUDED
5 #define OPENVDB_MATH_MAT4_H_HAS_BEEN_INCLUDED
24 template<
typename T>
class Vec4;
50 template<
typename Source>
53 for (
int i = 0; i < 16; i++) {
65 template<
typename Source>
66 Mat4(Source
a, Source
b, Source
c, Source d,
67 Source e, Source
f, Source
g, Source
h,
68 Source i, Source
j, Source k, Source l,
69 Source m, Source
n, Source o, Source p)
94 template<
typename Source>
106 template<
typename Source>
111 for (
int i=0; i<16; ++i) {
153 return Vec4<T>((*this)(i,0), (*
this)(i,1), (*
this)(i,2), (*
this)(i,3));
170 return Vec4<T>((*this)(0,
j), (*
this)(1,
j), (*
this)(2,
j), (*
this)(3,
j));
292 for (
int i = 0; i < 3; i++)
293 for (
int j=0;
j < 3;
j++)
301 for (
int i = 0; i < 3; i++)
302 for (
int j = 0;
j < 3;
j++)
322 template<
typename Source>
333 bool eq(
const Mat4 &m, T eps=1.0e-8)
const
335 for (
int i = 0; i < 16; i++) {
346 -
MyBase::mm[ 0], -MyBase::mm[ 1], -MyBase::mm[ 2], -MyBase::mm[ 3],
347 -MyBase::mm[ 4], -MyBase::mm[ 5], -MyBase::mm[ 6], -MyBase::mm[ 7],
348 -MyBase::mm[ 8], -MyBase::mm[ 9], -MyBase::mm[10], -MyBase::mm[11],
349 -MyBase::mm[12], -MyBase::mm[13], -MyBase::mm[14], -MyBase::mm[15]
354 template <
typename S>
380 template <
typename S>
409 template <
typename S>
438 template <
typename S>
446 for (
int i = 0; i < 4; i++) {
448 MyBase::mm[i4+0] =
static_cast<T>(s0[i4+0] * s1[ 0] +
453 MyBase::mm[i4+1] =
static_cast<T>(s0[i4+0] * s1[ 1] +
458 MyBase::mm[i4+2] =
static_cast<T>(s0[i4+0] * s1[ 2] +
463 MyBase::mm[i4+3] =
static_cast<T>(s0[i4+0] * s1[ 3] +
475 MyBase::mm[ 0], MyBase::mm[ 4], MyBase::mm[ 8], MyBase::mm[12],
476 MyBase::mm[ 1], MyBase::mm[ 5], MyBase::mm[ 9], MyBase::mm[13],
477 MyBase::mm[ 2], MyBase::mm[ 6], MyBase::mm[10], MyBase::mm[14],
478 MyBase::mm[ 3], MyBase::mm[ 7], MyBase::mm[11], MyBase::mm[15]
508 T m0011 = m[0][0] * m[1][1];
509 T m0012 = m[0][0] * m[1][2];
510 T m0110 = m[0][1] * m[1][0];
511 T m0210 = m[0][2] * m[1][0];
512 T m0120 = m[0][1] * m[2][0];
513 T m0220 = m[0][2] * m[2][0];
515 T detA = m0011 * m[2][2] - m0012 * m[2][1] - m0110 * m[2][2]
516 + m0210 * m[2][1] + m0120 * m[1][2] - m0220 * m[1][1];
518 bool hasPerspective =
525 if (hasPerspective) {
526 det = m[0][3] * det3(m, 1,2,3, 0,2,1)
527 + m[1][3] * det3(m, 2,0,3, 0,2,1)
528 + m[2][3] * det3(m, 3,0,1, 0,2,1)
531 det = detA * m[3][3];
542 invertible = m.invert(inv, tolerance);
551 inv[0][0] = detA * ( m[1][1] * m[2][2] - m[1][2] * m[2][1]);
552 inv[0][1] = detA * (-m[0][1] * m[2][2] + m[0][2] * m[2][1]);
553 inv[0][2] = detA * ( m[0][1] * m[1][2] - m[0][2] * m[1][1]);
555 inv[1][0] = detA * (-m[1][0] * m[2][2] + m[1][2] * m[2][0]);
556 inv[1][1] = detA * ( m[0][0] * m[2][2] - m0220);
557 inv[1][2] = detA * ( m0210 - m0012);
559 inv[2][0] = detA * ( m[1][0] * m[2][1] - m[1][1] * m[2][0]);
560 inv[2][1] = detA * ( m0120 - m[0][0] * m[2][1]);
561 inv[2][2] = detA * ( m0011 - m0110);
563 if (hasPerspective) {
568 r[0] = m[3][0] * inv[0][0] + m[3][1] * inv[1][0]
569 + m[3][2] * inv[2][0];
570 r[1] = m[3][0] * inv[0][1] + m[3][1] * inv[1][1]
571 + m[3][2] * inv[2][1];
572 r[2] = m[3][0] * inv[0][2] + m[3][1] * inv[1][2]
573 + m[3][2] * inv[2][2];
576 p[0] = inv[0][0] * m[0][3] + inv[0][1] * m[1][3]
577 + inv[0][2] * m[2][3];
578 p[1] = inv[1][0] * m[0][3] + inv[1][1] * m[1][3]
579 + inv[1][2] * m[2][3];
580 p[2] = inv[2][0] * m[0][3] + inv[2][1] * m[1][3]
581 + inv[2][2] * m[2][3];
583 T h = m[3][3] - p.
dot(
Vec3<T>(m[3][0],m[3][1],m[3][2]));
594 inv[3][0] = -h * r[0];
595 inv[3][1] = -h * r[1];
596 inv[3][2] = -h * r[2];
598 inv[0][3] = -h * p[0];
599 inv[1][3] = -h * p[1];
600 inv[2][3] = -h * p[2];
606 inv[0][0] += p[0] * r[0];
607 inv[0][1] += p[0] * r[1];
608 inv[0][2] += p[0] * r[2];
609 inv[1][0] += p[1] * r[0];
610 inv[1][1] += p[1] * r[1];
611 inv[1][2] += p[1] * r[2];
612 inv[2][0] += p[2] * r[0];
613 inv[2][1] += p[2] * r[1];
614 inv[2][2] += p[2] * r[2];
618 inv[3][0] = - (m[3][0] * inv[0][0] + m[3][1] * inv[1][0]
619 + m[3][2] * inv[2][0]);
620 inv[3][1] = - (m[3][0] * inv[0][1] + m[3][1] * inv[1][1]
621 + m[3][2] * inv[2][1]);
622 inv[3][2] = - (m[3][0] * inv[0][2] + m[3][1] * inv[1][2]
623 + m[3][2] * inv[2][2]);
631 if (!invertible)
OPENVDB_THROW(ArithmeticError,
"Inversion of singular 4x4 matrix");
647 for (i = 0; i < 4; i++) {
650 for (j = 0; j < 4; j++) {
651 for (k = 0; k < 4; k++) {
652 if ((k != i) && (j != 0)) {
670 T(1),
T(0),
T(0),
T(0),
671 T(0),
T(1),
T(0),
T(0),
672 T(0),
T(0),
T(1),
T(0),
673 T(v.
x()),
T(v.
y()),
T(v.
z()),
T(1));
677 template <
typename T0>
702 template <
typename T0>
708 *
this = Tr * (*this);
713 template <
typename T0>
719 *
this = (*this) * Tr;
725 template <
typename T0>
735 template <
typename T0>
757 template <
typename T0>
800 T c =
static_cast<T>(
cos(angle));
801 T s = -
static_cast<T>(
sin(angle));
809 a5 = c * MyBase::mm[ 5] - s * MyBase::mm[ 9];
810 a6 = c * MyBase::mm[ 6] - s * MyBase::mm[10];
811 a7 = c * MyBase::mm[ 7] - s * MyBase::mm[11];
814 MyBase::mm[ 8] = s * MyBase::mm[ 4] + c * MyBase::mm[ 8];
815 MyBase::mm[ 9] = s * MyBase::mm[ 5] + c * MyBase::mm[ 9];
816 MyBase::mm[10] = s * MyBase::mm[ 6] + c * MyBase::mm[10];
817 MyBase::mm[11] = s * MyBase::mm[ 7] + c * MyBase::mm[11];
831 a1 = c * MyBase::mm[ 1] + s * MyBase::mm[ 9];
832 a2 = c * MyBase::mm[ 2] + s * MyBase::mm[10];
833 a3 = c * MyBase::mm[ 3] + s * MyBase::mm[11];
835 MyBase::mm[ 8] = -s * MyBase::mm[ 0] + c * MyBase::mm[ 8];
836 MyBase::mm[ 9] = -s * MyBase::mm[ 1] + c * MyBase::mm[ 9];
837 MyBase::mm[10] = -s * MyBase::mm[ 2] + c * MyBase::mm[10];
838 MyBase::mm[11] = -s * MyBase::mm[ 3] + c * MyBase::mm[11];
853 a1 = c * MyBase::mm[ 1] - s * MyBase::mm[ 5];
854 a2 = c * MyBase::mm[ 2] - s * MyBase::mm[ 6];
855 a3 = c * MyBase::mm[ 3] - s * MyBase::mm[ 7];
857 MyBase::mm[ 4] = s * MyBase::mm[ 0] + c * MyBase::mm[ 4];
858 MyBase::mm[ 5] = s * MyBase::mm[ 1] + c * MyBase::mm[ 5];
859 MyBase::mm[ 6] = s * MyBase::mm[ 2] + c * MyBase::mm[ 6];
860 MyBase::mm[ 7] = s * MyBase::mm[ 3] + c * MyBase::mm[ 7];
880 T c =
static_cast<T>(
cos(angle));
881 T s = -
static_cast<T>(
sin(angle));
891 a6 = c * MyBase::mm[ 6] - s * MyBase::mm[ 5];
892 a10 = c * MyBase::mm[10] - s * MyBase::mm[ 9];
893 a14 = c * MyBase::mm[14] - s * MyBase::mm[13];
896 MyBase::mm[ 1] = c * MyBase::mm[ 1] + s * MyBase::mm[ 2];
897 MyBase::mm[ 5] = c * MyBase::mm[ 5] + s * MyBase::mm[ 6];
898 MyBase::mm[ 9] = c * MyBase::mm[ 9] + s * MyBase::mm[10];
899 MyBase::mm[13] = c * MyBase::mm[13] + s * MyBase::mm[14];
903 MyBase::mm[10] = a10;
904 MyBase::mm[14] = a14;
913 a6 = c * MyBase::mm[ 6] + s * MyBase::mm[ 4];
914 a10 = c * MyBase::mm[10] + s * MyBase::mm[ 8];
915 a14 = c * MyBase::mm[14] + s * MyBase::mm[12];
917 MyBase::mm[ 0] = c * MyBase::mm[ 0] - s * MyBase::mm[ 2];
918 MyBase::mm[ 4] = c * MyBase::mm[ 4] - s * MyBase::mm[ 6];
919 MyBase::mm[ 8] = c * MyBase::mm[ 8] - s * MyBase::mm[10];
920 MyBase::mm[12] = c * MyBase::mm[12] - s * MyBase::mm[14];
924 MyBase::mm[10] = a10;
925 MyBase::mm[14] = a14;
934 a5 = c * MyBase::mm[ 5] - s * MyBase::mm[ 4];
935 a9 = c * MyBase::mm[ 9] - s * MyBase::mm[ 8];
936 a13 = c * MyBase::mm[13] - s * MyBase::mm[12];
938 MyBase::mm[ 0] = c * MyBase::mm[ 0] + s * MyBase::mm[ 1];
939 MyBase::mm[ 4] = c * MyBase::mm[ 4] + s * MyBase::mm[ 5];
940 MyBase::mm[ 8] = c * MyBase::mm[ 8] + s * MyBase::mm[ 9];
941 MyBase::mm[12] = c * MyBase::mm[12] + s * MyBase::mm[13];
946 MyBase::mm[13] = a13;
962 *
this = shear<Mat4<T> >(axis0, axis1, shearby);
970 int index0 =
static_cast<int>(axis0);
971 int index1 =
static_cast<int>(axis1);
975 MyBase::mm[index1 * 4 + 1] += shear * MyBase::mm[index0 * 4 + 1];
976 MyBase::mm[index1 * 4 + 2] += shear * MyBase::mm[index0 * 4 + 2];
977 MyBase::mm[index1 * 4 + 3] += shear * MyBase::mm[index0 * 4 + 3];
985 int index0 =
static_cast<int>(axis0);
986 int index1 =
static_cast<int>(axis1);
990 MyBase::mm[index0 + 4] += shear * MyBase::mm[index1 + 4];
991 MyBase::mm[index0 + 8] += shear * MyBase::mm[index1 + 8];
992 MyBase::mm[index0 + 12] += shear * MyBase::mm[index1 + 12];
997 template<
typename T0>
1000 return static_cast< Vec4<T0> >(v * *
this);
1004 template<
typename T0>
1007 return static_cast< Vec3<T0> >(v * *
this);
1011 template<
typename T0>
1014 return static_cast< Vec4<T0> >(*
this *
v);
1018 template<
typename T0>
1021 return static_cast< Vec3<T0> >(*
this *
v);
1025 template<
typename T0>
1047 template<
typename T0>
1056 return Vec3<T0>(
static_cast<T0
>((p[0] * MyBase::mm[ 0] + p[1] * MyBase::mm[ 1] +
1057 p[2] * MyBase::mm[ 2] + MyBase::mm[ 3]) / w),
1058 static_cast<T0
>((p[0] * MyBase::mm[ 4] + p[1] * MyBase::mm[ 5] +
1059 p[2] * MyBase::mm[ 6] + MyBase::mm[ 7]) / w),
1060 static_cast<T0
>((p[0] * MyBase::mm[ 8] + p[1] * MyBase::mm[ 9] +
1061 p[2] * MyBase::mm[10] + MyBase::mm[11]) / w));
1068 template<
typename T0>
1074 static_cast<T0
>(v[0] * MyBase::mm[ 2] + v[1] * MyBase::mm[ 6] + v[2] * MyBase::mm[10]));
1081 T det2(
const Mat4<T> &
a,
int i0,
int i1,
int j0,
int j1)
const {
1084 return a.
mm[i0row+j0]*a.
mm[i1row+
j1] - a.
mm[i0row+
j1]*a.
mm[i1row+j0];
1087 T det3(
const Mat4<T> &
a,
int i0,
int i1,
int i2,
1088 int j0,
int j1,
int j2)
const {
1090 return a.mm[i0row+j0]*det2(a, i1,i2, j1,j2) +
1091 a.mm[i0row+
j1]*det2(a, i1,i2, j2,j0) +
1092 a.mm[i0row+
j2]*det2(a, i1,i2, j0,j1);
1099 template <
typename T0,
typename T1>
1105 for (
int i=0; i<16; ++i)
if (!
isExactlyEqual(t0[i], t1[i]))
return false;
1111 template <
typename T0,
typename T1>
1116 template <
typename S,
typename T>
1124 template <
typename S,
typename T>
1134 template<
typename T,
typename MT>
1141 _v[0]*m[0] + _v[1]*m[1] + _v[2]*m[2] + _v[3]*m[3],
1142 _v[0]*m[4] + _v[1]*m[5] + _v[2]*m[6] + _v[3]*m[7],
1143 _v[0]*m[8] + _v[1]*m[9] + _v[2]*m[10] + _v[3]*m[11],
1144 _v[0]*m[12] + _v[1]*m[13] + _v[2]*m[14] + _v[3]*m[15]);
1149 template<
typename T,
typename MT>
1156 _v[0]*m[0] + _v[1]*m[4] + _v[2]*m[8] + _v[3]*m[12],
1157 _v[0]*m[1] + _v[1]*m[5] + _v[2]*m[9] + _v[3]*m[13],
1158 _v[0]*m[2] + _v[1]*m[6] + _v[2]*m[10] + _v[3]*m[14],
1159 _v[0]*m[3] + _v[1]*m[7] + _v[2]*m[11] + _v[3]*m[15]);
1164 template<
typename T,
typename MT>
1170 _v[0]*m[0] + _v[1]*m[1] + _v[2]*m[2] + m[3],
1171 _v[0]*m[4] + _v[1]*m[5] + _v[2]*m[6] + m[7],
1172 _v[0]*m[8] + _v[1]*m[9] + _v[2]*m[10] + m[11]);
1177 template<
typename T,
typename MT>
1183 _v[0]*m[0] + _v[1]*m[4] + _v[2]*m[8] + m[12],
1184 _v[0]*m[1] + _v[1]*m[5] + _v[2]*m[9] + m[13],
1185 _v[0]*m[2] + _v[1]*m[6] + _v[2]*m[10] + m[14]);
1190 template <
typename T0,
typename T1>
1201 template <
typename T0,
typename T1>
1212 template <
typename T0,
typename T1>
1225 template<
typename T0,
typename T1>
1229 static_cast<T1
>(m[0][0]*n[0] + m[0][1]*n[1] + m[0][2]*n[2]),
1230 static_cast<T1>(m[1][0]*n[0] + m[1][1]*n[1] + m[1][2]*n[2]),
1231 static_cast<T1
>(m[2][0]*n[0] + m[2][1]*n[1] + m[2][2]*n[2]));
1236 template<
typename T>
1239 Mat4<T> temp(*
this);
1240 inverse.setIdentity();
1244 for (
int i = 0; i < 4; ++i) {
1246 double max = fabs(temp[i][i]);
1248 for (
int k = i+1; k < 4; ++k) {
1249 if (fabs(temp[k][i]) > max) {
1251 max = fabs(temp[k][i]);
1260 for (
int k = 0; k < 4; ++k) {
1262 std::swap(inverse[row][k], inverse[i][k]);
1266 double pivot = temp[i][i];
1270 for (
int k = 0; k < 4; ++k) {
1271 temp[i][k] /=
pivot;
1272 inverse[i][k] /=
pivot;
1276 for (
int j = i+1;
j < 4; ++
j) {
1277 double t = temp[
j][i];
1280 for (
int k = 0; k < 4; ++k) {
1281 temp[
j][k] -= temp[i][k] *
t;
1282 inverse[
j][k] -= inverse[i][k] *
t;
1289 for (
int i = 3; i > 0; --i) {
1290 for (
int j = 0;
j < i; ++
j) {
1291 double t = temp[
j][i];
1294 for (
int k = 0; k < 4; ++k) {
1295 inverse[
j][k] -= inverse[i][k]*
t;
1300 return det*det >= tolerance*tolerance;
1303 template <
typename T>
1308 template <
typename T>
1313 template<
typename T>
1320 for (
unsigned i = 0; i < 16; ++i, ++op, ++ip) *op =
math::Abs(*ip);
1324 template<
typename Type1,
typename Type2>
1331 for (
unsigned i = 0; i < 16; ++i, ++op, ++ip) {
1339 template<
typename T>
1343 return cwiseLessThan<4, T>(m0, m1);
1346 template<
typename T>
1350 return cwiseGreaterThan<4, T>(m0, m1);
1369 #endif // OPENVDB_UTIL_MAT4_H_HAS_BEEN_INCLUDED
SYS_API double cos(double x)
bool cwiseGreaterThan(const Mat< SIZE, T > &m0, const Mat< SIZE, T > &m1)
bool isExactlyEqual(const T0 &a, const T1 &b)
Return true if a is exactly equal to b.
MatType shear(Axis axis0, Axis axis1, typename MatType::value_type shear)
Set the matrix to a shear along axis0 by a fraction of axis1.
Vec3< T0 > transformH(const Vec3< T0 > &p) const
Transform a Vec3 by post-multiplication, doing homogenous divison.
void swap(UT::ArraySet< Key, MULTI, MAX_LOAD_FACTOR_256, Clearer, Hash, KeyEqual > &a, UT::ArraySet< Key, MULTI, MAX_LOAD_FACTOR_256, Clearer, Hash, KeyEqual > &b)
OIIO_UTIL_API bool copy(string_view from, string_view to, std::string &err)
Mat3< T > getMat3() const
Mat3< Type1 > cwiseAdd(const Mat3< Type1 > &m, const Type2 s)
void setRow(int i, const Vec4< T > &v)
Set ith row to vector v.
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...
void setToScale(const Vec3< T0 > &v)
Sets the matrix to a matrix that scales by v.
GLboolean GLboolean GLboolean GLboolean a
T & operator()(int i, int j)
#define OPENVDB_USE_VERSION_NAMESPACE
Vec3< T0 > transform(const Vec3< T0 > &v) const
Transform a Vec3 by post-multiplication, without homogenous division.
void setToRotation(const Vec3< T > &axis, T angle)
Sets the matrix to a rotation about an arbitrary axis.
Mat4< typename promote< T0, T1 >::type > operator*(const Mat4< T0 > &m0, const Mat4< T1 > &m1)
Multiply m0 by m1 and return the resulting matrix.
void postRotate(Axis axis, T angle)
Right multiplies by a rotation clock-wiseabout the given axis into this matrix.
**But if you need a result
void setToTranslation(const Vec3< T0 > &v)
Sets the matrix to a matrix that translates by v.
GLfloat GLfloat GLfloat v2
GLfloat GLfloat GLfloat GLfloat v3
void setIdentity()
Set this matrix to identity.
T dot(const Vec3< T > &v) const
Dot product.
void setToRotation(Axis axis, T angle)
Sets the matrix to a rotation about the given axis.
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.
void setTranslation(const Vec3< T > &t)
void preRotate(Axis axis, T angle)
Left multiplies by a rotation clock-wiseabout the given axis into this matrix.
Mat4(Source *a)
Constructor given array of elements, the ordering is in row major form:
bool operator!=(const Mat4< T0 > &m0, const Mat4< T1 > &m1)
Inequality operator, does exact floating point comparisons.
constexpr T zeroVal()
Return the value of type T that corresponds to zero.
#define OPENVDB_IS_POD(Type)
bool isApproxEqual(const Type &a, const Type &b, const Type &tolerance)
Return true if a is equal to b to within the given tolerance.
const Mat4< T > & operator-=(const Mat4< S > &m1)
Subtract each element of the given matrix from the corresponding element of this matrix.
Coord Abs(const Coord &xyz)
void preScale(const Vec3< T0 > &v)
void setCol(int j, const Vec4< T > &v)
Set jth column to vector v.
Vec3< T > getTranslation() const
Return the translation component.
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
void postTranslate(const Vec3< T0 > &tr)
Right multiplies by the specified translation matrix, i.e. (*this) * Trans.
Vec3< T0 > pretransformH(const Vec3< T0 > &p) const
Transform a Vec3 by pre-multiplication, doing homogenous division.
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.
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:
Vec3< T0 > transform3x3(const Vec3< T0 > &v) const
Transform a Vec3 by post-multiplication, without translation.
void setToShear(Axis axis0, Axis axis1, T shearby)
Sets the matrix to a shear along axis0 by a fraction of axis1.
void setMat3(const Mat3< T > &m)
Set upper left to a Mat3.
const Mat4< T > & operator*=(S scalar)
Multiply each element of this matrix by scalar.
T angle(const Vec2< T > &v1, const Vec2< T > &v2)
bool cwiseLessThan(const Mat< SIZE, T > &m0, const Mat< SIZE, T > &m1)
Vec4< T > col(int j) const
Get jth column, e.g. Vec4f v = m.col(0);.
void preTranslate(const Vec3< T0 > &tr)
Left multiples by the specified translation, i.e. Trans * (*this)
Mat4< T > operator-() const
Negation operator, for e.g. m1 = -m2;.
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.
T det() const
Determinant of matrix.
IMATH_HOSTDEVICE constexpr int sign(T a) IMATH_NOEXCEPT
Vec3< T0 > pretransform(const Vec3< T0 > &v) const
Transform a Vec3 by pre-multiplication, without homogenous division.
GLboolean GLboolean GLboolean b
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.
const Mat4 & operator=(const Mat4< Source > &m)
Assignment operator.
void postScale(const Vec3< T0 > &v)
Vec4< typename promote< T, MT >::type > operator*(const Mat4< MT > &_m, const Vec4< T > &_v)
Multiply _m by _v and return the resulting vector.
bool hasTranslation(const Mat4< T > &m)
GLfloat GLfloat GLfloat GLfloat h
T det() const
Determinant of matrix.
bool operator==(const Mat4< T0 > &m0, const Mat4< T1 > &m1)
Equality operator, does exact floating point comparisons.
const Mat4< T > & operator*=(const Mat4< S > &m1)
Multiply this matrix by the given matrix.
Vec4< T > row(int i) const
Get ith row, e.g. Vec4f v = m.row(1);.
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.
T & x()
Reference to the component, e.g. v.x() = 4.5f;.
T * asPointer()
Direct access to the internal data.
const Mat4< T > & operator+=(const Mat4< S > &m1)
Add each element of the given matrix to the corresponding element of this matrix. ...
void postShear(Axis axis0, Axis axis1, T shear)
Right multiplies a shearing transformation into the matrix.
Vec3< T1 > transformNormal(const Mat4< T0 > &m, const Vec3< T1 > &n)
Vec4< T0 > transform(const Vec4< T0 > &v) const
Transform a Vec4 by post-multiplication.
GLint GLint GLint GLint j2
ImageBuf OIIO_API max(Image_or_Const A, Image_or_Const B, ROI roi={}, int nthreads=0)
static const Mat4< T > & identity()
Predefined constant for identity matrix.
static unsigned numElements()
GA_API const UT_StringHolder pivot
T operator()(int i, int j) const
Vec3< typename promote< T, MT >::type > operator*(const Vec3< T > &_v, const Mat4< MT > &_m)
Multiply _v by _m and return the resulting vector.
GLubyte GLubyte GLubyte GLubyte w
Vec4< T0 > pretransform(const Vec4< T0 > &v) const
Transform a Vec4 by pre-multiplication.
GLenum GLenum GLsizei void * row
void preShear(Axis axis0, Axis axis1, T shear)
Left multiplies a shearing transformation into the matrix.
Mat4(const Vec4< Source > &v1, const Vec4< Source > &v2, const Vec4< Source > &v3, const Vec4< Source > &v4, bool rows=true)
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.
Mat4(const Mat4< Source > &m)
Conversion constructor.
Vec3< typename promote< T, MT >::type > operator*(const Mat4< MT > &_m, const Vec3< T > &_v)
Multiply _m by _v and return the resulting vector.
bool isAffine(const Mat4< T > &m)
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
static const Mat4< T > & zero()
Predefined constant for zero matrix.
SYS_API double sin(double x)
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.
Mat4 inverse(T tolerance=0) const
#define OPENVDB_THROW(exception, message)
Vec4< typename promote< T, MT >::type > operator*(const Vec4< T > &_v, const Mat4< MT > &_m)
Multiply _v by _m and return the resulting vector.
static Mat4 translation(const Vec3d &v)
Sets the matrix to a matrix that translates by v.