70    static_assert(
sizeof(
VertexData) == 8, 
"Compiler added padding");
 
   79    static_assert(
sizeof(
TriangleBlock) == 16, 
"Compiler added padding");
 
  107            mVertices(inVertices)
 
  119            UVec4 quantized_vertex[3];
 
  121            for (
int i = 0; i < 3; ++i)
 
  123            return quantized_vertex[0] == quantized_vertex[1] || quantized_vertex[1] == quantized_vertex[2] || quantized_vertex[0] == quantized_vertex[2];
 
  137            mVertexMap(inVertices.size(), 0xffffffff) 
 
  159            mNumTriangles += tri_count;
 
  165            uint start_vertex = 
Clamp((
int)mVertices.
size() - 256 + (
int)tri_count * 3, 0, (
int)mVertices.
size());
 
  173            uint padded_triangle_count = 
AlignUp(tri_count, 4);
 
  176                uint32 num_blocks = padded_triangle_count >> 2;
 
  182            for (
uint t = 0; t < padded_triangle_count; t += 4)
 
  185                for (
uint vertex_nr = 0; vertex_nr < 3; ++vertex_nr)
 
  186                    for (
uint block_tri_idx = 0; block_tri_idx < 4; ++block_tri_idx)
 
  189                        bool triangle_available = t + block_tri_idx < tri_count;
 
  190                        uint32 src_vertex_index = triangle_available? inTriangles[t + block_tri_idx].mIdx[vertex_nr] : inTriangles[tri_count - 1].mIdx[0];
 
  193                        uint32 &vertex_index = mVertexMap[src_vertex_index];
 
  194                        if (vertex_index == 0xffffffff || vertex_index < start_vertex)
 
  202                        uint32 vertex_offset = vertex_index - start_vertex;
 
  203                        if (vertex_offset > 0xff)
 
  205                            outError = 
"TriangleCodecIndexed8BitPackSOA4Flags: Offset doesn't fit in 8 bit";
 
  208                        block->
mIndices[vertex_nr][block_tri_idx] = (
uint8)vertex_offset;
 
  211                        uint32 flags = triangle_available? inTriangles[t + block_tri_idx].mMaterialIndex : 0;
 
  214                            outError = 
"TriangleCodecIndexed8BitPackSOA4Flags: Material index doesn't fit in 8 bit";
 
  225                for (
uint t = 0; t < tri_count; ++t)
 
  226                    user_data[t] = inTriangles[t].mUserData;
 
  236            if (mVertices.
empty())
 
  243            for (
uint o : mOffsetsToPatch)
 
  246                uint32 delta = vertices_idx - o;
 
  248                    JPH_ASSERT(
false, 
"Offset to vertices doesn't fit");
 
  254            for (
uint32 v : mVertices)
 
  260            for (
uint32 v : mVertices)
 
  279        uint                        mNumTriangles = 0;
 
  281        VertexMap                   mVertexMap;             
 
  293            UVec4 c1 = UVec4::sGatherInt4<8>(&inVertices->
mVertexXY, inIndex);
 
  294            UVec4 c2 = UVec4::sGatherInt4<8>(&inVertices->
mVertexZY, inIndex);
 
  309            mOffsetX(
Vec4::sReplicate(inHeader->mOffset.x)),
 
  310            mOffsetY(
Vec4::sReplicate(inHeader->mOffset.y)),
 
  311            mOffsetZ(
Vec4::sReplicate(inHeader->mOffset.z)),
 
  312            mScaleX(
Vec4::sReplicate(inHeader->mScale.x)),
 
  313            mScaleY(
Vec4::sReplicate(inHeader->mScale.y)),
 
  314            mScaleZ(
Vec4::sReplicate(inHeader->mScale.z))
 
  319        JPH_INLINE 
void             Unpack(
const void *inTriangleStart, 
uint32 inNumTriangles, 
Vec3 *outTriangles)
 const 
  327            int triangles_left = inNumTriangles;
 
  338                Vec4 v1x, v1y, v1z, v2x, v2y, v2z, v3x, v3y, v3z;
 
  339                Unpack(vertices, iv1, v1x, v1y, v1z);
 
  340                Unpack(vertices, iv2, v2x, v2y, v2z);
 
  341                Unpack(vertices, iv3, v3x, v3y, v3z);
 
  349                for (
int i = 0; i < 4 && triangles_left > 0; ++i, --triangles_left)
 
  362        JPH_INLINE 
