Fix invalid index buffer format returned by MeshAccessor when model is not yet loaded

#4017
This commit is contained in:
Wojtek Figat
2026-03-24 23:13:50 +01:00
parent 7b3cfd989f
commit e8134803c4
4 changed files with 25 additions and 8 deletions

View File

@@ -218,10 +218,16 @@ bool MeshAccessor::LoadMesh(const MeshBase* mesh, bool forceGpu, Span<MeshBuffer
return true;
for (int32 i = 0; i < buffers.Length(); i++)
{
_data[(int32)buffers[i]] = MoveTemp(meshBuffers[i]);
_layouts[(int32)buffers[i]] = meshLayouts[i];
const int32 buffer = (int32)buffers[i];
_data[buffer] = MoveTemp(meshBuffers[i]);
_layouts[buffer] = meshLayouts[i];
// Get format if using a single item (eg. index buffer type)
PixelFormat format = PixelFormat::Unknown;
if (meshLayouts[i] && meshLayouts[i]->GetElements().Count() == 1)
format = meshLayouts[i]->GetElements()[0].Format;
_formats[buffer] = format;
}
_formats[(int32)MeshBufferType::Index] = mesh->Use16BitIndexBuffer() ? PixelFormat::R16_UInt : PixelFormat::R32_UInt;
return false;
}
@@ -732,6 +738,9 @@ bool MeshBase::DownloadDataCPU(MeshBufferType type, BytesContainer& result, int3
_cachedVertexBufferCount = meshData.Vertices;
_cachedIndexBufferCount = (int32)meshData.Triangles * 3;
_cachedIndexBuffer.Copy((const byte*)meshData.IBData, _cachedIndexBufferCount * (int32)meshData.IBStride);
GPUVertexLayout::Elements ibLayout;
ibLayout.Add({ VertexElement::Types::Attribute, 0, 0, 0, meshData.IBStride == sizeof(uint16) ? PixelFormat::R16_UInt : PixelFormat::R32_UInt });
_cachedVertexLayouts[3] = GPUVertexLayout::Get(ibLayout);
for (int32 vb = 0; vb < meshData.VBData.Count(); vb++)
{
_cachedVertexBuffers[vb].Copy((const byte*)meshData.VBData[vb], (int32)(meshData.VBLayout[vb]->GetStride() * meshData.Vertices));
@@ -746,6 +755,8 @@ bool MeshBase::DownloadDataCPU(MeshBufferType type, BytesContainer& result, int3
case MeshBufferType::Index:
result.Link(_cachedIndexBuffer);
count = _cachedIndexBufferCount;
if (layout)
*layout = _cachedVertexLayouts[3];
break;
case MeshBufferType::Vertex0:
result.Link(_cachedVertexBuffers[0]);