15#ifndef BT_SIMD__QUATERNION_H_
16#define BT_SIMD__QUATERNION_H_
21#ifdef BT_USE_DOUBLE_PRECISION
22#define btQuaternionData btQuaternionDoubleData
23#define btQuaternionDataName "btQuaternionDoubleData"
25#define btQuaternionData btQuaternionFloatData
26#define btQuaternionDataName "btQuaternionFloatData"
32#define vOnes (_mm_set_ps(1.0f, 1.0f, 1.0f, 1.0f))
36#if defined(BT_USE_SSE)
38#define vQInv (_mm_set_ps(+0.0f, -0.0f, -0.0f, -0.0f))
39#define vPPPM (_mm_set_ps(-0.0f, +0.0f, +0.0f, +0.0f))
41#elif defined(BT_USE_NEON)
55#if (defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)) || defined(BT_USE_NEON)
99#ifndef BT_EULER_DEFAULT_ZYX
202#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
204#elif defined(BT_USE_NEON)
219#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
221#elif defined(BT_USE_NEON)
236#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
240#elif defined(BT_USE_NEON)
256#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
282#elif defined(BT_USE_NEON)
339#if defined BT_USE_SIMD_VECTOR3 && defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
350#elif defined(BT_USE_NEON)
387#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
413#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
418#elif defined(BT_USE_NEON)
499#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
501#elif defined(BT_USE_NEON)
513#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
515#elif defined(BT_USE_NEON)
528#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
530#elif defined(BT_USE_NEON)
542#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
544#elif defined(BT_USE_NEON)
635#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
666#elif defined(BT_USE_NEON)
723#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
749#elif defined(BT_USE_NEON)
796 q.w() * w.
x() +
q.y() * w.
z() -
q.z() * w.
y(),
797 q.w() * w.
y() +
q.z() * w.
x() -
q.x() * w.
z(),
798 q.w() * w.
z() +
q.x() * w.
y() -
q.y() * w.
x(),
799 -
q.x() * w.
x() -
q.y() * w.
y() -
q.z() * w.
z());
806#if defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
832#elif defined(BT_USE_NEON)
879 +w.
x() *
q.w() + w.
y() *
q.z() - w.
z() *
q.y(),
880 +w.
y() *
q.w() + w.
z() *
q.x() - w.
x() *
q.z(),
881 +w.
z() *
q.w() + w.
x() *
q.y() - w.
y() *
q.x(),
882 -w.
x() *
q.x() - w.
y() *
q.y() - w.
z() *
q.z());
930#if defined BT_USE_SIMD_VECTOR3 && defined(BT_USE_SSE_IN_API) && defined(BT_USE_SSE)
932#elif defined(BT_USE_NEON)
979 for (
int i = 0; i < 4; i++)
985 for (
int i = 0; i < 4; i++)
992 for (
int i = 0; i < 4; i++)
998 for (
int i = 0; i < 4; i++)
1005 for (
int i = 0; i < 4; i++)
1011 for (
int i = 0; i < 4; i++)
1017 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
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 deSerialize(const struct btQuaternionFloatData &dataIn)
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.