10 #ifndef INCLUDED_IMATHEULER_H
11 #define INCLUDED_IMATHEULER_H
23 IMATH_INTERNAL_NAMESPACE_HEADER_ENTER
25 #if (defined _WIN32 || defined _WIN64) && defined _MSC_VER
27 # pragma warning(push)
28 # pragma warning(disable : 4244)
223 InputLayout l = IJKLayout) IMATH_NOEXCEPT;
226 Euler (
T i,
T j,
T k,
Order o = Default, InputLayout l = IJKLayout)
264 return _initialRepeated;
299 set (
Axis initial,
bool relative,
bool parityEven,
bool firstRepeats)
310 operator= (const
Euler<
T>&) IMATH_NOEXCEPT;
314 operator= (const
Vec3<
T>&) IMATH_NOEXCEPT;
347 operator== (const
Euler<
S>& other) const IMATH_NOEXCEPT;
352 operator!= (const
Euler<
S>& other) const IMATH_NOEXCEPT;
365 angleMod (
T angle) IMATH_NOEXCEPT;
369 Vec3<
T>& xyzRot, const
Vec3<
T>& targetXyzRot) IMATH_NOEXCEPT;
375 const
Vec3<
T>& targetXyzRot,
388 bool _frameStatic : 1;
391 bool _initialRepeated : 1;
394 bool _parityEven : 1;
396 #if defined _WIN32 || defined _WIN64
425 j = _parityEven ? (i + 1) % 3 : (i > 0 ? i - 1 : 2);
426 k = _parityEven ? (i > 0 ? i - 1 : 2) : (i + 1) % 3;
436 m[(_initialAxis + 1) % 3] = _parityEven ? 1 : 2;
437 m[(_initialAxis + 2) % 3] = _parityEven ? 2 : 1;
448 angleMapping (i, j, k);
459 angleMapping (i, j, k);
460 return Vec3<T> ((*this)[i], (*this)[
j], (*this)[k]);
467 _initialRepeated (false),
476 _initialRepeated (
false),
526 setXYZVector (
Vec3<T> (xi, yi, zi));
563 angleOrder (i, j, k);
565 if (_initialRepeated)
571 x = std::atan2 (M[j][i], M[k][i]);
580 r[i] = (_parityEven ? -
x :
x);
606 T sy =
std::sqrt (N[j][i] * N[j][i] + N[k][i] * N[k][i]);
607 y = std::atan2 (sy, N[i][i]);
608 z = std::atan2 (N[j][k], N[j][j]);
616 x = std::atan2 (M[j][k], M[k][k]);
625 r[i] = (_parityEven ? -
x :
x);
651 T cy =
std::sqrt (N[i][i] * N[i][i] + N[i][j] * N[i][j]);
652 y = std::atan2 (-N[i][k], cy);
653 z = std::atan2 (-N[j][i], N[j][j]);
656 if (!_parityEven) *
this *= -1;
671 angleOrder (i, j, k);
673 if (_initialRepeated)
679 x = std::atan2 (M[j][i], M[k][i]);
688 r[i] = (_parityEven ? -
x :
x);
698 T sy =
std::sqrt (N[j][i] * N[j][i] + N[k][i] * N[k][i]);
699 y = std::atan2 (sy, N[i][i]);
700 z = std::atan2 (N[j][k], N[j][j]);
708 x = std::atan2 (M[j][k], M[k][k]);
717 r[i] = (_parityEven ? -
x :
x);
727 T cy =
std::sqrt (N[i][i] * N[i][i] + N[i][j] * N[i][j]);
728 y = std::atan2 (-N[i][k], cy);
729 z = std::atan2 (-N[j][i], N[j][j]);
732 if (!_parityEven) *
this *= -1;
747 angleOrder (i, j, k);
756 if (!_parityEven) angles *= -1.0;
758 T ci = std::cos (angles.
x);
759 T cj = std::cos (angles.
y);
760 T ch = std::cos (angles.
z);
761 T si = std::sin (angles.
x);
762 T sj = std::sin (angles.
y);
763 T sh = std::sin (angles.
z);
772 if (_initialRepeated)
778 M[
j][
j] = -cj * ss + cc;
779 M[k][
j] = -cj * cs - sc;
781 M[
j][k] = cj * sc + cs;
782 M[k][k] = cj * cc - ss;
787 M[
j][i] = sj * sc - cs;
788 M[k][i] = sj * cc + ss;
790 M[
j][
j] = sj * ss + cc;
791 M[k][
j] = sj * cs - sc;
805 angleOrder (i, j, k);
814 if (!_parityEven) angles *= -1.0;
816 T ci = std::cos (angles.
x);
817 T cj = std::cos (angles.
y);
818 T ch = std::cos (angles.
z);
819 T si = std::sin (angles.
x);
820 T sj = std::sin (angles.
y);
821 T sh = std::sin (angles.
z);
830 if (_initialRepeated)
836 M[
j][
j] = -cj * ss + cc;
837 M[k][
j] = -cj * cs - sc;
839 M[
j][k] = cj * sc + cs;
840 M[k][k] = cj * cc - ss;
845 M[
j][i] = sj * sc - cs;
846 M[k][i] = sj * cc + ss;
848 M[
j][
j] = sj * ss + cc;
849 M[k][
j] = sj * cs - sc;
864 angleOrder (i, j, k);
871 if (!_parityEven) angles.
y = -angles.
y;
873 T ti = angles.
x * 0.5;
874 T tj = angles.
y * 0.5;
875 T th = angles.
z * 0.5;
876 T ci = std::cos (ti);
877 T cj = std::cos (tj);
878 T ch = std::cos (th);
879 T si = std::sin (ti);
880 T sj = std::sin (tj);
881 T sh = std::sin (th);
887 T parity = _parityEven ? 1.0 : -1.0;
892 if (_initialRepeated)
894 a[i] = cj * (cs + sc);
895 a[
j] = sj * (cc + ss) * parity;
896 a[k] = sj * (cs - sc);
897 q.
r = cj * (cc - ss);
901 a[i] = cj * sc - sj * cs;
902 a[
j] = (cj * ss + sj * cc) * parity;
903 a[k] = cj * cs - sj * sc;
904 q.
r = cj * cc + sj * ss;
923 int foo = (_initialAxis ==
Z ? 0x2000 : (_initialAxis ==
Y ? 0x1000 : 0));
925 if (_parityEven) foo |= 0x0100;
926 if (_initialRepeated) foo |= 0x0010;
927 if (_frameStatic) foo++;
937 p & 0x2000 ? Z : (p & 0x1000 ?
Y :
X),
952 _frameStatic = !relative;
953 _parityEven = parityEven;
954 _initialRepeated = firstRepeats;
964 _initialAxis = euler._initialAxis;
965 _frameStatic = euler._frameStatic;
966 _parityEven = euler._parityEven;
967 _initialRepeated = euler._initialRepeated;
1001 const T pi =
static_cast<T> (
M_PI);
1015 Vec3<T> d = xyzRot - targetXyzRot;
1016 xyzRot.
x = targetXyzRot.x + angleMod (d.
x);
1017 xyzRot.y = targetXyzRot.y + angleMod (d.
y);
1018 xyzRot.z = targetXyzRot.z + angleMod (d.
z);
1028 e.angleOrder (i, j, k);
1030 simpleXYZRotation (xyzRot, targetXyzRot);
1033 otherXyzRot[i] =
M_PI + xyzRot[i];
1034 otherXyzRot[
j] =
M_PI - xyzRot[
j];
1035 otherXyzRot[k] =
M_PI + xyzRot[k];
1037 simpleXYZRotation (otherXyzRot, targetXyzRot);
1039 Vec3<T> d = xyzRot - targetXyzRot;
1040 Vec3<T> od = otherXyzRot - targetXyzRot;
1042 T odMag = od.
dot (od);
1044 if (odMag < dMag) { xyzRot = otherXyzRot; }
1051 Vec3<T> xyzRot = toXYZVector ();
1063 nearestRotation (xyzRot, targetXyz,
order ());
1065 setXYZVector (xyzRot);
1073 operator<< (std::ostream& o, const Euler<T>& euler)
1075 char a[3] = {
'X',
'Y',
'Z'};
1077 const char*
r = euler.frameStatic () ?
"" :
"r";
1079 euler.angleOrder (i, j, k);
1081 if (euler.initialRepeated ()) k = i;
1083 return o <<
"(" << euler.x <<
" " << euler.y <<
" " << euler.z <<
" "
1084 << a[i] << a[
j] << a[k] << r <<
")";
1087 #if (defined _WIN32 || defined _WIN64) && defined _MSC_VER
1088 # pragma warning(pop)
1091 IMATH_INTERNAL_NAMESPACE_HEADER_EXIT
1093 #endif // INCLUDED_IMATHEULER_H
IMATH_HOSTDEVICE constexpr bool parityEven() const
Return partityEven.
static IMATH_HOSTDEVICE void simpleXYZRotation(Vec3< T > &xyzRot, const Vec3< T > &targetXyzRot) IMATH_NOEXCEPT
Adjust xyzRot so that its components differ from targetXyzRot by no more than +/-PI.
*get result *(waiting if necessary)*A common idiom is to fire a bunch of sub tasks at the and then *wait for them to all complete We provide a helper class
SIM_API const UT_StringHolder angle
IMATH_HOSTDEVICE Matrix44< T > toMatrix44() const IMATH_NOEXCEPT
Convert to Matrix44.
vfloat4 sqrt(const vfloat4 &a)
GLdouble GLdouble GLdouble z
IMATH_HOSTDEVICE void set(Axis initial, bool relative, bool parityEven, bool firstRepeats) IMATH_NOEXCEPT
Set the value.
IMATH_HOSTDEVICE void setXYZVector(const Vec3< T > &) IMATH_NOEXCEPT
GLboolean GLboolean GLboolean GLboolean a
IMATH_HOSTDEVICE constexpr T dot(const Vec3 &v) const IMATH_NOEXCEPT
Dot product.
Vec3< T > v
The imaginary vector.
GLdouble GLdouble GLdouble q
OIIO_FORCEINLINE bool extract(const vbool4 &a)
constexpr auto set(type rhs) -> int
IMATH_HOSTDEVICE static constexpr bool legal(Order) IMATH_NOEXCEPT
Return whether the given value is a legal Order.
IMATH_HOSTDEVICE Vec3< T > toXYZVector() const IMATH_NOEXCEPT
IMATH_HOSTDEVICE void extract(const Matrix33< T > &) IMATH_NOEXCEPT
Assign from Matrix33, assumed to be affine.
IMATH_HOSTDEVICE constexpr bool operator==(const Vec3< S > &v) const IMATH_NOEXCEPT
Equality.
IMATH_HOSTDEVICE constexpr Axis initialAxis() const
Return initialAxis.
IMATH_HOSTDEVICE static IMATH_CONSTEXPR14 float angleMod(T angle) IMATH_NOEXCEPT
Convert an angle to its equivalent in [-PI, PI].
#define IMATH_EXPORT_ENUM
GLdouble GLdouble GLint GLint order
IMATH_HOSTDEVICE void angleMapping(int &i, int &j, int &k) const IMATH_NOEXCEPT
Determine mapping from xyz to ijk (reshuffle the xyz to match the order)
IMATH_HOSTDEVICE constexpr Euler() IMATH_NOEXCEPT
No initialization by default.
IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Order order() const IMATH_NOEXCEPT
Return the order.
IMATH_HOSTDEVICE IMATH_CONSTEXPR14 const Euler< T > & operator=(const Euler< T > &) IMATH_NOEXCEPT
Assignment.
IMATH_HOSTDEVICE constexpr bool operator==(const Euler< S > &other) const IMATH_NOEXCEPT
Equality.
IMATH_HOSTDEVICE constexpr bool initialRepeated() const
Return intialRepeated.
Euler< float > Eulerf
Euler of type float.
IMATH_HOSTDEVICE void angleOrder(int &i, int &j, int &k) const IMATH_NOEXCEPT
Unpack angles from ijk form.
Euler< double > Eulerd
Euler of type double.
__hostdev__ constexpr T pi()
Pi constant taken from Boost to match old behaviour.
IMATH_HOSTDEVICE constexpr bool operator!=(const Vec3< S > &v) const IMATH_NOEXCEPT
Inequality.
LeafData & operator=(const LeafData &)=delete
#define IMATH_EXPORT_TEMPLATE_TYPE
IMATH_HOSTDEVICE const Matrix44 & rotate(const Vec3< S > &r) IMATH_NOEXCEPT
IMATH_HOSTDEVICE Matrix33< T > toMatrix33() const IMATH_NOEXCEPT
Convert to Matrix33.
IMATH_HOSTDEVICE void setOrder(Order) IMATH_NOEXCEPT
GA_API const UT_StringHolder N
static IMATH_HOSTDEVICE void nearestRotation(Vec3< T > &xyzRot, const Vec3< T > &targetXyzRot, Order order=XYZ) IMATH_NOEXCEPT
IMATH_HOSTDEVICE constexpr bool operator!=(const Euler< S > &other) const IMATH_NOEXCEPT
Inequality.
IMATH_HOSTDEVICE void makeNear(const Euler< T > &target) IMATH_NOEXCEPT
IMATH_HOSTDEVICE Quat< T > toQuat() const IMATH_NOEXCEPT
Convert to Quat.