10 #ifndef __UT_Matrix3_h__
11 #define __UT_Matrix3_h__
38 template <
typename T,
typename S>
40 template <
typename T,
typename S>
42 template <
typename T,
typename S>
44 template <
typename T,
typename S>
46 template <
typename T,
typename S>
48 template <
typename T,
typename S>
50 template <
typename T,
typename S>
52 template <
typename T,
typename S>
54 template <
typename T,
typename S>
56 template <
typename T,
typename S>
58 template <
typename T,
typename S>
60 template <
typename T,
typename S>
67 template <
typename T,
typename S>
71 template <
typename T,
typename S>
78 template <
typename T,
typename S>
81 {
return v0 * (1 - u -
v) + v1 * u + v2 *v; }
97 static const int tuple_size = 9;
116 template <
typename S>
119 {
T(
m[0][0]),
T(
m[0][1]),
T(
m[0][2])},
120 {
T(
m[1][0]),
T(
m[1][1]),
T(
m[1][2])},
121 {
T(
m[2][0]),
T(
m[2][1]),
T(
m[2][2])}}
126 template <
typename S,
bool INST>
135 template <
typename S,
bool INST>
148 T val00,
T val01,
T val02,
149 T val10,
T val11,
T val12,
150 T val20,
T val21,
T val22) noexcept
158 template <
typename S>
161 {
T(
m(0,0)),
T(
m(0,1)),
T(
m(0,2))},
162 {
T(
m(1,0)),
T(
m(1,1)),
T(
m(1,2))},
163 {
T(
m(2,0)),
T(
m(2,1)),
T(
m(2,2))}}
169 template <
typename S>
187 template <
typename S>
190 matx[0][0]=
m(0,0); matx[0][1]=
m(0,1); matx[0][2]=
m(0,2);
191 matx[1][0]=
m(1,0); matx[1][1]=
m(1,1); matx[1][2]=
m(1,2);
192 matx[2][0]=
m(2,0); matx[2][1]=
m(2,1); matx[2][2]=
m(2,2);
197 template <
typename S>
202 matx[0][0] = l.q00; matx[0][1] = l.q10; matx[0][2] = l.q20;
203 matx[1][0] = l.q10; matx[1][1] = l.q11; matx[1][2] = l.q21;
204 matx[2][0] = l.q20; matx[2][1] = l.q21; matx[2][2] = l.q22;
212 matx[1][0], matx[1][1],
213 matx[2][0], matx[2][1], matx[2][2]);
220 matx[0][1], matx[1][1],
221 matx[0][2], matx[1][2], matx[2][2]);
228 (matx[0][1] + matx[1][0]) / 2,
230 (matx[0][2] + matx[2][0]) / 2,
231 (matx[1][2] + matx[2][1]) / 2,
238 -matx[1][0], -matx[1][1], -matx[1][2],
239 -matx[2][0], -matx[2][1], -matx[2][2]);
246 matx[0][0]+=k*m.
matx[0][0];
247 matx[0][1]+=k*m.
matx[0][1];
248 matx[0][2]+=k*m.
matx[0][2];
250 matx[1][0]+=k*m.
matx[1][0];
251 matx[1][1]+=k*m.
matx[1][1];
252 matx[1][2]+=k*m.
matx[1][2];
254 matx[2][0]+=k*m.
matx[2][0];
255 matx[2][1]+=k*m.
matx[2][1];
256 matx[2][2]+=k*m.
matx[2][2];
261 matx[0][0]+=m.
matx[0][0];
262 matx[0][1]+=m.
matx[0][1];
263 matx[0][2]+=m.
matx[0][2];
265 matx[1][0]+=m.
matx[1][0];
266 matx[1][1]+=m.
matx[1][1];
267 matx[1][2]+=m.
matx[1][2];
269 matx[2][0]+=m.
matx[2][0];
270 matx[2][1]+=m.
matx[2][1];
271 matx[2][2]+=m.
matx[2][2];
277 matx[0][0]-=m.
matx[0][0];
278 matx[0][1]-=m.
matx[0][1];
279 matx[0][2]-=m.
matx[0][2];
281 matx[1][0]-=m.
matx[1][0];
282 matx[1][1]-=m.
matx[1][1];
283 matx[1][2]-=m.
matx[1][2];
285 matx[2][0]-=m.
matx[2][0];
286 matx[2][1]-=m.
matx[2][1];
287 matx[2][2]-=m.
matx[2][2];
294 a = matx[0][0]; b = matx[0][1]; c = matx[0][2];
295 matx[0][0] = a*
m(0,0) + b*
m(1,0) + c*
m(2,0);
296 matx[0][1] = a*
m(0,1) + b*
m(1,1) + c*
m(2,1);
297 matx[0][2] = a*
m(0,2) + b*
m(1,2) + c*
m(2,2);
299 a = matx[1][0]; b = matx[1][1]; c = matx[1][2];
300 matx[1][0] = a*
m(0,0) + b*
m(1,0) + c*
m(2,0);
301 matx[1][1] = a*
m(0,1) + b*
m(1,1) + c*
m(2,1);
302 matx[1][2] = a*
m(0,2) + b*
m(1,2) + c*
m(2,2);
304 a = matx[2][0]; b = matx[2][1]; c = matx[2][2];
305 matx[2][0] = a*
m(0,0) + b*
m(1,0) + c*
m(2,0);
306 matx[2][1] = a*
m(0,1) + b*
m(1,1) + c*
m(2,1);
307 matx[2][2] = a*
m(0,2) + b*
m(1,2) + c*
m(2,2);
312 template <
typename S>
320 a = matx[0][0]; b = matx[0][1]; c = matx[0][2];
321 matx[0][0] = a*l.q00 + b*l.q10 + c*l.q20;
322 matx[0][1] = a*l.q10 + b*l.q11 + c*l.q21;
323 matx[0][2] = a*l.q20 + b*l.q21 + c*l.q22;
325 a = matx[1][0]; b = matx[1][1]; c = matx[1][2];
326 matx[1][0] = a*l.q00 + b*l.q10 + c*l.q20;
327 matx[1][1] = a*l.q10 + b*l.q11 + c*l.q21;
328 matx[1][2] = a*l.q20 + b*l.q21 + c*l.q22;
330 a = matx[2][0]; b = matx[2][1]; c = matx[2][2];
331 matx[2][0] = a*l.q00 + b*l.q10 + c*l.q20;
332 matx[2][1] = a*l.q10 + b*l.q11 + c*l.q21;
333 matx[2][2] = a*l.q20 + b*l.q21 + c*l.q22;
339 template <
typename S>
347 a = matx[0][0]; b = matx[1][0]; c = matx[2][0];
348 matx[0][0] = a*l.q00 + b*l.q10 + c*l.q20;
349 matx[1][0] = a*l.q10 + b*l.q11 + c*l.q21;
350 matx[2][0] = a*l.q20 + b*l.q21 + c*l.q22;
352 a = matx[0][1]; b = matx[1][1]; c = matx[2][1];
353 matx[0][1] = a*l.q00 + b*l.q10 + c*l.q20;
354 matx[1][1] = a*l.q10 + b*l.q11 + c*l.q21;
355 matx[2][1] = a*l.q20 + b*l.q21 + c*l.q22;
357 a = matx[0][2]; b = matx[1][2]; c = matx[2][2];
358 matx[0][2] = a*l.q00 + b*l.q10 + c*l.q20;
359 matx[1][2] = a*l.q10 + b*l.q11 + c*l.q21;
360 matx[2][2] = a*l.q20 + b*l.q21 + c*l.q22;
364 template <
typename S>
369 a = matx[0][0]; b = matx[1][0]; c = matx[2][0];
370 matx[0][0] = a*
m(0,0) + b*
m(0,1) + c*
m(0,2);
371 matx[1][0] = a*
m(1,0) + b*
m(1,1) + c*
m(1,2);
372 matx[2][0] = a*
m(2,0) + b*
m(2,1) + c*
m(2,2);
374 a = matx[0][1]; b = matx[1][1]; c = matx[2][1];
375 matx[0][1] = a*
m(0,0) + b*
m(0,1) + c*
m(0,2);
376 matx[1][1] = a*
m(1,0) + b*
m(1,1) + c*
m(1,2);
377 matx[2][1] = a*
m(2,0) + b*
m(2,1) + c*
m(2,2);
379 a = matx[0][2]; b = matx[1][2]; c = matx[2][2];
380 matx[0][2] = a*
m(0,0) + b*
m(0,1) + c*
m(0,2);
381 matx[1][2] = a*
m(1,0) + b*
m(1,1) + c*
m(1,2);
382 matx[2][2] = a*
m(2,0) + b*
m(2,1) + c*
m(2,2);
390 return (&
m ==
this) || (
391 matx[0][0]==
m(0,0) && matx[0][1]==
m(0,1) && matx[0][2]==
m(0,2) &&
392 matx[1][0]==
m(1,0) && matx[1][1]==
m(1,1) && matx[1][2]==
m(1,2) &&
393 matx[2][0]==
m(2,0) && matx[2][1]==
m(2,1) && matx[2][2]==
m(2,2) );
397 return !(*
this ==
m);
403 matx[0][0] =
val; matx[0][1] = 0; matx[0][2] = 0;
404 matx[1][0] = 0; matx[1][1] =
val; matx[1][2] = 0;
405 matx[2][0] = 0; matx[2][1] = 0; matx[2][2] =
val;
411 matx[0][0]*=scalar; matx[0][1]*=scalar; matx[0][2]*=scalar;
412 matx[1][0]*=scalar; matx[1][1]*=scalar; matx[1][2]*=scalar;
413 matx[2][0]*=scalar; matx[2][1]*=scalar; matx[2][2]*=scalar;
423 template <
typename S>
425 template <
typename S>
427 template <
typename S>
433 template <
typename S>
434 inline void outerproductUpdateT(
T b,
441 { outerproductUpdateT(b, v1, v2); }
446 { outerproductUpdateT(b, v1, v2); }
458 void arbitrary180rot();
463 template <
typename S>
478 template <
typename S>
482 template <
typename S>
496 template <
typename S>
499 template <
typename S>
511 template <
typename S>
513 template <
typename S>
526 template <
typename S>
535 { orientT(v, pscale, s3, up, q); }
540 { orientT(v, pscale, s3, up, q); }
541 template <
typename S>
550 { orientInverseT(v, pscale, s3, up, q); }
555 { orientInverseT(v, pscale, s3, up, q); }
571 return matx[r[0]][c[0]]*matx[r[1]][c[1]] -
572 matx[r[0]][c[1]]*matx[r[1]][c[0]];
577 return(matx[0][0]*coFactor(0,0) +
578 matx[0][1]*coFactor(0,1) +
579 matx[0][2]*coFactor(0,2));
582 {
return matx[0][0] + matx[1][1] + matx[2][2]; }
588 template <
typename S>
604 int invertKramer(
UT_Matrix3T<T> &
m,
T abs_det_threshold = FLT_EPSILON)
const;
607 int invertKramer(
T abs_det_threshold = FLT_EPSILON);
617 int safeInvertSymmetric(
T tol=1e-6
f);
651 tmp=matx[0][1]; matx[0][1]=matx[1][0]; matx[1][0]=tmp;
652 tmp=matx[0][2]; matx[0][2]=matx[2][0]; matx[2][0]=tmp;
653 tmp=matx[1][2]; matx[1][2]=matx[2][1]; matx[2][1]=tmp;
658 matx[0][1], matx[1][1], matx[2][1],
659 matx[0][2], matx[1][2], matx[2][2]);
666 return (&m ==
this) || (
667 SYSisEqual( matx[0][0], m.
matx[0][0], tolerance ) &&
668 SYSisEqual( matx[0][1], m.
matx[0][1], tolerance ) &&
669 SYSisEqual( matx[0][2], m.
matx[0][2], tolerance ) &&
671 SYSisEqual( matx[1][0], m.
matx[1][0], tolerance ) &&
672 SYSisEqual( matx[1][1], m.
matx[1][1], tolerance ) &&
673 SYSisEqual( matx[1][2], m.
matx[1][2], tolerance ) &&
675 SYSisEqual( matx[2][0], m.
matx[2][0], tolerance ) &&
676 SYSisEqual( matx[2][1], m.
matx[2][1], tolerance ) &&
677 SYSisEqual( matx[2][2], m.
matx[2][2], tolerance ) );
682 return (&m ==
this) || (
683 SYSalmostEqual( matx[0][0], m.
matx[0][0], ulps ) &&
684 SYSalmostEqual( matx[0][1], m.
matx[0][1], ulps ) &&
685 SYSalmostEqual( matx[0][2], m.
matx[0][2], ulps ) &&
687 SYSalmostEqual( matx[1][0], m.
matx[1][0], ulps ) &&
688 SYSalmostEqual( matx[1][1], m.
matx[1][1], ulps ) &&
689 SYSalmostEqual( matx[1][2], m.
matx[1][2], ulps ) &&
691 SYSalmostEqual( matx[2][0], m.
matx[2][0], ulps ) &&
692 SYSalmostEqual( matx[2][1], m.
matx[2][1], ulps ) &&
693 SYSalmostEqual( matx[2][2], m.
matx[2][2], ulps ) );
711 template <
typename S>
714 template<UT_Axis3::axis A>
720 template<UT_Axis3::axis A,
bool reverse=false>
730 matx[
row][col0] = -matx[
row][col1];
731 matx[
row][col1] =
v1;
735 matx[
row][col0] = matx[
row][col1];
736 matx[
row][col1] = -
v1;
743 template<UT_Axis3::axis A>
751 matx[
row][col0] = -matx[
row][col0];
752 matx[
row][col1] = -matx[
row][col1];
758 template<UT_Axis3::axis A>
774 template <
typename S>
781 template <
typename S>
784 template<UT_Axis3::axis A>
785 void prerotate(
T theta);
790 template<UT_Axis3::axis A,
bool reverse=false>
796 for (
uint col = 0; col < 3; ++col)
797 v1[col] = matx[row0][col];
800 for (
uint col = 0; col < 3; ++col)
801 matx[row0][col] = matx[row1][col];
802 for (
uint col = 0; col < 3; ++col)
803 matx[row1][col] = -v1[col];
807 for (
uint col = 0; col < 3; ++col)
808 matx[row0][col] = -matx[row1][col];
809 for (
uint col = 0; col < 3; ++col)
810 matx[row1][col] = v1[col];
816 template<UT_Axis3::axis A>
822 for (
uint col = 0; col < 3; ++col)
823 matx[row0][col] = -matx[row0][col];
824 for (
uint col = 0; col < 3; ++col)
825 matx[row1][col] = -matx[row1][col];
831 void prerotate(
T rx,
T ry,
T rz,
834 { prerotate(rad(0), rad(1), rad(2), order); }
844 {
rotate(rad(0), rad(1), rad(2), ord); }
851 matx[0][0] *= sx; matx[0][1] *= sy; matx[0][2] *= sz;
852 matx[1][0] *= sx; matx[1][1] *= sy; matx[1][2] *= sz;
853 matx[2][0] *= sx; matx[2][1] *= sy; matx[2][2] *= sz;
864 matx[0][0] *= sx; matx[1][0] *= sy; matx[2][0] *= sz;
865 matx[0][1] *= sx; matx[1][1] *= sy; matx[2][1] *= sz;
866 matx[0][2] *= sx; matx[1][2] *= sy; matx[2][2] *= sz;
870 { prescale(
s(0),
s(1),
s(2)); }
876 matx[0][0] = -matx[0][0]; matx[0][1] = -matx[0][1]; matx[0][2] = -matx[0][2];
877 matx[1][0] = -matx[1][0]; matx[1][1] = -matx[1][1]; matx[1][2] = -matx[1][2];
878 matx[2][0] = -matx[2][0]; matx[2][1] = -matx[2][1]; matx[2][2] = -matx[2][2];
885 matx[0][0] += matx[0][2] * dx;
886 matx[0][1] += matx[0][2] * dy;
887 matx[1][0] += matx[1][2] * dx;
888 matx[1][1] += matx[1][2] * dy;
889 matx[2][0] += matx[2][2] * dx;
890 matx[2][1] += matx[2][2] * dy;
901 matx[2][0] += matx[0][0] * dx + matx[1][0] * dy;
902 matx[2][1] += matx[0][1] * dx + matx[1][1] * dy;
903 matx[2][2] += matx[0][2] * dx + matx[1][2] * dy;
907 { pretranslate(delta(0), delta(1)); }
917 template <
typename S>
919 template <
typename S>
920 int crack2D(
S &
r)
const;
934 const int max_iter = 64,
935 const T rel_tol = FLT_EPSILON);
947 bool makeRotationMatrix(
950 const int max_iter = 64,
951 const T rel_tol = FLT_EPSILON);
959 template <
typename S>
962 { conditionRotateT(scales); }
964 { conditionRotateT(scales); }
972 template <
typename S>
975 { extractScalesT(scales, shears); }
977 { extractScalesT(scales, shears); }
980 { extractScalesT(scales, shears); }
986 template <
typename S>
993 template <
typename S>
1000 template <
typename S>
1002 S *shears =
nullptr);
1006 void shearXY(
T val);
1007 void shearXZ(
T val);
1008 void shearYZ(
T val);
1014 matx[0][0] += matx[0][1]*s_xy + matx[0][2]*s_xz;
1015 matx[0][1] += matx[0][2]*s_yz;
1017 matx[1][0] += matx[1][1]*s_xy + matx[1][2]*s_xz;
1018 matx[1][1] += matx[1][2]*s_yz;
1020 matx[2][0] += matx[2][1]*s_xy + matx[2][2]*s_xz;
1021 matx[2][1] += matx[2][2]*s_yz;
1025 {
shear(sh(0), sh(1), sh(2)); }
1031 template <
typename S>
1034 template <
typename S>
1041 template <
typename S>
1042 int solveTranspose(
T cx,
T cy,
T cz,
1044 template <
typename S>
1054 template <
typename S>
1068 T tx=0.0
f,
T ty=0.0
f,
T rz=0.0
f,
1083 template <
typename S>
1085 template <
typename S>
1091 int isNormalized() const;
1094 T dot(
unsigned i,
unsigned j)
const
1096 return (i <= 2 && j <= 2) ?
1097 matx[i][0]*matx[j][0] + matx[i][1]*matx[j][1] +
1098 matx[i][2]*matx[j][2] : (
T)0;
1110 matx[0][0]==1.0
f && matx[0][1]==0.0
f &&
1111 matx[0][2]==0.0
f && matx[1][0]==0.0
f &&
1112 matx[1][1]==1.0
f && matx[1][2]==0.0
f &&
1113 matx[2][0]==0.0
f && matx[2][1]==0.0
f &&
1122 matx[0][0]==0.0
f && matx[0][1]==0.0
f &&
1123 matx[0][2]==0.0
f && matx[1][0]==0.0
f &&
1124 matx[1][1]==0.0
f && matx[1][2]==0.0
f &&
1125 matx[2][0]==0.0
f && matx[2][1]==0.0
f &&
1132 const T *
data()
const {
return myFloats; }
1137 unsigned hash()
const {
return SYSvector_hash(
data(), tuple_size); }
1144 return matx[
row][col];
1150 return matx[
row][col];
1177 {
return SYSsqrt(getEuclideanNorm2()); }
1179 T getEuclideanNorm2()
const;
1191 T getNormInf()
const;
1195 T getNormMax()
const;
1198 int save(std::ostream &os,
int binary)
const;
1201 void outAsciiNoName(std::ostream &os)
const;
1206 friend std::ostream &operator<<(std::ostream &os, const UT_Matrix3T<T> &
v)
1208 v.writeClassName(os);
1209 v.outAsciiNoName(os);
1227 template <
int ORDER>
1234 static uint reduceExactQuarterTurns(
T &angle_degrees);
1239 int checkRot()
const;
1243 void coVals(
int k,
int r[2])
const
1247 case 0: r[0] = 1; r[1] = 2;
break;
1248 case 1: r[0] = 0; r[1] = 2;
break;
1249 case 2: r[0] = 0; r[1] = 1;
break;
1254 void writeClassName(std::ostream &os)
const;
1255 static const char *className();
1262 T myFloats[tuple_size];
1273 template <
typename T>
1274 template <
typename S>
1278 matx[0][0] = matx[0][1] = matx[0][2] = vec.
x();
1279 matx[1][0] = matx[1][1] = matx[1][2] = vec.
y();
1280 matx[2][0] = matx[2][1] = matx[2][2] = vec.
z();
1284 template <
typename T>
1285 template <
typename S>
1289 T x = vec.
x();
T y = vec.
y();
T z = vec.
z();
1290 matx[0][0]+=
x; matx[0][1]+=
x; matx[0][2]+=
x;
1291 matx[1][0]+=
y; matx[1][1]+=
y; matx[1][2]+=
y;
1292 matx[2][0]+=
z; matx[2][1]+=
z; matx[2][2]+=
z;
1296 template <
typename T>
1297 template <
typename S>
1301 T x = vec.
x();
T y = vec.
y();
T z = vec.
z();
1302 matx[0][0]-=
x; matx[0][1]-=
x; matx[0][2]-=
x;
1303 matx[1][0]-=
y; matx[1][1]-=
y; matx[1][2]-=
y;
1304 matx[2][0]-=
z; matx[2][1]-=
z; matx[2][2]-=
z;
1308 #ifndef UT_DISABLE_VECTORIZE_MATRIX
1314 v4uf r2(
m(2,0),
m(2,1),
m(2,2), 0.
f);
1318 const float m10 =
matx[1][0];
1319 const float m20 =
matx[2][0];
1340 matx[2][0] = row[0];
1341 matx[2][1] = row[1];
1342 matx[2][2] = row[2];
1351 v4uf r0(
l.q00,
l.q10,
l.q20, 0.f);
1352 v4uf r1(
l.q10,
l.q11,
l.q21, 0.f);
1353 v4uf r2(
l.q20,
l.q21,
l.q22, 0.f);
1357 const float m10 =
matx[1][0];
1358 const float m20 =
matx[2][0];
1379 matx[2][0] = row[0];
1380 matx[2][1] = row[1];
1381 matx[2][2] = row[2];
1389 template <
typename T>
1390 template <
typename S>
1398 matx[0][0]+=bv1*v2.
x();
1399 matx[0][1]+=bv1*v2.
y();
1400 matx[0][2]+=bv1*v2.
z();
1402 matx[1][0]+=bv1*v2.
x();
1403 matx[1][1]+=bv1*v2.
y();
1404 matx[1][2]+=bv1*v2.
z();
1406 matx[2][0]+=bv1*v2.
x();
1407 matx[2][1]+=bv1*v2.
y();
1408 matx[2][2]+=bv1*v2.
z();
1411 template <
typename T>
1419 template <
typename T>
1429 template <
typename T,
typename S>
1436 template <
typename T,
typename S>
1443 template <
typename T,
typename S>
1447 return (m1 * (1.0
f/scalar));
1469 template <
typename T,
typename S>
1471 template <
typename T,
typename S>
1475 template <
typename T,
typename S>
1480 v.
x()*
m(0,0) + v.
y()*
m(1,0) + v.
z()*
m(2,0),
1481 v.
x()*
m(0,1) + v.
y()*
m(1,1) + v.
z()*
m(2,1),
1482 v.
x()*
m(0,2) + v.
y()*
m(1,2) + v.
z()*
m(2,2)
1486 template <
typename T,
typename S>
1493 template <
typename T,
typename S>
1498 v.
x()*
m(0,0) + v.
y()*
m(0,1) + v.
z()*
m(0,2),
1499 v.
x()*
m(1,0) + v.
y()*
m(1,1) + v.
z()*
m(1,2),
1500 v.
x()*
m(2,0) + v.
y()*
m(2,1) + v.
z()*
m(2,2)
1504 template <
typename T>
1510 template <
typename T>
1516 template <
typename T>
1522 template <
typename T>
1528 template <
typename T>
1529 template <
typename S>
1536 template <
typename T>
1537 template <
typename S>
1543 template <
typename T>
1544 template <
typename S>
1550 template <
typename T>
1551 template <
typename S>
1558 template <
typename T>
1564 template <
typename T>
1581 template <
typename T>
1598 template <
typename T,
typename S>
1615 #ifndef UT_DISABLE_VECTORIZE_MATRIX
1638 template<
typename T>
1648 template<
typename T>
1652 template <
typename T>
template<
int ORDER>
1659 if(rx) rotate<UT_Axis3::XAXIS>(rx);
1660 if(ry) rotate<UT_Axis3::YAXIS>(ry);
1661 if(rz) rotate<UT_Axis3::ZAXIS>(rz);
1666 if(rx) rotate<UT_Axis3::XAXIS>(rx);
1667 if(rz) rotate<UT_Axis3::ZAXIS>(rz);
1668 if(ry) rotate<UT_Axis3::YAXIS>(ry);
1673 if(ry) rotate<UT_Axis3::YAXIS>(ry);
1674 if(rx) rotate<UT_Axis3::XAXIS>(rx);
1675 if(rz) rotate<UT_Axis3::ZAXIS>(rz);
1680 if(ry) rotate<UT_Axis3::YAXIS>(ry);
1681 if(rz) rotate<UT_Axis3::ZAXIS>(rz);
1682 if(rx) rotate<UT_Axis3::XAXIS>(rx);
1687 if(rz) rotate<UT_Axis3::ZAXIS>(rz);
1688 if(rx) rotate<UT_Axis3::XAXIS>(rx);
1689 if(ry) rotate<UT_Axis3::YAXIS>(ry);
1694 if(rz) rotate<UT_Axis3::ZAXIS>(rz);
1695 if(ry) rotate<UT_Axis3::YAXIS>(ry);
1696 if(rx) rotate<UT_Axis3::XAXIS>(rx);
static int entries()
Returns the vector size.
UT_Vector3T< T > rowVecMult(const UT_Vector3T< T > &v, const UT_Matrix3T< S > &m)
SYS_FORCE_INLINE T & operator()(unsigned row, unsigned col) noexcept
Return a matrix entry. No bounds checking on subscripts.
UT_Matrix3T< T > & operator=(const UT_SymMatrix3T< S > &m)
Convert from a symmetric matrix to non-symmetric.
Mat3< typename promote< S, T >::type > operator*(S scalar, const Mat3< T > &m)
Multiply each element of the given matrix by scalar and return the result.
GLboolean GLboolean GLboolean b
SYS_FORCE_INLINE T coFactor(int k, int l) const
SYS_FORCE_INLINE UT_Matrix3T< T > & operator/=(T scalar)
void leftMult(const UT_SymMatrix3T< S > &m)
Multiply given symmetric matrix on the left.
#define SYS_STATIC_ASSERT(expr)
UT_Matrix3T< T > transposedCopy() const
UT_SymMatrix3T< T > averagedSymMatrix3() const
Convert this to a symmetric matrix, using averaged components.
GLuint GLdouble GLdouble GLint GLint order
#define SYS_DEPRECATED(__V__)
GLenum GLenum GLenum GLenum GLenum scale
UT_SymMatrix3T< T > upperTriangularSymMatrix3() const
Convert this to a symmetric matrix, using the upper-triangular portion.
void leftMult(const UT_Matrix3T< S > &m)
Multiply given matrix3 on the left.
constexpr bool operator!=(const UT_Matrix3T< T > &m) const noexcept
void orientInverse(const UT_Vector3F &v, T pscale, const UT_Vector3F *s3, const UT_Vector3F *up, const UT_QuaternionF *q)
const T * operator()(unsigned row) const
Return a matrix row. No bounds checking on subscript.
SYS_FORCE_INLINE void translate(const UT_Vector2T< T > &delta)
SYS_FORCE_INLINE void prerotateQuarter()
void scale(T sx, T sy, T sz)
MatType shear(Axis axis0, Axis axis1, typename MatType::value_type shear)
Set the matrix to a shear along axis0 by a fraction of axis1.
constexpr bool operator==(const UT_Matrix3T< T > &m) const noexcept
SYS_FORCE_INLINE void colVecMult(const UT_Matrix3F &m)
UT_Matrix3T< T > & operator*=(const UT_Matrix3T< T > &m)
Mat3< typename promote< T0, T1 >::type > operator+(const Mat3< T0 > &m0, const Mat3< T1 > &m1)
Add corresponding elements of m0 and m1 and return the result.
UT_Matrix3T(const UT_SymMatrix3T< S > m)
Construct from a symmetric 3x3 matrix.
void extractScales(UT_Vector3F &scales, UT_Vector3F *shears=0)
SYS_FORCE_INLINE T operator()(unsigned row, unsigned col) const noexcept
Return a matrix entry. No bounds checking on subscripts.
const GLuint GLenum const void * binary
void prerotate(const UT_Vector3T< T > &rad, const UT_XformOrder &order)
UT_Matrix3T< T > SYSmax(const UT_Matrix3T< T > &v1, const UT_Matrix3T< T > &v2)
const LowerTri & lowerTri() const
Return reference to the lower triangular elements for symbolic access.
UT_API size_t format(char *buffer, size_t buffer_size, const UT_Matrix3T< T > &v)
void reverse(I begin, I end)
SYS_FORCE_INLINE UT_Matrix3T< T > & operator+=(const UT_Matrix3T< T > &m)
JSON reader class which handles parsing of JSON or bJSON files.
Generic symmetric 3x3 matrix.
T * operator()(unsigned row)
Return a matrix row. No bounds checking on subscript.
Class which writes ASCII or binary JSON streams.
void extractScales(UT_Vector3T< fpreal16 > &scales, UT_Vector3T< fpreal16 > *shears=0)
void prescale(T sx, T sy, T sz)
static const exint TupleSize
void orient(const UT_Vector3D &v, T pscale, const UT_Vector3D *s3, const UT_Vector3D *up, const UT_QuaternionD *q)
UT_Matrix3T< T > SYSmin(const UT_Matrix3T< T > &v1, const UT_Matrix3T< T > &v2)
const T * data() const
Return the raw matrix data.
SYS_FORCE_INLINE void pretranslate(const UT_Vector2T< T > &delta)
SYS_FORCE_INLINE void rotateQuarter()
SYS_FORCE_INLINE void prescale(const UT_Vector3T< T > &s)
GLubyte GLubyte GLubyte GLubyte w
GLdouble GLdouble GLdouble GLdouble q
UT_Matrix3T< T > SYSbilerp(const UT_Matrix3T< T > &u0v0, const UT_Matrix3T< T > &u1v0, const UT_Matrix3T< T > &u0v1, const UT_Matrix3T< T > &u1v1, S u, S v)
Bilinear interpolation.
SYS_FORCE_INLINE void outerproductUpdate(T b, const UT_Vector3F &v1, const UT_Vector3F &v2)
SYS_FORCE_INLINE void shear(const UT_Vector3T< T > &sh)
SYS_FORCE_INLINE void negate()
Negates this matrix, i.e. multiplies it by -1.
SYS_FORCE_INLINE void multiplyT(const UT_Matrix3T< S > &mat)
bool isEqual(const UT_Matrix3T< T > &m, T tolerance=T(SYS_FTOLERANCE)) const
Check for equality within a tolerance level.
void identity()
Set the matrix to identity.
UT_Matrix3T< T > SYSlerp(const UT_Matrix3T< T > &v1, const UT_Matrix3T< T > &v2, S t)
Mat3< typename promote< T0, T1 >::type > operator-(const Mat3< T0 > &m0, const Mat3< T1 > &m1)
Subtract corresponding elements of m0 and m1 and return the result.
OIIO_FORCEINLINE const vint4 & operator+=(vint4 &a, const vint4 &b)
GLfloat GLfloat GLfloat v2
SYS_FORCE_INLINE void scale(const UT_Vector3T< T > &s)
fpreal64 dot(const CE_VectorT< T > &a, const CE_VectorT< T > &b)
static const bool isVectorType
void outerproductUpdateT(T b, const UT_Vector3T< S > &v1, const UT_Vector3T< S > &v2)
GLboolean GLboolean GLboolean GLboolean a
UT_Matrix3T< T > SYSbarycentric(const UT_Matrix3T< T > &v0, const UT_Matrix3T< T > &v1, const UT_Matrix3T< T > &v2, S u, S v)
Barycentric interpolation.
GLdouble GLdouble GLdouble z
SYS_FORCE_INLINE void rowVecMult(const UT_Matrix3F &m)
SYS_FORCE_INLINE void outerproductUpdate(T b, const UT_Vector3D &v1, const UT_Vector3D &v2)
UT_Matrix3T< T > & operator=(const UT_Matrix3T< S > &m) noexcept
constexpr UT_Matrix3T(fpreal64 val) noexcept
Construct identity matrix, multipled by scalar.
bool INST SYS_FORCE_INLINE UT_Matrix3T(const UT_FixedVector< S, 3, INST > &r0, const UT_FixedVector< S, 3, INST > &r1, const UT_FixedVector< S, 3, INST > &r2) noexcept
const Vec2< S > & operator*=(Vec2< S > &v, const Matrix33< T > &m)
void orientInverse(const UT_Vector3D &v, T pscale, const UT_Vector3D *s3, const UT_Vector3D *up, const UT_QuaternionD *q)
ImageBuf OIIO_API rotate(const ImageBuf &src, float angle, string_view filtername=string_view(), float filterwidth=0.0f, bool recompute_roi=false, ROI roi={}, int nthreads=0)
void translate(T dx, T dy)
SYS_FORCE_INLINE UT_Vector3T< T > & operator*=(const UT_Matrix3T< S > &m)
GA_API const UT_StringHolder orient
UT_SymMatrix3T< T > lowerTriangularSymMatrix3() const
Convert this to a symmetric matrix, using the lower-triangular portion.
UT_Matrix3T< T > & operator=(const UT_Matrix3T< T > &m)=default
Default copy assignment operator.
UT_Matrix3T< T > & operator*=(const UT_SymMatrix3T< S > &m)
Multiply given symmetric matrix on the right.
SYS_FORCE_INLINE void rotateHalf()
UT_Matrix3T< T > operator-() const
const UT_Vector3T< T > & operator[](unsigned row) const
Return a matrix row. No bounds checking on subscript.
bool SYSequalZero(const UT_Vector3T< T > &v)
void shear(T s_xy, T s_xz, T s_yz)
Inner class to access the elements symbolically.
GA_API const UT_StringHolder up
bool isSymmetric(const MatType &m)
Determine if a matrix is symmetric.
SYS_FORCE_INLINE UT_Matrix3T< T > & operator-=(const UT_Matrix3T< T > &m)
void extractScales(UT_Vector3D &scales, UT_Vector3D *shears=0)
UT_Vector3T< T > colVecMult(const UT_Matrix3T< S > &m, const UT_Vector3T< T > &v)
GA_API const UT_StringHolder pscale
unsigned hash() const
Compute a hash.
Class to store JSON objects as C++ objects.
SYS_FORCE_INLINE void addScaledMat(T k, const UT_Matrix3T< T > &m)
bool isAlmostEqual(const UT_Matrix3T< T > &m, int ulps=50) const
T getEuclideanNorm() const
OIIO_FORCEINLINE const vint4 & operator-=(vint4 &a, const vint4 &b)
void orient(const UT_Vector3F &v, T pscale, const UT_Vector3F *s3, const UT_Vector3F *up, const UT_QuaternionF *q)
void zero()
Set the matrix to zero.
void conditionRotate(UT_Vector3F *scales=0)
void conditionRotate(UT_Vector3D *scales)
void rotate(UT_Vector3T< S > &axis, T theta, int norm=1)
PUGI__FN char_t * translate(char_t *buffer, const char_t *from, const char_t *to, size_t to_length)
T dot(unsigned i, unsigned j) const
SYS_FORCE_INLINE void prerotateHalf()
SYS_FORCE_INLINE void multiply(UT_Vector3T< T > &dest, const UT_Matrix4T< S > &mat) const
UT_Matrix3T< T > operator/(const UT_Matrix3T< T > &mat, S sc)
SYS_FORCE_INLINE void rotateWithQTurns(T theta, uint qturns)
void pretranslate(T dx, T dy)
UT_FixedVector< T, 9 > FixedVectorType
bool INST SYS_FORCE_INLINE UT_Matrix3T(const UT_FixedVector< S, tuple_size, INST > &v) noexcept
void rotate(const UT_Vector3T< T > &rad, const UT_XformOrder &ord)
SYS_FORCE_INLINE UT_Matrix3T< T > & operator*=(T scalar)
bool isLowerTriangular(T tolerance=T(SYS_FTOLERANCE)) const
Check for lower triangular within a tolerance level to 0.
T * data()
Return the raw matrix data.