aboutsummaryrefslogtreecommitdiff
path: root/sdk
diff options
context:
space:
mode:
authorBryan Galdrikian <[email protected]>2019-08-19 02:18:16 -0700
committerBryan Galdrikian <[email protected]>2019-08-19 02:18:16 -0700
commit9c03a9fbef009c8e5ea406e6929907206d8d135c (patch)
tree859704aaaca035688986cae3cc75a56f6d784a68 /sdk
parentPadding bounds when determining chunks from islands, allows nearby chunks gen... (diff)
downloadblast-9c03a9fbef009c8e5ea406e6929907206d8d135c.tar.xz
blast-9c03a9fbef009c8e5ea406e6929907206d8d135c.zip
Fixing chunk hierarchy optimization/merge bugsv1.1.5_pre4
Exposing ability to remove chunks to fracture tool API
Diffstat (limited to 'sdk')
-rwxr-xr-xsdk/extensions/authoring/include/NvBlastExtAuthoringFractureTool.h5
-rwxr-xr-xsdk/extensions/authoring/source/NvBlastExtAuthoringFractureToolImpl.cpp57
-rwxr-xr-xsdk/extensions/authoring/source/NvBlastExtAuthoringFractureToolImpl.h3
3 files changed, 26 insertions, 39 deletions
diff --git a/sdk/extensions/authoring/include/NvBlastExtAuthoringFractureTool.h b/sdk/extensions/authoring/include/NvBlastExtAuthoringFractureTool.h
index 8f9e3bb..55b15f5 100755
--- a/sdk/extensions/authoring/include/NvBlastExtAuthoringFractureTool.h
+++ b/sdk/extensions/authoring/include/NvBlastExtAuthoringFractureTool.h
@@ -486,12 +486,13 @@ class FractureTool
*/
virtual bool isMeshContainOpenEdges(const Mesh* input) = 0;
- /**
+ /**
Delete all children for specified chunk (also recursively delete chidren of children).
\param[in] chunkId Chunk ID which children should be deleted
+ \param[in] deleteRoot (optional) If true, deletes the given chunk too
\return true if one or more chunks were removed
*/
- virtual bool deleteAllChildrenOfChunk(int32_t chunkId) = 0;
+ virtual bool deleteChunkSubhierarchy(int32_t chunkId, bool deleteRoot = false) = 0;
/**
Optimize chunk hierarhy for better runtime performance.
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<int32_t>(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<int32_t>(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<int32_t> 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<uint32_t>& group, std::vector<std::vector<uint32_t>>& graph);