|
CUGL 1.3
Cornell University Game Library
|
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
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
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);
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
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) {
float dot(const Quaternion &q) const
Definition: CUQuaternion.h:659
bool operator!=(const Quaternion &q) const
Quaternion & negate()
Definition: CUQuaternion.h:629
Quaternion & add(const Quaternion &q)
Definition: CUQuaternion.h:459
Quaternion getNormalization() const
Definition: CUQuaternion.h:619
Quaternion & slerp(const Quaternion &q, float t)
Definition: CUQuaternion.h:1093
static Quaternion * lerp(const Quaternion &q1, const Quaternion &q2, float t, Quaternion *dst)
static Quaternion * nlerp(const Quaternion &q1, const Quaternion &q2, float t, Quaternion *dst)
bool equals(const Quaternion &q, float variance=CU_MATH_EPSILON) const
Quaternion()
Definition: CUQuaternion.h:152
static Quaternion * subtract(const Quaternion &q1, const Quaternion &q2, Quaternion *dst)
const Quaternion operator/(const Quaternion &q) const
Definition: CUQuaternion.h:836
Quaternion getLerp(const Quaternion &q, float t)
Definition: CUQuaternion.h:1135
Quaternion & scale(float s)
Definition: CUQuaternion.h:521
Quaternion getNegation() const
Definition: CUQuaternion.h:647
bool operator==(const Quaternion &q) const
Quaternion & operator/=(float s)
Definition: CUQuaternion.h:720
static Quaternion * divide(const Quaternion &q1, const Quaternion &q2, Quaternion *dst)
float norm() const
Definition: CUQuaternion.h:890
Quaternion & operator*=(const Quaternion &q)
Definition: CUQuaternion.h:709
Quaternion & setIdentity()
Definition: CUQuaternion.h:296
static Quaternion * createFromRotationMatrix(const Mat4 &m, Quaternion *dst)
Quaternion getSlerp(const Quaternion &q, float t)
Definition: CUQuaternion.h:1160
float w
Definition: CUQuaternion.h:137
Quaternion & set(const Quaternion &q)
Definition: CUQuaternion.h:282
Quaternion & divide(const Quaternion &q)
Definition: CUQuaternion.h:509
bool isNearIdentity(float variance=CU_MATH_EPSILON) const
Definition: CUQuaternion.h:949
float y
Definition: CUQuaternion.h:133
Quaternion & operator/=(const Quaternion &q)
Definition: CUQuaternion.h:735
Quaternion & operator+=(const Quaternion &q)
Definition: CUQuaternion.h:674
const Quaternion operator*(float s) const
Definition: CUQuaternion.h:788
bool isNearZero(float variance=CU_MATH_EPSILON) const
Definition: CUQuaternion.h:929
static const Quaternion ZERO
Definition: CUQuaternion.h:141
const Quaternion operator-(const Quaternion &q) const
Definition: CUQuaternion.h:762
Quaternion & operator*=(float s)
Definition: CUQuaternion.h:696
static const Quaternion IDENTITY
Definition: CUQuaternion.h:143
const Quaternion operator-() const
Definition: CUQuaternion.h:774
static Quaternion * slerp(const Quaternion &q1, const Quaternion &q2, float t, Quaternion *dst)
float z
Definition: CUQuaternion.h:135
static Quaternion * multiply(const Quaternion &q1, const Quaternion &q2, Quaternion *dst)
Vec3 getRotation(const Vec3 &v)
Definition: CUQuaternion.h:1198
const Quaternion operator+(const Quaternion &q) const
Definition: CUQuaternion.h:748
Quaternion & invert()
Definition: CUQuaternion.h:575
Quaternion getNlerp(const Quaternion &q, float t)
Definition: CUQuaternion.h:1185
Quaternion & normalize()
Definition: CUQuaternion.h:605
Quaternion & lerp(const Quaternion &q, float t)
Definition: CUQuaternion.h:1071
float toAxisAngle(Vec3 *e) const
Quaternion & nlerp(const Quaternion &q, float t)
Definition: CUQuaternion.h:1115
const Quaternion operator/(float s) const
Definition: CUQuaternion.h:818
Quaternion & subtract(const Quaternion &q)
Definition: CUQuaternion.h:477
Quaternion & multiply(const Quaternion &q)
Definition: CUQuaternion.h:495
static Quaternion * createFromAxisAngle(const Vec3 &axis, float angle, Quaternion *dst)
float x
Definition: CUQuaternion.h:131
Quaternion(float x, float y, float z, float w)
Definition: CUQuaternion.h:162
Definition: CUQuaternion.h:97
static float dot(const Quaternion &q1, const Quaternion &q2)
Quaternion & setZero()
Definition: CUQuaternion.h:314
static Vec3 * rotate(const Vec3 &v, const Quaternion &quat, Vec3 *dst)
float normSquared() const
Definition: CUQuaternion.h:906
Quaternion & operator=(const float *array)
Definition: CUQuaternion.h:229
std::string toString(bool verbose=false) const
Quaternion & conjugate()
Definition: CUQuaternion.h:537
Quaternion getConjugate() const
Definition: CUQuaternion.h:557
Quaternion & operator-=(const Quaternion &q)
Definition: CUQuaternion.h:685
static Quaternion * add(const Quaternion &q1, const Quaternion &q2, Quaternion *dst)
Quaternion & set(float x, float y, float z, float w)
Definition: CUQuaternion.h:243
const Quaternion operator*(const Quaternion &q) const
Definition: CUQuaternion.h:804
bool isUnit(float variance=CU_MATH_EPSILON) const
Definition: CUQuaternion.h:960
Quaternion getInverse() const
Definition: CUQuaternion.h:592
static Quaternion * scale(const Quaternion &q1, float s, Quaternion *dst)