@@ -260,6 +260,7 @@ Renderer::InitializationData Renderer::initSceneObjects(const SAssetBundle& mesh
260
260
allocParams.MDIDataBuffMinAllocCnt = 1u ; // so structs from different meshbuffers are adjacent in memory
261
261
262
262
constexpr auto combinedNormalUVAttributeIx = 1 ;
263
+ constexpr auto newEnabledAttributeMask = (0x1u <<combinedNormalUVAttributeIx)|0b1 ;
263
264
264
265
auto cpump = core::make_smart_refctd_ptr<CCPUMeshPackerV2<>>(allocParams,minTrisBatch,maxTrisBatch);
265
266
uint32_t mdiBoundMax=0u ,batchInstanceBoundTotal=0u ;
@@ -289,25 +290,26 @@ Renderer::InitializationData Renderer::initSceneObjects(const SAssetBundle& mesh
289
290
vertexInput.enabledBindingFlags |= 0x1u <<freeBinding;
290
291
vertexInput.bindings [freeBinding].inputRate = EVIR_PER_VERTEX;
291
292
vertexInput.bindings [freeBinding].stride = 0u ;
292
- auto newBuff = core::make_smart_refctd_ptr<ICPUBuffer>(sizeof (uvec2)*IMeshManipulator::upperBoundVertexID (meshBuffer));
293
- auto * dst = reinterpret_cast <uvec2*>(newBuff->getPointer ());
293
+ const auto approxVxCount = IMeshManipulator::upperBoundVertexID (meshBuffer)+meshBuffer->getBaseVertex ();
294
+ struct CombinedNormalUV
295
+ {
296
+ uint32_t nml;
297
+ uint16_t u,v;
298
+ };
299
+ auto newBuff = core::make_smart_refctd_ptr<ICPUBuffer>(sizeof (CombinedNormalUV)*approxVxCount);
300
+ auto * dst = reinterpret_cast <CombinedNormalUV*>(newBuff->getPointer ())+meshBuffer->getBaseVertex ();
294
301
meshBuffer->setVertexBufferBinding ({0u ,newBuff},freeBinding);
295
302
// copy and pack data
296
- const uint8_t * nmlSrc = meshBuffer->getAttribPointer (meshBuffer-> getNormalAttributeIx () );
297
- const auto stride = meshBuffer-> getAttribStride (combinedNormalUVAttributeIx) ;
298
- for (auto i=0u ; i<meshBuffer-> getIndexCount () ; i++)
303
+ const auto normalAttr = meshBuffer->getNormalAttributeIx ();
304
+ vertexInput. attributes [normalAttr]. format = EF_R32_UINT ;
305
+ for (auto i=0u ; i<approxVxCount ; i++)
299
306
{
300
- const auto ix = meshBuffer->getIndexValue (i);
301
- if (nmlSrc)
302
- dst[ix].x = *reinterpret_cast <const uint32_t *>(nmlSrc+ix*stride);
303
- else
304
- dst[ix].x = 0xdeadbeefu ; // should warn about getting a mesh with no normals
307
+ meshBuffer->getAttribute (&dst[i].nml ,normalAttr,i);
305
308
core::vectorSIMDf uv;
306
- meshBuffer->getAttribute (uv,2u ,ix );
307
- reinterpret_cast < uint16_t *>(& dst[ix]. y )[ 0 ] = core::Float16Compressor::compress (uv.x );
308
- reinterpret_cast < uint16_t *>(& dst[ix]. y )[ 1 ] = core::Float16Compressor::compress (uv.y );
309
+ meshBuffer->getAttribute (uv,2u ,i );
310
+ dst[i]. u = core::Float16Compressor::compress (uv.x );
311
+ dst[i]. v = core::Float16Compressor::compress (uv.y );
309
312
}
310
- vertexInput.enabledAttribFlags = (0x1u <<combinedNormalUVAttributeIx)|0b1 ;
311
313
}
312
314
313
315
const uint32_t mdiBound = cpump->calcMDIStructMaxCount (meshBuffers.begin (),meshBuffers.end ());
@@ -316,6 +318,8 @@ Renderer::InitializationData Renderer::initSceneObjects(const SAssetBundle& mesh
316
318
317
319
meshBuffersToProcess.insert (meshBuffersToProcess.end (),meshBuffers.begin (),meshBuffers.end ());
318
320
}
321
+ for (auto meshBuffer : meshBuffersToProcess)
322
+ const_cast <ICPUMeshBuffer*>(meshBuffer)->getPipeline ()->getVertexInputParams ().enabledAttribFlags = newEnabledAttributeMask;
319
323
allocData.resize (meshBuffersToProcess.size ());
320
324
321
325
cpump->alloc (allocData.data (),meshBuffersToProcess.begin (),meshBuffersToProcess.end ());
0 commit comments