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/dracoenc/src/draco/point_cloud/point_cloud_test.cc')
-rw-r--r--extern/draco/dracoenc/src/draco/point_cloud/point_cloud_test.cc131
1 files changed, 131 insertions, 0 deletions
diff --git a/extern/draco/dracoenc/src/draco/point_cloud/point_cloud_test.cc b/extern/draco/dracoenc/src/draco/point_cloud/point_cloud_test.cc
new file mode 100644
index 00000000000..00491b7309a
--- /dev/null
+++ b/extern/draco/dracoenc/src/draco/point_cloud/point_cloud_test.cc
@@ -0,0 +1,131 @@
+// Copyright 2017 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/core/draco_test_base.h"
+#include "draco/core/draco_test_utils.h"
+
+#include "draco/point_cloud/point_cloud.h"
+
+namespace {
+
+class PointCloudTest : public ::testing::Test {
+ protected:
+ PointCloudTest() {}
+};
+
+TEST_F(PointCloudTest, TestAttributeDeletion) {
+ draco::PointCloud pc;
+ // Test whether we can correctly delete an attribute from a point cloud.
+ // Create some attributes for the point cloud.
+ draco::GeometryAttribute pos_att;
+ pos_att.Init(draco::GeometryAttribute::POSITION, nullptr, 3,
+ draco::DT_FLOAT32, false, 12, 0);
+ draco::GeometryAttribute norm_att;
+ norm_att.Init(draco::GeometryAttribute::NORMAL, nullptr, 3, draco::DT_FLOAT32,
+ false, 12, 0);
+ draco::GeometryAttribute gen_att;
+ gen_att.Init(draco::GeometryAttribute::GENERIC, nullptr, 3, draco::DT_FLOAT32,
+ false, 12, 0);
+
+ // Add one position, two normal and two generic attributes.
+ pc.AddAttribute(pos_att, false, 0);
+ pc.AddAttribute(gen_att, false, 0);
+ pc.AddAttribute(norm_att, false, 0);
+ pc.AddAttribute(gen_att, false, 0);
+ pc.AddAttribute(norm_att, false, 0);
+
+ ASSERT_EQ(pc.num_attributes(), 5);
+ ASSERT_EQ(pc.attribute(0)->attribute_type(),
+ draco::GeometryAttribute::POSITION);
+ ASSERT_EQ(pc.attribute(3)->attribute_type(),
+ draco::GeometryAttribute::GENERIC);
+
+ // Delete generic attribute.
+ pc.DeleteAttribute(1);
+ ASSERT_EQ(pc.num_attributes(), 4);
+ ASSERT_EQ(pc.attribute(1)->attribute_type(),
+ draco::GeometryAttribute::NORMAL);
+ ASSERT_EQ(pc.NumNamedAttributes(draco::GeometryAttribute::NORMAL), 2);
+ ASSERT_EQ(pc.GetNamedAttributeId(draco::GeometryAttribute::NORMAL, 1), 3);
+
+ // Delete the first normal attribute.
+ pc.DeleteAttribute(1);
+ ASSERT_EQ(pc.num_attributes(), 3);
+ ASSERT_EQ(pc.attribute(1)->attribute_type(),
+ draco::GeometryAttribute::GENERIC);
+ ASSERT_EQ(pc.NumNamedAttributes(draco::GeometryAttribute::NORMAL), 1);
+ ASSERT_EQ(pc.GetNamedAttributeId(draco::GeometryAttribute::NORMAL, 0), 2);
+}
+
+TEST_F(PointCloudTest, TestPointCloudWithMetadata) {
+ draco::PointCloud pc;
+ std::unique_ptr<draco::GeometryMetadata> metadata =
+ std::unique_ptr<draco::GeometryMetadata>(new draco::GeometryMetadata());
+
+ // Add a position attribute metadata.
+ draco::GeometryAttribute pos_att;
+ pos_att.Init(draco::GeometryAttribute::POSITION, nullptr, 3,
+ draco::DT_FLOAT32, false, 12, 0);
+ const uint32_t pos_att_id = pc.AddAttribute(pos_att, false, 0);
+ ASSERT_EQ(pos_att_id, 0);
+ std::unique_ptr<draco::AttributeMetadata> pos_metadata =
+ std::unique_ptr<draco::AttributeMetadata>(new draco::AttributeMetadata());
+ pos_metadata->AddEntryString("name", "position");
+ pc.AddAttributeMetadata(pos_att_id, std::move(pos_metadata));
+ const draco::GeometryMetadata *pc_metadata = pc.GetMetadata();
+ ASSERT_NE(pc_metadata, nullptr);
+ // Add a generic material attribute metadata.
+ draco::GeometryAttribute material_att;
+ material_att.Init(draco::GeometryAttribute::GENERIC, nullptr, 3,
+ draco::DT_FLOAT32, false, 12, 0);
+ const uint32_t material_att_id = pc.AddAttribute(material_att, false, 0);
+ ASSERT_EQ(material_att_id, 1);
+ std::unique_ptr<draco::AttributeMetadata> material_metadata =
+ std::unique_ptr<draco::AttributeMetadata>(new draco::AttributeMetadata());
+ material_metadata->AddEntryString("name", "material");
+ // The material attribute has id of 1 now.
+ pc.AddAttributeMetadata(material_att_id, std::move(material_metadata));
+
+ // Test if the attribute metadata is correctly added.
+ const draco::AttributeMetadata *requested_pos_metadata =
+ pc.GetAttributeMetadataByStringEntry("name", "position");
+ ASSERT_NE(requested_pos_metadata, nullptr);
+ const draco::AttributeMetadata *requested_mat_metadata =
+ pc.GetAttributeMetadataByStringEntry("name", "material");
+ ASSERT_NE(requested_mat_metadata, nullptr);
+
+ // Attribute id should be preserved.
+ ASSERT_EQ(
+ pc.GetAttributeIdByUniqueId(requested_pos_metadata->att_unique_id()), 0);
+ ASSERT_EQ(
+ pc.GetAttributeIdByUniqueId(requested_mat_metadata->att_unique_id()), 1);
+
+ // Test deleting attribute with metadata.
+ pc.DeleteAttribute(pos_att_id);
+ ASSERT_EQ(pc.GetAttributeMetadataByStringEntry("name", "position"), nullptr);
+
+ requested_mat_metadata =
+ pc.GetAttributeMetadataByStringEntry("name", "material");
+ // The unique id should not be changed.
+ ASSERT_EQ(requested_mat_metadata->att_unique_id(), 1);
+ // Now position attribute is removed, material attribute should have the
+ // attribute id of 0.
+ ASSERT_EQ(
+ pc.GetAttributeIdByUniqueId(requested_mat_metadata->att_unique_id()), 0);
+ // Should be able to get metadata using the current attribute id.
+ // Attribute id of material attribute is changed from 1 to 0.
+ ASSERT_NE(pc.GetAttributeMetadataByAttributeId(0), nullptr);
+}
+
+} // namespace