float            TestRay(
Vec3Arg inRayOrigin, 
Vec3Arg inRayDirection, 
const void *inTriangleStart, 
uint32 inNumTriangles, 
float inClosest, 
uint32 &outClosestTriangleIndex)
 const 
  383                Vec4 v1x, v1y, v1z, v2x, v2y, v2z, v3x, v3y, v3z;
 
  384                Unpack(vertices, iv1, v1x, v1y, v1z);
 
  385                Unpack(vertices, iv2, v2x, v2y, v2z);
 
  386                Unpack(vertices, iv3, v3x, v3y, v3z);
 
  389                Vec4 distance = 
RayTriangle4(inRayOrigin, inRayDirection, v1x, v1y, v1z, v2x, v2y, v2z, v3x, v3y, v3z);
 
  396                UVec4 triangle_idx = start_triangle_idx + 
UVec4(0, 1, 2, 3);
 
  397                closest_triangle_idx = 
UVec4::sSelect(closest_triangle_idx, triangle_idx, smaller);
 
  407            outClosestTriangleIndex = closest_triangle_idx.
GetX();
 
  408            return closest.
GetX();
 
  417            uint32 block_triangle_idx = inTriangleIdx & 0b11;
 
  450            return user_data != 
nullptr? user_data[inTriangleIdx] : 0;
 
  461            int triangles_left = inNumTriangles;
 
  464                for (
int i = 0; i < 4 && triangles_left > 0; ++i, --triangles_left)
 
  465                    *outTriangleFlags++ = t->
mFlags[i];
 
  473        JPH_INLINE 
static uint8     sGetFlags(
const void *inTriangleStart, 
int inTriangleIndex)
 
  477            return first_block[inTriangleIndex >> 2].
mFlags[inTriangleIndex & 0b11];
 
  481        JPH_INLINE 
void             Unpack(
const void *inTriangleStart, 
uint32 inNumTriangles, 
Vec3 *outTriangles, 
uint8 *outTriangleFlags)
 const 
  483            Unpack(inTriangleStart, inNumTriangles, outTriangles);
 
  484            sGetFlags(inTriangleStart, inNumTriangles, outTriangleFlags);
 
std::uint8_t uint8
Definition: Core.h:453
 
unsigned int uint
Definition: Core.h:452
 
#define JPH_NAMESPACE_END
Definition: Core.h:378
 
std::uint32_t uint32
Definition: Core.h:455
 
#define JPH_NAMESPACE_BEGIN
Definition: Core.h:372
 
#define JPH_ASSERT(...)
Definition: IssueReporting.h:33
 
JPH_INLINE constexpr T Clamp(T inV, T inMin, T inMax)
Clamp a value between two values.
Definition: Math.h:45
 
T AlignUp(T inV, uint64 inAlignment)
Align inV up to the next inAlignment bytes.
Definition: Math.h:80
 
JPH_INLINE Vec4 RayTriangle4(Vec3Arg inOrigin, Vec3Arg inDirection, Vec4Arg inV0X, Vec4Arg inV0Y, Vec4Arg inV0Z, Vec4Arg inV1X, Vec4Arg inV1Y, Vec4Arg inV1Z, Vec4Arg inV2X, Vec4Arg inV2Y, Vec4Arg inV2Z)
Intersect ray with 4 triangles in SOA format, returns 4 vector of closest points or FLT_MAX if no hit...
Definition: RayTriangle.h:76
 
Axis aligned box.
Definition: AABox.h:16
 
Vec3 GetSize() const
Get size of bounding box.
Definition: AABox.h:117
 
Vec3 mMin
Bounding box min and max.
Definition: AABox.h:300
 
void Encapsulate(Vec3Arg inPos)
Encapsulate point in bounding box.
Definition: AABox.h:53
 
bool empty() const
Returns true if there are no elements in the array.
Definition: Array.h:312
 
size_type size() const
Returns amount of elements in the array.
Definition: Array.h:318
 
void push_back(const T &inValue)
Add element to the back of the array.
Definition: Array.h:275
 
void reserve(size_type inNewSize)
Reserve array space.
Definition: Array.h:111
 
Simple byte buffer, aligned to a cache line.
Definition: ByteBuffer.h:16
 
Type * Allocate(size_t inSize=1)
Allocate block of data of inSize elements and return the pointer.
Definition: ByteBuffer.h:33
 
size_t Align(size_t inSize)
Align the size to a multiple of inSize, returns the length after alignment.
Definition: ByteBuffer.h:19
 
const Type * Get(size_t inPosition) const
Get object at inPosition (an offset in bytes)
Definition: ByteBuffer.h:61
 
