Skip to content

Commit ee9db86

Browse files
fix bounding box computation error
1 parent a308fa2 commit ee9db86

File tree

1 file changed

+21
-11
lines changed

1 file changed

+21
-11
lines changed

src/nbl/ext/MitsubaLoader/CSerializedLoader.cpp

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -217,11 +217,20 @@ asset::SAssetBundle CSerializedLoader::loadAsset(io::IReadFile* _file, const ass
217217

218218
auto buf = core::make_smart_refctd_ptr<asset::ICPUBuffer>(totalDataSize);
219219
void* outPtr = buf->getPointer();
220-
auto readAttributes = [&](auto* outPtr, size_t attrOffset, auto* &inPtr, size_t attrCount) -> void
220+
auto readAttributes = [&](auto* outPtr, size_t attrOffset, auto* &inPtr, uint32_t attrCount, core::aabbox3df* aabb=nullptr) -> void
221221
{
222222
for (uint64_t j=0ull; j<vertexCount; j++)
223-
for (uint64_t k=0ull; k<attrCount; k++)
224-
outPtr[j*vertexAttributeCount+attrOffset+k] = *(inPtr++);
223+
{
224+
if (aabb)
225+
{
226+
if (j)
227+
aabb->addInternalPoint(inPtr[0],inPtr[1],inPtr[2]);
228+
else
229+
aabb->reset(inPtr[0],inPtr[1],inPtr[2]);
230+
}
231+
for (auto k=0u; k<attrCount; k++)
232+
outPtr[j*vertexAttributeCount+attrOffset+k] = *(inPtr++);
233+
}
225234
};
226235

227236
auto meshBuffer = core::make_smart_refctd_ptr<asset::ICPUMeshBuffer>();
@@ -308,7 +317,7 @@ asset::SAssetBundle CSerializedLoader::loadAsset(io::IReadFile* _file, const ass
308317
inputParams.bindings[0].stride = vertexSize;
309318

310319
size_t attrOffset = 0ull;
311-
auto readAttributeDispatch = [&](auto attrId, size_t attrCount, bool read = true) -> void
320+
auto readAttributeDispatch = [&](auto attrId, size_t attrCount, core::aabbox3df* aabb, bool read = true) -> void
312321
{
313322
asset::E_FORMAT format = asset::EF_UNKNOWN;
314323
switch (attrCount)
@@ -333,20 +342,22 @@ asset::SAssetBundle CSerializedLoader::loadAsset(io::IReadFile* _file, const ass
333342
if (read)
334343
{
335344
if (flags & MF_SINGLE_FLOAT)
336-
readAttributes(reinterpret_cast<float*>(outPtr), attrOffset, reinterpret_cast<float*&>(ptr), attrCount);
345+
readAttributes(reinterpret_cast<float*>(outPtr), attrOffset, reinterpret_cast<float*&>(ptr), attrCount, aabb);
337346
else if (flags & MF_DOUBLE_FLOAT)
338-
readAttributes(reinterpret_cast<double*>(outPtr), attrOffset, reinterpret_cast<double*&>(ptr), attrCount);
347+
readAttributes(reinterpret_cast<double*>(outPtr), attrOffset, reinterpret_cast<double*&>(ptr), attrCount, aabb);
339348
}
340349
attrOffset += attrCount;
341350
};
342351

343-
readAttributeDispatch(POSITION_ATTRIBUTE, 3ull);
352+
core::aabbox3df aabb;
353+
readAttributeDispatch(POSITION_ATTRIBUTE, 3ull, &aabb);
354+
meshBuffer->setBoundingBox(aabb);
344355
if ((flags & MF_PER_VERTEX_NORMALS) || (flags & MF_FACE_NORMALS))
345-
readAttributeDispatch(NORMAL_ATTRIBUTE, 3ull, flags&MF_PER_VERTEX_NORMALS); // TODO: normal quantization and optimization
356+
readAttributeDispatch(NORMAL_ATTRIBUTE, 3ull, nullptr, flags&MF_PER_VERTEX_NORMALS); // TODO: normal quantization and optimization
346357
if (flags & MF_TEXTURE_COORDINATES) // TODO: UV quantization and optimization
347-
readAttributeDispatch(UV_ATTRIBUTE, 2ull);
358+
readAttributeDispatch(UV_ATTRIBUTE, 2ull, nullptr);
348359
if (flags & MF_VERTEX_COLORS) // TODO: quantize to 32bit format like RGB9E5
349-
readAttributeDispatch(COLOR_ATTRIBUTE, 3ull);
360+
readAttributeDispatch(COLOR_ATTRIBUTE, 3ull, nullptr);
350361

351362
auto mbPipeline = core::make_smart_refctd_ptr<asset::ICPURenderpassIndependentPipeline>(std::move(mbPipelineLayout), nullptr, nullptr, inputParams, blendParams, primitiveAssemblyParams, rastarizationParams);
352363
mbPipeline->setShaderAtStage(asset::ISpecializedShader::E_SHADER_STAGE::ESS_VERTEX, mbVertexShader.get());
@@ -387,7 +398,6 @@ asset::SAssetBundle CSerializedLoader::loadAsset(io::IReadFile* _file, const ass
387398
continue;
388399

389400
manager->setAssetMetadata(mbPipeline.get(), core::make_smart_refctd_ptr<nbl::ext::MitsubaLoader::CMitsubaSerializedPipelineMetadata>(std::move(shaderInputsMetadata)));
390-
meshBuffer->recalculateBoundingBox();
391401
meshBuffer->setPipeline(std::move(mbPipeline));
392402

393403
auto mesh = core::make_smart_refctd_ptr<asset::CCPUMesh>();

0 commit comments

Comments
 (0)