OpenVDB: AttributeGroup.h Source File

OpenVDB 8.0.0

AttributeGroup.h
Go to the documentation of this file.
1 // Copyright Contributors to the OpenVDB Project
2 // SPDX-License-Identifier: MPL-2.0
3
9
10 #ifndef OPENVDB_POINTS_ATTRIBUTE_GROUP_HAS_BEEN_INCLUDED
11 #define OPENVDB_POINTS_ATTRIBUTE_GROUP_HAS_BEEN_INCLUDED
12
13 #include "AttributeArray.h"
14 #include "AttributeSet.h"
15 #include <memory>
16
17 namespace openvdb {
18 OPENVDB_USE_VERSION_NAMESPACE
19 namespace OPENVDB_VERSION_NAME {
20 namespace points {
21
22
24
25
26 struct GroupCodec
27 {
28 using StorageType = GroupType;
29 using ValueType = GroupType;
30
31 template <typename T>
32 struct Storage { using Type = StorageType; };
33
34 static void decode(const StorageType&, ValueType&);
35 static void encode(const ValueType&, StorageType&);
36 static const char* name() { return "grp"; }
37 };
38
39
40 using GroupAttributeArray = TypedAttributeArray<GroupType, GroupCodec>;
41
42
44
45
46 inline void
47 GroupCodec::decode(const StorageType& data, ValueType& val)
48 {
49 val = data;
50 }
51
52
53 inline void
54 GroupCodec::encode(const ValueType& val, StorageType& data)
55 {
56 data = val;
57 }
58
59
61
62
63 inline bool isGroup(const AttributeArray& array)
64 {
65 return array.isType<GroupAttributeArray>();
66 }
67
68
70
71
72 class OPENVDB_API GroupHandle
73 {
74 public:
75 using Ptr = std::shared_ptr<GroupHandle>;
76 using UniquePtr = std::unique_ptr<GroupHandle>;
77
78 // Dummy class that distinguishes an offset from a bitmask on construction
79 struct BitMask { };
80
81 using GroupIndex = std::pair<Index, uint8_t>;
82
83 GroupHandle(const GroupAttributeArray& array, const GroupType& offset);
84 GroupHandle(const GroupAttributeArray& array, const GroupType& bitMask, BitMask);
85
86 Index size() const { return mArray.size(); }
87 bool isUniform() const { return mArray.isUniform(); }
88
89 bool get(Index n) const;
90 bool getUnsafe(Index n) const;
91
92 protected:
93 const GroupAttributeArray& mArray;
94 const GroupType mBitMask;
95 }; // class GroupHandle
96
97
99
100
101 class OPENVDB_API GroupWriteHandle : public GroupHandle
102 {
103 public:
104 using Ptr = std::shared_ptr<GroupWriteHandle>;
105 using UniquePtr = std::unique_ptr<GroupWriteHandle>;
106
107 GroupWriteHandle(GroupAttributeArray& array, const GroupType& offset);
108
110 void set(Index n, bool on);
112 void setUnsafe(Index n, bool on);
113
122 bool collapse(bool on);
123
125 bool compact();
126
127 }; // class GroupWriteHandle
128
129
131
132
134 class GroupFilter
135 {
136 public:
137 GroupFilter(const Name& name, const AttributeSet& attributeSet)
138 : mIndex(attributeSet.groupIndex(name)) { }
139
140 explicit GroupFilter(const AttributeSet::Descriptor::GroupIndex& index)
141 : mIndex(index) { }
142
143 inline bool initialized() const { return bool(mHandle); }
144
145 static index::State state() { return index::PARTIAL; }
146 template <typename LeafT>
147 static index::State state(const LeafT&) { return index::PARTIAL; }
148
149 template <typename LeafT>
150 void reset(const LeafT& leaf) {
151 mHandle.reset(new GroupHandle(leaf.groupHandle(mIndex)));
152 }
153
154 template <typename IterT>
155 bool valid(const IterT& iter) const {
156 assert(mHandle);
157 return mHandle->getUnsafe(*iter);
158 }
159
160 private:
161 const AttributeSet::Descriptor::GroupIndex mIndex;
162 GroupHandle::Ptr mHandle;
163 }; // class GroupFilter
164
165
167
168
169 } // namespace points
170
171 } // namespace OPENVDB_VERSION_NAME
172 } // namespace openvdb
173
174
175 #endif // OPENVDB_POINTS_ATTRIBUTE_GROUP_HAS_BEEN_INCLUDED
AttributeSet.h
Set of Attribute Arrays which tracks metadata about each array.
openvdb::v8_2::points::AttributeArray
Base class for storing attribute data.
Definition: AttributeArray.h:93
openvdb::v8_2::points::GroupCodec::Storage::Type
StorageType Type
Definition: AttributeGroup.h:32
openvdb::v8_2::points::GroupHandle::BitMask
Definition: AttributeGroup.h:79
openvdb::v8_2::points::GroupHandle::get
bool get(Index n) const
openvdb::v8_2::points::GroupHandle::Ptr
std::shared_ptr< GroupHandle > Ptr
Definition: AttributeGroup.h:75
openvdb::v8_2::points::AttributeSet
Ordered collection of uniquely-named attribute arrays.
Definition: AttributeSet.h:39
openvdb::v8_2::points::GroupCodec
Definition: AttributeGroup.h:27
openvdb::v8_2::Index
Index32 Index
Definition: openvdb/Types.h:32
openvdb::v8_2::points::GroupHandle::mBitMask
const GroupType mBitMask
Definition: AttributeGroup.h:94
openvdb::v8_2::points::GroupHandle::GroupHandle
GroupHandle(const GroupAttributeArray &array, const GroupType &bitMask, BitMask)
openvdb::v8_2::points::GroupWriteHandle::set
void set(Index n, bool on)
Set on at the given index n.
openvdb::v8_2::points::GroupWriteHandle::setUnsafe
void setUnsafe(Index n, bool on)
Set on at the given index n (assumes in-core and non-uniform)
openvdb::v8_2::points::GroupCodec::StorageType
GroupType StorageType
Definition: AttributeGroup.h:28
openvdb::v8_2::points::GroupWriteHandle
Definition: AttributeGroup.h:102
openvdb::v8_2::points::GroupHandle::size
Index size() const
Definition: AttributeGroup.h:86
AttributeArray.h
Attribute Array storage templated on type and compression codec.
openvdb::v8_2::points::GroupFilter::valid
bool valid(const IterT &iter) const
Definition: AttributeGroup.h:155
openvdb::v8_2::points::GroupWriteHandle::collapse
bool collapse(bool on)
Set membership for the whole array and attempt to collapse.
openvdb::v8_2::points::GroupType
uint8_t GroupType
Definition: AttributeSet.h:31
openvdb::v8_2::points::GroupFilter::state
static index::State state()
Definition: AttributeGroup.h:145
openvdb::v8_2::points::AttributeArray::isType
bool isType() const
Return true if this attribute is of the same type as the template parameter.
Definition: AttributeArray.h:221
openvdb::v8_2::points::GroupCodec::ValueType
GroupType ValueType
Definition: AttributeGroup.h:29
openvdb::v8_2::points::GroupFilter::GroupFilter
GroupFilter(const AttributeSet::Descriptor::GroupIndex &index)
Definition: AttributeGroup.h:140
openvdb::v8_2::points::GroupHandle::getUnsafe
bool getUnsafe(Index n) const
OPENVDB_API
#define OPENVDB_API
Helper macros for defining library symbol visibility.
Definition: Platform.h:208
openvdb::v8_2::points::index::State
State
Definition: IndexIterator.h:40
openvdb::v8_2::points::GroupCodec::name
static const char * name()
Definition: AttributeGroup.h:36
openvdb::v8_2::points::TypedAttributeArray
Typed class for storing attribute data.
Definition: AttributeArray.h:559
openvdb::v8_2::points::GroupFilter::initialized
bool initialized() const
Definition: AttributeGroup.h:143
openvdb::v8_2::points::GroupHandle::mArray
const GroupAttributeArray & mArray
Definition: AttributeGroup.h:93
openvdb::v8_2::points::GroupFilter
Index filtering on group membership.
Definition: AttributeGroup.h:135
openvdb::v8_2::points::GroupHandle::UniquePtr
std::unique_ptr< GroupHandle > UniquePtr
Definition: AttributeGroup.h:76
openvdb::v8_2::points::GroupCodec::Storage
Definition: AttributeGroup.h:32
openvdb::v8_2::points::isGroup
bool isGroup(const AttributeArray &array)
Definition: AttributeGroup.h:63
openvdb::v8_2::points::GroupFilter::state
static index::State state(const LeafT &)
Definition: AttributeGroup.h:147
OPENVDB_USE_VERSION_NAMESPACE
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:153
openvdb::v8_2::points::GroupWriteHandle::GroupWriteHandle
GroupWriteHandle(GroupAttributeArray &array, const GroupType &offset)
openvdb::v8_2::points::GroupFilter::reset
void reset(const LeafT &leaf)
Definition: AttributeGroup.h:150
openvdb::v8_2::points::GroupFilter::GroupFilter
GroupFilter(const Name &name, const AttributeSet &attributeSet)
Definition: AttributeGroup.h:137
OPENVDB_VERSION_NAME
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition: version.h:101
openvdb::v8_2::points::GroupWriteHandle::compact
bool compact()
Compact the existing array to become uniform if all values are identical.
openvdb::v8_2::points::GroupHandle::GroupIndex
std::pair< Index, uint8_t > GroupIndex
Definition: AttributeGroup.h:81
openvdb::v8_2::points::GroupHandle::isUniform
bool isUniform() const
Definition: AttributeGroup.h:87
openvdb::v8_2::points::GroupHandle::GroupHandle
GroupHandle(const GroupAttributeArray &array, const GroupType &offset)
openvdb
Definition: openvdb/Exceptions.h:13
openvdb::v8_2::points::GroupHandle
Definition: AttributeGroup.h:73
openvdb::v8_2::Name
std::string Name
Definition: Name.h:17
openvdb::v8_2::points::index::PARTIAL
@ PARTIAL
Definition: IndexIterator.h:41