diff options
Diffstat (limited to 'sdk/extensions')
3 files changed, 38 insertions, 10 deletions
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<PxVec3>& hull1p,
const std::vector<PxVec3>& 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<physx::PxVec3>& hull1p, const std::vector<physx::PxVec3>& 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<std::pair<uint32_t, uint32_t> >* 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<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
|