Class that holds 3 floats. Used as a storage class. Convert to Vec3 for calculations.
Definition: Float3.h:13
 
Triangle with 32-bit indices and material index.
Definition: IndexedTriangle.h:73
 
uint32 mIdx[3]
Definition: IndexedTriangle.h:68
 
Holds a 4x4 matrix of floats, but supports also operations on the 3x3 upper left part of the matrix.
Definition: Mat44.h:13
 
JPH_INLINE Vec3 GetAxisY() const
Definition: Mat44.h:148
 
JPH_INLINE Vec3 GetAxisZ() const
Definition: Mat44.h:150
 
JPH_INLINE Mat44 Transposed() const
Transpose matrix.
Definition: Mat44.inl:467
 
JPH_INLINE Vec3 GetColumn3(uint inCol) const
Definition: Mat44.h:158
 
JPH_INLINE Vec3 GetAxisX() const
Access to the columns.
Definition: Mat44.h:146
 
This class is used to decode and decompress triangle data packed by the EncodingContext.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:287
 
void GetTriangle(const void *inTriangleStart, uint32 inTriangleIdx, Vec3 &outV1, Vec3 &outV2, Vec3 &outV3) const
Decode a single triangle.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:412
 
static JPH_INLINE uint8 sGetFlags(const void *inTriangleStart, int inTriangleIndex)
Get flags for a particular triangle.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:473
 
static JPH_INLINE void sGetFlags(const void *inTriangleStart, uint32 inNumTriangles, uint8 *outTriangleFlags)
Get flags for entire triangle block.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:454
 
JPH_INLINE uint32 GetUserData(const void *inTriangleStart, uint32 inTriangleIdx) const
Get user data for a triangle.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:446
 
JPH_INLINE void Unpack(const void *inTriangleStart, uint32 inNumTriangles, Vec3 *outTriangles, uint8 *outTriangleFlags) const
Unpacks triangles and flags, convenience function.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:481
 
JPH_INLINE void Unpack(const void *inTriangleStart, uint32 inNumTriangles, Vec3 *outTriangles) const
Unpacks triangles in the format t1v1,t1v2,t1v3, t2v1,t2v2,t2v3, ...
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:319
 
JPH_INLINE float TestRay(Vec3Arg inRayOrigin, Vec3Arg inRayDirection, const void *inTriangleStart, uint32 inNumTriangles, float inClosest, uint32 &outClosestTriangleIndex) const
Tests a ray against the packed triangles.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:362
 
JPH_INLINE DecodingContext(const TriangleHeader *inHeader)
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:308
 
This class is used to encode and compress triangle data into a byte buffer.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:133
 
EncodingContext(const VertexList &inVertices)
Construct the encoding context.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:136
 
void Finalize(const VertexList &inVertices, TriangleHeader *ioHeader, ByteBuffer &ioBuffer) const
After all triangles have been packed, this finalizes the header and triangle buffer.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:233
 
uint Pack(const IndexedTriangleList &inTriangles, bool inStoreUserData, ByteBuffer &ioBuffer, const char *&outError)
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:152
 
uint GetPessimisticMemoryEstimate(uint inTriangleCount, bool inStoreUserData) const
Get an upper bound on the amount of bytes needed to store inTriangleCount triangles.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:144
 
This class is used to validate that the triangle data will not be degenerate after compression.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:103
 
bool IsDegenerate(const IndexedTriangle &inTriangle) const
Test if a triangle will be degenerate after quantization.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:116
 
ValidationContext(const IndexedTriangleList &inTriangles, const VertexList &inVertices)
Constructor.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:106
 
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:25
 
static constexpr bool ChangesOffsetOnPack
If this codec could return a different offset than the current buffer size when calling Pack()
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:38
 
static constexpr int TriangleHeaderSize
Size of the header (an empty struct is always > 0 bytes so this needs a separate variable)
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:35
 
EComponentData
Amount of bits per component.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:42
 
@ COMPONENT_BITS
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:43
 
@ COMPONENT_MASK
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:44
 
ETriangleBlockHeaderFlags
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:82
 
