17 #include "impeller/scene/importer/scene_flatbuffers.h"
18 #include "impeller/scene/shaders/skinned.vert.h"
19 #include "impeller/scene/shaders/unskinned.vert.h"
31 auto result = std::make_shared<CuboidGeometry>();
32 result->SetSize(size);
39 auto result = std::make_shared<SkinnedVertexBufferGeometry>();
40 result->SetVertexBuffer(std::move(vertex_buffer));
43 auto result = std::make_shared<UnskinnedVertexBufferGeometry>();
44 result->SetVertexBuffer(std::move(vertex_buffer));
50 const fb::MeshPrimitive& mesh,
53 switch (mesh.indices()->type()) {
54 case fb::IndexType::k16Bit:
57 case fb::IndexType::k32Bit:
62 const uint8_t* vertices_start;
63 size_t vertices_bytes;
66 switch (mesh.vertices_type()) {
67 case fb::VertexBuffer::UnskinnedVertexBuffer: {
68 const auto* vertices =
69 mesh.vertices_as_UnskinnedVertexBuffer()->vertices();
70 vertices_start =
reinterpret_cast<const uint8_t*
>(vertices->Get(0));
71 vertices_bytes = vertices->size() *
sizeof(fb::Vertex);
75 case fb::VertexBuffer::SkinnedVertexBuffer: {
76 const auto* vertices = mesh.vertices_as_SkinnedVertexBuffer()->vertices();
77 vertices_start =
reinterpret_cast<const uint8_t*
>(vertices->Get(0));
78 vertices_bytes = vertices->size() *
sizeof(fb::SkinnedVertex);
82 case fb::VertexBuffer::NONE:
87 const uint8_t* indices_start =
88 reinterpret_cast<const uint8_t*
>(mesh.indices()->data()->Data());
90 const size_t indices_bytes = mesh.indices()->data()->size();
91 if (vertices_bytes == 0 || indices_bytes == 0) {
96 buffer_desc.
size = vertices_bytes + indices_bytes;
100 buffer->SetLabel(
"Mesh vertices+indices");
102 if (!buffer->CopyHostBuffer(vertices_start,
Range(0, vertices_bytes))) {
105 if (!buffer->CopyHostBuffer(indices_start,
Range(0, indices_bytes),
112 .index_buffer = {.buffer = buffer,
113 .range =
Range(vertices_bytes, indices_bytes)},
114 .vertex_count = mesh.indices()->count(),
115 .index_type = index_type,
145 {
Vector3(0, 0, 0),
Vector3(0, 0, -1),
Vector3(1, 0, 0),
Point(0, 0),
147 {
Vector3(1, 0, 0),
Vector3(0, 0, -1),
Vector3(1, 0, 0),
Point(1, 0),
149 {
Vector3(1, 1, 0),
Vector3(0, 0, -1),
Vector3(1, 0, 0),
Point(1, 1),
151 {
Vector3(1, 1, 0),
Vector3(0, 0, -1),
Vector3(1, 0, 0),
Point(1, 1),
153 {
Vector3(0, 1, 0),
Vector3(0, 0, -1),
Vector3(1, 0, 0),
Point(0, 1),
155 {
Vector3(0, 0, 0),
Vector3(0, 0, -1),
Vector3(1, 0, 0),
Point(0, 0),
169 UnskinnedVertexShader::FrameInfo info;
170 info.mvp = transform;
171 UnskinnedVertexShader::BindFrameInfo(command, buffer.
EmplaceUniform(info));
184 vertex_buffer_ = std::move(vertex_buffer);
195 return vertex_buffer_;
207 UnskinnedVertexShader::FrameInfo info;
208 info.mvp = transform;
209 UnskinnedVertexShader::BindFrameInfo(command, buffer.
EmplaceUniform(info));
221 vertex_buffer_ = std::move(vertex_buffer);
232 return vertex_buffer_;
249 sampler_desc.
label =
"NN Repeat";
251 SkinnedVertexShader::BindJointsTexture(
254 scene_context.
GetContext()->GetSamplerLibrary()->GetSampler(
257 SkinnedVertexShader::FrameInfo info;
258 info.mvp = transform;
259 info.enable_skinning = joints_texture_ ? 1 : 0;
260 info.joint_texture_size =
261 joints_texture_ ? joints_texture_->GetSize().width : 1;
262 SkinnedVertexShader::BindFrameInfo(command, buffer.
EmplaceUniform(info));
267 const std::shared_ptr<Texture>& texture) {
268 joints_texture_ = texture;