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)); } }
void copy_vertices(Mesh::Ptr mesh, std::unique_ptr<DracoMesh>& draco_mesh) { const auto dim = mesh->get_dim(); const auto num_vertices = mesh->get_num_vertices(); draco_mesh->set_num_points(num_vertices); draco::GeometryAttribute positions; positions.Init(draco::GeometryAttribute::POSITION, // Attribute type nullptr, // data buffer dim, // number of components draco::DT_FLOAT64, // data type false, // normalized sizeof(Float) * dim, // byte stride 0); // byte offset auto pos_att_id = draco_mesh->AddAttribute( positions, // attribute object true, // identity mapping num_vertices); // num attribute values for (int i = 0; i < num_vertices; ++i) { draco_mesh->attribute(pos_att_id)->SetAttributeValue( draco::AttributeValueIndex(i), mesh->get_vertex(i).data()); } }