mirror of
https://git.mirrors.martin98.com/https://github.com/google/draco
synced 2025-06-04 11:25:44 +08:00
83 lines
3.3 KiB
C++
83 lines
3.3 KiB
C++
// Copyright 2016 The Draco Authors.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
//
|
|
#include "mesh/triangle_soup_mesh_builder.h"
|
|
|
|
namespace draco {
|
|
|
|
void TriangleSoupMeshBuilder::Start(int num_faces) {
|
|
mesh_ = std::unique_ptr<Mesh>(new Mesh());
|
|
mesh_->SetNumFaces(num_faces);
|
|
mesh_->set_num_points(num_faces * 3);
|
|
attribute_element_types_.clear();
|
|
}
|
|
|
|
int TriangleSoupMeshBuilder::AddAttribute(
|
|
GeometryAttribute::Type attribute_type, int8_t num_components,
|
|
DataType data_type) {
|
|
GeometryAttribute va;
|
|
va.Init(attribute_type, nullptr, num_components, data_type, false,
|
|
DataTypeLength(data_type) * num_components, 0);
|
|
attribute_element_types_.push_back(-1);
|
|
return mesh_->AddAttribute(va, true, mesh_->num_points());
|
|
}
|
|
|
|
void TriangleSoupMeshBuilder::SetAttributeValuesForFace(
|
|
int att_id, FaceIndex face_id, const void *corner_value_0,
|
|
const void *corner_value_1, const void *corner_value_2) {
|
|
const int start_index = 3 * face_id.value();
|
|
PointAttribute *const att = mesh_->attribute(att_id);
|
|
att->SetAttributeValue(AttributeValueIndex(start_index), corner_value_0);
|
|
att->SetAttributeValue(AttributeValueIndex(start_index + 1), corner_value_1);
|
|
att->SetAttributeValue(AttributeValueIndex(start_index + 2), corner_value_2);
|
|
// TODO(ostava): The below code should be called only for one attribute.
|
|
// It will work ok even for multiple attributes, but it's redundant.
|
|
mesh_->SetFace(face_id,
|
|
{{PointIndex(start_index), PointIndex(start_index + 1),
|
|
PointIndex(start_index + 2)}});
|
|
attribute_element_types_[att_id] = MESH_CORNER_ATTRIBUTE;
|
|
}
|
|
|
|
void TriangleSoupMeshBuilder::SetPerFaceAttributeValueForFace(
|
|
int att_id, FaceIndex face_id, const void *value) {
|
|
const int start_index = 3 * face_id.value();
|
|
PointAttribute *const att = mesh_->attribute(att_id);
|
|
att->SetAttributeValue(AttributeValueIndex(start_index), value);
|
|
att->SetAttributeValue(AttributeValueIndex(start_index + 1), value);
|
|
att->SetAttributeValue(AttributeValueIndex(start_index + 2), value);
|
|
mesh_->SetFace(face_id,
|
|
{{PointIndex(start_index), PointIndex(start_index + 1),
|
|
PointIndex(start_index + 2)}});
|
|
int8_t &element_type = attribute_element_types_[att_id];
|
|
if (element_type < 0)
|
|
element_type = MESH_FACE_ATTRIBUTE;
|
|
}
|
|
|
|
std::unique_ptr<Mesh> TriangleSoupMeshBuilder::Finalize() {
|
|
// First deduplicate attribute values.
|
|
if (!mesh_->DeduplicateAttributeValues())
|
|
return nullptr;
|
|
// Also deduplicate vertex indices.
|
|
mesh_->DeduplicatePointIds();
|
|
for (size_t i = 0; i < attribute_element_types_.size(); ++i) {
|
|
if (attribute_element_types_[i] >= 0) {
|
|
mesh_->SetAttributeElementType(i, static_cast<MeshAttributeElementType>(
|
|
attribute_element_types_[i]));
|
|
}
|
|
}
|
|
return std::move(mesh_);
|
|
}
|
|
|
|
} // namespace draco
|