Skip to content

Commit 2a72149

Browse files
the mesh manipulation API is rather complex
1 parent f0757d2 commit 2a72149

File tree

1 file changed

+18
-14
lines changed

1 file changed

+18
-14
lines changed

examples_tests/22.RaytracedAO/Renderer.cpp

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ Renderer::InitializationData Renderer::initSceneObjects(const SAssetBundle& mesh
260260
allocParams.MDIDataBuffMinAllocCnt = 1u; //so structs from different meshbuffers are adjacent in memory
261261

262262
constexpr auto combinedNormalUVAttributeIx = 1;
263+
constexpr auto newEnabledAttributeMask = (0x1u<<combinedNormalUVAttributeIx)|0b1;
263264

264265
auto cpump = core::make_smart_refctd_ptr<CCPUMeshPackerV2<>>(allocParams,minTrisBatch,maxTrisBatch);
265266
uint32_t mdiBoundMax=0u,batchInstanceBoundTotal=0u;
@@ -289,25 +290,26 @@ Renderer::InitializationData Renderer::initSceneObjects(const SAssetBundle& mesh
289290
vertexInput.enabledBindingFlags |= 0x1u<<freeBinding;
290291
vertexInput.bindings[freeBinding].inputRate = EVIR_PER_VERTEX;
291292
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();
294301
meshBuffer->setVertexBufferBinding({0u,newBuff},freeBinding);
295302
// 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++)
299306
{
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);
305308
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);
309312
}
310-
vertexInput.enabledAttribFlags = (0x1u<<combinedNormalUVAttributeIx)|0b1;
311313
}
312314

313315
const uint32_t mdiBound = cpump->calcMDIStructMaxCount(meshBuffers.begin(),meshBuffers.end());
@@ -316,6 +318,8 @@ Renderer::InitializationData Renderer::initSceneObjects(const SAssetBundle& mesh
316318

317319
meshBuffersToProcess.insert(meshBuffersToProcess.end(),meshBuffers.begin(),meshBuffers.end());
318320
}
321+
for (auto meshBuffer : meshBuffersToProcess)
322+
const_cast<ICPUMeshBuffer*>(meshBuffer)->getPipeline()->getVertexInputParams().enabledAttribFlags = newEnabledAttributeMask;
319323
allocData.resize(meshBuffersToProcess.size());
320324

321325
cpump->alloc(allocData.data(),meshBuffersToProcess.begin(),meshBuffersToProcess.end());

0 commit comments

Comments
 (0)