Havok: Add hkVector4f sign utils

This commit is contained in:
Léo Lam 2022-01-27 19:44:24 +01:00
parent 55eb07087c
commit 469681f9b1
No known key found for this signature in database
GPG Key ID: 0DF30F9081000741
2 changed files with 36 additions and 0 deletions

View File

@ -105,6 +105,18 @@ public:
template <int N>
HK_FORCE_INLINE void setNeg(hkVector4fParameter a);
/// v[i] = mask[i] ? -a[i] : a[i]
HK_FORCE_INLINE void setFlipSign(hkVector4fParameter a, hkVector4fComparisonParameter mask);
/// v[i] = signs[i] < 0 ? -a[i] : a[i]
HK_FORCE_INLINE void setFlipSign(hkVector4fParameter a, hkVector4fParameter signs);
/// v[i] = sign < 0 ? -a[i] : a[i]
HK_FORCE_INLINE void setFlipSign(hkVector4fParameter a, hkSimdFloat32Parameter sign);
/// Whether the sign bit is set. (True for -0.0.)
HK_FORCE_INLINE hkVector4fComparison signBitSet() const;
/// Whether the sign bit is cleared.
HK_FORCE_INLINE hkVector4fComparison signBitClear() const;
// ========== Matrix operations (out-of-line)
void setRotatedDir(const hkMatrix3f& a, hkVector4fParameter b);

View File

@ -347,6 +347,30 @@ inline void hkVector4f::setNeg(hkVector4fParameter a) {
#endif
}
inline void hkVector4f::setFlipSign(hkVector4fParameter a, hkVector4fComparisonParameter mask) {
static constexpr m128u signbits = {0x80000000, 0x80000000, 0x80000000, 0x80000000};
v = m128u(a.v) ^ (mask.m_mask & signbits);
}
inline void hkVector4f::setFlipSign(hkVector4fParameter a, hkVector4fParameter signs) {
static constexpr m128u signbits = {0x80000000, 0x80000000, 0x80000000, 0x80000000};
v = m128u(a.v) ^ (m128u(signs.v) & signbits);
}
inline void hkVector4f::setFlipSign(hkVector4fParameter a, hkSimdFloat32Parameter sign) {
setFlipSign(a, hkVector4fComparison::convert(sign.toQuad()));
}
inline hkVector4fComparison hkVector4f::signBitSet() const {
static constexpr m128u signbits = {0x80000000, 0x80000000, 0x80000000, 0x80000000};
return hkVector4fComparison::convert((m128u(v) & signbits) != m128u());
}
inline hkVector4fComparison hkVector4f::signBitClear() const {
static constexpr m128u signbits = {0x80000000, 0x80000000, 0x80000000, 0x80000000};
return hkVector4fComparison::convert((m128u(v) & signbits) == m128u());
}
inline void hkVector4f::_setRotatedDir(const hkMatrix3f& a, hkVector4fParameter b) {
#ifdef HK_VECTOR4F_AARCH64_NEON
auto col0 = vmulq_laneq_f32(a.m_col0.v, b.v, 0);