diff options
author | Benjamin Schmithüsen <UX3D-schmithuesen> | 2019-04-11 12:26:23 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2019-04-11 13:04:53 +0300 |
commit | 4bad4bfc6ae5a81c44038cb1259f44befbb3afe0 (patch) | |
tree | 9b196d3ed0466406ba85441ea2314bedaeaea783 /extern/draco/dracoenc/src/draco/compression/point_cloud/point_cloud_sequential_encoding_test.cc | |
parent | a9d6356fee28d3567e956415a8eb08ab0bb7a0ab (diff) |
glTF: add Draco shared library for mesh compression.
Draco is added as a library under extern/ and builds a shared library that is
installed into the Python site-packages. This is then loaded by the glTF add-on
to do mesh compression.
Differential Revision: https://developer.blender.org/D4501
Diffstat (limited to 'extern/draco/dracoenc/src/draco/compression/point_cloud/point_cloud_sequential_encoding_test.cc')
-rw-r--r-- | extern/draco/dracoenc/src/draco/compression/point_cloud/point_cloud_sequential_encoding_test.cc | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/extern/draco/dracoenc/src/draco/compression/point_cloud/point_cloud_sequential_encoding_test.cc b/extern/draco/dracoenc/src/draco/compression/point_cloud/point_cloud_sequential_encoding_test.cc new file mode 100644 index 00000000000..beab4bcd7e9 --- /dev/null +++ b/extern/draco/dracoenc/src/draco/compression/point_cloud/point_cloud_sequential_encoding_test.cc @@ -0,0 +1,90 @@ +// 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/compression/point_cloud/point_cloud_sequential_decoder.h" +#include "draco/compression/point_cloud/point_cloud_sequential_encoder.h" +#include "draco/core/draco_test_base.h" +#include "draco/core/draco_test_utils.h" +#include "draco/io/obj_decoder.h" + +namespace draco { + +class PointCloudSequentialEncodingTest : public ::testing::Test { + protected: + std::unique_ptr<PointCloud> EncodeAndDecodePointCloud(const PointCloud *pc) { + EncoderBuffer buffer; + PointCloudSequentialEncoder encoder; + EncoderOptions options = EncoderOptions::CreateDefaultOptions(); + encoder.SetPointCloud(*pc); + if (!encoder.Encode(options, &buffer).ok()) + return nullptr; + + DecoderBuffer dec_buffer; + dec_buffer.Init(buffer.data(), buffer.size()); + PointCloudSequentialDecoder decoder; + + std::unique_ptr<PointCloud> out_pc(new PointCloud()); + DecoderOptions dec_options; + if (!decoder.Decode(dec_options, &dec_buffer, out_pc.get()).ok()) + return nullptr; + return out_pc; + } + + void TestEncoding(const std::string &file_name) { + std::unique_ptr<PointCloud> pc = ReadPointCloudFromTestFile(file_name); + ASSERT_NE(pc, nullptr); + + std::unique_ptr<PointCloud> decoded_pc = + EncodeAndDecodePointCloud(pc.get()); + ASSERT_NE(decoded_pc.get(), nullptr); + ASSERT_EQ(decoded_pc->num_points(), pc->num_points()); + } +}; + +TEST_F(PointCloudSequentialEncodingTest, DoesEncodeAndDecode) { + TestEncoding("test_nm.obj"); +} + +TEST_F(PointCloudSequentialEncodingTest, EncodingPointCloudWithMetadata) { + std::unique_ptr<PointCloud> pc = ReadPointCloudFromTestFile("test_nm.obj"); + ASSERT_NE(pc, nullptr); + // Add metadata to point cloud. + std::unique_ptr<GeometryMetadata> metadata = + std::unique_ptr<GeometryMetadata>(new GeometryMetadata()); + const uint32_t pos_att_id = + pc->GetNamedAttributeId(GeometryAttribute::POSITION); + std::unique_ptr<AttributeMetadata> pos_metadata = + std::unique_ptr<AttributeMetadata>(new AttributeMetadata()); + pos_metadata->AddEntryString("name", "position"); + pc->AddAttributeMetadata(pos_att_id, std::move(pos_metadata)); + + std::unique_ptr<PointCloud> decoded_pc = EncodeAndDecodePointCloud(pc.get()); + ASSERT_NE(decoded_pc.get(), nullptr); + + const GeometryMetadata *const pc_metadata = decoded_pc->GetMetadata(); + ASSERT_NE(pc_metadata, nullptr); + // Test getting attribute metadata by id. + ASSERT_NE(pc->GetAttributeMetadataByAttributeId(pos_att_id), nullptr); + // Test getting attribute metadata by entry name value pair. + const AttributeMetadata *const requested_att_metadata = + pc_metadata->GetAttributeMetadataByStringEntry("name", "position"); + ASSERT_NE(requested_att_metadata, nullptr); + ASSERT_EQ(requested_att_metadata->att_unique_id(), + pc->attribute(pos_att_id)->unique_id()); +} + +// TODO(ostava): Test the reusability of a single instance of the encoder and +// decoder class. + +} // namespace draco |