MCPcopy Create free account
hub / github.com/NVIDIAGameWorks/PhysX / swapIndex

Method swapIndex

physx/source/scenequery/src/SqExtendedBucketPruner.cpp:452–499  ·  view source on GitHub ↗

Swap object index if swapObject is in a merged tree its index needs to be swapped with objectIndex

Source from the content-addressed store, hash-verified

450// Swap object index
451// if swapObject is in a merged tree its index needs to be swapped with objectIndex
452void 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

Callers 1

removeObjectsMethod · 0.45

Calls 9

PX_UNUSEDFunction · 0.85
ifFunction · 0.50
findMethod · 0.45
getNbNodesMethod · 0.45
isLeafMethod · 0.45
getNodesMethod · 0.45
getPrimitivesMethod · 0.45
getIndicesMethod · 0.45

Tested by

no test coverage detected