///////////////////////////////////////////////////////////////////// Add a tree from a pruning structure 1. get new tree index 2. initialize merged tree, bounds 3. create update map for the merged tree 4. build new tree of trees from given trees bounds 5. add new objects into extended bucket pruner map 6. shift indices in the merged tree
| 126 | // 5. add new objects into extended bucket pruner map |
| 127 | // 6. shift indices in the merged tree |
| 128 | void ExtendedBucketPruner::addTree(const AABBTreeMergeData& mergeData, PxU32 timeStamp) |
| 129 | { |
| 130 | // check if we have to resize |
| 131 | if(mCurrentTreeIndex == mCurrentTreeCapacity) |
| 132 | { |
| 133 | resize(mCurrentTreeCapacity*2); |
| 134 | } |
| 135 | |
| 136 | // get current merge tree index |
| 137 | const PxU32 mergeTreeIndex = mCurrentTreeIndex++; |
| 138 | |
| 139 | // get payloads pointers - the pointers start at mIndicesOffset, thats where all |
| 140 | // objects were added before merge was called |
| 141 | const PrunerPayload* payloads = &mPruningPool->getObjects()[mergeData.mIndicesOffset]; |
| 142 | |
| 143 | // setup merged tree with the merge data and timestamp |
| 144 | mMergedTrees[mergeTreeIndex].mTimeStamp = timeStamp; |
| 145 | AABBTree& mergedTree = *mMergedTrees[mergeTreeIndex].mTree; |
| 146 | mergedTree.initTree(mergeData); |
| 147 | // set bounds |
| 148 | mBounds[mergeTreeIndex] = mergeData.getRootNode().mBV; |
| 149 | |
| 150 | // update temporally update map for the current merge tree, map is used to setup the base extended bucket pruner map |
| 151 | mMergeTreeUpdateMap.initMap(mergeData.mNbIndices, mergedTree); |
| 152 | |
| 153 | // create new base tree of trees |
| 154 | buildMainAABBTree(); |
| 155 | |
| 156 | // Add each object into extended bucket pruner hash map |
| 157 | for (PxU32 i = 0; i < mergeData.mNbIndices; i++) |
| 158 | { |
| 159 | ExtendedBucketPrunerData mapData; |
| 160 | mapData.mMergeIndex = mergeTreeIndex; |
| 161 | mapData.mTimeStamp = timeStamp; |
| 162 | PX_ASSERT(mMergeTreeUpdateMap[i] < mergedTree.getNbNodes()); |
| 163 | // get node information from the merge tree update map |
| 164 | mapData.mSubTreeNode = mMergeTreeUpdateMap[i]; |
| 165 | mExtendedBucketPrunerMap.insert(payloads[i], mapData); |
| 166 | } |
| 167 | // merged tree indices needs to be shifted now, we cannot shift it in init - the update map |
| 168 | // could not be constructed otherwise, as the indices wont start from 0. The indices |
| 169 | // needs to be shifted by offset from the pruning pool, where the new objects were added into the pruning pool. |
| 170 | mergedTree.shiftIndices(mergeData.mIndicesOffset); |
| 171 | |
| 172 | #if PX_DEBUG |
| 173 | checkValidity(); |
| 174 | #endif // PX_DEBUG |
| 175 | } |
| 176 | |
| 177 | ////////////////////////////////////////////////////////////////////////// |
| 178 | // Builds the new main AABB tree with given current active merged trees and its bounds |
no test coverage detected