// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // * Neither the name of NVIDIA CORPORATION nor the names of its // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Copyright (c) 2008-2018 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. #include "SqAABBTreeUpdateMap.h" #include "SqAABBTree.h" using namespace physx; using namespace Sq; static const PxU32 SHRINK_THRESHOLD = 1024; void AABBTreeUpdateMap::initMap(PxU32 nbObjects, const AABBTree& tree) { if(!nbObjects) { release(); return; } // Memory management { const PxU32 mapSize = nbObjects; const PxU32 targetCapacity = mapSize + (mapSize>>2); PxU32 currentCapacity = mMapping.capacity(); if( ( targetCapacity < (currentCapacity>>1) ) && ( (currentCapacity-targetCapacity) > SHRINK_THRESHOLD ) ) { // trigger reallocation of a smaller array, there is enough memory to save currentCapacity = 0; } if(mapSize > currentCapacity) { // the mapping values are invalid and reset below in any case // so there is no need to copy the values at all mMapping.reset(); mMapping.reserve(targetCapacity); // since size is 0, reserve will also just allocate } mMapping.forceSize_Unsafe(mapSize); for(PxU32 i=0;igetNbRuntimePrimitives(); PX_ASSERT(nbPrims <= 16); // retrieve the primitives pointer PxU32* primitives = node0->getPrimitives(tree.getIndices()); PX_ASSERT(primitives); // PT: look for desired pool index in the leaf bool foundIt = false; for(PxU32 i=0;isetNbRunTimePrimitives(last); primitives[i] = INVALID_POOL_ID; // Mark primitive index as invalid in the node mMapping[prunerIndex0] = INVALID_NODE_ID; // invalidate the node index for pool 0 // PT: swap within the leaf node. No need to update the mapping since they should all point // to the same tree node anyway. if(last!=i) Ps::swap(primitives[i], primitives[last]); break; } } PX_ASSERT(foundIt); PX_UNUSED(foundIt); } if (nodeIndex1!=INVALID_NODE_ID) { // PT: with multiple primitives per leaf, tree nodes may very well be the same for different pool indices. // However the pool indices may be the same when a swap has been skipped in the pruning pool, in which // case there is nothing to do. if(prunerIndex0!=prunerIndex1) { PX_ASSERT(nodeIndex1 < tree.getNbNodes()); PX_ASSERT(nodes[nodeIndex1].isLeaf()); AABBTreeRuntimeNode* node1 = nodes + nodeIndex1; const PxU32 nbPrims = node1->getNbRuntimePrimitives(); PX_ASSERT(nbPrims <= 16); // retrieve the primitives pointer PxU32* primitives = node1->getPrimitives(tree.getIndices()); PX_ASSERT(primitives); // PT: look for desired pool index in the leaf bool foundIt = false; for(PxU32 i=0;i