| 200 | } |
| 201 | |
| 202 | bool MeshAccessor::LoadMesh(const MeshBase* mesh, bool forceGpu, Span<MeshBufferType> buffers) |
| 203 | { |
| 204 | CHECK_RETURN(mesh, true); |
| 205 | constexpr MeshBufferType allBuffers[(int32)MeshBufferType::MAX] = { MeshBufferType::Index, MeshBufferType::Vertex0, MeshBufferType::Vertex1, MeshBufferType::Vertex2 }; |
| 206 | if (buffers.IsInvalid()) |
| 207 | buffers = Span<MeshBufferType>(allBuffers, ARRAY_COUNT(allBuffers)); |
| 208 | Array<BytesContainer, FixedAllocation<4>> meshBuffers; |
| 209 | Array<GPUVertexLayout*, FixedAllocation<4>> meshLayouts; |
| 210 | if (ModelBase* model = mesh->GetModelBase()) |
| 211 | { |
| 212 | // Maintain reference to mesh data (it's buffers might be referenced, not copied) |
| 213 | model->AddReference(); |
| 214 | if (model->Storage) |
| 215 | model->Storage->LockChunks(); |
| 216 | _usedModels.Add(model); |
| 217 | } |
| 218 | if (mesh->DownloadData(buffers, meshBuffers, meshLayouts, forceGpu)) |
| 219 | return true; |
| 220 | for (int32 i = 0; i < buffers.Length(); i++) |
| 221 | { |
| 222 | const int32 buffer = (int32)buffers[i]; |
| 223 | _data[buffer] = MoveTemp(meshBuffers[i]); |
| 224 | _layouts[buffer] = meshLayouts[i]; |
| 225 | |
| 226 | // Get format if using a single item (eg. index buffer type) |
| 227 | PixelFormat format = PixelFormat::Unknown; |
| 228 | if (meshLayouts[i] && meshLayouts[i]->GetElements().Count() == 1) |
| 229 | format = meshLayouts[i]->GetElements()[0].Format; |
| 230 | _formats[buffer] = format; |
| 231 | } |
| 232 | return false; |
| 233 | } |
| 234 | |
| 235 | bool MeshAccessor::LoadBuffer(MeshBufferType bufferType, Span<byte> bufferData, GPUVertexLayout* layout) |
| 236 | { |
no test coverage detected