52 {
53 IndexType index_type;
54 switch (
mesh.indices()->type()) {
55 case fb::IndexType::k16Bit:
57 break;
58 case fb::IndexType::k32Bit:
60 break;
61 }
62
63 const uint8_t* vertices_start;
64 size_t vertices_bytes;
65 bool is_skinned;
66
67 switch (
mesh.vertices_type()) {
68 case fb::VertexBuffer::UnskinnedVertexBuffer: {
69 const auto* vertices =
70 mesh.vertices_as_UnskinnedVertexBuffer()->vertices();
71 vertices_start = reinterpret_cast<const uint8_t*>(vertices->Get(0));
72 vertices_bytes = vertices->size() * sizeof(fb::Vertex);
73 is_skinned = false;
74 break;
75 }
76 case fb::VertexBuffer::SkinnedVertexBuffer: {
77 const auto* vertices =
mesh.vertices_as_SkinnedVertexBuffer()->vertices();
78 vertices_start = reinterpret_cast<const uint8_t*>(vertices->Get(0));
79 vertices_bytes = vertices->size() * sizeof(fb::SkinnedVertex);
80 is_skinned = true;
81 break;
82 }
83 case fb::VertexBuffer::NONE:
85 return nullptr;
86 }
87
88 const uint8_t* indices_start =
89 reinterpret_cast<const uint8_t*
>(
mesh.indices()->data()->Data());
90
91 const size_t indices_bytes =
mesh.indices()->data()->size();
92 if (vertices_bytes == 0 || indices_bytes == 0) {
93 return nullptr;
94 }
95
96 DeviceBufferDescriptor buffer_desc;
97 buffer_desc.size = vertices_bytes + indices_bytes;
99
100 auto buffer = allocator.CreateBuffer(buffer_desc);
101 buffer->SetLabel(
"Mesh vertices+indices");
102
103 if (!
buffer->CopyHostBuffer(vertices_start, Range(0, vertices_bytes))) {
104 return nullptr;
105 }
106 if (!
buffer->CopyHostBuffer(indices_start, Range(0, indices_bytes),
107 vertices_bytes)) {
108 return nullptr;
109 }
110
112 .vertex_buffer = {.buffer =
buffer, .range = Range(0, vertices_bytes)},
113 .index_buffer = {.buffer =
buffer,
114 .range = Range(vertices_bytes, indices_bytes)},
115 .vertex_count =
mesh.indices()->count(),
116 .index_type = index_type,
117 };
119}
static std::shared_ptr< Geometry > MakeVertexBuffer(VertexBuffer vertex_buffer, bool is_skinned)
static const uint8_t buffer[]