diff options
| author | Bryan Galdrikian <[email protected]> | 2019-07-15 21:28:41 -0700 |
|---|---|---|
| committer | Bryan Galdrikian <[email protected]> | 2019-07-15 21:28:41 -0700 |
| commit | 9e911235772cb122b44b3a55a3f796072098ce04 (patch) | |
| tree | bd8a0e6199eb35364883dffc2f2f69a2b20078fe /sdk/extensions/authoring/source/NvBlastExtAuthoringFractureToolImpl.cpp | |
| parent | Hierarchy optimization bugfixes and improvements (diff) | |
| download | blast-1.1.5_pre3.tar.xz blast-1.1.5_pre3.zip | |
Padding bounds when determining chunks from islands, allows nearby chunks generated this way to be merged with uniteChunks.v1.1.5_pre3
Fixing bug when removing original chunks in uniteChunks function.
Diffstat (limited to 'sdk/extensions/authoring/source/NvBlastExtAuthoringFractureToolImpl.cpp')
| -rwxr-xr-x | sdk/extensions/authoring/source/NvBlastExtAuthoringFractureToolImpl.cpp | 41 |
1 files changed, 34 insertions, 7 deletions
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<uint32_t> remap(mChunkData.size(), 0xFFFFFFFF);
+ std::sort(chunksToRemove.begin(), chunksToRemove.end());
+ std::vector<uint32_t>::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
|