10 #ifndef __UT_Matrix3_h__
11 #define __UT_Matrix3_h__
39 template <
typename T,
typename S>
41 template <
typename T,
typename S>
43 template <
typename T,
typename S>
45 template <
typename T,
typename S>
47 template <
typename T,
typename S>
49 template <
typename T,
typename S>
51 template <
typename T,
typename S>
53 template <
typename T,
typename S>
55 template <
typename T,
typename S>
57 template <
typename T,
typename S>
59 template <
typename T,
typename S>
61 template <
typename T,
typename S>
68 template <
typename T,
typename S>
72 template <
typename T,
typename S>
79 template <
typename T,
typename S>
82 {
return v0 * (1 - u -
v) + v1 * u + v2 *v; }
98 static constexpr
int tuple_size = 9;
117 template <
typename S>
120 {
T(
m[0][0]),
T(
m[0][1]),
T(
m[0][2])},
121 {
T(
m[1][0]),
T(
m[1][1]),
T(
m[1][2])},
122 {
T(
m[2][0]),
T(
m[2][1]),
T(
m[2][2])}}
147 T val00,
T val01,
T val02,
148 T val10,
T val11,
T val12,
149 T val20,
T val21,
T val22) noexcept
157 template <
typename S>
160 {
T(
m(0,0)),
T(
m(0,1)),
T(
m(0,2))},
161 {
T(
m(1,0)),
T(
m(1,1)),
T(
m(1,2))},
162 {
T(
m(2,0)),
T(
m(2,1)),
T(
m(2,2))}}
168 template <
typename S>
186 template <
typename S>
189 matx[0][0]=
m(0,0); matx[0][1]=
m(0,1); matx[0][2]=
m(0,2);
190 matx[1][0]=
m(1,0); matx[1][1]=
m(1,1); matx[1][2]=
m(1,2);
191 matx[2][0]=
m(2,0); matx[2][1]=
m(2,1); matx[2][2]=
m(2,2);
196 template <
typename S>
201 matx[0][0] = l.q00; matx[0][1] = l.q10; matx[0][2] = l.q20;
202 matx[1][0] = l.q10; matx[1][1] = l.q11; matx[1][2] = l.q21;
203 matx[2][0] = l.q20; matx[2][1] = l.q21; matx[2][2] = l.q22;
211 matx[1][0], matx[1][1],
212 matx[2][0], matx[2][1], matx[2][2]);
219 matx[0][1], matx[1][1],
220 matx[0][2], matx[1][2], matx[2][2]);
227 (matx[0][1] + matx[1][0]) / 2,
229 (matx[0][2] + matx[2][0]) / 2,
230 (matx[1][2] + matx[2][1]) / 2,
237 -matx[1][0], -matx[1][1], -matx[1][2],
238 -matx[2][0], -matx[2][1], -matx[2][2]);
245 matx[0][0]+=k*m.
matx[0][0];
246 matx[0][1]+=k*m.
matx[0][1];
247 matx[0][2]+=k*m.
matx[0][2];
249 matx[1][0]+=k*m.
matx[1][0];
250 matx[1][1]+=k*m.
matx[1][1];
251 matx[1][2]+=k*m.
matx[1][2];
253 matx[2][0]+=k*m.
matx[2][0];
254 matx[2][1]+=k*m.
matx[2][1];
255 matx[2][2]+=k*m.
matx[2][2];
260 matx[0][0]+=m.
matx[0][0];
261 matx[0][1]+=m.
matx[0][1];
262 matx[0][2]+=m.
matx[0][2];
264 matx[1][0]+=m.
matx[1][0];
265 matx[1][1]+=m.
matx[1][1];
266 matx[1][2]+=m.
matx[1][2];
268 matx[2][0]+=m.
matx[2][0];
269 matx[2][1]+=m.
matx[2][1];
270 matx[2][2]+=m.
matx[2][2];
276 matx[0][0]-=m.
matx[0][0];
277 matx[0][1]-=m.
matx[0][1];
278 matx[0][2]-=m.
matx[0][2];
280 matx[1][0]-=m.
matx[1][0];
281 matx[1][1]-=m.
matx[1][1];
282 matx[1][2]-=m.
matx[1][2];
284 matx[2][0]-=m.
matx[2][0];
285 matx[2][1]-=m.
matx[2][1];
286 matx[2][2]-=m.
matx[2][2];
293 a = matx[0][0]; b = matx[0][1]; c = matx[0][2];
294 matx[0][0] = a*
m(0,0) + b*
m(1,0) + c*
m(2,0);
295 matx[0][1] = a*
m(0,1) + b*
m(1,1) + c*
m(2,1);
296 matx[0][2] = a*
m(0,2) + b*
m(1,2) + c*
m(2,2);
298 a = matx[1][0]; b = matx[1][1]; c = matx[1][2];
299 matx[1][0] = a*
m(0,0) + b*
m(1,0) + c*
m(2,0);
300 matx[1][1] = a*
m(0,1) + b*
m(1,1) + c*
m(2,1);
301 matx[1][2] = a*
m(0,2) + b*
m(1,2) + c*
m(2,2);
303 a = matx[2][0]; b = matx[2][1]; c = matx[2][2];
304 matx[2][0] = a*
m(0,0) + b*
m(1,0) + c*
m(2,0);
305 matx[2][1] = a*
m(0,1) + b*
m(1,1) + c*
m(2,1);
306 matx[2][2] = a*
m(0,2) + b*
m(1,2) + c*
m(2,2);
311 template <
typename S>
319 a = matx[0][0]; b = matx[0][1]; c = matx[0][2];
320 matx[0][0] = a*l.q00 + b*l.q10 + c*l.q20;
321 matx[0][1] = a*l.q10 + b*l.q11 + c*l.q21;
322 matx[0][2] = a*l.q20 + b*l.q21 + c*l.q22;
324 a = matx[1][0]; b = matx[1][1]; c = matx[1][2];
325 matx[1][0] = a*l.q00 + b*l.q10 + c*l.q20;
326 matx[1][1] = a*l.q10 + b*l.q11 + c*l.q21;
327 matx[1][2] = a*l.q20 + b*l.q21 + c*l.q22;
329 a = matx[2][0]; b = matx[2][1]; c = matx[2][2];
330 matx[2][0] = a*l.q00 + b*l.q10 + c*l.q20;
331 matx[2][1] = a*l.q10 + b*l.q11 + c*l.q21;
332 matx[2][2] = a*l.q20 + b*l.q21 + c*l.q22;
338 template <
typename S>
346 a = matx[0][0]; b = matx[1][0]; c = matx[2][0];
347 matx[0][0] = a*l.q00 + b*l.q10 + c*l.q20;
348 matx[1][0] = a*l.q10 + b*l.q11 + c*l.q21;
349 matx[2][0] = a*l.q20 + b*l.q21 + c*l.q22;
351 a = matx[0][1]; b = matx[1][1]; c = matx[2][1];
352 matx[0][1] = a*l.q00 + b*l.q10 + c*l.q20;
353 matx[1][1] = a*l.q10 + b*l.q11 + c*l.q21;
354 matx[2][1] = a*l.q20 + b*l.q21 + c*l.q22;
356 a = matx[0][2]; b = matx[1][2]; c = matx[2][2];
357 matx[0][2] = a*l.q00 + b*l.q10 + c*l.q20;
358 matx[1][2] = a*l.q10 + b*l.q11 + c*l.q21;
359 matx[2][2] = a*l.q20 + b*l.q21 + c*l.q22;
363 template <
typename S>
368 a = matx[0][0]; b = matx[1][0]; c = matx[2][0];
369 matx[0][0] = a*
m(0,0) + b*
m(0,1) + c*
m(0,2);
370 matx[1][0] = a*
m(1,0) + b*
m(1,1) + c*
m(1,2);
371 matx[2][0] = a*
m(2,0) + b*
m(2,1) + c*
m(2,2);
373 a = matx[0][1]; b = matx[1][1]; c = matx[2][1];
374 matx[0][1] = a*
m(0,0) + b*
m(0,1) + c*
m(0,2);
375 matx[1][1] = a*
m(1,0) + b*
m(1,1) + c*
m(1,2);
376 matx[2][1] = a*
m(2,0) + b*
m(2,1) + c*
m(2,2);
378 a = matx[0][2]; b = matx[1][2]; c = matx[2][2];
379 matx[0][2] = a*
m(0,0) + b*
m(0,1) + c*
m(0,2);
380 matx[1][2] = a*
m(1,0) + b*
m(1,1) + c*
m(1,2);
381 matx[2][2] = a*
m(2,0) + b*
m(2,1) + c*
m(2,2);
389 return (&
m ==
this) || (
390 matx[0][0]==
m(0,0) && matx[0][1]==
m(0,1) && matx[0][2]==
m(0,2) &&
391 matx[1][0]==
m(1,0) && matx[1][1]==
m(1,1) && matx[1][2]==
m(1,2) &&
392 matx[2][0]==
m(2,0) && matx[2][1]==
m(2,1) && matx[2][2]==
m(2,2) );
396 return !(*
this ==
m);
402 matx[0][0] =
val; matx[0][1] = 0; matx[0][2] = 0;
403 matx[1][0] = 0; matx[1][1] =
val; matx[1][2] = 0;
404 matx[2][0] = 0; matx[2][1] = 0; matx[2][2] =
val;
410 matx[0][0]*=scalar; matx[0][1]*=scalar; matx[0][2]*=scalar;
411 matx[1][0]*=scalar; matx[1][1]*=scalar; matx[1][2]*=scalar;
412 matx[2][0]*=scalar; matx[2][1]*=scalar; matx[2][2]*=scalar;
422 template <
typename S>
424 template <
typename S>
426 template <
typename S>
432 template <
typename S>
433 inline void outerproductUpdateT(
T b,
440 { outerproductUpdateT(b, v1, v2); }
445 { outerproductUpdateT(b, v1, v2); }
457 void arbitrary180rot();
462 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;
930 template <
typename S>
934 const int max_iter = 64,
935 const T rel_tol = FLT_EPSILON)
const;
940 template <
typename S>
957 const int max_iter = 64,
958 const T rel_tol = FLT_EPSILON);
970 bool makeRotationMatrix(
973 const int max_iter = 64,
974 const T rel_tol = FLT_EPSILON);
982 template <
typename S>
985 { conditionRotateT(scales); }
987 { conditionRotateT(scales); }
995 template <
typename S>
998 { extractScalesT(scales, shears); }
1000 { extractScalesT(scales, shears); }
1003 { extractScalesT(scales, shears); }
1009 template <
typename S>
1016 template <
typename S>
1023 template <
typename S>
1025 S *shears =
nullptr);
1029 void shearXY(
T val);
1030 void shearXZ(
T val);
1031 void shearYZ(
T val);
1037 matx[0][0] += matx[0][1]*s_xy + matx[0][2]*s_xz;
1038 matx[0][1] += matx[0][2]*s_yz;
1040 matx[1][0] += matx[1][1]*s_xy + matx[1][2]*s_xz;
1041 matx[1][1] += matx[1][2]*s_yz;
1043 matx[2][0] += matx[2][1]*s_xy + matx[2][2]*s_xz;
1044 matx[2][1] += matx[2][2]*s_yz;
1048 {
shear(sh(0), sh(1), sh(2)); }
1054 template <
typename S>
1057 template <
typename S>
1064 template <
typename S>
1065 int solveTranspose(
T cx,
T cy,
T cz,
1067 template <
typename S>
1077 template <
typename S>
1091 T tx=0,
T ty=0,
T rz=0,
1092 T sx=1,
T sy=1,
T px=0,
T py=0,
1106 template <
typename S>
1108 template <
typename S>
1114 int isNormalized() const;
1117 T dot(
unsigned i,
unsigned j)
const
1119 return (i <= 2 && j <= 2) ?
1120 matx[i][0]*matx[j][0] + matx[i][1]*matx[j][1] +
1121 matx[i][2]*matx[j][2] : (
T)0;
1133 matx[0][0]==1 && matx[0][1]==0 &&
1134 matx[0][2]==0 && matx[1][0]==0 &&
1135 matx[1][1]==1 && matx[1][2]==0 &&
1136 matx[2][0]==0 && matx[2][1]==0 &&
1145 matx[0][0]==0 && matx[0][1]==0 &&
1146 matx[0][2]==0 && matx[1][0]==0 &&
1147 matx[1][1]==0 && matx[1][2]==0 &&
1148 matx[2][0]==0 && matx[2][1]==0 &&
1155 const T *
data()
const {
return myFloats; }
1160 unsigned hash()
const {
return SYSvector_hash(
data(), tuple_size); }
1167 return matx[
row][col];
1173 return matx[
row][col];
1200 {
return SYSsqrt(getEuclideanNorm2()); }
1202 T getEuclideanNorm2()
const;
1214 T getNormInf()
const;
1218 T getNormMax()
const;
1221 int save(std::ostream &os,
int binary)
const;
1224 void outAsciiNoName(std::ostream &os)
const;
1229 friend std::ostream &operator<<(std::ostream &os, const UT_Matrix3T<T> &
v)
1231 v.writeClassName(os);
1232 v.outAsciiNoName(os);
1250 template <
int ORDER>
1257 static uint reduceExactQuarterTurns(
T &angle_degrees);
1262 int checkRot()
const;
1266 void coVals(
int k,
int r[2])
const
1270 case 0: r[0] = 1; r[1] = 2;
break;
1271 case 1: r[0] = 0; r[1] = 2;
break;
1272 case 2: r[0] = 0; r[1] = 1;
break;
1277 void writeClassName(std::ostream &os)
const;
1278 static const char *className();
1285 T myFloats[tuple_size];
1296 template <
typename T>
1297 template <
typename S>
1301 matx[0][0] = matx[0][1] = matx[0][2] = vec.
x();
1302 matx[1][0] = matx[1][1] = matx[1][2] = vec.
y();
1303 matx[2][0] = matx[2][1] = matx[2][2] = vec.
z();
1307 template <
typename T>
1308 template <
typename S>
1312 T x = vec.
x();
T y = vec.
y();
T z = vec.
z();
1313 matx[0][0]+=
x; matx[0][1]+=
x; matx[0][2]+=
x;
1314 matx[1][0]+=
y; matx[1][1]+=
y; matx[1][2]+=
y;
1315 matx[2][0]+=
z; matx[2][1]+=
z; matx[2][2]+=
z;
1319 template <
typename T>
1320 template <
typename S>
1324 T x = vec.
x();
T y = vec.
y();
T z = vec.
z();
1325 matx[0][0]-=
x; matx[0][1]-=
x; matx[0][2]-=
x;
1326 matx[1][0]-=
y; matx[1][1]-=
y; matx[1][2]-=
y;
1327 matx[2][0]-=
z; matx[2][1]-=
z; matx[2][2]-=
z;
1331 #ifndef UT_DISABLE_VECTORIZE_MATRIX
1337 v4uf r2(
m(2,0),
m(2,1),
m(2,2), 0.
f);
1341 const float m10 =
matx[1][0];
1342 const float m20 =
matx[2][0];
1363 matx[2][0] = row[0];
1364 matx[2][1] = row[1];
1365 matx[2][2] = row[2];
1374 v4uf r0(
l.q00,
l.q10,
l.q20, 0.f);
1375 v4uf r1(
l.q10,
l.q11,
l.q21, 0.f);
1376 v4uf r2(
l.q20,
l.q21,
l.q22, 0.f);
1380 const float m10 =
matx[1][0];
1381 const float m20 =
matx[2][0];
1402 matx[2][0] = row[0];
1403 matx[2][1] = row[1];
1404 matx[2][2] = row[2];
1412 template <
typename T>
1413 template <
typename S>
1421 matx[0][0]+=bv1*v2.
x();
1422 matx[0][1]+=bv1*v2.
y();
1423 matx[0][2]+=bv1*v2.
z();
1425 matx[1][0]+=bv1*v2.
x();
1426 matx[1][1]+=bv1*v2.
y();
1427 matx[1][2]+=bv1*v2.
z();
1429 matx[2][0]+=bv1*v2.
x();
1430 matx[2][1]+=bv1*v2.
y();
1431 matx[2][2]+=bv1*v2.
z();
1434 template <
typename T>
1442 template <
typename T>
1452 template <
typename T,
typename S>
1459 template <
typename T,
typename S>
1466 template <
typename T,
typename S>
1470 return (m1 * (
T(1)/scalar));
1492 template <
typename T,
typename S>
1494 template <
typename T,
typename S>
1498 template <
typename T,
typename S>
1503 v.
x()*
m(0,0) + v.
y()*
m(1,0) + v.
z()*
m(2,0),
1504 v.
x()*
m(0,1) + v.
y()*
m(1,1) + v.
z()*
m(2,1),
1505 v.
x()*
m(0,2) + v.
y()*
m(1,2) + v.
z()*
m(2,2)
1509 template <
typename T,
typename S>
1516 template <
typename T,
typename S>
1521 v.
x()*
m(0,0) + v.
y()*
m(0,1) + v.
z()*
m(0,2),
1522 v.
x()*
m(1,0) + v.
y()*
m(1,1) + v.
z()*
m(1,2),
1523 v.
x()*
m(2,0) + v.
y()*
m(2,1) + v.
z()*
m(2,2)
1527 template <
typename T>
1533 template <
typename T>
1539 template <
typename T>
1545 template <
typename T>
1551 template <
typename T>
1552 template <
typename S>
1559 template <
typename T>
1560 template <
typename S>
1566 template <
typename T>
1567 template <
typename S>
1573 template <
typename T>
1574 template <
typename S>
1581 template <
typename T>
1587 template <
typename T>
1604 template <
typename T>
1621 template <
typename T,
typename S>
1638 #ifndef UT_DISABLE_VECTORIZE_MATRIX
1661 template<
typename T, ex
int D >
1664 template<
typename T>
1674 template<
typename T>
1678 template <
typename T>
template<
int ORDER>
1685 if(rx) rotate<UT_Axis3::XAXIS>(rx);
1686 if(ry) rotate<UT_Axis3::YAXIS>(ry);
1687 if(rz) rotate<UT_Axis3::ZAXIS>(rz);
1692 if(rx) rotate<UT_Axis3::XAXIS>(rx);
1693 if(rz) rotate<UT_Axis3::ZAXIS>(rz);
1694 if(ry) rotate<UT_Axis3::YAXIS>(ry);
1699 if(ry) rotate<UT_Axis3::YAXIS>(ry);
1700 if(rx) rotate<UT_Axis3::XAXIS>(rx);
1701 if(rz) rotate<UT_Axis3::ZAXIS>(rz);
1706 if(ry) rotate<UT_Axis3::YAXIS>(ry);
1707 if(rz) rotate<UT_Axis3::ZAXIS>(rz);
1708 if(rx) rotate<UT_Axis3::XAXIS>(rx);
1713 if(rz) rotate<UT_Axis3::ZAXIS>(rz);
1714 if(rx) rotate<UT_Axis3::XAXIS>(rx);
1715 if(ry) rotate<UT_Axis3::YAXIS>(ry);
1720 if(rz) rotate<UT_Axis3::ZAXIS>(rz);
1721 if(ry) rotate<UT_Axis3::YAXIS>(ry);
1722 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
GA_API const UT_StringHolder rot
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)
constexpr SYS_FORCE_INLINE T & z() noexcept
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)
constexpr SYS_FORCE_INLINE UT_Vector3T & operator*=(const T &a) noexcept
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.
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)
GA_API const UT_StringHolder orient
IMATH_HOSTDEVICE const Vec2< S > & operator*=(Vec2< S > &v, const Matrix22< T > &m) IMATH_NOEXCEPT
Vector-matrix multiplication: v *= m.
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()
constexpr SYS_FORCE_INLINE T & y() noexcept
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
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.
constexpr SYS_FORCE_INLINE T & x() noexcept