13template <
int Alignment>
 
   58    static_assert(
sizeof(
Node) == 64, 
"Node should be 64 bytes");
 
   67            return inNodeCount * (
sizeof(
Node) + Alignment - 1);
 
   82            ioBuffer.
Align(Alignment);
 
   88            for (
size_t i = 0; i < 4; ++i)
 
   90                if (i < ioChildren.
size())
 
  106                        outError = 
"NodeCodecQuadTreeHalfFloat: Too many triangles";
 
  128                outChildBoundsMin[i] = inNodeBoundsMin;
 
  129                outChildBoundsMax[i] = inNodeBoundsMax;
 
  142            for (
uint i = 0; i < inNumChildren; ++i)
 
  145                uint offset = node->
mNodeProperties[i] != 0? inChildrenTrianglesStart[i] : inChildrenNodeStart[i];
 
  148                    outError = 
"NodeCodecQuadTreeHalfFloat: Internal Error: Offset has non-significant bits set";
 
  154                    outError = 
"NodeCodecQuadTreeHalfFloat: Offset too large. Too much data.";
 
  168            uint offset = inRoot->
HasChildren()? inRootNodeStart : inRootTrianglesStart;
 
  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";
 
  218        template <
class TriangleContext, 
class Visitor>
 
  219        JPH_INLINE 
void             WalkTree(
const uint8 *inBufferStart, 
const TriangleContext &inTriangleContext, Visitor &ioVisitor)
 
  224                uint32 node_properties = mNodeStack[mTop];
 
  247                    int num_results = ioVisitor.VisitNodes(bounds_minx, bounds_miny, bounds_minz, bounds_maxx, bounds_maxy, bounds_maxz, properties, mTop);
 
  260                    ioVisitor.VisitTriangles(inTriangleContext, triangles, tri_count, triangle_block_id);
 
  264                if (ioVisitor.ShouldAbort())
 
  270                while (mTop >= 0 && !ioVisitor.ShouldVisitNode(mTop));
 
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
 
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:131
 
@ 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
 
AABox mBounds
Bounding box.
Definition: AABBTreeBuilder.h:79
 
uint GetTriangleCount() const
Get number of triangles in this node.
Definition: AABBTreeBuilder.h:49
 
bool HasChildren() const
Check if this node has any children.
Definition: AABBTreeBuilder.h:52
 
Vec3 mMin
Bounding box min and max.
Definition: AABox.h:300
 
Vec3 mMax
Definition: AABox.h:301
 
size_type size() const
Returns amount of elements in the array.
Definition: Array.h:318
 
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
 
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
 
JPH_INLINE UVec4 Swizzle() const
Swizzle the elements in inV.
 
JPH_INLINE void StoreInt4(uint32 *outV) const
Store 4 ints to memory.
Definition: UVec4.inl:348
 
static JPH_INLINE UVec4 sLoadInt4(const uint32 *inV)
Load 4 ints from memory.
Definition: UVec4.inl:78
 
JPH_INLINE float GetX() const
Get individual components.
Definition: Vec3.h:124
 
JPH_INLINE float GetY() const
Definition: Vec3.h:125
 
JPH_INLINE void StoreFloat3(Float3 *outV) const
Store 3 floats to memory.
Definition: Vec3.inl:765
 
JPH_INLINE float GetZ() const
Definition: Vec3.h:126
 
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