Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'extern/draco/draco/src/draco/mesh/triangle_soup_mesh_builder.cc')
-rw-r--r--extern/draco/draco/src/draco/mesh/triangle_soup_mesh_builder.cc89
1 files changed, 89 insertions, 0 deletions
diff --git a/extern/draco/draco/src/draco/mesh/triangle_soup_mesh_builder.cc b/extern/draco/draco/src/draco/mesh/triangle_soup_mesh_builder.cc
new file mode 100644
index 00000000000..60b0c50b8d5
--- /dev/null
+++ b/extern/draco/draco/src/draco/mesh/triangle_soup_mesh_builder.cc
@@ -0,0 +1,89 @@
+// 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 "draco/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() {
+#ifdef DRACO_ATTRIBUTE_VALUES_DEDUPLICATION_SUPPORTED
+ // First deduplicate attribute values.
+ if (!mesh_->DeduplicateAttributeValues()) {
+ return nullptr;
+ }
+#endif
+#ifdef DRACO_ATTRIBUTE_INDICES_DEDUPLICATION_SUPPORTED
+ // Also deduplicate vertex indices.
+ mesh_->DeduplicatePointIds();
+#endif
+ for (size_t i = 0; i < attribute_element_types_.size(); ++i) {
+ if (attribute_element_types_[i] >= 0) {
+ mesh_->SetAttributeElementType(
+ static_cast<int>(i),
+ static_cast<MeshAttributeElementType>(attribute_element_types_[i]));
+ }
+ }
+ return std::move(mesh_);
+}
+
+} // namespace draco