@@ -217,11 +217,20 @@ asset::SAssetBundle CSerializedLoader::loadAsset(io::IReadFile* _file, const ass
217
217
218
218
auto buf = core::make_smart_refctd_ptr<asset::ICPUBuffer>(totalDataSize);
219
219
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
221
221
{
222
222
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
+ }
225
234
};
226
235
227
236
auto meshBuffer = core::make_smart_refctd_ptr<asset::ICPUMeshBuffer>();
@@ -308,7 +317,7 @@ asset::SAssetBundle CSerializedLoader::loadAsset(io::IReadFile* _file, const ass
308
317
inputParams.bindings [0 ].stride = vertexSize;
309
318
310
319
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
312
321
{
313
322
asset::E_FORMAT format = asset::EF_UNKNOWN;
314
323
switch (attrCount)
@@ -333,20 +342,22 @@ asset::SAssetBundle CSerializedLoader::loadAsset(io::IReadFile* _file, const ass
333
342
if (read)
334
343
{
335
344
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 );
337
346
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 );
339
348
}
340
349
attrOffset += attrCount;
341
350
};
342
351
343
- readAttributeDispatch (POSITION_ATTRIBUTE, 3ull );
352
+ core::aabbox3df aabb;
353
+ readAttributeDispatch (POSITION_ATTRIBUTE, 3ull , &aabb);
354
+ meshBuffer->setBoundingBox (aabb);
344
355
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
346
357
if (flags & MF_TEXTURE_COORDINATES) // TODO: UV quantization and optimization
347
- readAttributeDispatch (UV_ATTRIBUTE, 2ull );
358
+ readAttributeDispatch (UV_ATTRIBUTE, 2ull , nullptr );
348
359
if (flags & MF_VERTEX_COLORS) // TODO: quantize to 32bit format like RGB9E5
349
- readAttributeDispatch (COLOR_ATTRIBUTE, 3ull );
360
+ readAttributeDispatch (COLOR_ATTRIBUTE, 3ull , nullptr );
350
361
351
362
auto mbPipeline = core::make_smart_refctd_ptr<asset::ICPURenderpassIndependentPipeline>(std::move (mbPipelineLayout), nullptr , nullptr , inputParams, blendParams, primitiveAssemblyParams, rastarizationParams);
352
363
mbPipeline->setShaderAtStage (asset::ISpecializedShader::E_SHADER_STAGE::ESS_VERTEX, mbVertexShader.get ());
@@ -387,7 +398,6 @@ asset::SAssetBundle CSerializedLoader::loadAsset(io::IReadFile* _file, const ass
387
398
continue ;
388
399
389
400
manager->setAssetMetadata (mbPipeline.get (), core::make_smart_refctd_ptr<nbl::ext::MitsubaLoader::CMitsubaSerializedPipelineMetadata>(std::move (shaderInputsMetadata)));
390
- meshBuffer->recalculateBoundingBox ();
391
401
meshBuffer->setPipeline (std::move (mbPipeline));
392
402
393
403
auto mesh = core::make_smart_refctd_ptr<asset::CCPUMesh>();
0 commit comments