diff --git a/lib/hkStubs/Havok/Common/Base/Math/Vector/hkVector4f.h b/lib/hkStubs/Havok/Common/Base/Math/Vector/hkVector4f.h index 9af511ad..b4504c79 100644 --- a/lib/hkStubs/Havok/Common/Base/Math/Vector/hkVector4f.h +++ b/lib/hkStubs/Havok/Common/Base/Math/Vector/hkVector4f.h @@ -105,6 +105,18 @@ public: template 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); diff --git a/lib/hkStubs/Havok/Common/Base/Math/Vector/hkVector4f.inl b/lib/hkStubs/Havok/Common/Base/Math/Vector/hkVector4f.inl index 88c9379e..b11ce178 100644 --- a/lib/hkStubs/Havok/Common/Base/Math/Vector/hkVector4f.inl +++ b/lib/hkStubs/Havok/Common/Base/Math/Vector/hkVector4f.inl @@ -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);