17template <
class T> 
using Deque = std::deque<T, STLAllocator<T>>;
 
   20template <
class TriangleCodec, 
class NodeCodec>
 
   66            uint                            mNumChildren = 0;                           
 
   67            uint                            mChildNodeStart[NumChildrenPerNode];        
 
   68            uint                            mChildTrianglesStart[NumChildrenPerNode];   
 
   69            uint *                          mParentChildNodeStart = 
nullptr;            
 
   70            uint *                          mParentTrianglesStart = 
nullptr;            
 
   84        to_process.push_back(&node_list.
back());
 
   92            while (!to_process.empty())
 
   95                NodeData *node_data = to_process.back();
 
   96                to_process.pop_back();
 
   99                JPH_ASSERT(
AABox(node_data->mNodeBoundsMin, node_data->mNodeBoundsMax).
Contains(node_data->mNode->mBounds), 
"AABBTreeToBuffer: Bounding box became smaller!");
 
  104                node_data->mNumChildren = (
uint)child_nodes.
size();
 
  109                    if (i < child_nodes.
size())
 
  111                        child_bounds_min[i] = child_nodes[i]->mBounds.mMin;
 
  112                        child_bounds_max[i] = child_nodes[i]->mBounds.mMax;
 
  122                node_data->mNodeStart = node_ctx.
NodeAllocate(node_data->mNode, node_data->mNodeBoundsMin, node_data->mNodeBoundsMax, child_nodes, child_bounds_min, child_bounds_max, mTree, outError);
 
  123                if (node_data->mNodeStart == 
uint(-1))
 
  125                mNodesSize += (
uint)mTree.
size() - old_size;
 
  127                if (node_data->mNode->HasChildren())
 
  130                    for (
int idx = 
int(child_nodes.
size()) - 1; idx >= 0; --idx)
 
  133                        JPH_ASSERT(
AABox(child_bounds_min[idx], child_bounds_max[idx]).Contains(child_nodes[idx]->mBounds), 
"AABBTreeToBuffer: Bounding box became smaller!");
 
  137                        child.mNode = child_nodes[idx];
 
  138                        child.mNodeBoundsMin = child_bounds_min[idx];
 
  139                        child.mNodeBoundsMax = child_bounds_max[idx];
 
  140                        child.mParentChildNodeStart = &node_data->mChildNodeStart[idx];
 
  141                        child.mParentTrianglesStart = &node_data->mChildTrianglesStart[idx];
 
  142                        NodeData *old = &node_list[0];
 
  144                        if (old != &node_list[0])
 
  146                            outError = 
"Internal Error: Array reallocated, memory corruption!";
 
  151                        if (node_list.
back().mNode->HasChildren())
 
  152                            to_process.push_back(&node_list.
back());
 
  154                            to_process_triangles.push_back(&node_list.
back());
 
  160                    node_data->mTriangleStart = tri_ctx.
Pack(node_data->mNode->mTriangles, inStoreUserData, mTree, outError);
 
  161                    if (node_data->mTriangleStart == 
uint(-1))
 
  166                if (node_data->mParentChildNodeStart != 
nullptr)
 
  168                    *node_data->mParentChildNodeStart = node_data->mNodeStart;
 
  169                    *node_data->mParentTrianglesStart = node_data->mTriangleStart;
 
  174            if (to_process_triangles.empty())
 
  177                to_process.swap(to_process_triangles);
 
  181        for (NodeData &n : node_list)
 
  182            if (!node_ctx.
NodeFinalize(n.mNode, n.mNodeStart, n.mNumChildren, n.mChildNodeStart, n.mChildTrianglesStart, mTree, outError))
 
  186        tri_ctx.
Finalize(inVertices, triangle_header, mTree);
 
  189        if (nodes_size < mNodesSize)
 
  191            outError = 
"Internal Error: Not enough memory reserved for nodes!";
 
  194        if (total_size < (
uint)mTree.
size())
 
  196            outError = 
"Internal Error: Not enough memory reserved for triangles!";
 
  201        if (!node_ctx.
Finalize(header, inRoot, node_list[0].mNodeStart, node_list[0].mTriangleStart, outError))
 
std::deque< T, STLAllocator< T > > Deque
Definition: AABBTreeToBuffer.h:17
 
#define JPH_SUPPRESS_WARNINGS_STD_BEGIN
Definition: Core.h:383
 
#define JPH_SUPPRESS_WARNINGS_STD_END
Definition: Core.h:395
 
unsigned int uint
Definition: Core.h:452
 
#define JPH_NAMESPACE_END
Definition: Core.h:378
 
#define JPH_NAMESPACE_BEGIN
Definition: Core.h:372
 
#define JPH_ASSERT(...)
Definition: IssueReporting.h:33
 
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 GetTriangleCountInTree() const
Get triangle count in tree.
Definition: AABBTreeBuilder.cpp:63
 
uint GetNodeCount() const
Number of nodes in tree.
Definition: AABBTreeBuilder.cpp:47
 
Conversion algorithm that converts an AABB tree to an optimized binary buffer.
Definition: AABBTreeToBuffer.h:22
 
static const int TriangleHeaderSize
Size in bytes of the header for the triangles.
Definition: AABBTreeToBuffer.h:37
 
typename TriangleCodec::TriangleHeader TriangleHeader
Header for the triangles.
Definition: AABBTreeToBuffer.h:34
 
const ByteBuffer & GetBuffer() const
Get resulting data.
Definition: AABBTreeToBuffer.h:211
 
typename NodeCodec::Header NodeHeader
Header for the tree.
Definition: AABBTreeToBuffer.h:25
 
static const int HeaderSize
Size in bytes of the header of the tree.
Definition: AABBTreeToBuffer.h:28
 
static const int NumChildrenPerNode
Maximum number of children per node in the tree.
Definition: AABBTreeToBuffer.h:31
 
bool Convert(const VertexList &inVertices, const AABBTreeBuilder::Node *inRoot, bool inStoreUserData, const char *&outError)
Convert AABB tree. Returns false if failed.
Definition: AABBTreeToBuffer.h:40
 
const TriangleHeader * GetTriangleHeader() const
Get header for triangles.
Definition: AABBTreeToBuffer.h:229
 
const NodeHeader * GetNodeHeader() const
Get header for tree.
Definition: AABBTreeToBuffer.h:223
 
ByteBuffer & GetBuffer()
Get resulting data.
Definition: AABBTreeToBuffer.h:217
 
const void * GetRoot() const
Get root of resulting tree.
Definition: AABBTreeToBuffer.h:235
 
Axis aligned box.
Definition: AABox.h:16
 
Vec3 mMin
Bounding box min and max.
Definition: AABox.h:300
 
bool Contains(const AABox &inOther) const
Check if this box contains another box.
Definition: AABox.h:137
 
Vec3 mMax
Definition: AABox.h:301
 
const T & back() const
Last element in the array.
Definition: Array.h:492
 
size_type size() const
Returns amount of elements in the array.
Definition: Array.h:318
 
void shrink_to_fit()
Reduce the capacity of the array to match its size.
Definition: Array.h:330
 
void clear()
Destruct all elements and set length to zero.
Definition: Array.h:143
 
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
 
const Type * Get(size_t inPosition) const
Get object at inPosition (an offset in bytes)
Definition: ByteBuffer.h:61
 
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
 
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
 
This class is used to encode and compress triangle data into a byte buffer.
Definition: TriangleCodecIndexed8BitPackSOA4Flags.h:133
 
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
 
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
 
static JPH_INLINE Vec3 sZero()
Vector with all zeros.
Definition: Vec3.inl:107