Skip to content

Commit 94a87e0

Browse files
committed
Improved packing mesh buffers with non triangle list topologies
1 parent ee69e74 commit 94a87e0

File tree

1 file changed

+21
-20
lines changed

1 file changed

+21
-20
lines changed

include/nbl/asset/utils/IMeshPacker.h

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ class IMeshPacker : public IMeshPackerBase
215215
struct IdxBufferParams
216216
{
217217
SBufferBinding<ICPUBuffer> idxBuffer = { 0u, nullptr };
218-
E_INDEX_TYPE indexType = EIT_UNKNOWN;
218+
E_INDEX_TYPE idxType = EIT_UNKNOWN;
219219
};
220220

221221
//TODO: functions: constructTriangleBatches, convertIdxBufferToTriangles, deinterleaveAndCopyAttribute and deinterleaveAndCopyPerInstanceAttribute
@@ -271,30 +271,27 @@ class IMeshPacker : public IMeshPackerBase
271271
TriangleBatches triangleBatches(triCnt);
272272
core::vector<TriangleMortonCodePair> triangles(triCnt); //#1
273273

274+
core::smart_refctd_ptr<ICPUMeshBuffer> mbTmp = core::smart_refctd_ptr_static_cast<ICPUMeshBuffer>(meshBuffer->clone());
275+
mbTmp->setIndexBufferBinding(std::move(idxBufferParams.idxBuffer));
276+
mbTmp->setIndexType(idxBufferParams.idxType);
277+
mbTmp->getPipeline()->getPrimitiveAssemblyParams().primitiveType = EPT_TRIANGLE_LIST;
278+
274279
//triangle reordering
275280
{
276-
const bool wasTmpIdxBufferSet = idxBufferParams.idxBuffer.buffer.get() != nullptr ? true : false;
277-
if (wasTmpIdxBufferSet)
278-
{
279-
auto tmpBuffer = std::move(meshBuffer->getIndexBufferBinding());
280-
meshBuffer->setIndexBufferBinding(std::move(idxBufferParams.idxBuffer));
281-
idxBufferParams.idxBuffer = std::move(tmpBuffer);
282-
}
283-
284-
const core::aabbox3df aabb = IMeshManipulator::calculateBoundingBox(meshBuffer);
281+
const core::aabbox3df aabb = IMeshManipulator::calculateBoundingBox(mbTmp.get());
285282

286283
uint32_t ix = 0u;
287284
float maxTriangleArea = 0.0f;
288285
for (auto it = triangles.begin(); it != triangles.end(); it++)
289286
{
290-
auto triangleIndices = IMeshManipulator::getTriangleIndices(meshBuffer, ix++);
287+
auto triangleIndices = IMeshManipulator::getTriangleIndices(mbTmp.get(), ix++);
291288
//have to copy there
292289
std::copy(triangleIndices.begin(), triangleIndices.end(), it->triangle.oldIndices);
293290

294291
core::vectorSIMDf trianglePos[3];
295-
trianglePos[0] = meshBuffer->getPosition(it->triangle.oldIndices[0]);
296-
trianglePos[1] = meshBuffer->getPosition(it->triangle.oldIndices[1]);
297-
trianglePos[2] = meshBuffer->getPosition(it->triangle.oldIndices[2]);
292+
trianglePos[0] = mbTmp->getPosition(it->triangle.oldIndices[0]);
293+
trianglePos[1] = mbTmp->getPosition(it->triangle.oldIndices[1]);
294+
trianglePos[2] = mbTmp->getPosition(it->triangle.oldIndices[2]);
298295

299296
const core::vectorSIMDf centroid = ((trianglePos[0] + trianglePos[1] + trianglePos[2]) / 3.0f) - core::vectorSIMDf(aabb.MinEdge.X, aabb.MinEdge.Y, aabb.MinEdge.Z);
300297
uint16_t fixedPointPos[3];
@@ -309,9 +306,6 @@ class IMeshPacker : public IMeshPackerBase
309306
maxTriangleArea = area;
310307
}
311308

312-
if (wasTmpIdxBufferSet)
313-
meshBuffer->setIndexBufferBinding(std::move(idxBufferParams.idxBuffer));
314-
315309
//complete morton code
316310
for (auto it = triangles.begin(); it != triangles.end(); it++)
317311
it->mortonCode.complete(maxTriangleArea);
@@ -557,13 +551,20 @@ class IMeshPacker : public IMeshPackerBase
557551
{
558552
IdxBufferParams output;
559553

560-
const auto mbPrimitiveType = meshBuffer->getPipeline()->getPrimitiveAssemblyParams().primitiveType;
561-
if (mbPrimitiveType != EPT_TRIANGLE_LIST)
554+
const auto& mbPrimitiveType = meshBuffer->getPipeline()->getPrimitiveAssemblyParams().primitiveType;
555+
if (mbPrimitiveType == EPT_TRIANGLE_LIST)
556+
{
557+
const auto& mbIdxBuff = meshBuffer->getIndexBufferBinding();
558+
output.idxBuffer.offset = mbIdxBuff.offset;
559+
output.idxBuffer.buffer = core::smart_refctd_ptr(mbIdxBuff.buffer);
560+
output.idxType = meshBuffer->getIndexType();
561+
}
562+
else
562563
{
563564
auto newIdxBuffer = convertIdxBufferToTriangles(meshBuffer);
564565
output.idxBuffer.offset = 0u;
565566
output.idxBuffer.buffer = newIdxBuffer.second;
566-
output.indexType = EIT_32BIT;
567+
output.idxType = EIT_32BIT;
567568
}
568569

569570
return output;

0 commit comments

Comments
 (0)