17#ifndef BT_SIMD__QUATERNION_H_
18#define BT_SIMD__QUATERNION_H_
25#ifdef BT_USE_DOUBLE_PRECISION
26#define btQuaternionData btQuaternionDoubleData
27#define btQuaternionDataName "btQuaternionDoubleData"
29#define btQuaternionData btQuaternionFloatData
30#define btQuaternionDataName "btQuaternionFloatData"
38#define vOnes (_mm_set_ps(1.0f, 1.0f, 1.0f, 1.0f))
42#if defined(BT_USE_SSE)
44#define vQInv (_mm_set_ps(+0.0f, -0.0f, -0.0f, -0.0f))
45#define vPPPM (_mm_set_ps(-0.0f, +0.0f, +0.0f, +0.0f))
47#elif defined(BT_USE_NEON)
60#if (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE))|| defined(BT_USE_NEON)
103#ifndef BT_EULER_DEFAULT_ZYX
186#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE)
188#elif defined(BT_USE_NEON)
203#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE)
205#elif defined(BT_USE_NEON)
220#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE)
224#elif defined(BT_USE_NEON)
240#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE)
266#elif defined(BT_USE_NEON)
323#if defined BT_USE_SIMD_VECTOR3 && defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE)
334#elif defined(BT_USE_NEON)
371#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE)
397#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE)
402#elif defined(BT_USE_NEON)
484#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE)
486#elif defined(BT_USE_NEON)
498#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE)
500#elif defined(BT_USE_NEON)
513#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE)
515#elif defined(BT_USE_NEON)
527#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE)
529#elif defined(BT_USE_NEON)
625#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE)
656#elif defined(BT_USE_NEON)
713#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE)
739#elif defined(BT_USE_NEON)
786 q.w() * w.
x() +
q.y() * w.
z() -
q.z() * w.
y(),
787 q.w() * w.
y() +
q.z() * w.
x() -
q.x() * w.
z(),
788 q.w() * w.
z() +
q.x() * w.
y() -
q.y() * w.
x(),
789 -
q.x() * w.
x() -
q.y() * w.
y() -
q.z() * w.
z());
796#if defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE)
822#elif defined(BT_USE_NEON)
869 +w.
x() *
q.w() + w.
y() *
q.z() - w.
z() *
q.y(),
870 +w.
y() *
q.w() + w.
z() *
q.x() - w.
x() *
q.z(),
871 +w.
z() *
q.w() + w.
x() *
q.y() - w.
y() *
q.x(),
872 -w.
x() *
q.x() - w.
y() *
q.y() - w.
z() *
q.z());
921#if defined BT_USE_SIMD_VECTOR3 && defined (BT_USE_SSE_IN_API) && defined (BT_USE_SSE)
923#elif defined(BT_USE_NEON)
974 for (
int i=0;i<4;i++)
980 for (
int i=0;i<4;i++)
988 for (
int i=0;i<4;i++)
994 for (
int i=0;i<4;i++)
1002 for (
int i=0;i<4;i++)
1008 for (
int i=0;i<4;i++)
const T & btMax(const T &a, const T &b)
btScalar dot(const btQuaternion &q1, const btQuaternion &q2)
Calculate the dot product between two quaternions.
btQuaternion slerp(const btQuaternion &q1, const btQuaternion &q2, const btScalar &t)
Return the result of spherical linear interpolation betwen two quaternions.
btQuaternion shortestArcQuat(const btVector3 &v0, const btVector3 &v1)
btQuaternion shortestArcQuatNormalize2(btVector3 &v0, btVector3 &v1)
btQuaternion inverse(const btQuaternion &q)
Return the inverse of a quaternion.
btVector3 quatRotate(const btQuaternion &rotation, const btVector3 &v)
btQuaternion operator*(const btQuaternion &q1, const btQuaternion &q2)
Return the product of two quaternions.
btScalar length(const btQuaternion &q)
Return the length of a quaternion.
btScalar btAngle(const btQuaternion &q1, const btQuaternion &q2)
Return the angle between two quaternions.
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
#define ATTRIBUTE_ALIGNED16(a)
btScalar btSqrt(btScalar y)
btScalar btAtan2(btScalar x, btScalar y)
btScalar btSin(btScalar x)
btScalar btFabs(btScalar x)
#define SIMD_FORCE_INLINE
btScalar btCos(btScalar x)
btScalar btAcos(btScalar x)
btScalar btAsin(btScalar x)
static T sum(const btAlignedObjectArray< T > &items)
void btPlaneSpace1(const T &n, T &p, T &q)
The btQuadWord class is base class for btVector3 and btQuaternion.
const btScalar & z() const
Return the z value.
const btScalar & y() const
Return the y value.
void setValue(const btScalar &_x, const btScalar &_y, const btScalar &_z)
Set x,y,z and zero w.
const btScalar & x() const
Return the x value.
The btQuaternion implements quaternion to perform linear algebra rotations in combination with btMatr...
btQuaternion operator-(const btQuaternion &q2) const
Return the difference between this quaternion and the other.
btQuaternion operator/(const btScalar &s) const
Return an inversely scaled versionof this quaternion.
btQuaternion slerp(const btQuaternion &q, const btScalar &t) const
Return the quaternion which is the result of Spherical Linear Interpolation between this and the othe...
btQuaternion operator*(const btScalar &s) const
Return a scaled version of this quaternion.
void getEulerZYX(btScalar &yawZ, btScalar &pitchY, btScalar &rollX) const
Get the euler angles from this quaternion.
btScalar angleShortestPath(const btQuaternion &q) const
Return the angle between this quaternion and the other along the shortest path.
void deSerializeFloat(const struct btQuaternionFloatData &dataIn)
static const btQuaternion & getIdentity()
btQuaternion & operator*=(const btQuaternion &q)
Multiply this quaternion by q on the right.
btScalar length() const
Return the length of the quaternion.
btQuaternion(const btVector3 &_axis, const btScalar &_angle)
Axis angle Constructor.
btQuaternion farthest(const btQuaternion &qd) const
void deSerialize(const struct btQuaternionData &dataIn)
btQuaternion()
No initialization constructor.
const btScalar & getW() const
btScalar dot(const btQuaternion &q) const
Return the dot product between this quaternion and another.
void serialize(struct btQuaternionData &dataOut) const
void deSerializeDouble(const struct btQuaternionDoubleData &dataIn)
btScalar getAngle() const
Return the angle [0, 2Pi] of rotation represented by this quaternion.
void serializeDouble(struct btQuaternionDoubleData &dataOut) const
btQuaternion operator+(const btQuaternion &q2) const
Return the sum of this quaternion and the other.
btQuaternion(const btScalar &_x, const btScalar &_y, const btScalar &_z, const btScalar &_w)
Constructor from scalars.
btScalar angle(const btQuaternion &q) const
Return the half angle between this quaternion and the other.
btQuaternion nearest(const btQuaternion &qd) const
btQuaternion & operator*=(const btScalar &s)
Scale this quaternion.
btQuaternion(const btScalar &yaw, const btScalar &pitch, const btScalar &roll)
Constructor from Euler angles.
btScalar length2() const
Return the length squared of the quaternion.
btQuaternion normalized() const
Return a normalized version of this quaternion.
btQuaternion operator-() const
Return the negative of this quaternion This simply negates each element.
btQuaternion & safeNormalize()
btQuaternion inverse() const
Return the inverse of this quaternion.
btQuaternion & operator/=(const btScalar &s)
Inversely scale this quaternion.
btScalar getAngleShortestPath() const
Return the angle [0, Pi] of rotation represented by this quaternion along the shortest path.
btQuaternion & operator-=(const btQuaternion &q)
Subtract out a quaternion.
btVector3 getAxis() const
Return the axis of the rotation represented by this quaternion.
void setRotation(const btVector3 &axis, const btScalar &_angle)
Set the rotation using axis angle notation.
void setEulerZYX(const btScalar &yawZ, const btScalar &pitchY, const btScalar &rollX)
Set the quaternion using euler angles.
btQuaternion & normalize()
Normalize the quaternion Such that x^2 + y^2 + z^2 +w^2 = 1.
void setEuler(const btScalar &yaw, const btScalar &pitch, const btScalar &roll)
Set the quaternion using Euler angles.
btQuaternion & operator+=(const btQuaternion &q)
Add two quaternions.
void serializeFloat(struct btQuaternionFloatData &dataOut) const
btVector3 can be used to represent 3D points and vectors.
const btScalar & getZ() const
Return the z value.
const btScalar & z() const
Return the z value.
btScalar length() const
Return the length of the vector.
btVector3 cross(const btVector3 &v) const
Return the cross product between this and another vector.
btScalar dot(const btVector3 &v) const
Return the dot product.
const btScalar & getY() const
Return the y value.
const btScalar & x() const
Return the x value.
btVector3 & normalize()
Normalize this vector x^2 + y^2 + z^2 = 1.
const btScalar & getX() const
Return the x value.
const btScalar & y() const
Return the y value.