Swap object index if swapObject is in a merged tree its index needs to be swapped with objectIndex
| 450 | // Swap object index |
| 451 | // if swapObject is in a merged tree its index needs to be swapped with objectIndex |
| 452 | void ExtendedBucketPruner::swapIndex(PxU32 objectIndex, const PrunerPayload& swapObject, PxU32 swapObjectIndex, bool corePrunerIncluded) |
| 453 | { |
| 454 | PX_UNUSED(corePrunerIncluded); |
| 455 | if (objectIndex == swapObjectIndex) |
| 456 | return; |
| 457 | |
| 458 | const ExtendedBucketPrunerMap::Entry* extendedPrunerSwapEntry = mExtendedBucketPrunerMap.find(swapObject); |
| 459 | |
| 460 | // if swapped object index is in extended pruner, we have to fix the primitives index |
| 461 | if (extendedPrunerSwapEntry) |
| 462 | { |
| 463 | const ExtendedBucketPrunerData& swapData = extendedPrunerSwapEntry->second; |
| 464 | AABBTree& swapTree = *mMergedTrees[swapData.mMergeIndex].mTree; |
| 465 | // With multiple primitives per leaf, tree nodes may very well be the same for different pool indices. |
| 466 | // However the pool indices may be the same when a swap has been skipped in the pruning pool, in which |
| 467 | // case there is nothing to do. |
| 468 | PX_ASSERT(swapData.mSubTreeNode < swapTree.getNbNodes()); |
| 469 | PX_ASSERT(swapTree.getNodes()[swapData.mSubTreeNode].isLeaf()); |
| 470 | AABBTreeRuntimeNode* node1 = swapTree.getNodes() + swapData.mSubTreeNode; |
| 471 | const PxU32 nbPrims = node1->getNbRuntimePrimitives(); |
| 472 | PX_ASSERT(nbPrims <= NB_OBJECTS_PER_NODE); |
| 473 | |
| 474 | // retrieve the primitives pointer |
| 475 | PxU32* primitives = node1->getPrimitives(swapTree.getIndices()); |
| 476 | PX_ASSERT(primitives); |
| 477 | |
| 478 | // look for desired pool index in the leaf |
| 479 | bool foundIt = false; |
| 480 | for (PxU32 i = 0; i < nbPrims; i++) |
| 481 | { |
| 482 | if (swapObjectIndex == primitives[i]) |
| 483 | { |
| 484 | foundIt = true; |
| 485 | primitives[i] = objectIndex; // point node to the pool object moved to |
| 486 | break; |
| 487 | } |
| 488 | } |
| 489 | PX_ASSERT(foundIt); |
| 490 | PX_UNUSED(foundIt); |
| 491 | } |
| 492 | #if USE_INCREMENTAL_PRUNER |
| 493 | else |
| 494 | { |
| 495 | if(corePrunerIncluded) |
| 496 | mPrunerCore.swapIndex(objectIndex, swapObjectIndex); |
| 497 | } |
| 498 | #endif |
| 499 | } |
| 500 | |
| 501 | ////////////////////////////////////////////////////////////////////////// |
| 502 | // Optimized removal of timestamped objects from the extended bucket pruner |
no test coverage detected