void copy_face_attributes(Mesh::Ptr mesh, std::unique_ptr<draco::Mesh>& draco_mesh) { const auto num_faces = mesh->get_num_faces(); const auto& attribute_names = mesh->get_attribute_names(); for (const auto& name : attribute_names) { const auto& values = mesh->get_attribute(name); if (values.size() % num_faces != 0) continue; const auto num_rows = num_faces; const auto num_cols = values.size() / num_faces; draco::GeometryAttribute attr; if (name == "face_normal") { attr.Init(draco::GeometryAttribute::NORMAL, nullptr, num_cols, draco::DT_FLOAT64, false, sizeof(Float) * num_cols, 0); } else if (name.substr(0, 4) == "face"){ attr.Init(draco::GeometryAttribute::GENERIC, nullptr, num_cols, draco::DT_FLOAT64, false, sizeof(Float) * num_cols, 0); } else { // Not a face attribute. continue; } const auto id = draco_mesh->AddAttribute(attr, true, num_rows); draco_mesh->SetAttributeElementType(id, draco::MESH_FACE_ATTRIBUTE); for (size_t i=0; i<num_rows; i++) { draco_mesh->attribute(id)->SetAttributeValue( draco::AttributeValueIndex(i), values.data() + i*num_cols); } std::unique_ptr<draco::AttributeMetadata> metadata = std::make_unique<draco::AttributeMetadata>(); metadata->AddEntryString("name", name); draco_mesh->AddAttributeMetadata(id, std::move(metadata)); } }