13template <
int Alignment>
58 static_assert(
sizeof(
Node) == 64,
"Node should be 64 bytes");
78 if (!
inNode->HasChildren())
88 for (
size_t i = 0;
i < 4; ++
i)
95 node->mBoundsMinX[
i] = HalfFloatConversion::FromFloat<HalfFloatConversion::ROUND_TO_NEG_INF>(
this_node->mBounds.mMin.GetX());
96 node->mBoundsMinY[
i] = HalfFloatConversion::FromFloat<HalfFloatConversion::ROUND_TO_NEG_INF>(
this_node->mBounds.mMin.GetY());
97 node->mBoundsMinZ[
i] = HalfFloatConversion::FromFloat<HalfFloatConversion::ROUND_TO_NEG_INF>(
this_node->mBounds.mMin.GetZ());
98 node->mBoundsMaxX[
i] = HalfFloatConversion::FromFloat<HalfFloatConversion::ROUND_TO_POS_INF>(
this_node->mBounds.mMax.GetX());
99 node->mBoundsMaxY[
i] = HalfFloatConversion::FromFloat<HalfFloatConversion::ROUND_TO_POS_INF>(
this_node->mBounds.mMax.GetY());
100 node->mBoundsMaxZ[
i] = HalfFloatConversion::FromFloat<HalfFloatConversion::ROUND_TO_POS_INF>(
this_node->mBounds.mMax.GetZ());
106 outError =
"NodeCodecQuadTreeHalfFloat: Too many triangles";
116 node->mBoundsMinX[
i] = HALF_FLT_MAX;
117 node->mBoundsMinY[
i] = HALF_FLT_MAX;
118 node->mBoundsMinZ[
i] = HALF_FLT_MAX;
119 node->mBoundsMaxX[
i] = HALF_FLT_MAX;
120 node->mBoundsMaxY[
i] = HALF_FLT_MAX;
121 node->mBoundsMaxZ[
i] = HALF_FLT_MAX;
138 if (!
inNode->HasChildren())
148 outError =
"NodeCodecQuadTreeHalfFloat: Internal Error: Offset has non-significant bits set";
154 outError =
"NodeCodecQuadTreeHalfFloat: Offset too large. Too much data.";
171 outError =
"NodeCodecQuadTreeHalfFloat: Internal Error: Offset has non-significant bits set";
177 outError =
"NodeCodecQuadTreeHalfFloat: Offset too large. Too much data.";
186 outError =
"NodeCodecQuadTreeHalfFloat: Too many triangles";
214 mNodeStack[0] =
inHeader->mRootProperties;
218 template <
class TriangleContext,
class Visitor>
270 while (mTop >= 0 && !
ioVisitor.ShouldVisitNode(mTop));
std::uint8_t uint8
Definition Core.h:440
unsigned int uint
Definition Core.h:439
#define JPH_NAMESPACE_END
Definition Core.h:367
std::uint32_t uint32
Definition Core.h:442
#define JPH_NAMESPACE_BEGIN
Definition Core.h:361
uint16 HalfFloat
Definition HalfFloat.h:11
#define JPH_ASSERT(...)
Definition IssueReporting.h:33
uint CountLeadingZeros(uint32 inValue)
Compute the number of leading zero bits (how many high bits are zero)
Definition Math.h:129
AllocateFunction Allocate
Definition Memory.cpp:59
std::vector< T, STLAllocator< T > > Array
Definition STLAllocator.h:81
@ SWIZZLE_Z
Use the Z component.
Definition Swizzle.h:14
@ SWIZZLE_W
Use the W component.
Definition Swizzle.h:15
@ SWIZZLE_UNUSED
We always use the Z component when we don't specifically want to initialize a value,...
Definition Swizzle.h:16
A node in the tree, contains the AABox for the tree and any child nodes or triangles.
Definition AABBTreeBuilder.h:40
Simple byte buffer, aligned to a cache line.
Definition ByteBuffer.h:16
Class that holds 3 floats. Used as a storage class. Convert to Vec3 for calculations.
Definition Float3.h:13
This class decodes and decompresses quad tree nodes.
Definition NodeCodecQuadTreeHalfFloat.h:196
JPH_INLINE void WalkTree(const uint8 *inBufferStart, const TriangleContext &inTriangleContext, Visitor &ioVisitor)
Walk the node tree calling the Visitor::VisitNodes for each node encountered and Visitor::VisitTriang...
Definition NodeCodecQuadTreeHalfFloat.h:219
bool IsDoneWalking() const
This can be used to have the visitor early out (ioVisitor.ShouldAbort() returns true) and later conti...
Definition NodeCodecQuadTreeHalfFloat.h:276
static const void * sGetTriangleBlockStart(const uint8 *inBufferStart, uint inTriangleBlockID)
Convert a triangle block ID to the start of the triangle buffer.
Definition NodeCodecQuadTreeHalfFloat.h:205
static uint sTriangleBlockIDBits(const ByteBuffer &inTree)
Get the amount of bits needed to store an ID to a triangle block.
Definition NodeCodecQuadTreeHalfFloat.h:199
JPH_INLINE DecodingContext(const Header *inHeader)
Constructor.
Definition NodeCodecQuadTreeHalfFloat.h:211
This class encodes and compresses quad tree nodes.
Definition NodeCodecQuadTreeHalfFloat.h:62
bool NodeFinalize(const AABBTreeBuilder::Node *inNode, uint inNodeStart, uint inNumChildren, const uint *inChildrenNodeStart, const uint *inChildrenTrianglesStart, ByteBuffer &ioBuffer, const char *&outError) const
Once all nodes have been added, this call finalizes all nodes by patching in the offsets of the child...
Definition NodeCodecQuadTreeHalfFloat.h:136
uint GetPessimisticMemoryEstimate(uint inNodeCount) const
Get an upper bound on the amount of bytes needed for a node tree with inNodeCount nodes.
Definition NodeCodecQuadTreeHalfFloat.h:65
bool Finalize(Header *outHeader, const AABBTreeBuilder::Node *inRoot, uint inRootNodeStart, uint inRootTrianglesStart, const char *&outError) const
Once all nodes have been finalized, this will finalize the header of the nodes.
Definition NodeCodecQuadTreeHalfFloat.h:166
uint NodeAllocate(const AABBTreeBuilder::Node *inNode, Vec3Arg inNodeBoundsMin, Vec3Arg inNodeBoundsMax, Array< const AABBTreeBuilder::Node * > &ioChildren, Vec3 outChildBoundsMin[NumChildrenPerNode], Vec3 outChildBoundsMax[NumChildrenPerNode], ByteBuffer &ioBuffer, const char *&outError) const
Definition NodeCodecQuadTreeHalfFloat.h:75
Definition NodeCodecQuadTreeHalfFloat.h:15
static constexpr int StackSize
Stack size to use during DecodingContext::sWalkTree.
Definition NodeCodecQuadTreeHalfFloat.h:32
static constexpr int HeaderSize
Size of the header (an empty struct is always > 0 bytes so this needs a separate variable)
Definition NodeCodecQuadTreeHalfFloat.h:29
static constexpr int NumChildrenPerNode
Number of child nodes of this node.
Definition NodeCodecQuadTreeHalfFloat.h:18
@ TRIANGLE_COUNT_BITS
Definition NodeCodecQuadTreeHalfFloat.h:37
@ OFFSET_BITS
Definition NodeCodecQuadTreeHalfFloat.h:40
@ TRIANGLE_COUNT_SHIFT
Definition NodeCodecQuadTreeHalfFloat.h:38
@ TRIANGLE_COUNT_MASK
Definition NodeCodecQuadTreeHalfFloat.h:39
@ OFFSET_MASK
Definition NodeCodecQuadTreeHalfFloat.h:41
@ OFFSET_NON_SIGNIFICANT_BITS
Definition NodeCodecQuadTreeHalfFloat.h:42
@ OFFSET_NON_SIGNIFICANT_MASK
Definition NodeCodecQuadTreeHalfFloat.h:43
static JPH_INLINE UVec4 sLoadInt4(const uint32 *inV)
Load 4 ints from memory.
Definition UVec4.inl:78
JPH_INLINE Vec4 ToFloat(UVec4Arg inValue)
Convert 4 half floats (lower 64 bits) to floats.
Definition HalfFloat.h:191
Node structure.
Definition NodeCodecQuadTreeHalfFloat.h:48
HalfFloat mBoundsMaxY[4]
Definition NodeCodecQuadTreeHalfFloat.h:53
HalfFloat mBoundsMinX[4]
4 child bounding boxes
Definition NodeCodecQuadTreeHalfFloat.h:49
HalfFloat mBoundsMinZ[4]
Definition NodeCodecQuadTreeHalfFloat.h:51
HalfFloat mBoundsMaxX[4]
Definition NodeCodecQuadTreeHalfFloat.h:52
uint32 mNodeProperties[4]
4 child node properties
Definition NodeCodecQuadTreeHalfFloat.h:55
HalfFloat mBoundsMinY[4]
Definition NodeCodecQuadTreeHalfFloat.h:50
HalfFloat mBoundsMaxZ[4]
Definition NodeCodecQuadTreeHalfFloat.h:54