Skip to content

Commit 51d003f

Browse files
Fix Instancing Bug In MistubaLoader, fully.
Also fix a long ICPUMesh cloning bug.
1 parent 2aa584f commit 51d003f

File tree

2 files changed

+23
-19
lines changed

2 files changed

+23
-19
lines changed

include/nbl/asset/ICPUMesh.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ class ICPUMesh final : public IMesh<ICPUMeshBuffer>, public BlobSerializable, pu
9999
{
100100
auto cp = core::make_smart_refctd_ptr<ICPUMesh>();
101101
clone_common(cp.get());
102+
cp->m_cachedBoundingBox = m_cachedBoundingBox;
102103
cp->m_meshBuffers.resize(m_meshBuffers.size());
103104

104105
auto outIt = cp->m_meshBuffers.begin();

src/nbl/ext/MitsubaLoader/CMitsubaLoader.cpp

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -657,7 +657,7 @@ static core::smart_refctd_ptr<ICPUMesh> createMeshFromGeomCreatorReturnType(IGeo
657657

658658
SContext::shape_ass_type CMitsubaLoader::loadBasicShape(SContext& ctx, uint32_t hierarchyLevel, CElementShape* shape, const core::matrix3x4SIMD& relTform)
659659
{
660-
constexpr uint32_t UV_ATTRIB_ID = 2U;
660+
constexpr uint32_t UV_ATTRIB_ID = 2u;
661661

662662
auto addInstance = [shape,&ctx,&relTform,this](SContext::shape_ass_type& mesh)
663663
{
@@ -777,14 +777,17 @@ SContext::shape_ass_type CMitsubaLoader::loadBasicShape(SContext& ctx, uint32_t
777777
maxSmoothAngle = shape->obj.maxSmoothAngle;
778778
if (mesh && shape->obj.flipTexCoords)
779779
{
780-
newMesh = core::smart_refctd_ptr_static_cast<asset::ICPUMesh>(mesh->clone(~0u));//clone everything (for the texcoords)
781-
for (auto meshbuffer : newMesh->getMeshBuffers())
780+
newMesh = core::smart_refctd_ptr_static_cast<asset::ICPUMesh> (mesh->clone(1u));
781+
for (auto& meshbuffer : mesh->getMeshBufferVector())
782782
{
783+
auto binding = meshbuffer->getVertexBufferBindings()[UV_ATTRIB_ID];
784+
binding.buffer = core::smart_refctd_ptr_static_cast<ICPUBuffer>(binding.buffer->clone(0u));
785+
meshbuffer->setVertexBufferBinding(std::move(binding),UV_ATTRIB_ID);
783786
core::vectorSIMDf uv;
784-
for (uint32_t i=0u; meshbuffer->getAttribute(uv, UV_ATTRIB_ID, i); i++)
787+
for (uint32_t i=0u; meshbuffer->getAttribute(uv,UV_ATTRIB_ID,i); i++)
785788
{
786789
uv.y = -uv.y;
787-
meshbuffer->setAttribute(uv, UV_ATTRIB_ID, i);
790+
meshbuffer->setAttribute(uv,UV_ATTRIB_ID,i);
788791
}
789792
}
790793
}
@@ -806,12 +809,11 @@ SContext::shape_ass_type CMitsubaLoader::loadBasicShape(SContext& ctx, uint32_t
806809
constexpr uint32_t hidefRGBSize = 4u;
807810
auto newRGB = core::make_smart_refctd_ptr<asset::ICPUBuffer>(hidefRGBSize*totalVertexCount);
808811
uint32_t* it = reinterpret_cast<uint32_t*>(newRGB->getPointer());
809-
newMesh = core::smart_refctd_ptr_static_cast<asset::ICPUMesh>(mesh->clone(~0u));//clone everything
810-
for (auto meshbuffer : newMesh->getMeshBuffers())
812+
newMesh = core::smart_refctd_ptr_static_cast<asset::ICPUMesh>(mesh->clone(1u));
813+
for (auto& meshbuffer : mesh->getMeshBufferVector())
811814
{
812-
uint32_t offset = reinterpret_cast<uint8_t*>(it)-reinterpret_cast<uint8_t*>(newRGB->getPointer());
813815
core::vectorSIMDf rgb;
814-
for (uint32_t i=0u; meshbuffer->getAttribute(rgb, 1u, i); i++,it++)
816+
for (uint32_t i=0u; meshbuffer->getAttribute(rgb,1u,i); i++,it++)
815817
{
816818
for (auto i=0; i<3u; i++)
817819
rgb[i] = core::srgb2lin(rgb[i]);
@@ -849,20 +851,21 @@ SContext::shape_ass_type CMitsubaLoader::loadBasicShape(SContext& ctx, uint32_t
849851
if (!mesh)
850852
return nullptr;
851853

854+
// mesh including meshbuffers needs to be cloned because instance counts and base instances will be changed
855+
if (!newMesh)
856+
newMesh = core::smart_refctd_ptr_static_cast<asset::ICPUMesh>(mesh->clone(1u));
852857
// flip normals if necessary
853858
if (flipNormals)
854859
{
855-
if (!newMesh)
856-
newMesh = core::smart_refctd_ptr_static_cast<asset::ICPUMesh>(mesh->clone(~0u));//clone everything (for the index buffer)
857-
for (auto meshbuffer : mesh->getMeshBuffers())
858-
ctx.manipulator->flipSurfaces(meshbuffer);
859-
}
860-
861-
if (!newMesh)
862-
{
863-
newMesh = core::make_smart_refctd_ptr<ICPUMesh>();
864-
newMesh->getMeshBufferVector() = mesh->getMeshBufferVector();
860+
for (auto& meshbuffer : mesh->getMeshBufferVector())
861+
{
862+
auto binding = meshbuffer->getIndexBufferBinding();
863+
binding.buffer = core::smart_refctd_ptr_static_cast<ICPUBuffer>(binding.buffer->clone(0u));
864+
meshbuffer->setIndexBufferBinding(std::move(binding));
865+
ctx.manipulator->flipSurfaces(meshbuffer.get());
866+
}
865867
}
868+
// recompute normalis if necessary
866869
if (faceNormals || !std::isnan(maxSmoothAngle))
867870
for (auto& meshbuffer : mesh->getMeshBufferVector())
868871
{

0 commit comments

Comments
 (0)