diff options
Diffstat (limited to 'extern/draco/dracoenc/src/draco/metadata/geometry_metadata.h')
-rw-r--r-- | extern/draco/dracoenc/src/draco/metadata/geometry_metadata.h | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/extern/draco/dracoenc/src/draco/metadata/geometry_metadata.h b/extern/draco/dracoenc/src/draco/metadata/geometry_metadata.h new file mode 100644 index 00000000000..9f668f7fa15 --- /dev/null +++ b/extern/draco/dracoenc/src/draco/metadata/geometry_metadata.h @@ -0,0 +1,126 @@ +// 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. +// +#ifndef DRACO_METADATA_GEOMETRY_METADATA_H_ +#define DRACO_METADATA_GEOMETRY_METADATA_H_ + +#include "draco/metadata/metadata.h" + +namespace draco { + +// Class for representing specifically metadata of attributes. It must have an +// attribute id which should be identical to it's counterpart attribute in +// the point cloud it belongs to. +class AttributeMetadata : public Metadata { + public: + AttributeMetadata() : att_unique_id_(0) {} + explicit AttributeMetadata(const Metadata &metadata) + : Metadata(metadata), att_unique_id_(0) {} + + void set_att_unique_id(uint32_t att_unique_id) { + att_unique_id_ = att_unique_id; + } + // The unique id of the attribute that this metadata belongs to. + uint32_t att_unique_id() const { return att_unique_id_; } + + private: + uint32_t att_unique_id_; + + friend struct AttributeMetadataHasher; + friend class PointCloud; +}; + +// Functor for computing a hash from data stored in a AttributeMetadata class. +struct AttributeMetadataHasher { + size_t operator()(const AttributeMetadata &metadata) const { + size_t hash = metadata.att_unique_id_; + MetadataHasher metadata_hasher; + hash = HashCombine(metadata_hasher(static_cast<const Metadata &>(metadata)), + hash); + return hash; + } +}; +// Class for representing the metadata for a point cloud. It could have a list +// of attribute metadata. +class GeometryMetadata : public Metadata { + public: + GeometryMetadata(){}; + explicit GeometryMetadata(const Metadata &metadata) : Metadata(metadata) {} + + const AttributeMetadata *GetAttributeMetadataByStringEntry( + const std::string &entry_name, const std::string &entry_value) const; + bool AddAttributeMetadata(std::unique_ptr<AttributeMetadata> att_metadata); + + void DeleteAttributeMetadataByUniqueId(int32_t att_unique_id) { + for (auto itr = att_metadatas_.begin(); itr != att_metadatas_.end(); + ++itr) { + if (itr->get()->att_unique_id() == att_unique_id) { + att_metadatas_.erase(itr); + return; + } + } + } + + const AttributeMetadata *GetAttributeMetadataByUniqueId( + int32_t att_unique_id) const { + // TODO(draco-eng): Consider using unordered_map instead of vector to store + // attribute metadata. + for (auto &&att_metadata : att_metadatas_) { + if (att_metadata->att_unique_id() == att_unique_id) { + return att_metadata.get(); + } + } + return nullptr; + } + + AttributeMetadata *attribute_metadata(int32_t att_unique_id) { + // TODO(draco-eng): Consider use unordered_map instead of vector to store + // attribute metadata. + for (auto &&att_metadata : att_metadatas_) { + if (att_metadata->att_unique_id() == att_unique_id) { + return att_metadata.get(); + } + } + return nullptr; + } + + const std::vector<std::unique_ptr<AttributeMetadata>> &attribute_metadatas() + const { + return att_metadatas_; + } + + private: + std::vector<std::unique_ptr<AttributeMetadata>> att_metadatas_; + + friend struct GeometryMetadataHasher; +}; + +// Functor for computing a hash from data stored in a GeometryMetadata class. +struct GeometryMetadataHasher { + size_t operator()(const GeometryMetadata &metadata) const { + size_t hash = metadata.att_metadatas_.size(); + AttributeMetadataHasher att_metadata_hasher; + for (auto &&att_metadata : metadata.att_metadatas_) { + hash = HashCombine(att_metadata_hasher(*att_metadata), hash); + } + MetadataHasher metadata_hasher; + hash = HashCombine(metadata_hasher(static_cast<const Metadata &>(metadata)), + hash); + return hash; + } +}; + +} // namespace draco + +#endif // THIRD_PARTY_DRACO_METADATA_GEOMETRY_METADATA_H_ |