28#ifndef OZZ_OZZ_BASE_MATHS_SOA_QUATERNION_H_
29#define OZZ_OZZ_BASE_MATHS_SOA_QUATERNION_H_
33#include "ozz/base/maths/soa_float.h"
34#include "ozz/base/platform.h"
52 const SoaQuaternion r = {zero, zero, zero, simd_float4::one()};
65OZZ_INLINE SoaQuaternion operator-(
const SoaQuaternion& _q) {
66 const SoaQuaternion r = {-_q.x, -_q.y, -_q.z, -_q.w};
71OZZ_INLINE SimdFloat4 Dot(
const SoaQuaternion& _a,
const SoaQuaternion& _b) {
72 return _a.x * _b.x + _a.y * _b.y + _a.z * _b.z + _a.w * _b.w;
76OZZ_INLINE SoaQuaternion Normalize(
const SoaQuaternion& _q) {
77 const SimdFloat4 len2 = _q.x * _q.x + _q.y * _q.y + _q.z * _q.z + _q.w * _q.w;
78 const SimdFloat4 inv_len = math::simd_float4::one() / Sqrt(len2);
79 const SoaQuaternion r = {_q.x * inv_len, _q.y * inv_len, _q.z * inv_len,
85OZZ_INLINE SoaQuaternion NormalizeEst(
const SoaQuaternion& _q) {
86 const SimdFloat4 len2 = _q.x * _q.x + _q.y * _q.y + _q.z * _q.z + _q.w * _q.w;
89 const SimdFloat4 inv_len = RSqrtEstNR(len2);
90 const SoaQuaternion r = {_q.x * inv_len, _q.y * inv_len, _q.z * inv_len,
96OZZ_INLINE SimdInt4 IsNormalized(
const SoaQuaternion& _q) {
97 const SimdFloat4 len2 = _q.x * _q.x + _q.y * _q.y + _q.z * _q.z + _q.w * _q.w;
98 return CmpLt(Abs(len2 - math::simd_float4::one()),
99 simd_float4::Load1(kNormalizationToleranceSq));
103OZZ_INLINE SimdInt4 IsNormalizedEst(
const SoaQuaternion& _q) {
104 const SimdFloat4 len2 = _q.x * _q.x + _q.y * _q.y + _q.z * _q.z + _q.w * _q.w;
105 return CmpLt(Abs(len2 - math::simd_float4::one()),
106 simd_float4::Load1(kNormalizationToleranceEstSq));
111OZZ_INLINE SoaQuaternion Lerp(
const SoaQuaternion& _a,
const SoaQuaternion& _b,
113 const SoaQuaternion r = {(_b.x - _a.x) * _f + _a.x, (_b.y - _a.y) * _f + _a.y,
114 (_b.z - _a.z) * _f + _a.z,
115 (_b.w - _a.w) * _f + _a.w};
121OZZ_INLINE SoaQuaternion NLerp(
const SoaQuaternion& _a,
const SoaQuaternion& _b,
123 const SoaFloat4
lerp = {(_b.x - _a.x) * _f + _a.x, (_b.y - _a.y) * _f + _a.y,
124 (_b.z - _a.z) * _f + _a.z, (_b.w - _a.w) * _f + _a.w};
125 const SimdFloat4 len2 =
127 const SimdFloat4 inv_len = math::simd_float4::one() / Sqrt(len2);
128 const SoaQuaternion r = {
lerp.x * inv_len,
lerp.y * inv_len,
lerp.z * inv_len,
135OZZ_INLINE SoaQuaternion NLerpEst(
const SoaQuaternion& _a,
136 const SoaQuaternion& _b, _SimdFloat4 _f) {
137 const SoaFloat4
lerp = {(_b.x - _a.x) * _f + _a.x, (_b.y - _a.y) * _f + _a.y,
138 (_b.z - _a.z) * _f + _a.z, (_b.w - _a.w) * _f + _a.w};
139 const SimdFloat4 len2 =
143 const SimdFloat4 inv_len = RSqrtEstNR(len2);
144 const SoaQuaternion r = {
lerp.x * inv_len,
lerp.y * inv_len,
lerp.z * inv_len,
172 _a.w * _b.x + _a.x * _b.w + _a.y * _b.z - _a.z * _b.y,
173 _a.w * _b.y + _a.y * _b.w + _a.z * _b.x - _a.x * _b.z,
174 _a.w * _b.z + _a.z * _b.w + _a.x * _b.y - _a.y * _b.x,
175 _a.w * _b.w - _a.x * _b.x - _a.y * _b.y - _a.z * _b.z};
187 return ozz::math::And(ozz::math::And(ozz::math::And(x, y), z), w);
GLM_FUNC_DECL qua< T, Q > lerp(qua< T, Q > const &x, qua< T, Q > const &y, T a)
Definition quaternion_common.inl:29
Definition simd_math_config.h:121
Definition simd_math_config.h:129
Definition soa_quaternion.h:39