From 9e911235772cb122b44b3a55a3f796072098ce04 Mon Sep 17 00:00:00 2001 From: Bryan Galdrikian Date: Mon, 15 Jul 2019 21:28:41 -0700 Subject: Padding bounds when determining chunks from islands, allows nearby chunks generated this way to be merged with uniteChunks. Fixing bug when removing original chunks in uniteChunks function. --- .../source/NvBlastExtAuthoringFractureToolImpl.cpp | 41 ++++++++++++++++++---- 1 file changed, 34 insertions(+), 7 deletions(-) (limited to 'sdk/extensions/authoring/source/NvBlastExtAuthoringFractureToolImpl.cpp') diff --git a/sdk/extensions/authoring/source/NvBlastExtAuthoringFractureToolImpl.cpp b/sdk/extensions/authoring/source/NvBlastExtAuthoringFractureToolImpl.cpp index 2354474..54d83a7 100755 --- a/sdk/extensions/authoring/source/NvBlastExtAuthoringFractureToolImpl.cpp +++ b/sdk/extensions/authoring/source/NvBlastExtAuthoringFractureToolImpl.cpp @@ -2547,13 +2547,40 @@ void FractureToolImpl::uniteChunks(uint32_t threshold, uint32_t targetClusterSiz } } - for (uint32_t i = (uint32_t)chunksToRemove.size(); i--;) - { - const uint32_t m = chunksToRemove[i]; - delete mChunkData[m].meshData; - std::swap(mChunkData.back(), mChunkData[m]); - mChunkData.pop_back(); - } + // Remove chunks + std::vector remap(mChunkData.size(), 0xFFFFFFFF); + std::sort(chunksToRemove.begin(), chunksToRemove.end()); + std::vector::iterator removeIt = chunksToRemove.begin(); + size_t chunkWriteIndex = 0; + for (size_t chunkReadIndex = 0; chunkReadIndex < mChunkData.size(); ++chunkReadIndex) + { + if (removeIt < chunksToRemove.end()) + { + if (*removeIt == chunkReadIndex) + { + ++removeIt; + continue; + } + } + if (chunkReadIndex != chunkWriteIndex) + { + mChunkData[chunkWriteIndex] = mChunkData[chunkReadIndex]; + } + remap[chunkReadIndex] = chunkWriteIndex++; + } + mChunkData.resize(chunkWriteIndex); + for (ChunkInfo& chunkInfo : mChunkData) + { + if (chunkInfo.parent > 0) + { + const uint32_t mappedParent = remap[chunkInfo.parent]; + NVBLAST_ASSERT(mappedParent < mChunkData.size()); + if (mappedParent < mChunkData.size()) + { + chunkInfo.parent = mappedParent; + } + } + } } } // namespace Blast -- cgit v1.2.3