14 __m128 abca = _mm_shuffle_ps(abcd, abcd, _MM_SHUFFLE(0, 2, 1, 0));
15 __m128 bcab = _mm_shuffle_ps(abcd, abcd, _MM_SHUFFLE(1, 0, 2, 1));
16 __m128 cabc = _mm_shuffle_ps(abcd, abcd, _MM_SHUFFLE(2, 1, 0, 2));
17 __m128 dddd = _mm_shuffle_ps(abcd, abcd, _MM_SHUFFLE(3, 3, 3, 3));
19 __m128 wwwx = _mm_shuffle_ps(xyzw, xyzw, _MM_SHUFFLE(0, 3, 3, 3));
20 __m128 zxyy = _mm_shuffle_ps(xyzw, xyzw, _MM_SHUFFLE(1, 1, 0, 2));
21 __m128 yzxz = _mm_shuffle_ps(xyzw, xyzw, _MM_SHUFFLE(2, 0, 2, 1));
23 __m128 m2 = _mm_mul_ps(bcab, zxyy);
25 __m128 m3 = _mm_fmadd_ps(abca, wwwx, m2);
27 __m128 m1 = _mm_mul_ps(abca, wwwx);
28 __m128 m3 = _mm_add_ps(m1, m2);
32 m3 = _mm_xor_ps(_mm_set_ps(-0.0f, 0.0f, 0.0f, 0.0f), m3);
35 __m128 m5 = _mm_fnmadd_ps(cabc, yzxz, m3);
36 __m128 m7 = _mm_fmadd_ps(dddd, xyzw, m5);
38 __m128 m4 = _mm_mul_ps(dddd, xyzw);
39 __m128 m5 = _mm_mul_ps(cabc, yzxz);
40 __m128 m6 = _mm_sub_ps(m4, m5);
41 __m128 m7 = _mm_add_ps(m3, m6);
57 return Quat((a * w + b * z) + (d * x - c * y),
58 (b * w + c * x) + (d * y - a * z),
59 (c * w + a * y) + (d * z - b * x),
60 -(a * x + b * y) + (d * w - c * z));
67 __m128 abc0 = inLHS.
mValue;
71 __m128 abca = _mm_shuffle_ps(abc0, abc0, _MM_SHUFFLE(0, 2, 1, 0));
72 __m128 bcab = _mm_shuffle_ps(abc0, abc0, _MM_SHUFFLE(1, 0, 2, 1));
73 __m128 cabc = _mm_shuffle_ps(abc0, abc0, _MM_SHUFFLE(2, 1, 0, 2));
75 __m128 wwwx = _mm_shuffle_ps(xyzw, xyzw, _MM_SHUFFLE(0, 3, 3, 3));
76 __m128 zxyy = _mm_shuffle_ps(xyzw, xyzw, _MM_SHUFFLE(1, 1, 0, 2));
77 __m128 yzxz = _mm_shuffle_ps(xyzw, xyzw, _MM_SHUFFLE(2, 0, 2, 1));
79 __m128 m2 = _mm_mul_ps(bcab, zxyy);
81 __m128 m3 = _mm_fmadd_ps(abca, wwwx, m2);
83 __m128 m1 = _mm_mul_ps(abca, wwwx);
84 __m128 m3 = _mm_add_ps(m1, m2);
88 m3 = _mm_xor_ps(_mm_set_ps(-0.0f, 0.0f, 0.0f, 0.0f), m3);
90 __m128 m4 = _mm_mul_ps(cabc, yzxz);
93 return Quat(
Vec4(_mm_sub_ps(m3, m4)));
95 float a = inLHS.
GetX();
96 float b = inLHS.
GetY();
97 float c = inLHS.
GetZ();
104 return Quat((a * w + b * z) - c * y,
105 (b * w + c * x) - a * z,
106 (c * w + a * y) - b * x,
107 -(a * x + b * y) - c * z);
124 float abs_w = w_pos.
GetW();
132 outAngle = 2.0f *
ACos(abs_w);
148 if (xyz_len_sq < 4.0e-4f)
149 return (2.0f / inDeltaTime) *
xyz;
153 float angle = 2.0f *
ACos(w_pos.
GetW());
154 return (
xyz / (sqrt(xyz_len_sq) * inDeltaTime)) * angle;
190 float w = len_v1_v2 + inFrom.
Dot(inTo);
194 if (len_v1_v2 == 0.0f)
210template <
class Random>
213 std::uniform_real_distribution<float> zero_to_one(0.0f, 1.0f);
214 float x0 = zero_to_one(inRandom);
215 float r1 = sqrt(1.0f - x0), r2 = sqrt(x0);
216 std::uniform_real_distribution<float> zero_to_two_pi(0.0f, 2.0f * JPH_PI);
218 Vec4(zero_to_two_pi(inRandom), zero_to_two_pi(inRandom), 0, 0).
SinCos(s, c);
224 Vec4 half(0.5f * inAngles);
236 cz * sx * cy - sz * cx * sy,
237 cz * cx * sy + sz * sx * cy,
238 sz * cx * cy - cz * sx * sy,
239 cz * cx * cy + sz * sx * sy);
248 float t1 = 1.0f - 2.0f * (
GetX() *
GetX() + y_sq);
252 t2 = t2 > 1.0f? 1.0f : t2;
253 t2 = t2 < -1.0f? -1.0f : t2;
257 float t4 = 1.0f - 2.0f * (y_sq +
GetZ() *
GetZ());
266 if (twist_len != 0.0f)
267 return twist / sqrt(twist_len);
278 outTwist =
Quat(x / s, 0, 0, w / s);
279 outSwing =
Quat(0, (w * y - x * z) / s, (w * z + x * y) / s, s);
291 float scale0 = 1.0f - inFraction;
298 const float delta = 0.0001f;
301 float sign_scale1 = 1.0f;
302 float cos_omega =
Dot(inDestination);
305 if (cos_omega < 0.0f)
307 cos_omega = -cos_omega;
312 float scale0, scale1;
313 if (1.0f - cos_omega > delta)
316 float omega =
ACos(cos_omega);
317 float sin_omega =
Sin(omega);
318 scale0 =
Sin((1.0f - inFraction) * omega) / sin_omega;
319 scale1 = sign_scale1 *
Sin(inFraction * omega) / sin_omega;
324 scale0 = 1.0f - inFraction;
325 scale1 = sign_scale1 * inFraction;
353 return inValue + (v + v);
364 return inValue + (v + v);
405 float w = sqrt(max(1.0f - v.
LengthSq(), 0.0f));
#define JPH_NAMESPACE_END
Definition Core.h:428
#define JPH_NAMESPACE_BEGIN
Definition Core.h:422
#define xyz
Definition HLSLToCPP.h:513
#define yzx
Definition HLSLToCPP.h:516
#define JPH_ASSERT(...)
Definition IssueReporting.h:33
JPH_INLINE constexpr T Square(T inV)
Square a value.
Definition Math.h:55
@ SWIZZLE_Z
Use the Z component.
Definition Swizzle.h:14
@ SWIZZLE_W
Use the W component.
Definition Swizzle.h:15
@ SWIZZLE_X
Use the X component.
Definition Swizzle.h:12
@ SWIZZLE_Y
Use the Y component.
Definition Swizzle.h:13
JPH_INLINE float ACos(float inX)
Definition Trigonometry.h:42
JPH_INLINE float ATan2(float inY, float inX)
Arc tangent of y / x using the signs of the arguments to determine the correct quadrant (returns valu...
Definition Trigonometry.h:74
JPH_NAMESPACE_BEGIN JPH_INLINE float Sin(float inX)
Sine of x (input in radians)
Definition Trigonometry.h:12
JPH_INLINE float ASin(float inX)
Definition Trigonometry.h:35
Class that holds 3 floats. Used as a storage class. Convert to Vec3 for calculations.
Definition Float3.h:13
Class that holds 4 float values. Convert to Vec4 to perform calculations.
Definition Float4.h:11
static Quat sRandom(Random &inRandom)
Random unit quaternion.
Definition Quat.inl:211
JPH_INLINE Vec3 InverseRotate(Vec3Arg inValue) const
Rotate a vector by the inverse of this quaternion.
Definition Quat.inl:356
JPH_INLINE float GetW() const
Get W component (real part)
Definition Quat.h:79
static JPH_INLINE Quat sMultiplyImaginary(Vec3Arg inLHS, QuatArg inRHS)
Multiply a quaternion with imaginary components and no real component (x, y, z, 0) with a quaternion.
Definition Quat.inl:64
static Quat sEulerAngles(Vec3Arg inAngles)
Conversion from Euler angles. Rotation order is X then Y then Z (RotZ * RotY * RotX)....
Definition Quat.inl:222
JPH_INLINE float GetY() const
Get Y component (imaginary part j)
Definition Quat.h:73
JPH_INLINE float GetZ() const
Get Z component (imaginary part k)
Definition Quat.h:76
static JPH_INLINE Quat sRotation(Vec3Arg inAxis, float inAngle)
Rotation from axis and angle.
Definition Quat.inl:111
JPH_INLINE float GetX() const
Get X component (imaginary part i)
Definition Quat.h:70
JPH_INLINE Vec3 GetAngularVelocity(float inDeltaTime) const
Calculate angular velocity given that this quaternion represents the rotation that is reached after i...
Definition Quat.inl:137
JPH_INLINE Quat LERP(QuatArg inDestination, float inFraction) const
Definition Quat.inl:289
static JPH_INLINE Quat sLoadFloat3Unsafe(const Float3 &inV)
Load 3 floats from memory (X, Y and Z component and then calculates W) reads 32 bits extra which it d...
Definition Quat.inl:402
JPH_INLINE float LengthSq() const
Definition Quat.h:136
JPH_INLINE void GetAxisAngle(Vec3 &outAxis, float &outAngle) const
Get axis and angle that represents this quaternion, outAngle will always be in the range .
Definition Quat.inl:120
static JPH_INLINE Quat sIdentity()
Definition Quat.h:104
JPH_INLINE void GetSwingTwist(Quat &outSwing, Quat &outTwist) const
Definition Quat.inl:272
JPH_INLINE void StoreFloat4(Float4 *outV) const
Store as 4 floats.
Definition Quat.inl:397
static JPH_INLINE Quat sFromTo(Vec3Arg inFrom, Vec3Arg inTo)
Definition Quat.inl:157
friend Quat operator*(float inValue, QuatArg inRHS)
Definition Quat.h:158
JPH_INLINE Quat EnsureWPositive() const
Ensures that the W component is positive by negating the entire quaternion if it is not....
Definition Quat.h:191
JPH_INLINE Quat GetTwist(Vec3Arg inAxis) const
Definition Quat.inl:262
JPH_INLINE float Dot(QuatArg inRHS) const
Dot product.
Definition Quat.h:182
Quat()=default
Intentionally not initialized for performance reasons.
JPH_INLINE Vec3 RotateAxisZ() const
Rotate a the vector (0, 0, 1) with this quaternion.
Definition Quat.inl:383
JPH_INLINE Vec3 RotateAxisX() const
Rotate a the vector (1, 0, 0) with this quaternion.
Definition Quat.inl:367
JPH_INLINE Vec3 RotateAxisY() const
Rotate a the vector (0, 1, 0) with this quaternion.
Definition Quat.inl:375
Vec3 GetEulerAngles() const
Conversion to Euler angles. Rotation order is X then Y then Z (RotZ * RotY * RotX)....
Definition Quat.inl:242
bool IsNormalized(float inTolerance=1.0e-5f) const
If the length of this quaternion is 1 +/- inTolerance.
Definition Quat.h:60
JPH_INLINE void StoreFloat3(Float3 *outV) const
Store as 3 floats to memory (X, Y and Z component). Ensures that W is positive before storing.
Definition Quat.inl:391
JPH_INLINE Vec3 GetXYZ() const
Get the imaginary part of the quaternion.
Definition Quat.h:82
Vec4 mValue
4 vector that stores [x, y, z, w] parts of the quaternion
Definition Quat.h:264
JPH_INLINE Quat SLERP(QuatArg inDestination, float inFraction) const
Definition Quat.inl:295
JPH_INLINE float Dot(Vec3Arg inV2) const
Dot product.
Definition Vec3.inl:943
JPH_INLINE Vec3 Normalized() const
Normalize vector.
Definition Vec3.inl:1044
JPH_INLINE Vec3 Cross(Vec3Arg inV2) const
Cross product.
Definition Vec3.inl:841
JPH_INLINE Vec3 GetNormalizedPerpendicular() const
Get normalized vector that is perpendicular to this vector.
Definition Vec3.inl:1217
JPH_INLINE float GetX() const
Get individual components.
Definition Vec3.h:127
JPH_INLINE bool IsNormalized(float inTolerance=1.0e-6f) const
Test if vector is normalized.
Definition Vec3.inl:1128
JPH_INLINE Vec3 NormalizedOr(Vec3Arg inZeroValue) const
Normalize vector or return inZeroValue if the length of the vector is zero.
Definition Vec3.inl:1076
Type mValue
Definition Vec3.h:299
JPH_INLINE float GetY() const
Definition Vec3.h:128
JPH_INLINE void StoreFloat3(Float3 *outV) const
Store 3 floats to memory.
Definition Vec3.inl:1153
JPH_INLINE float LengthSq() const
Squared length of vector.
Definition Vec3.inl:972
static JPH_INLINE Vec3 sZero()
Vector with all zeros.
Definition Vec3.inl:125
static JPH_INLINE Vec3 sLoadFloat3Unsafe(const Float3 &inV)
Load 3 floats from memory (reads 32 bits extra which it doesn't use)
Definition Vec3.inl:167
JPH_INLINE float GetZ() const
Definition Vec3.h:129
JPH_INLINE Vec3 Swizzle() const
Swizzle the elements in inV.
JPH_INLINE Vec4 SplatX() const
Replicate the X component to all components.
Definition Vec4.inl:808
JPH_INLINE Vec3 SplatW3() const
Replicate the W component to all components.
Definition Vec4.inl:920
JPH_INLINE Vec4 FlipSign() const
Flips the signs of the components, e.g. FlipSign<-1, 1, -1, 1>() will flip the signs of the X and Z c...
Definition Vec4.inl:1102
JPH_INLINE float GetW() const
Definition Vec4.h:122
JPH_INLINE Vec4 SplatY() const
Replicate the Y component to all components.
Definition Vec4.inl:824
JPH_INLINE Vec4 SplatZ() const
Replicate the Z component to all components.
Definition Vec4.inl:840
JPH_INLINE Vec4 SplatW() const
Replicate the W component to all components.
Definition Vec4.inl:856
JPH_INLINE float GetX() const
Get individual components.
Definition Vec4.h:119
JPH_INLINE Vec4 Swizzle() const
Swizzle the elements in inV.
Type mValue
Definition Vec4.h:314
JPH_INLINE float GetZ() const
Definition Vec4.h:121
static JPH_INLINE Vec4 sSelect(Vec4Arg inNotSet, Vec4Arg inSet, UVec4Arg inControl)
Component wise select, returns inNotSet when highest bit of inControl = 0 and inSet when highest bit ...
Definition Vec4.inl:377
JPH_INLINE float GetY() const
Definition Vec4.h:120
static JPH_INLINE Vec4 sReplicate(float inV)
Replicate inV across all components.
Definition Vec4.inl:97
void SinCos(Vec4 &outSin, Vec4 &outCos) const
Calculate the sine and cosine for each element of this vector (input in radians)
Definition Vec4.inl:1216
JPH_INLINE void StoreFloat4(Float4 *outV) const
Store 4 floats to memory.
Definition Vec4.inl:1133