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. --- .../NvBlastExtAuthoringBondGeneratorImpl.cpp | 5 +-- .../source/NvBlastExtAuthoringBondGeneratorImpl.h | 2 +- .../source/NvBlastExtAuthoringFractureToolImpl.cpp | 41 ++++++++++++++++++---- 3 files changed, 38 insertions(+), 10 deletions(-) (limited to 'sdk') diff --git a/sdk/extensions/authoring/source/NvBlastExtAuthoringBondGeneratorImpl.cpp b/sdk/extensions/authoring/source/NvBlastExtAuthoringBondGeneratorImpl.cpp index 318479f..bda11e9 100755 --- a/sdk/extensions/authoring/source/NvBlastExtAuthoringBondGeneratorImpl.cpp +++ b/sdk/extensions/authoring/source/NvBlastExtAuthoringBondGeneratorImpl.cpp @@ -267,7 +267,7 @@ float BlastBondGeneratorImpl::processWithMidplanes(TriangleProcessor* trProcesso const Triangle* mB, uint32_t mbvc, const CollisionHull* hull1, const CollisionHull* hull2, const std::vector& hull1p, const std::vector& hull2p, PxVec3& normal, PxVec3& centroid, - float maxSeparation) + float maxRelSeparation) { PxBounds3 bounds; PxBounds3 aBounds; @@ -302,6 +302,7 @@ float BlastBondGeneratorImpl::processWithMidplanes(TriangleProcessor* trProcesso chunk1Centroid *= (1.0f / hull1p.size()); chunk2Centroid *= (1.0f / hull2p.size()); + const float maxSeparation = maxRelSeparation * std::sqrt(std::max(aBounds.getExtents().magnitudeSquared(), bBounds.getExtents().magnitudeSquared())); Separation separation; if (!importerHullsInProximityApexFree(hull1p.size(), hull1p.data(), aBounds, PxTransform(PxIdentity), @@ -1283,7 +1284,7 @@ int32_t BlastBondGeneratorImpl::buildDescFromInternalFracture(FractureTool* tool BondGenerationConfig cfg; cfg.bondMode = BondGenerationConfig::AVERAGE; - cfg.maxSeparation = 0.0f; + cfg.maxSeparation = 0.01f; uint32_t nbListSize = createFullBondListAveraged(chunkCount, chunkTrianglesOffsets.data(), chunkTriangles.data(), nullptr, diff --git a/sdk/extensions/authoring/source/NvBlastExtAuthoringBondGeneratorImpl.h b/sdk/extensions/authoring/source/NvBlastExtAuthoringBondGeneratorImpl.h index 79c43bb..fd81c2c 100755 --- a/sdk/extensions/authoring/source/NvBlastExtAuthoringBondGeneratorImpl.h +++ b/sdk/extensions/authoring/source/NvBlastExtAuthoringBondGeneratorImpl.h @@ -76,7 +76,7 @@ public: private: float processWithMidplanes(TriangleProcessor* trProcessor, const Triangle* mA, uint32_t mavc, const Triangle* mB, uint32_t mbvc, const CollisionHull* hull1, const CollisionHull* hull2, const std::vector& hull1p, const std::vector& hull2p, - physx::PxVec3& normal, physx::PxVec3& centroid, float maxSeparation); + physx::PxVec3& normal, physx::PxVec3& centroid, float maxRelSeparation); int32_t createFullBondListAveraged( uint32_t meshCount, const uint32_t* geometryOffset, const Triangle* geometry, const CollisionHull** chunkHulls, const bool* supportFlags, const uint32_t* meshGroups, NvBlastBondDesc*& resultBondDescs, BondGenerationConfig conf, std::set >* pairNotToTest = nullptr); 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