diff --git a/Source/Engine/Graphics/Models/MeshAccessor.cs b/Source/Engine/Graphics/Models/MeshAccessor.cs index 29aa86c18..ffe509476 100644 --- a/Source/Engine/Graphics/Models/MeshAccessor.cs +++ b/Source/Engine/Graphics/Models/MeshAccessor.cs @@ -413,10 +413,16 @@ namespace FlaxEngine return true; for (int i = 0; i < buffersLocal.Length; i++) { - _data[(int)buffersLocal[i]] = meshBuffers[i]; - _layouts[(int)buffersLocal[i]] = meshLayouts[i]; + int buffer = (int)buffersLocal[i]; + _data[buffer] = meshBuffers[i]; + _layouts[buffer] = meshLayouts[i]; + + // Get format if using a single item (eg. index buffer type) + var format = PixelFormat.Unknown; + if (meshLayouts[i] && meshLayouts[i].Elements.Length == 1) + format = meshLayouts[i].Elements[0].Format; + _formats[buffer] = format; } - _formats[(int)MeshBufferType.Index] = mesh.Use16BitIndexBuffer ? PixelFormat.R16_UInt : PixelFormat.R32_UInt; return false; } diff --git a/Source/Engine/Graphics/Models/MeshBase.cpp b/Source/Engine/Graphics/Models/MeshBase.cpp index 275a072d1..81fffb3e7 100644 --- a/Source/Engine/Graphics/Models/MeshBase.cpp +++ b/Source/Engine/Graphics/Models/MeshBase.cpp @@ -218,10 +218,16 @@ bool MeshAccessor::LoadMesh(const MeshBase* mesh, bool forceGpu, SpanGetElements().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]); diff --git a/Source/Engine/Graphics/Models/MeshBase.h b/Source/Engine/Graphics/Models/MeshBase.h index 1c76df166..cb51f466b 100644 --- a/Source/Engine/Graphics/Models/MeshBase.h +++ b/Source/Engine/Graphics/Models/MeshBase.h @@ -50,7 +50,7 @@ protected: GPUBuffer* _indexBuffer = nullptr; mutable BytesContainer _cachedVertexBuffers[MODEL_MAX_VB]; - mutable GPUVertexLayout* _cachedVertexLayouts[MODEL_MAX_VB] = {}; + mutable GPUVertexLayout* _cachedVertexLayouts[MODEL_MAX_VB + 1] = {}; mutable BytesContainer _cachedIndexBuffer; mutable int32 _cachedIndexBufferCount = 0, _cachedVertexBufferCount = 0; diff --git a/Source/Engine/Tools/ModelTool/MeshAccelerationStructure.cpp b/Source/Engine/Tools/ModelTool/MeshAccelerationStructure.cpp index 297a6f868..7dd33c12a 100644 --- a/Source/Engine/Tools/ModelTool/MeshAccelerationStructure.cpp +++ b/Source/Engine/Tools/ModelTool/MeshAccelerationStructure.cpp @@ -349,7 +349,7 @@ void MeshAccelerationStructure::Add(Model* model, int32 lodIndex) meshData.IndexBuffer.Copy(indexStream.GetData()); meshData.VertexBuffer.Allocate(meshData.Vertices * sizeof(Float3)); positionStream.CopyTo(ToSpan(meshData.VertexBuffer.Get(), meshData.Vertices)); - meshData.Use16BitIndexBuffer = mesh.Use16BitIndexBuffer(); + meshData.Use16BitIndexBuffer = indexStream.GetFormat() == PixelFormat::R16_UInt; meshData.Bounds = mesh.GetBox(); } }