Path: blob/master/thirdparty/jolt_physics/Jolt/Math/UVec4.h
9913 views
// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)1// SPDX-FileCopyrightText: 2021 Jorrit Rouwe2// SPDX-License-Identifier: MIT34#pragma once56#include <Jolt/Math/Vec4.h>78JPH_NAMESPACE_BEGIN910class [[nodiscard]] alignas(JPH_VECTOR_ALIGNMENT) UVec411{12public:13JPH_OVERRIDE_NEW_DELETE1415// Underlying vector type16#if defined(JPH_USE_SSE)17using Type = __m128i;18#elif defined(JPH_USE_NEON)19using Type = uint32x4_t;20#else21using Type = struct { uint32 mData[4]; };22#endif2324/// Constructor25UVec4() = default; ///< Intentionally not initialized for performance reasons26UVec4(const UVec4 &inRHS) = default;27UVec4 & operator = (const UVec4 &inRHS) = default;28JPH_INLINE UVec4(Type inRHS) : mValue(inRHS) { }2930/// Create a vector from 4 integer components31JPH_INLINE UVec4(uint32 inX, uint32 inY, uint32 inZ, uint32 inW);3233/// Comparison34JPH_INLINE bool operator == (UVec4Arg inV2) const;35JPH_INLINE bool operator != (UVec4Arg inV2) const { return !(*this == inV2); }3637/// Swizzle the elements in inV38template<uint32 SwizzleX, uint32 SwizzleY, uint32 SwizzleZ, uint32 SwizzleW>39JPH_INLINE UVec4 Swizzle() const;4041/// Vector with all zeros42static JPH_INLINE UVec4 sZero();4344/// Replicate int inV across all components45static JPH_INLINE UVec4 sReplicate(uint32 inV);4647/// Load 1 int from memory and place it in the X component, zeros Y, Z and W48static JPH_INLINE UVec4 sLoadInt(const uint32 *inV);4950/// Load 4 ints from memory51static JPH_INLINE UVec4 sLoadInt4(const uint32 *inV);5253/// Load 4 ints from memory, aligned to 16 bytes54static JPH_INLINE UVec4 sLoadInt4Aligned(const uint32 *inV);5556/// Gather 4 ints from memory at inBase + inOffsets[i] * Scale57template <const int Scale>58static JPH_INLINE UVec4 sGatherInt4(const uint32 *inBase, UVec4Arg inOffsets);5960/// Return the minimum value of each of the components61static JPH_INLINE UVec4 sMin(UVec4Arg inV1, UVec4Arg inV2);6263/// Return the maximum of each of the components64static JPH_INLINE UVec4 sMax(UVec4Arg inV1, UVec4Arg inV2);6566/// Equals (component wise)67static JPH_INLINE UVec4 sEquals(UVec4Arg inV1, UVec4Arg inV2);6869/// Component wise select, returns inNotSet when highest bit of inControl = 0 and inSet when highest bit of inControl = 170static JPH_INLINE UVec4 sSelect(UVec4Arg inNotSet, UVec4Arg inSet, UVec4Arg inControl);7172/// Logical or (component wise)73static JPH_INLINE UVec4 sOr(UVec4Arg inV1, UVec4Arg inV2);7475/// Logical xor (component wise)76static JPH_INLINE UVec4 sXor(UVec4Arg inV1, UVec4Arg inV2);7778/// Logical and (component wise)79static JPH_INLINE UVec4 sAnd(UVec4Arg inV1, UVec4Arg inV2);8081/// Logical not (component wise)82static JPH_INLINE UVec4 sNot(UVec4Arg inV1);8384/// Sorts the elements in inIndex so that the values that correspond to trues in inValue are the first elements.85/// The remaining elements will be set to inValue.w.86/// I.e. if inValue = (true, false, true, false) and inIndex = (1, 2, 3, 4) the function returns (1, 3, 4, 4).87static JPH_INLINE UVec4 sSort4True(UVec4Arg inValue, UVec4Arg inIndex);8889/// Get individual components90#if defined(JPH_USE_SSE)91JPH_INLINE uint32 GetX() const { return uint32(_mm_cvtsi128_si32(mValue)); }92JPH_INLINE uint32 GetY() const { return mU32[1]; }93JPH_INLINE uint32 GetZ() const { return mU32[2]; }94JPH_INLINE uint32 GetW() const { return mU32[3]; }95#elif defined(JPH_USE_NEON)96JPH_INLINE uint32 GetX() const { return vgetq_lane_u32(mValue, 0); }97JPH_INLINE uint32 GetY() const { return vgetq_lane_u32(mValue, 1); }98JPH_INLINE uint32 GetZ() const { return vgetq_lane_u32(mValue, 2); }99JPH_INLINE uint32 GetW() const { return vgetq_lane_u32(mValue, 3); }100#else101JPH_INLINE uint32 GetX() const { return mU32[0]; }102JPH_INLINE uint32 GetY() const { return mU32[1]; }103JPH_INLINE uint32 GetZ() const { return mU32[2]; }104JPH_INLINE uint32 GetW() const { return mU32[3]; }105#endif106107/// Set individual components108JPH_INLINE void SetX(uint32 inX) { mU32[0] = inX; }109JPH_INLINE void SetY(uint32 inY) { mU32[1] = inY; }110JPH_INLINE void SetZ(uint32 inZ) { mU32[2] = inZ; }111JPH_INLINE void SetW(uint32 inW) { mU32[3] = inW; }112113/// Get component by index114JPH_INLINE uint32 operator [] (uint inCoordinate) const { JPH_ASSERT(inCoordinate < 4); return mU32[inCoordinate]; }115JPH_INLINE uint32 & operator [] (uint inCoordinate) { JPH_ASSERT(inCoordinate < 4); return mU32[inCoordinate]; }116117/// Multiplies each of the 4 integer components with an integer (discards any overflow)118JPH_INLINE UVec4 operator * (UVec4Arg inV2) const;119120/// Adds an integer value to all integer components (discards any overflow)121JPH_INLINE UVec4 operator + (UVec4Arg inV2);122123/// Add two integer vectors (component wise)124JPH_INLINE UVec4 & operator += (UVec4Arg inV2);125126/// Replicate the X component to all components127JPH_INLINE UVec4 SplatX() const;128129/// Replicate the Y component to all components130JPH_INLINE UVec4 SplatY() const;131132/// Replicate the Z component to all components133JPH_INLINE UVec4 SplatZ() const;134135/// Replicate the W component to all components136JPH_INLINE UVec4 SplatW() const;137138/// Convert each component from an int to a float139JPH_INLINE Vec4 ToFloat() const;140141/// Reinterpret UVec4 as a Vec4 (doesn't change the bits)142JPH_INLINE Vec4 ReinterpretAsFloat() const;143144/// Store 4 ints to memory145JPH_INLINE void StoreInt4(uint32 *outV) const;146147/// Store 4 ints to memory, aligned to 16 bytes148JPH_INLINE void StoreInt4Aligned(uint32 *outV) const;149150/// Test if any of the components are true (true is when highest bit of component is set)151JPH_INLINE bool TestAnyTrue() const;152153/// Test if any of X, Y or Z components are true (true is when highest bit of component is set)154JPH_INLINE bool TestAnyXYZTrue() const;155156/// Test if all components are true (true is when highest bit of component is set)157JPH_INLINE bool TestAllTrue() const;158159/// Test if X, Y and Z components are true (true is when highest bit of component is set)160JPH_INLINE bool TestAllXYZTrue() const;161162/// Count the number of components that are true (true is when highest bit of component is set)163JPH_INLINE int CountTrues() const;164165/// Store if X is true in bit 0, Y in bit 1, Z in bit 2 and W in bit 3 (true is when highest bit of component is set)166JPH_INLINE int GetTrues() const;167168/// Shift all components by Count bits to the left (filling with zeros from the left)169template <const uint Count>170JPH_INLINE UVec4 LogicalShiftLeft() const;171172/// Shift all components by Count bits to the right (filling with zeros from the right)173template <const uint Count>174JPH_INLINE UVec4 LogicalShiftRight() const;175176/// Shift all components by Count bits to the right (shifting in the value of the highest bit)177template <const uint Count>178JPH_INLINE UVec4 ArithmeticShiftRight() const;179180/// Takes the lower 4 16 bits and expands them to X, Y, Z and W181JPH_INLINE UVec4 Expand4Uint16Lo() const;182183/// Takes the upper 4 16 bits and expands them to X, Y, Z and W184JPH_INLINE UVec4 Expand4Uint16Hi() const;185186/// Takes byte 0 .. 3 and expands them to X, Y, Z and W187JPH_INLINE UVec4 Expand4Byte0() const;188189/// Takes byte 4 .. 7 and expands them to X, Y, Z and W190JPH_INLINE UVec4 Expand4Byte4() const;191192/// Takes byte 8 .. 11 and expands them to X, Y, Z and W193JPH_INLINE UVec4 Expand4Byte8() const;194195/// Takes byte 12 .. 15 and expands them to X, Y, Z and W196JPH_INLINE UVec4 Expand4Byte12() const;197198/// Shift vector components by 4 - Count floats to the left, so if Count = 1 the resulting vector is (W, 0, 0, 0), when Count = 3 the resulting vector is (Y, Z, W, 0)199JPH_INLINE UVec4 ShiftComponents4Minus(int inCount) const;200201/// To String202friend ostream & operator << (ostream &inStream, UVec4Arg inV)203{204inStream << inV.mU32[0] << ", " << inV.mU32[1] << ", " << inV.mU32[2] << ", " << inV.mU32[3];205return inStream;206}207208union209{210Type mValue;211uint32 mU32[4];212};213};214215static_assert(std::is_trivial<UVec4>(), "Is supposed to be a trivial type!");216217JPH_NAMESPACE_END218219#include "UVec4.inl"220221222