@@ -215,7 +215,7 @@ class IMeshPacker : public IMeshPackerBase
215
215
struct IdxBufferParams
216
216
{
217
217
SBufferBinding<ICPUBuffer> idxBuffer = { 0u , nullptr };
218
- E_INDEX_TYPE indexType = EIT_UNKNOWN;
218
+ E_INDEX_TYPE idxType = EIT_UNKNOWN;
219
219
};
220
220
221
221
// TODO: functions: constructTriangleBatches, convertIdxBufferToTriangles, deinterleaveAndCopyAttribute and deinterleaveAndCopyPerInstanceAttribute
@@ -271,30 +271,27 @@ class IMeshPacker : public IMeshPackerBase
271
271
TriangleBatches triangleBatches (triCnt);
272
272
core::vector<TriangleMortonCodePair> triangles (triCnt); // #1
273
273
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
+
274
279
// triangle reordering
275
280
{
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 ());
285
282
286
283
uint32_t ix = 0u ;
287
284
float maxTriangleArea = 0 .0f ;
288
285
for (auto it = triangles.begin (); it != triangles.end (); it++)
289
286
{
290
- auto triangleIndices = IMeshManipulator::getTriangleIndices (meshBuffer , ix++);
287
+ auto triangleIndices = IMeshManipulator::getTriangleIndices (mbTmp. get () , ix++);
291
288
// have to copy there
292
289
std::copy (triangleIndices.begin (), triangleIndices.end (), it->triangle .oldIndices );
293
290
294
291
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 ]);
298
295
299
296
const core::vectorSIMDf centroid = ((trianglePos[0 ] + trianglePos[1 ] + trianglePos[2 ]) / 3 .0f ) - core::vectorSIMDf (aabb.MinEdge .X , aabb.MinEdge .Y , aabb.MinEdge .Z );
300
297
uint16_t fixedPointPos[3 ];
@@ -309,9 +306,6 @@ class IMeshPacker : public IMeshPackerBase
309
306
maxTriangleArea = area;
310
307
}
311
308
312
- if (wasTmpIdxBufferSet)
313
- meshBuffer->setIndexBufferBinding (std::move (idxBufferParams.idxBuffer ));
314
-
315
309
// complete morton code
316
310
for (auto it = triangles.begin (); it != triangles.end (); it++)
317
311
it->mortonCode .complete (maxTriangleArea);
@@ -557,13 +551,20 @@ class IMeshPacker : public IMeshPackerBase
557
551
{
558
552
IdxBufferParams output;
559
553
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
562
563
{
563
564
auto newIdxBuffer = convertIdxBufferToTriangles (meshBuffer);
564
565
output.idxBuffer .offset = 0u ;
565
566
output.idxBuffer .buffer = newIdxBuffer.second ;
566
- output.indexType = EIT_32BIT;
567
+ output.idxType = EIT_32BIT;
567
568
}
568
569
569
570
return output;
0 commit comments