5 #ifndef _EULE_NO_INTRINSICS_
33 #ifndef _EULE_NO_INTRINSICS_
36 __m256d __vec = _mm256_set_pd(0, eulerRad.
z, eulerRad.
y, eulerRad.
x);
37 __vec = _mm256_mul_pd(__vec, _mm256_set1_pd(0.5));
39 __m256d __sin = _mm256_sincos_pd(&__cos, __vec);
45 _mm256_storeu_pd(sin, __sin);
46 _mm256_storeu_pd(cos, __cos);
48 __m256d __a = _mm256_set_pd(cos[0], cos[0], sin[0], cos[0]);
49 __m256d __b = _mm256_set_pd(cos[1], sin[1], cos[1], cos[1]);
50 __m256d __c = _mm256_set_pd(sin[2], cos[2], cos[2], cos[2]);
52 __m256d __d = _mm256_set_pd(sin[0], sin[0], cos[0], sin[0]);
53 __m256d __e = _mm256_set_pd(sin[1], cos[1], sin[1], sin[1]);
54 __m256d __f = _mm256_set_pd(cos[2], sin[2], sin[2], sin[2]);
58 __abc = _mm256_mul_pd(__a, __b);
59 __abc = _mm256_mul_pd(__abc, __c);
62 __def = _mm256_mul_pd(__d, __e);
63 __def = _mm256_mul_pd(__def, __f);
69 _mm256_storeu_pd(abc, __abc);
70 _mm256_storeu_pd(def, __def);
73 v.
w = abc[0] + def[0];
74 v.
x = abc[1] - def[1];
75 v.
y = abc[2] + def[2];
76 v.
z = abc[3] - def[3];
80 const double cy = cos(eulerRad.
z * 0.5);
81 const double sy = sin(eulerRad.
z * 0.5);
82 const double cp = cos(eulerRad.
y * 0.5);
83 const double sp = sin(eulerRad.
y * 0.5);
84 const double cr = cos(eulerRad.
x * 0.5);
85 const double sr = sin(eulerRad.
x * 0.5);
87 v.
w = cr * cp * cy + sr * sp * sy;
88 v.
x = sr * cp * cy - cr * sp * sy;
89 v.
y = cr * sp * cy + sr * cp * sy;
90 v.
z = cr * cp * sy - sr * sp * cy;
114 v.
w * q.v.
x + v.
x * q.v.
w + v.
y * q.v.
z - v.
z * q.v.
y,
115 v.
w * q.v.
y + v.
y * q.v.
w + v.
z * q.v.
x - v.
x * q.v.
z,
116 v.
w * q.v.
z + v.
z * q.v.
w + v.
x * q.v.
y - v.
y * q.v.
x,
117 v.
w * q.v.
w - v.
x * q.v.
x - v.
y * q.v.
y - v.
z * q.v.
z
128 return ((*
this) * (q.
Inverse()));
136 v.
x = bufr.
w * q.v.
x + bufr.
x * q.v.
w + bufr.
y * q.v.
z - bufr.
z * q.v.
y;
137 v.
y = bufr.
w * q.v.
y + bufr.
y * q.v.
w + bufr.
z * q.v.
x - bufr.
x * q.v.
z;
138 v.
z = bufr.
w * q.v.
z + bufr.
z * q.v.
w + bufr.
x * q.v.
y - bufr.
y * q.v.
x;
139 v.
w = bufr.
w * q.v.
w - bufr.
x * q.v.
x - bufr.
y * q.v.
y - bufr.
z * q.v.
z;
156 (*this) = (*this) * q.
Inverse();
177 if (!isCacheUpToDate_inverse)
181 isCacheUpToDate_inverse =
true;
217 if (!isCacheUpToDate_euler)
221 double sinr_cosp = 2.0 * (v.
w * v.
x + v.
y * v.
z);
222 double cosr_cosp = 1.0 - 2.0 * (v.
x * v.
x + v.
y * v.
y);
223 euler.
x = std::atan2(sinr_cosp, cosr_cosp);
226 double sinp = 2.0 * (v.
w * v.
y - v.
z * v.
x);
227 if (std::abs(sinp) >= 1)
228 euler.
y = std::copysign(
PI / 2, sinp);
230 euler.
y = std::asin(sinp);
233 double siny_cosp = 2.0 * (v.
w * v.
z + v.
x * v.
y);
234 double cosy_cosp = 1.0 - 2.0 * (v.
y * v.
y + v.
z * v.
z);
235 euler.
z = std::atan2(siny_cosp, cosy_cosp);
240 isCacheUpToDate_matrix =
true;
248 if (!isCacheUpToDate_matrix)
252 const double sqx = v.
x * v.
x;
253 const double sqy = v.
y * v.
y;
254 const double sqz = v.
z * v.
z;
255 const double sqw = v.
w * v.
w;
256 const double x = v.
x;
257 const double y = v.
y;
258 const double z = v.
z;
259 const double w = v.
w;
262 double invs = 1.0 / (sqx + sqy + sqz + sqw);
267 m.
c = ((2 * x * z) - (2 * w * y)) * invs;
268 m.
f = (1 - (2 * sqx) - (2 * sqz)) * invs;
269 m.
i = ((2 * x * z) + (2 * w * y)) * invs;
272 m.
a = (1 - (2 * sqy) - (2 * sqz)) * invs;
273 m.
g = ((2 * y * z) + (2 * w * x)) * invs;
274 m.
j = ((2 * y * z) - (2 * w * x)) * invs;
277 m.
b = ((2 * x * v.
y) + (2 * w * z)) * invs;
278 m.
e = ((2 * x * v.
y) - (2 * w * z)) * invs;
279 m.
k = (1 - (2 * sqx) - (2 * sqy)) * invs;
284 isCacheUpToDate_matrix =
true;
314 void Quaternion::InvalidateCache()
316 isCacheUpToDate_euler =
false;
317 isCacheUpToDate_matrix =
false;
318 isCacheUpToDate_inverse =
false;
327 os <<
"[" << q.v <<
"]";
333 os << L
"[" << q.v << L
"]";