From 9c03a9fbef009c8e5ea406e6929907206d8d135c Mon Sep 17 00:00:00 2001 From: Bryan Galdrikian Date: Mon, 19 Aug 2019 02:18:16 -0700 Subject: Fixing chunk hierarchy optimization/merge bugs Exposing ability to remove chunks to fracture tool API --- .../source/NvBlastExtAuthoringFractureToolImpl.cpp | 57 +++++++++------------- .../source/NvBlastExtAuthoringFractureToolImpl.h | 3 +- 2 files changed, 23 insertions(+), 37 deletions(-) (limited to 'sdk/extensions/authoring/source') diff --git a/sdk/extensions/authoring/source/NvBlastExtAuthoringFractureToolImpl.cpp b/sdk/extensions/authoring/source/NvBlastExtAuthoringFractureToolImpl.cpp index 54d83a7..e4cc86f 100755 --- a/sdk/extensions/authoring/source/NvBlastExtAuthoringFractureToolImpl.cpp +++ b/sdk/extensions/authoring/source/NvBlastExtAuthoringFractureToolImpl.cpp @@ -423,7 +423,7 @@ FractureToolImpl::voronoiFracturing(uint32_t chunkId, uint32_t cellCount, const } if (!mChunkData[chunkIndex].isLeaf) { - deleteAllChildrenOfChunk(chunkId); + deleteChunkSubhierarchy(chunkId); } chunkIndex = getChunkIndex(chunkId); @@ -476,7 +476,7 @@ FractureToolImpl::voronoiFracturing(uint32_t chunkId, uint32_t cellCount, const mChunkData[chunkIndex].isLeaf = false; if (replaceChunk) { - eraseChunk(chunkId); + deleteChunkSubhierarchy(chunkId, true); } mPlaneIndexerOffset += static_cast(cellPoints.size() * cellPoints.size()); @@ -585,7 +585,7 @@ int32_t FractureToolImpl::voronoiFracturing(uint32_t chunkId, uint32_t cellCount } if (!mChunkData[chunkIndex].isLeaf) { - deleteAllChildrenOfChunk(chunkId); + deleteChunkSubhierarchy(chunkId); } chunkIndex = getChunkIndex(chunkId); @@ -654,7 +654,7 @@ int32_t FractureToolImpl::voronoiFracturing(uint32_t chunkId, uint32_t cellCount mChunkData[chunkIndex].isLeaf = false; if (replaceChunk) { - eraseChunk(chunkId); + deleteChunkSubhierarchy(chunkId, true); } mPlaneIndexerOffset += static_cast(cellPoints.size() * cellPoints.size()); @@ -689,7 +689,7 @@ int32_t FractureToolImpl::slicing(uint32_t chunkId, const SlicingConfiguration& } if (!mChunkData[chunkIndex].isLeaf) { - deleteAllChildrenOfChunk(chunkId); + deleteChunkSubhierarchy(chunkId); } chunkIndex = getChunkIndex(chunkId); @@ -850,7 +850,7 @@ int32_t FractureToolImpl::slicing(uint32_t chunkId, const SlicingConfiguration& mChunkData[chunkIndex].isLeaf = false; if (replaceChunk) { - eraseChunk(chunkId); + deleteChunkSubhierarchy(chunkId, true); } if (mRemoveIslands) @@ -879,7 +879,7 @@ int32_t FractureToolImpl::slicingNoisy(uint32_t chunkId, const SlicingConfigurat } if (!mChunkData[chunkIndex].isLeaf) { - deleteAllChildrenOfChunk(chunkId); + deleteChunkSubhierarchy(chunkId); } chunkIndex = getChunkIndex(chunkId); @@ -1061,7 +1061,7 @@ int32_t FractureToolImpl::slicingNoisy(uint32_t chunkId, const SlicingConfigurat mChunkData[chunkIndex].isLeaf = false; if (replaceChunk) { - eraseChunk(chunkId); + deleteChunkSubhierarchy(chunkId, true); } if (mRemoveIslands) @@ -1089,7 +1089,7 @@ int32_t FractureToolImpl::cut(uint32_t chunkId, const NvcVec3& normal, const Nvc } if (!mChunkData[chunkIndex].isLeaf) { - deleteAllChildrenOfChunk(chunkId); + deleteChunkSubhierarchy(chunkId); } chunkIndex = getChunkIndex(chunkId); @@ -1130,7 +1130,7 @@ int32_t FractureToolImpl::cut(uint32_t chunkId, const NvcVec3& normal, const Nvc if (!mChunkData[chunkIndex].isLeaf) { - deleteAllChildrenOfChunk(chunkId); + deleteChunkSubhierarchy(chunkId); } chunkIndex = getChunkIndex(chunkId); @@ -1151,7 +1151,7 @@ int32_t FractureToolImpl::cut(uint32_t chunkId, const NvcVec3& normal, const Nvc mChunkData[chunkIndex].isLeaf = false; if (replaceChunk) { - eraseChunk(chunkId); + deleteChunkSubhierarchy(chunkId, true); } if (mRemoveIslands && firstChunkId >= 0) @@ -1196,7 +1196,7 @@ int32_t FractureToolImpl::cutout(uint32_t chunkId, CutoutConfiguration conf, boo } if (!mChunkData[chunkIndex].isLeaf) { - deleteAllChildrenOfChunk(chunkId); + deleteChunkSubhierarchy(chunkId); } chunkIndex = getChunkIndex(chunkId); Nv::Blast::CutoutSet& cutoutSet = *conf.cutoutSet; @@ -1391,7 +1391,7 @@ int32_t FractureToolImpl::cutout(uint32_t chunkId, CutoutConfiguration conf, boo mChunkData[chunkIndex].isLeaf = false; if (replaceChunk) { - eraseChunk(chunkId); + deleteChunkSubhierarchy(chunkId, true); } if (mRemoveIslands) @@ -1611,25 +1611,12 @@ bool FractureToolImpl::isAncestorForChunk(int32_t ancestorId, int32_t chunkId) return false; } -void FractureToolImpl::eraseChunk(int32_t chunkId) -{ - deleteAllChildrenOfChunk(chunkId); - int32_t index = getChunkIndex(chunkId); - if (index != -1) - { - delete mChunkData[index].meshData; - std::swap(mChunkData.back(), mChunkData[index]); - mChunkData.pop_back(); - } -} - - -bool FractureToolImpl::deleteAllChildrenOfChunk(int32_t chunkId) +bool FractureToolImpl::deleteChunkSubhierarchy(int32_t chunkId, bool deleteRoot /*= false*/) { std::vector chunkToDelete; for (uint32_t i = 0; i < mChunkData.size(); ++i) { - if (isAncestorForChunk(chunkId, mChunkData[i].chunkId)) + if (isAncestorForChunk(chunkId, mChunkData[i].chunkId) || (deleteRoot && chunkId == mChunkData[i].chunkId)) { chunkToDelete.push_back(i); } @@ -2002,7 +1989,7 @@ int32_t FractureToolImpl::islandDetectionAndRemoving(int32_t chunkId, bool creat else { mChunkData[chunkIndex].isLeaf = false; - deleteAllChildrenOfChunk(chunkId); + deleteChunkSubhierarchy(chunkId); for (int32_t i = 0; i < cComp; ++i) { uint32_t nc = createNewChunk(chunkId); @@ -2449,7 +2436,7 @@ void FractureToolImpl::uniteChunks(uint32_t threshold, uint32_t targetClusterSiz break; } treeWalk.push_back(walkIndex); - } while ((walkIndex = mChunkData[walkIndex].parent) >= 0); + } while ((walkIndex = getChunkIndex(mChunkData[walkIndex].parent)) >= 0); } } @@ -2571,13 +2558,13 @@ void FractureToolImpl::uniteChunks(uint32_t threshold, uint32_t targetClusterSiz mChunkData.resize(chunkWriteIndex); for (ChunkInfo& chunkInfo : mChunkData) { - if (chunkInfo.parent > 0) + if (chunkInfo.parent >= 0) { - const uint32_t mappedParent = remap[chunkInfo.parent]; - NVBLAST_ASSERT(mappedParent < mChunkData.size()); - if (mappedParent < mChunkData.size()) + const uint32_t mappedParentIndex = remap[getChunkIndex(chunkInfo.parent)]; + NVBLAST_ASSERT(mappedParentIndex < mChunkData.size()); + if (mappedParentIndex < mChunkData.size()) { - chunkInfo.parent = mappedParent; + chunkInfo.parent = mChunkData[mappedParentIndex].chunkId; } } } diff --git a/sdk/extensions/authoring/source/NvBlastExtAuthoringFractureToolImpl.h b/sdk/extensions/authoring/source/NvBlastExtAuthoringFractureToolImpl.h index a8c59dc..9e4d41e 100755 --- a/sdk/extensions/authoring/source/NvBlastExtAuthoringFractureToolImpl.h +++ b/sdk/extensions/authoring/source/NvBlastExtAuthoringFractureToolImpl.h @@ -373,7 +373,7 @@ public: */ bool isMeshContainOpenEdges(const Mesh* input) override; - bool deleteAllChildrenOfChunk(int32_t chunkId) override; + bool deleteChunkSubhierarchy(int32_t chunkId, bool deleteRoot = false) override; void uniteChunks(uint32_t threshold, uint32_t targetClusterSize, const uint32_t* chunksToMerge, uint32_t mergeChunkCount, @@ -397,7 +397,6 @@ public: private: - void eraseChunk(int32_t chunkId); bool isAncestorForChunk(int32_t ancestorId, int32_t chunkId); int32_t slicingNoisy(uint32_t chunkId, const SlicingConfiguration& conf, bool replaceChunk, RandomGeneratorBase* rnd); uint32_t stretchGroup(const std::vector& group, std::vector>& graph); -- cgit v1.2.3