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)); }
918 template <
typename S>
920 int remove_scales=1);
921 template <
typename S>
923 int remove_scales=1)
const;
924 template <
typename S>
925 int crack2D(
S &
r)
const;
939 const int max_iter = 64,
940 const T rel_tol = FLT_EPSILON);
952 bool makeRotationMatrix(
955 const int max_iter = 64,
956 const T rel_tol = FLT_EPSILON);
964 template <
typename S>
967 { conditionRotateT(scales); }
969 { conditionRotateT(scales); }
977 template <
typename S>
980 { extractScalesT(scales, shears); }
982 { extractScalesT(scales, shears); }
985 { extractScalesT(scales, shears); }
991 template <
typename S>
998 template <
typename S>
1005 template <
typename S>
1007 S *shears =
nullptr);
1011 void shearXY(
T val);
1012 void shearXZ(
T val);
1013 void shearYZ(
T val);
1019 matx[0][0] += matx[0][1]*s_xy + matx[0][2]*s_xz;
1020 matx[0][1] += matx[0][2]*s_yz;
1022 matx[1][0] += matx[1][1]*s_xy + matx[1][2]*s_xz;
1023 matx[1][1] += matx[1][2]*s_yz;
1025 matx[2][0] += matx[2][1]*s_xy + matx[2][2]*s_xz;
1026 matx[2][1] += matx[2][2]*s_yz;
1030 {
shear(sh(0), sh(1), sh(2)); }
1036 template <
typename S>
1046 template <
typename S>
1060 T tx=0.0
f,
T ty=0.0
f,
T rz=0.0
f,
1075 template <
typename S>
1077 template <
typename S>
1083 int isNormalized() const;
1086 T dot(
unsigned i,
unsigned j)
const
1088 return (i <= 2 && j <= 2) ?
1089 matx[i][0]*matx[j][0] + matx[i][1]*matx[j][1] +
1090 matx[i][2]*matx[j][2] : (
T)0;
1102 matx[0][0]==1.0
f && matx[0][1]==0.0
f &&
1103 matx[0][2]==0.0
f && matx[1][0]==0.0
f &&
1104 matx[1][1]==1.0
f && matx[1][2]==0.0
f &&
1105 matx[2][0]==0.0
f && matx[2][1]==0.0
f &&
1114 matx[0][0]==0.0
f && matx[0][1]==0.0
f &&
1115 matx[0][2]==0.0
f && matx[1][0]==0.0
f &&
1116 matx[1][1]==0.0
f && matx[1][2]==0.0
f &&
1117 matx[2][0]==0.0
f && matx[2][1]==0.0
f &&
1124 const T *
data()
const {
return myFloats; }
1129 unsigned hash()
const {
return SYSvector_hash(
data(), tuple_size); }
1136 return matx[
row][col];
1142 return matx[
row][col];
1165 {
return SYSsqrt(getEuclideanNorm2()); }
1167 T getEuclideanNorm2()
const;
1179 T getNormInf()
const;
1182 int save(std::ostream &os,
int binary)
const;
1185 void outAsciiNoName(std::ostream &os)
const;
1190 friend std::ostream &operator<<(std::ostream &os, const UT_Matrix3T<T> &
v)
1192 v.writeClassName(os);
1193 v.outAsciiNoName(os);
1211 template <
int ORDER>
1218 static uint reduceExactQuarterTurns(
T &angle_degrees);
1223 int checkRot()
const;
1224 void permute(
int l0,
int l1,
int l2);
1228 void coVals(
int k,
int r[2])
const
1232 case 0: r[0] = 1; r[1] = 2;
break;
1233 case 1: r[0] = 0; r[1] = 2;
break;
1234 case 2: r[0] = 0; r[1] = 1;
break;
1239 void writeClassName(std::ostream &os)
const;
1240 static const char *className();
1245 T myFloats[tuple_size];
1251 template <
typename T>
1252 template <
typename S>
1256 matx[0][0] = matx[0][1] = matx[0][2] = vec.
x();
1257 matx[1][0] = matx[1][1] = matx[1][2] = vec.
y();
1258 matx[2][0] = matx[2][1] = matx[2][2] = vec.
z();
1262 template <
typename T>
1263 template <
typename S>
1267 T x = vec.
x();
T y = vec.
y();
T z = vec.
z();
1268 matx[0][0]+=
x; matx[0][1]+=
x; matx[0][2]+=
x;
1269 matx[1][0]+=
y; matx[1][1]+=
y; matx[1][2]+=
y;
1270 matx[2][0]+=
z; matx[2][1]+=
z; matx[2][2]+=
z;
1274 template <
typename T>
1275 template <
typename S>
1279 T x = vec.
x();
T y = vec.
y();
T z = vec.
z();
1280 matx[0][0]-=
x; matx[0][1]-=
x; matx[0][2]-=
x;
1281 matx[1][0]-=
y; matx[1][1]-=
y; matx[1][2]-=
y;
1282 matx[2][0]-=
z; matx[2][1]-=
z; matx[2][2]-=
z;
1286 #ifndef UT_DISABLE_VECTORIZE_MATRIX
1292 v4uf r2(
m(2,0),
m(2,1),
m(2,2), 0.
f);
1296 const float m10 =
matx[1][0];
1297 const float m20 =
matx[2][0];
1318 matx[2][0] = row[0];
1319 matx[2][1] = row[1];
1320 matx[2][2] = row[2];
1329 v4uf r0(
l.q00,
l.q10,
l.q20, 0.f);
1330 v4uf r1(
l.q10,
l.q11,
l.q21, 0.f);
1331 v4uf r2(
l.q20,
l.q21,
l.q22, 0.f);
1335 const float m10 =
matx[1][0];
1336 const float m20 =
matx[2][0];
1357 matx[2][0] = row[0];
1358 matx[2][1] = row[1];
1359 matx[2][2] = row[2];
1367 template <
typename T>
1368 template <
typename S>
1376 matx[0][0]+=bv1*v2.
x();
1377 matx[0][1]+=bv1*v2.
y();
1378 matx[0][2]+=bv1*v2.
z();
1380 matx[1][0]+=bv1*v2.
x();
1381 matx[1][1]+=bv1*v2.
y();
1382 matx[1][2]+=bv1*v2.
z();
1384 matx[2][0]+=bv1*v2.
x();
1385 matx[2][1]+=bv1*v2.
y();
1386 matx[2][2]+=bv1*v2.
z();
1389 template <
typename T>
1397 template <
typename T>
1407 template <
typename T,
typename S>
1414 template <
typename T,
typename S>
1421 template <
typename T,
typename S>
1425 return (m1 * (1.0
f/scalar));
1447 template <
typename T,
typename S>
1449 template <
typename T,
typename S>
1453 template <
typename T,
typename S>
1458 v.
x()*
m(0,0) + v.
y()*
m(1,0) + v.
z()*
m(2,0),
1459 v.
x()*
m(0,1) + v.
y()*
m(1,1) + v.
z()*
m(2,1),
1460 v.
x()*
m(0,2) + v.
y()*
m(1,2) + v.
z()*
m(2,2)
1464 template <
typename T,
typename S>
1471 template <
typename T,
typename S>
1476 v.
x()*
m(0,0) + v.
y()*
m(0,1) + v.
z()*
m(0,2),
1477 v.
x()*
m(1,0) + v.
y()*
m(1,1) + v.
z()*
m(1,2),
1478 v.
x()*
m(2,0) + v.
y()*
m(2,1) + v.
z()*
m(2,2)
1482 template <
typename T>
1488 template <
typename T>
1494 template <
typename T>
1500 template <
typename T>
1506 template <
typename T>
1507 template <
typename S>
1514 template <
typename T>
1515 template <
typename S>
1521 template <
typename T>
1522 template <
typename S>
1528 template <
typename T>
1529 template <
typename S>
1536 template <
typename T>
1553 template <
typename T>
1570 template <
typename T,
typename S>
1587 #ifndef UT_DISABLE_VECTORIZE_MATRIX
1610 template<
typename T>
1620 template<
typename T>
1624 template <
typename T>
template<
int ORDER>
1631 if(rx) rotate<UT_Axis3::XAXIS>(rx);
1632 if(ry) rotate<UT_Axis3::YAXIS>(ry);
1633 if(rz) rotate<UT_Axis3::ZAXIS>(rz);
1638 if(rx) rotate<UT_Axis3::XAXIS>(rx);
1639 if(rz) rotate<UT_Axis3::ZAXIS>(rz);
1640 if(ry) rotate<UT_Axis3::YAXIS>(ry);
1645 if(ry) rotate<UT_Axis3::YAXIS>(ry);
1646 if(rx) rotate<UT_Axis3::XAXIS>(rx);
1647 if(rz) rotate<UT_Axis3::ZAXIS>(rz);
1652 if(ry) rotate<UT_Axis3::YAXIS>(ry);
1653 if(rz) rotate<UT_Axis3::ZAXIS>(rz);
1654 if(rx) rotate<UT_Axis3::XAXIS>(rx);
1659 if(rz) rotate<UT_Axis3::ZAXIS>(rz);
1660 if(rx) rotate<UT_Axis3::XAXIS>(rx);
1661 if(ry) rotate<UT_Axis3::YAXIS>(ry);
1666 if(rz) rotate<UT_Axis3::ZAXIS>(rz);
1667 if(ry) rotate<UT_Axis3::YAXIS>(ry);
1668 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.
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.
#define SYS_DEPRECATED(__V__)
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)
GLuint const GLfloat * val
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.
GLenum GLenum GLenum GLenum GLenum scale
GLboolean GLboolean GLboolean GLboolean a
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.
GLuint GLdouble GLdouble GLint GLint order
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)
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)
GLfloat GLfloat GLfloat v2
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)
GLint GLint GLint GLint GLint x
GLint GLint GLint GLint GLint GLint y
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)
GLint GLenum GLsizei GLint GLsizei const void * data
const GLuint GLenum const void * binary
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)
GLubyte GLubyte GLubyte GLubyte w
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.
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)
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)
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.
GLdouble GLdouble GLdouble b
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)
GLdouble GLdouble GLdouble r
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)
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.