15
15
#include " impeller/renderer/vertex_buffer.h"
16
16
#include " impeller/renderer/vertex_buffer_builder.h"
17
17
#include " impeller/scene/importer/scene_flatbuffers.h"
18
+ #include " impeller/scene/shaders/skinned.vert.h"
18
19
#include " impeller/scene/shaders/unskinned.vert.h"
19
20
20
21
namespace impeller {
@@ -32,14 +33,20 @@ std::shared_ptr<CuboidGeometry> Geometry::MakeCuboid(Vector3 size) {
32
33
return result;
33
34
}
34
35
35
- std::shared_ptr<VertexBufferGeometry> Geometry::MakeVertexBuffer (
36
- VertexBuffer vertex_buffer) {
37
- auto result = std::make_shared<VertexBufferGeometry>();
38
- result->SetVertexBuffer (std::move (vertex_buffer));
39
- return result;
36
+ std::shared_ptr<Geometry> Geometry::MakeVertexBuffer (VertexBuffer vertex_buffer,
37
+ bool is_skinned) {
38
+ if (is_skinned) {
39
+ auto result = std::make_shared<SkinnedVertexBufferGeometry>();
40
+ result->SetVertexBuffer (std::move (vertex_buffer));
41
+ return result;
42
+ } else {
43
+ auto result = std::make_shared<UnskinnedVertexBufferGeometry>();
44
+ result->SetVertexBuffer (std::move (vertex_buffer));
45
+ return result;
46
+ }
40
47
}
41
48
42
- std::shared_ptr<VertexBufferGeometry > Geometry::MakeFromFlatbuffer (
49
+ std::shared_ptr<Geometry > Geometry::MakeFromFlatbuffer (
43
50
const fb::MeshPrimitive& mesh,
44
51
Allocator& allocator) {
45
52
IndexType index_type;
@@ -52,17 +59,34 @@ std::shared_ptr<VertexBufferGeometry> Geometry::MakeFromFlatbuffer(
52
59
break ;
53
60
}
54
61
55
- if (mesh.vertices_type () == fb::VertexBuffer::SkinnedVertexBuffer) {
56
- VALIDATION_LOG << " Skinned meshes not yet supported." ;
57
- return nullptr ;
58
- }
59
- if (mesh.vertices_type () != fb::VertexBuffer::UnskinnedVertexBuffer) {
60
- VALIDATION_LOG << " Invalid vertex buffer type." ;
61
- return nullptr ;
62
+ const uint8_t * vertices_start;
63
+ size_t vertices_bytes;
64
+ bool is_skinned;
65
+
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);
72
+ is_skinned = false ;
73
+ break ;
74
+ }
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);
79
+ is_skinned = true ;
80
+ break ;
81
+ }
82
+ case fb::VertexBuffer::NONE:
83
+ VALIDATION_LOG << " Invalid vertex buffer type." ;
84
+ return nullptr ;
62
85
}
63
86
64
- const auto * vertices = mesh.vertices_as_UnskinnedVertexBuffer ()->vertices ();
65
- const size_t vertices_bytes = vertices->size () * sizeof (fb::Vertex);
87
+ const uint8_t * indices_start =
88
+ reinterpret_cast <const uint8_t *>(mesh.indices ()->data ()->Data ());
89
+
66
90
const size_t indices_bytes = mesh.indices ()->data ()->size ();
67
91
if (vertices_bytes == 0 || indices_bytes == 0 ) {
68
92
return nullptr ;
@@ -75,11 +99,6 @@ std::shared_ptr<VertexBufferGeometry> Geometry::MakeFromFlatbuffer(
75
99
auto buffer = allocator.CreateBuffer (buffer_desc);
76
100
buffer->SetLabel (" Mesh vertices+indices" );
77
101
78
- const uint8_t * vertices_start =
79
- reinterpret_cast <const uint8_t *>(vertices->Get (0 ));
80
- const uint8_t * indices_start =
81
- reinterpret_cast <const uint8_t *>(mesh.indices ()->data ()->Data ());
82
-
83
102
if (!buffer->CopyHostBuffer (vertices_start, Range (0 , vertices_bytes))) {
84
103
return nullptr ;
85
104
}
@@ -95,7 +114,7 @@ std::shared_ptr<VertexBufferGeometry> Geometry::MakeFromFlatbuffer(
95
114
.index_count = mesh.indices ()->count (),
96
115
.index_type = index_type,
97
116
};
98
- return MakeVertexBuffer (std::move (vertex_buffer));
117
+ return MakeVertexBuffer (std::move (vertex_buffer), is_skinned );
99
118
}
100
119
101
120
// ------------------------------------------------------------------------------
@@ -151,32 +170,35 @@ void CuboidGeometry::BindToCommand(const SceneContext& scene_context,
151
170
}
152
171
153
172
// ------------------------------------------------------------------------------
154
- // / VertexBufferGeometry
173
+ // / UnskinnedVertexBufferGeometry
155
174
// /
156
175
157
- VertexBufferGeometry::VertexBufferGeometry () = default ;
176
+ UnskinnedVertexBufferGeometry::UnskinnedVertexBufferGeometry () = default ;
158
177
159
- VertexBufferGeometry ::~VertexBufferGeometry () = default ;
178
+ UnskinnedVertexBufferGeometry ::~UnskinnedVertexBufferGeometry () = default ;
160
179
161
- void VertexBufferGeometry::SetVertexBuffer (VertexBuffer vertex_buffer) {
180
+ void UnskinnedVertexBufferGeometry::SetVertexBuffer (
181
+ VertexBuffer vertex_buffer) {
162
182
vertex_buffer_ = std::move (vertex_buffer);
163
183
}
164
184
165
185
// |Geometry|
166
- GeometryType VertexBufferGeometry ::GetGeometryType () const {
186
+ GeometryType UnskinnedVertexBufferGeometry ::GetGeometryType () const {
167
187
return GeometryType::kUnskinned ;
168
188
}
169
189
170
190
// |Geometry|
171
- VertexBuffer VertexBufferGeometry::GetVertexBuffer (Allocator& allocator) const {
191
+ VertexBuffer UnskinnedVertexBufferGeometry::GetVertexBuffer (
192
+ Allocator& allocator) const {
172
193
return vertex_buffer_;
173
194
}
174
195
175
196
// |Geometry|
176
- void VertexBufferGeometry::BindToCommand (const SceneContext& scene_context,
177
- HostBuffer& buffer,
178
- const Matrix& transform,
179
- Command& command) const {
197
+ void UnskinnedVertexBufferGeometry::BindToCommand (
198
+ const SceneContext& scene_context,
199
+ HostBuffer& buffer,
200
+ const Matrix& transform,
201
+ Command& command) const {
180
202
command.BindVertices (
181
203
GetVertexBuffer (*scene_context.GetContext ()->GetResourceAllocator ()));
182
204
@@ -185,5 +207,42 @@ void VertexBufferGeometry::BindToCommand(const SceneContext& scene_context,
185
207
UnskinnedVertexShader::BindVertInfo (command, buffer.EmplaceUniform (info));
186
208
}
187
209
210
+ // ------------------------------------------------------------------------------
211
+ // / SkinnedVertexBufferGeometry
212
+ // /
213
+
214
+ SkinnedVertexBufferGeometry::SkinnedVertexBufferGeometry () = default ;
215
+
216
+ SkinnedVertexBufferGeometry::~SkinnedVertexBufferGeometry () = default ;
217
+
218
+ void SkinnedVertexBufferGeometry::SetVertexBuffer (VertexBuffer vertex_buffer) {
219
+ vertex_buffer_ = std::move (vertex_buffer);
220
+ }
221
+
222
+ // |Geometry|
223
+ GeometryType SkinnedVertexBufferGeometry::GetGeometryType () const {
224
+ return GeometryType::kSkinned ;
225
+ }
226
+
227
+ // |Geometry|
228
+ VertexBuffer SkinnedVertexBufferGeometry::GetVertexBuffer (
229
+ Allocator& allocator) const {
230
+ return vertex_buffer_;
231
+ }
232
+
233
+ // |Geometry|
234
+ void SkinnedVertexBufferGeometry::BindToCommand (
235
+ const SceneContext& scene_context,
236
+ HostBuffer& buffer,
237
+ const Matrix& transform,
238
+ Command& command) const {
239
+ command.BindVertices (
240
+ GetVertexBuffer (*scene_context.GetContext ()->GetResourceAllocator ()));
241
+
242
+ SkinnedVertexShader::VertInfo info;
243
+ info.mvp = transform;
244
+ SkinnedVertexShader::BindVertInfo (command, buffer.EmplaceUniform (info));
245
+ }
246
+
188
247
} // namespace scene
189
248
} // namespace impeller
0 commit comments