10 #include <type_traits>
12 #include "flutter/fml/logging.h"
14 #include "impeller/scene/importer/scene_flatbuffers.h"
25 return std::make_unique<UnskinnedVerticesBuilder>();
29 return std::make_unique<SkinnedVerticesBuilder>();
39 template <
typename SourceType>
44 constexpr
SourceType divisor = std::is_integral_v<SourceType>
45 ? std::numeric_limits<SourceType>::max()
47 result =
static_cast<Scalar>(*s) /
static_cast<Scalar>(divisor);
63 *(destination + component_i) =
75 for (
int i = 0; i < 4; i++) {
76 *(destination + i) = component.
convert_proc(source, i,
false);
80 std::map<VerticesBuilder::AttributeType, VerticesBuilder::AttributeProperties>
81 VerticesBuilder::kAttributeTypes = {
83 {.offset_bytes = offsetof(UnskinnedVerticesBuilder::Vertex, position),
88 {.offset_bytes = offsetof(UnskinnedVerticesBuilder::Vertex, normal),
93 {.offset_bytes = offsetof(UnskinnedVerticesBuilder::Vertex, tangent),
99 offsetof(UnskinnedVerticesBuilder::Vertex, texture_coords),
102 .component_count = 2,
105 {.offset_bytes = offsetof(UnskinnedVerticesBuilder::Vertex, color),
107 .component_count = 4,
110 {.offset_bytes = offsetof(SkinnedVerticesBuilder::Vertex, joints),
112 .component_count = 4,
115 {.offset_bytes = offsetof(SkinnedVerticesBuilder::Vertex, weights),
117 .component_count = 4,
121 VerticesBuilder::ComponentProperties>
124 {.size_bytes =
sizeof(int8_t), .convert_proc = ToScalar<int8_t>}},
126 {.size_bytes =
sizeof(int8_t), .convert_proc = ToScalar<uint8_t>}},
128 {.size_bytes =
sizeof(int16_t), .convert_proc = ToScalar<int16_t>}},
130 {.size_bytes =
sizeof(int16_t), .convert_proc = ToScalar<uint16_t>}},
132 {.size_bytes =
sizeof(int32_t), .convert_proc = ToScalar<int32_t>}},
134 {.size_bytes =
sizeof(int32_t), .convert_proc = ToScalar<uint32_t>}},
136 {.size_bytes =
sizeof(float), .convert_proc = ToScalar<float>}},
140 size_t destination_stride_bytes,
144 size_t attribute_stride_bytes,
145 size_t attribute_count) {
148 for (
size_t i = 0; i < attribute_count; i++) {
150 reinterpret_cast<const uint8_t*
>(source) + attribute_stride_bytes * i;
151 uint8_t* dst =
reinterpret_cast<uint8_t*
>(destination) +
152 i * destination_stride_bytes + attribute_props.
offset_bytes;
155 component_props, attribute_props);
168 fb::MeshPrimitiveT& primitive)
const {
169 auto vertex_buffer = fb::UnskinnedVertexBufferT();
170 vertex_buffer.vertices.resize(0);
171 for (
auto& v : vertices_) {
172 vertex_buffer.vertices.push_back(fb::Vertex(
176 primitive.vertices.Set(std::move(vertex_buffer));
182 const void* buffer_start,
183 size_t attribute_stride_bytes,
184 size_t attribute_count) {
185 if (attribute_count > vertices_.size()) {
186 vertices_.resize(attribute_count,
Vertex());
193 attribute_stride_bytes,
206 fb::MeshPrimitiveT& primitive)
const {
207 auto vertex_buffer = fb::SkinnedVertexBufferT();
208 vertex_buffer.vertices.resize(0);
209 for (
auto& v : vertices_) {
210 auto unskinned_attributes = fb::Vertex(
214 vertex_buffer.vertices.push_back(fb::SkinnedVertex(
217 primitive.vertices.Set(std::move(vertex_buffer));
223 const void* buffer_start,
224 size_t attribute_stride_bytes,
225 size_t attribute_count) {
226 if (attribute_count > vertices_.size()) {
227 vertices_.resize(attribute_count,
Vertex());
234 attribute_stride_bytes,