25#elif defined(USE_SIMD_APPLE)
27#elif defined(USE_SIMD_NEON)
43 explicit Quaternion(__m128 simd) : simd(simd) {}
44#elif defined(USE_SIMD_APPLE)
45 explicit Quaternion(
const simd_quatf& simd) : simd(simd) {}
46#elif defined(USE_SIMD_NEON)
47 explicit Quaternion(float32x4_t simd) : simd(simd) {}
50 [[nodiscard]]
float getX()
const
52#if defined(USE_SIMD_SSE)
53 return _mm_cvtss_f32(simd);
54#elif defined(USE_SIMD_APPLE)
56#elif defined(USE_SIMD_NEON)
57 return vgetq_lane_f32(simd, 0);
63 [[nodiscard]]
float getY()
const
65#if defined(USE_SIMD_SSE)
66 return _mm_cvtss_f32(_mm_shuffle_ps(simd, simd, _MM_SHUFFLE(1, 1, 1, 1)));
67#elif defined(USE_SIMD_APPLE)
69#elif defined(USE_SIMD_NEON)
70 return vgetq_lane_f32(simd, 1);
76 [[nodiscard]]
float getZ()
const
78#if defined(USE_SIMD_SSE)
79 return _mm_cvtss_f32(_mm_shuffle_ps(simd, simd, _MM_SHUFFLE(2, 2, 2, 2)));
80#elif defined(USE_SIMD_APPLE)
82#elif defined(USE_SIMD_NEON)
83 return vgetq_lane_f32(simd, 2);
89 [[nodiscard]]
float getW()
const
91#if defined(USE_SIMD_SSE)
92 return _mm_cvtss_f32(_mm_shuffle_ps(simd, simd, _MM_SHUFFLE(3, 3, 3, 3)));
93#elif defined(USE_SIMD_APPLE)
95#elif defined(USE_SIMD_NEON)
96 return vgetq_lane_f32(simd, 3);
131 return os <<
"Quaternion(" <<
q.getX() <<
", " <<
q.getY() <<
", " <<
q.getZ() <<
", " <<
q.getW() <<
")";
151#include "quaternion.inl"
4x4 column-major transformation matrix with SIMD acceleration.
Quaternion operator*(const Quaternion &rhs) const
Vector3 operator*(const Vector3 &v) const
friend std::ostream & operator<<(std::ostream &os, const Quaternion &q)
static Quaternion fromEulerAngles(float ax, float ay, float az)
float lengthSquared() const
Quaternion invert() const
Matrix4 toRotationMatrix() const
Quaternion conjugate() const
static Quaternion fromAxisAngle(const Vector3 &axis, float angle)
static Quaternion fromMatrix4(const Matrix4 &m)
Quaternion(float x, float y, float z, float w)
Quaternion operator*(const float scalar) const
Quaternion normalized() const
3D vector for positions, directions, and normals with multi-backend SIMD acceleration.