44
55#include " impeller/scene/geometry.h"
66
7+ #include < iostream>
78#include < memory>
9+ #include < ostream>
810
911#include " impeller/geometry/point.h"
1012#include " impeller/geometry/vector.h"
13+ #include " impeller/renderer/device_buffer_descriptor.h"
1114#include " impeller/renderer/formats.h"
15+ #include " impeller/renderer/vertex_buffer.h"
1216#include " impeller/renderer/vertex_buffer_builder.h"
17+ #include " impeller/scene/importer/scene_flatbuffers.h"
1318#include " impeller/scene/shaders/geometry.vert.h"
19+ #include " third_party/flatbuffers/include/flatbuffers/vector.h"
1420
1521namespace impeller {
1622namespace scene {
@@ -19,16 +25,78 @@ namespace scene {
1925// / Geometry
2026// /
2127
28+ Geometry::~Geometry () = default ;
29+
2230std::shared_ptr<CuboidGeometry> Geometry::MakeCuboid (Vector3 size) {
2331 auto result = std::make_shared<CuboidGeometry>();
2432 result->SetSize (size);
2533 return result;
2634}
2735
36+ std::shared_ptr<VertexBufferGeometry> Geometry::MakeVertexBuffer (
37+ VertexBuffer vertex_buffer) {
38+ auto result = std::make_shared<VertexBufferGeometry>();
39+ result->SetVertexBuffer (std::move (vertex_buffer));
40+ return result;
41+ }
42+
43+ std::shared_ptr<VertexBufferGeometry> Geometry::MakeFromFBMesh (
44+ const fb::StaticMesh& mesh,
45+ Allocator& allocator) {
46+ IndexType index_type;
47+ switch (mesh.indices ()->type ()) {
48+ case fb::IndicesType::k16Bit:
49+ index_type = IndexType::k16bit;
50+ break ;
51+ case fb::IndicesType::k32Bit:
52+ index_type = IndexType::k32bit;
53+ break ;
54+ }
55+
56+ const size_t vertices_bytes = mesh.vertices ()->size () * sizeof (fb::Vertex);
57+ const size_t indices_bytes = mesh.indices ()->data ()->size ();
58+ if (vertices_bytes == 0 || indices_bytes == 0 ) {
59+ return nullptr ;
60+ }
61+
62+ DeviceBufferDescriptor buffer_desc;
63+ buffer_desc.size = vertices_bytes * indices_bytes;
64+ buffer_desc.storage_mode = StorageMode::kHostVisible ;
65+
66+ auto buffer = allocator.CreateBuffer (buffer_desc);
67+ buffer->SetLabel (" Mesh vertices+indices" );
68+
69+ const uint8_t * vertices_start =
70+ reinterpret_cast <const uint8_t *>(mesh.vertices ()->Get (0 ));
71+ const uint8_t * indices_start =
72+ reinterpret_cast <const uint8_t *>(mesh.indices ()->data ()->Data ());
73+
74+ if (!buffer->CopyHostBuffer (vertices_start, Range (0 , vertices_bytes))) {
75+ return nullptr ;
76+ }
77+ if (!buffer->CopyHostBuffer (indices_start, Range (0 , indices_bytes),
78+ vertices_bytes)) {
79+ return nullptr ;
80+ }
81+
82+ VertexBuffer vertex_buffer = {
83+ .vertex_buffer = {.buffer = buffer, .range = Range (0 , vertices_bytes)},
84+ .index_buffer = {.buffer = buffer,
85+ .range = Range (vertices_bytes, indices_bytes)},
86+ .index_count = mesh.indices ()->count (),
87+ .index_type = index_type,
88+ };
89+ return MakeVertexBuffer (std::move (vertex_buffer));
90+ }
91+
2892// ------------------------------------------------------------------------------
2993// / CuboidGeometry
3094// /
3195
96+ CuboidGeometry::CuboidGeometry () = default ;
97+
98+ CuboidGeometry::~CuboidGeometry () = default ;
99+
32100void CuboidGeometry::SetSize (Vector3 size) {
33101 size_ = size;
34102}
@@ -38,15 +106,37 @@ VertexBuffer CuboidGeometry::GetVertexBuffer(Allocator& allocator) const {
38106 // Layout: position, normal, tangent, uv
39107 builder.AddVertices ({
40108 // Front.
41- {Vector3 (0 , 0 , 0 ), Vector3 (0 , 0 , -1 ), Vector3 (1 , 0 , 0 ), Point (0 , 0 )},
42- {Vector3 (1 , 0 , 0 ), Vector3 (0 , 0 , -1 ), Vector3 (1 , 0 , 0 ), Point (1 , 0 )},
43- {Vector3 (1 , 1 , 0 ), Vector3 (0 , 0 , -1 ), Vector3 (1 , 0 , 0 ), Point (1 , 1 )},
44- {Vector3 (1 , 1 , 0 ), Vector3 (0 , 0 , -1 ), Vector3 (1 , 0 , 0 ), Point (1 , 1 )},
45- {Vector3 (0 , 1 , 0 ), Vector3 (0 , 0 , -1 ), Vector3 (1 , 0 , 0 ), Point (0 , 1 )},
46- {Vector3 (0 , 0 , 0 ), Vector3 (0 , 0 , -1 ), Vector3 (1 , 0 , 0 ), Point (0 , 0 )},
109+ {Vector3 (0 , 0 , 0 ), Vector3 (0 , 0 , -1 ), Vector3 (1 , 0 , 0 ), Point (0 , 0 ),
110+ Color::White ()},
111+ {Vector3 (1 , 0 , 0 ), Vector3 (0 , 0 , -1 ), Vector3 (1 , 0 , 0 ), Point (1 , 0 ),
112+ Color::White ()},
113+ {Vector3 (1 , 1 , 0 ), Vector3 (0 , 0 , -1 ), Vector3 (1 , 0 , 0 ), Point (1 , 1 ),
114+ Color::White ()},
115+ {Vector3 (1 , 1 , 0 ), Vector3 (0 , 0 , -1 ), Vector3 (1 , 0 , 0 ), Point (1 , 1 ),
116+ Color::White ()},
117+ {Vector3 (0 , 1 , 0 ), Vector3 (0 , 0 , -1 ), Vector3 (1 , 0 , 0 ), Point (0 , 1 ),
118+ Color::White ()},
119+ {Vector3 (0 , 0 , 0 ), Vector3 (0 , 0 , -1 ), Vector3 (1 , 0 , 0 ), Point (0 , 0 ),
120+ Color::White ()},
47121 });
48122 return builder.CreateVertexBuffer (allocator);
49123}
50124
125+ // ------------------------------------------------------------------------------
126+ // / VertexBufferGeometry
127+ // /
128+
129+ VertexBufferGeometry::VertexBufferGeometry () = default ;
130+
131+ VertexBufferGeometry::~VertexBufferGeometry () = default ;
132+
133+ void VertexBufferGeometry::SetVertexBuffer (VertexBuffer vertex_buffer) {
134+ vertex_buffer_ = std::move (vertex_buffer);
135+ }
136+
137+ VertexBuffer VertexBufferGeometry::GetVertexBuffer (Allocator& allocator) const {
138+ return vertex_buffer_;
139+ }
140+
51141} // namespace scene
52142} // namespace impeller
0 commit comments