@ OFFSET_TO_USERDATA_BITS
When user data is stored, this is the number of blocks to skip to get to the user data (0 = no user d...
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:85
 
@ OFFSET_TO_USERDATA_MASK
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:86
 
@ OFFSET_TO_VERTICES_MASK
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:84
 
@ OFFSET_TO_VERTICES_BITS
Offset from current block to start of vertices in bytes.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:83
 
EVertexXY
Packed X and Y coordinate.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:49
 
@ COMPONENT_X
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:50
 
@ COMPONENT_Y1
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:51
 
@ COMPONENT_Y1_BITS
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:52
 
EVertexZY
Packed Z and Y coordinate.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:57
 
@ COMPONENT_Z
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:58
 
@ COMPONENT_Y2_BITS
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:60
 
@ COMPONENT_Y2
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:59
 
JPH_INLINE uint32 GetZ() const
Definition: UVec4.h:104
 
static JPH_INLINE UVec4 sSelect(UVec4Arg inNotSet, UVec4Arg inSet, UVec4Arg inControl)
Component wise select, returns inNotSet when highest bit of inControl = 0 and inSet when highest bit ...
Definition: UVec4.inl:157
 
JPH_INLINE uint32 GetY() const
Definition: UVec4.h:103
 
JPH_INLINE UVec4 LogicalShiftRight() const
Shift all components by Count bits to the right (filling with zeros from the right)
 
static JPH_INLINE UVec4 sReplicate(uint32 inV)
Replicate int inV across all components.
Definition: UVec4.inl:56
 
JPH_INLINE UVec4 Expand4Byte4() const
Takes byte 4 .. 7 and expands them to X, Y, Z and W.
Definition: UVec4.inl:510
 
JPH_INLINE UVec4 Expand4Byte0() const
Takes byte 0 .. 3 and expands them to X, Y, Z and W.
Definition: UVec4.inl:495
 
static JPH_INLINE UVec4 sAnd(UVec4Arg inV1, UVec4Arg inV2)
Logical and (component wise)
Definition: UVec4.inl:202
 
static JPH_INLINE UVec4 sOr(UVec4Arg inV1, UVec4Arg inV2)
Logical or (component wise)
Definition: UVec4.inl:174
 
JPH_INLINE uint32 GetX() const
Get individual components.
Definition: UVec4.h:102
 
JPH_INLINE UVec4 Expand4Byte8() const
Takes byte 8 .. 11 and expands them to X, Y, Z and W.
Definition: UVec4.inl:525
 
static JPH_INLINE UVec4 sLoadInt4(const uint32 *inV)
Load 4 ints from memory.
Definition: UVec4.inl:78
 
static JPH_INLINE UVec4 sZero()
Vector with all zeros.
Definition: UVec4.inl:45
 
JPH_INLINE Vec4 ToFloat() const
Convert each component from an int to a float.
Definition: UVec4.inl:329
 
static JPH_INLINE Vec3 sMax(Vec3Arg inV1, Vec3Arg inV2)
Return the maximum of each of the components.
Definition: Vec3.inl:159
 
JPH_INLINE void StoreFloat3(Float3 *outV) const
Store 3 floats to memory.
Definition: Vec3.inl:769
 
static JPH_INLINE Vec3 sReplicate(float inV)
Replicate inV across all components.
Definition: Vec3.inl:118
 
static JPH_INLINE void sSort4(Vec4 &ioValue, UVec4 &ioIndex)
Definition: Vec4.inl:304
 
static JPH_INLINE UVec4 sLess(Vec4Arg inV1, Vec4Arg inV2)
Less than (component wise)
Definition: Vec4.inl:180
 
static JPH_INLINE Vec4 sFusedMultiplyAdd(Vec4Arg inMul1, Vec4Arg inMul2, Vec4Arg inAdd)
Calculates inMul1 * inMul2 + inAdd.
Definition: Vec4.inl:236
 
JPH_INLINE float GetX() const
Get individual components.
Definition: Vec4.h:113
 
static JPH_INLINE Vec4 sZero()
Vector with all zeros.
Definition: Vec4.inl:63
 
static JPH_INLINE Vec4 sSelect(Vec4Arg inNotSet, Vec4Arg inSet, UVec4Arg inControl)
Component wise select, returns inNotSet when highest bit of inControl = 0 and inSet when highest bit ...
Definition: Vec4.inl:254
 
static JPH_INLINE Vec4 sReplicate(float inV)
Replicate inV across all components.
Definition: Vec4.inl:74
 
A block of 4 triangles.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:74
 
uint8 mFlags[4]
Triangle flags (could contain material and active edges)
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:76
 
uint8 mIndices[3][4]
8 bit indices to triangle vertices for 4 triangles in the form mIndices[vertex][triangle] where verte...
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:75
 
A single packed vertex.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:65
 
uint32 mVertexXY
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:66
 
uint32 mVertexZY
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:67