55 switch (mesh.indices()->type()) {
56 case fb::IndexType::k16Bit:
59 case fb::IndexType::k32Bit:
64 const uint8_t* vertices_start;
65 size_t vertices_bytes;
68 switch (mesh.vertices_type()) {
69 case fb::VertexBuffer::UnskinnedVertexBuffer: {
70 const auto* vertices =
71 mesh.vertices_as_UnskinnedVertexBuffer()->vertices();
72 vertices_start =
reinterpret_cast<const uint8_t*
>(vertices->Get(0));
73 vertices_bytes = vertices->size() *
sizeof(fb::Vertex);
77 case fb::VertexBuffer::SkinnedVertexBuffer: {
78 const auto* vertices = mesh.vertices_as_SkinnedVertexBuffer()->vertices();
79 vertices_start =
reinterpret_cast<const uint8_t*
>(vertices->Get(0));
80 vertices_bytes = vertices->size() *
sizeof(fb::SkinnedVertex);
84 case fb::VertexBuffer::NONE:
89 const uint8_t* indices_start =
90 reinterpret_cast<const uint8_t*
>(mesh.indices()->data()->Data());
92 const size_t indices_bytes = mesh.indices()->data()->size();
93 if (vertices_bytes == 0 || indices_bytes == 0) {
97 DeviceBufferDescriptor buffer_desc;
98 buffer_desc.size = vertices_bytes + indices_bytes;
101 auto buffer = allocator.CreateBuffer(buffer_desc);
102 buffer->SetLabel(
"Mesh vertices+indices");
104 if (!buffer->CopyHostBuffer(vertices_start, Range(0, vertices_bytes))) {
107 if (!buffer->CopyHostBuffer(indices_start, Range(0, indices_bytes),
112 VertexBuffer vertex_buffer = {
113 .vertex_buffer = {.buffer = buffer, .range = Range(0, vertices_bytes)},
114 .index_buffer = {.buffer = buffer,
115 .range = Range(vertices_bytes, indices_bytes)},
116 .vertex_count = mesh.indices()->count(),
117 .index_type = index_type,