1515#include " impeller/renderer/vertex_buffer.h"
1616#include " impeller/renderer/vertex_buffer_builder.h"
1717#include " impeller/scene/importer/scene_flatbuffers.h"
18+ #include " impeller/scene/shaders/skinned.vert.h"
1819#include " impeller/scene/shaders/unskinned.vert.h"
1920
2021namespace impeller {
@@ -32,14 +33,20 @@ std::shared_ptr<CuboidGeometry> Geometry::MakeCuboid(Vector3 size) {
3233 return result;
3334}
3435
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+ }
4047}
4148
42- std::shared_ptr<VertexBufferGeometry > Geometry::MakeFromFlatbuffer (
49+ std::shared_ptr<Geometry > Geometry::MakeFromFlatbuffer (
4350 const fb::MeshPrimitive& mesh,
4451 Allocator& allocator) {
4552 IndexType index_type;
@@ -52,17 +59,34 @@ std::shared_ptr<VertexBufferGeometry> Geometry::MakeFromFlatbuffer(
5259 break ;
5360 }
5461
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 ;
6285 }
6386
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+
6690 const size_t indices_bytes = mesh.indices ()->data ()->size ();
6791 if (vertices_bytes == 0 || indices_bytes == 0 ) {
6892 return nullptr ;
@@ -75,11 +99,6 @@ std::shared_ptr<VertexBufferGeometry> Geometry::MakeFromFlatbuffer(
7599 auto buffer = allocator.CreateBuffer (buffer_desc);
76100 buffer->SetLabel (" Mesh vertices+indices" );
77101
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-
83102 if (!buffer->CopyHostBuffer (vertices_start, Range (0 , vertices_bytes))) {
84103 return nullptr ;
85104 }
@@ -95,7 +114,7 @@ std::shared_ptr<VertexBufferGeometry> Geometry::MakeFromFlatbuffer(
95114 .index_count = mesh.indices ()->count (),
96115 .index_type = index_type,
97116 };
98- return MakeVertexBuffer (std::move (vertex_buffer));
117+ return MakeVertexBuffer (std::move (vertex_buffer), is_skinned );
99118}
100119
101120// ------------------------------------------------------------------------------
@@ -151,32 +170,35 @@ void CuboidGeometry::BindToCommand(const SceneContext& scene_context,
151170}
152171
153172// ------------------------------------------------------------------------------
154- // / VertexBufferGeometry
173+ // / UnskinnedVertexBufferGeometry
155174// /
156175
157- VertexBufferGeometry::VertexBufferGeometry () = default ;
176+ UnskinnedVertexBufferGeometry::UnskinnedVertexBufferGeometry () = default ;
158177
159- VertexBufferGeometry ::~VertexBufferGeometry () = default ;
178+ UnskinnedVertexBufferGeometry ::~UnskinnedVertexBufferGeometry () = default ;
160179
161- void VertexBufferGeometry::SetVertexBuffer (VertexBuffer vertex_buffer) {
180+ void UnskinnedVertexBufferGeometry::SetVertexBuffer (
181+ VertexBuffer vertex_buffer) {
162182 vertex_buffer_ = std::move (vertex_buffer);
163183}
164184
165185// |Geometry|
166- GeometryType VertexBufferGeometry ::GetGeometryType () const {
186+ GeometryType UnskinnedVertexBufferGeometry ::GetGeometryType () const {
167187 return GeometryType::kUnskinned ;
168188}
169189
170190// |Geometry|
171- VertexBuffer VertexBufferGeometry::GetVertexBuffer (Allocator& allocator) const {
191+ VertexBuffer UnskinnedVertexBufferGeometry::GetVertexBuffer (
192+ Allocator& allocator) const {
172193 return vertex_buffer_;
173194}
174195
175196// |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 {
180202 command.BindVertices (
181203 GetVertexBuffer (*scene_context.GetContext ()->GetResourceAllocator ()));
182204
@@ -185,5 +207,42 @@ void VertexBufferGeometry::BindToCommand(const SceneContext& scene_context,
185207 UnskinnedVertexShader::BindVertInfo (command, buffer.EmplaceUniform (info));
186208}
187209
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+
188247} // namespace scene
189248} // namespace impeller
0 commit comments