36 #ifndef __CU_QUATERNION_H__
37 #define __CU_QUATERNION_H__
41 #include "CUMathBase.h"
101 #if defined CU_MATH_VECTOR_SSE
115 #elif defined CU_MATH_VECTOR_NEON64
147 #pragma mark Constructors
163 #if defined CU_MATH_VECTOR_SSE
164 v = _mm_set_ps(w, z, y, x);
165 #elif defined CU_MATH_VECTOR_NEON64
168 this->x =
x; this->y =
y; this->z =
z; this->w =
w;
191 #pragma mark Static Constructors
244 #if defined CU_MATH_VECTOR_SSE
245 v = _mm_set_ps(w, z, y, x);
246 #elif defined CU_MATH_VECTOR_NEON64
249 this->x =
x; this->y =
y; this->z =
z; this->w =
w;
283 #if defined CU_MATH_VECTOR_SSE || defined CU_MATH_VECTOR_NEON64
286 x = q.
x; y = q.
y; z = q.
z; w = q.
w;
297 #if defined CU_MATH_VECTOR_SSE
298 v = _mm_setzero_ps();
300 #elif defined CU_MATH_VECTOR_NEON64
301 v = vmovq_n_f32(0.0f);
304 x = y = z = 0; w = 1;
315 #if defined CU_MATH_VECTOR_SSE
316 v = _mm_setzero_ps();
317 #elif defined CU_MATH_VECTOR_NEON64
318 v = vmovq_n_f32(0.0f);
327 #pragma mark Static Arithmetic
451 #pragma mark Arithmetic
460 #if defined CU_MATH_VECTOR_SSE
461 v = _mm_add_ps(v,q.v);
462 #elif defined CU_MATH_VECTOR_NEON64
463 v = vaddq_f32(v,q.v);
465 x += q.
x; y += q.
y; z += q.
z; w += q.
w;
478 #if defined CU_MATH_VECTOR_SSE
479 v = _mm_sub_ps(v,q.v);
480 #elif defined CU_MATH_VECTOR_NEON64
481 v = vsubq_f32(v,q.v);
483 x -= q.
x; y -= q.
y; z -= q.
z; w -= q.
w;
510 return *(
divide(*
this,q,
this));
522 #if defined CU_MATH_VECTOR_SSE
523 v = _mm_mul_ps(v,_mm_set1_ps(s));
524 #elif defined CU_MATH_VECTOR_NEON64
525 v = vmulq_n_f32(v,(float32_t)s);
527 x *= s; y *= s; z *= s; w *= s;
538 #if defined CU_MATH_VECTOR_SSE
540 v = _mm_sub_ps(_mm_setzero_ps(), v);
542 #elif defined CU_MATH_VECTOR_NEON64
547 x = -
x; y = -
y; z = -
z;
576 return *(
invert(*
this,
this));
594 return *(
invert(*
this,&result));
630 #if defined CU_MATH_VECTOR_SSE
631 v = _mm_sub_ps(_mm_setzero_ps(), v);
632 #elif defined CU_MATH_VECTOR_NEON64
633 v = vsubq_f32(vmovq_n_f32(0.0f), v);
635 x = -
x; y = -
y; z = -
z; w = -
w;
649 return *(
negate(*
this,&result));
666 #pragma mark Operators
721 return *(
scale(*
this,1.0f/s,
this));
736 return *(
divide(*
this,q,
this));
750 return *(
add(*
this,q,&result));
764 return *(
subtract(*
this,q,&result));
776 return *(
negate(*
this,&result));
790 return *(
scale(*
this,s,&result));
806 return *(
multiply(*
this,q,&result));
820 return *(
scale(*
this,1.0f/s,&result));
838 return *(
divide(*
this,q,&result));
843 #pragma mark Comparisons
882 #pragma mark Linear Attributes
930 return equals(ZERO,variance);
950 return equals(IDENTITY,variance);
960 bool isUnit(
float variance=CU_MATH_EPSILON)
const {
962 return fabsf(dot) <= variance;
978 #pragma mark Static Interpolation
1056 #pragma mark Interpolation
1072 return *(
lerp(*
this,q,t,
this));
1094 return *(
slerp(*
this,q,t,
this));
1116 return *(
slerp(*
this,q,t,
this));
1137 return *(
lerp(*
this,q,t,&result));
1162 return *(
slerp(*
this,q,t,&result));
1187 return *(
nlerp(*
this,q,t,&result));
1200 return *(
rotate(v,*
this,&result));
1204 #pragma mark Conversion Methods
1216 std::string
toString(
bool verbose =
false)
const;
1222 operator Vec4()
const;
1257 operator Mat4()
const;
1312 inline Vec3& operator*=(Vec3& v,
const Quaternion& quat) {
1328 inline const Vec3 operator*(
const Vec3& v,
const Quaternion& quat) {
1342 inline const Quaternion operator*(
float s,
const Quaternion& quat) {
Quaternion & lerp(const Quaternion &q, float t)
Definition: CUQuaternion.h:1071
std::string toString(bool verbose=false) const
bool operator==(const Quaternion &q) const
const Quaternion operator*(const Quaternion &q) const
Definition: CUQuaternion.h:804
Quaternion getNegation() const
Definition: CUQuaternion.h:647
const Quaternion operator-() const
Definition: CUQuaternion.h:774
Quaternion getConjugate() const
Definition: CUQuaternion.h:557
Quaternion & multiply(const Quaternion &q)
Definition: CUQuaternion.h:495
static Quaternion * subtract(const Quaternion &q1, const Quaternion &q2, Quaternion *dst)
Quaternion & set(const Quaternion &q)
Definition: CUQuaternion.h:282
Quaternion & operator*=(float s)
Definition: CUQuaternion.h:696
static Quaternion * createFromAxisAngle(const Vec3 &axis, float angle, Quaternion *dst)
float normSquared() const
Definition: CUQuaternion.h:906
static Quaternion * lerp(const Quaternion &q1, const Quaternion &q2, float t, Quaternion *dst)
static float dot(const Quaternion &q1, const Quaternion &q2)
Quaternion()
Definition: CUQuaternion.h:152
bool equals(const Quaternion &q, float variance=CU_MATH_EPSILON) const
Quaternion & operator/=(const Quaternion &q)
Definition: CUQuaternion.h:735
float dot(const Quaternion &q) const
Definition: CUQuaternion.h:659
Quaternion & subtract(const Quaternion &q)
Definition: CUQuaternion.h:477
const Quaternion operator*(float s) const
Definition: CUQuaternion.h:788
Quaternion & operator*=(const Quaternion &q)
Definition: CUQuaternion.h:709
Quaternion & negate()
Definition: CUQuaternion.h:629
float norm() const
Definition: CUQuaternion.h:890
Quaternion & set(float x, float y, float z, float w)
Definition: CUQuaternion.h:243
static Quaternion * nlerp(const Quaternion &q1, const Quaternion &q2, float t, Quaternion *dst)
static Vec3 * rotate(const Vec3 &v, const Quaternion &quat, Vec3 *dst)
Quaternion & slerp(const Quaternion &q, float t)
Definition: CUQuaternion.h:1093
bool isNearIdentity(float variance=CU_MATH_EPSILON) const
Definition: CUQuaternion.h:949
Quaternion & operator+=(const Quaternion &q)
Definition: CUQuaternion.h:674
Quaternion & operator=(const float *array)
Definition: CUQuaternion.h:229
bool isNearZero(float variance=CU_MATH_EPSILON) const
Definition: CUQuaternion.h:929
float x
Definition: CUQuaternion.h:131
static Quaternion * add(const Quaternion &q1, const Quaternion &q2, Quaternion *dst)
static const Quaternion IDENTITY
Definition: CUQuaternion.h:143
const Quaternion operator/(const Quaternion &q) const
Definition: CUQuaternion.h:836
Quaternion & scale(float s)
Definition: CUQuaternion.h:521
Quaternion & divide(const Quaternion &q)
Definition: CUQuaternion.h:509
float w
Definition: CUQuaternion.h:137
float y
Definition: CUQuaternion.h:133
Quaternion & normalize()
Definition: CUQuaternion.h:605
bool operator!=(const Quaternion &q) const
Quaternion getNormalization() const
Definition: CUQuaternion.h:619
const Quaternion operator+(const Quaternion &q) const
Definition: CUQuaternion.h:748
Quaternion & operator-=(const Quaternion &q)
Definition: CUQuaternion.h:685
const Quaternion operator-(const Quaternion &q) const
Definition: CUQuaternion.h:762
static const Quaternion ZERO
Definition: CUQuaternion.h:141
Quaternion & setIdentity()
Definition: CUQuaternion.h:296
Quaternion getInverse() const
Definition: CUQuaternion.h:592
bool isUnit(float variance=CU_MATH_EPSILON) const
Definition: CUQuaternion.h:960
Quaternion & conjugate()
Definition: CUQuaternion.h:537
static Quaternion * slerp(const Quaternion &q1, const Quaternion &q2, float t, Quaternion *dst)
static Quaternion * multiply(const Quaternion &q1, const Quaternion &q2, Quaternion *dst)
Quaternion(float x, float y, float z, float w)
Definition: CUQuaternion.h:162
Quaternion & operator/=(float s)
Definition: CUQuaternion.h:720
Quaternion & setZero()
Definition: CUQuaternion.h:314
float toAxisAngle(Vec3 *e) const
static Quaternion * scale(const Quaternion &q1, float s, Quaternion *dst)
Quaternion getLerp(const Quaternion &q, float t)
Definition: CUQuaternion.h:1135
Quaternion getNlerp(const Quaternion &q, float t)
Definition: CUQuaternion.h:1185
const Quaternion operator/(float s) const
Definition: CUQuaternion.h:818
Vec3 getRotation(const Vec3 &v)
Definition: CUQuaternion.h:1198
Quaternion & invert()
Definition: CUQuaternion.h:575
float z
Definition: CUQuaternion.h:135
Quaternion & nlerp(const Quaternion &q, float t)
Definition: CUQuaternion.h:1115
static Quaternion * divide(const Quaternion &q1, const Quaternion &q2, Quaternion *dst)
Definition: CUAction.h:51
Definition: CUQuaternion.h:97
Quaternion & add(const Quaternion &q)
Definition: CUQuaternion.h:459
Quaternion getSlerp(const Quaternion &q, float t)
Definition: CUQuaternion.h:1160
static Quaternion * createFromRotationMatrix(const Mat4 &m, Quaternion *dst)