OpenVDB  11.0.0
PointLeafLocalData.h
Go to the documentation of this file.
1 // Copyright Contributors to the OpenVDB Project
2 // SPDX-License-Identifier: MPL-2.0
3 
4 /// @file codegen/PointLeafLocalData.h
5 ///
6 /// @authors Nick Avramoussis
7 ///
8 /// @brief Thread/Leaf local data used during execution over OpenVDB Points
9 ///
10 
11 #ifndef OPENVDB_AX_COMPILER_LEAF_LOCAL_DATA_HAS_BEEN_INCLUDED
12 #define OPENVDB_AX_COMPILER_LEAF_LOCAL_DATA_HAS_BEEN_INCLUDED
13 
14 #include <openvdb/openvdb.h>
15 #include <openvdb/version.h>
20 
21 namespace openvdb {
23 namespace OPENVDB_VERSION_NAME {
24 
25 namespace ax {
26 namespace codegen {
27 
28 namespace codegen_internal {
29 
30 
31 /// @brief Various functions can request the use and initialization of point data from within
32 /// the kernel that does not use the standard attribute handle methods. This data can
33 /// then be accessed after execution to perform post-processes such as adding new groups,
34 /// adding new string attributes or updating positions.
35 ///
36 /// @note Due to the way string handles work, string write attribute handles cannot
37 /// be constructed in parallel, nor can read handles retrieve values in parallel
38 /// if there is a chance the shared metadata is being written to (with set()).
39 /// As the compiler allows for any arbitrary string setting/getting, leaf local
40 /// maps are used for temporary storage per point. The maps use the string array
41 /// pointers as a key for later synchronization.
42 ///
44 {
45  using UniquePtr = std::unique_ptr<PointLeafLocalData>;
47  using GroupHandleT = openvdb::points::GroupWriteHandle;
48 
49  using PointStringMap = std::map<uint64_t, std::string>;
50  using StringArrayMap = std::map<points::AttributeArray*, PointStringMap>;
51 
52  using LeafNode = openvdb::points::PointDataTree::LeafNodeType;
53 
54  /// @brief Construct a new data object to keep track of various data objects
55  /// created per leaf by the point compute generator.
56  ///
57  /// @param count The number of points within the current leaf, used to initialize
58  /// the size of new arrays
59  ///
60  PointLeafLocalData(const size_t count)
61  : mPointCount(count)
62  , mArrays()
63  , mOffset(0)
64  , mHandles()
65  , mStringMap() {}
66 
67  ////////////////////////////////////////////////////////////////////////
68 
69  /// Group methods
70 
71  /// @brief Return a group write handle to a specific group name, creating the
72  /// group array if it doesn't exist. This includes either registering a
73  /// new offset or allocating an entire array. The returned handle is
74  /// guaranteed to be valid.
75  ///
76  /// @param name The group name
77  ///
78  inline GroupHandleT* getOrInsert(const std::string& name)
79  {
80  GroupHandleT* ptr = get(name);
81  if (ptr) return ptr;
82 
83  static const size_t maxGroupsInArray =
84 #if (OPENVDB_LIBRARY_MAJOR_VERSION_NUMBER > 7 || \
85  (OPENVDB_LIBRARY_MAJOR_VERSION_NUMBER >= 7 && \
86  OPENVDB_LIBRARY_MINOR_VERSION_NUMBER >= 1))
87  points::AttributeSet::Descriptor::groupBits();
88 #else
89  // old removed method
90  points::point_group_internal::GroupInfo::groupBits();
91 #endif
92 
93  if (mArrays.empty() || mOffset == maxGroupsInArray) {
94  assert(mPointCount < static_cast<size_t>(std::numeric_limits<openvdb::Index>::max()));
95  mArrays.emplace_back(new GroupArrayT(static_cast<openvdb::Index>(mPointCount)));
96  mOffset = 0;
97  }
98 
99  GroupArrayT* array = mArrays.back().get();
100  assert(array);
101 
102  std::unique_ptr<GroupHandleT>& handle = mHandles[name];
103  handle.reset(new GroupHandleT(*array, mOffset++));
104  return handle.get();
105  }
106 
107  /// @brief Return a group write handle to a specific group name if it exists.
108  /// Returns a nullptr if no group exists of the given name
109  ///
110  /// @param name The group name
111  ///
112  inline GroupHandleT* get(const std::string& name) const
113  {
114  const auto iter = mHandles.find(name);
115  if (iter == mHandles.end()) return nullptr;
116  return iter->second.get();
117  }
118 
119  /// @brief Return true if a valid group handle exists
120  ///
121  /// @param name The group name
122  ///
123  inline bool hasGroup(const std::string& name) const {
124  return mHandles.find(name) != mHandles.end();
125  }
126 
127  /// @brief Populate a set with all the groups which have been inserted into
128  /// this object. Used to compute a final set of all new groups which
129  /// have been created across all leaf nodes
130  ///
131  /// @param groups The set to populate
132  ///
133  inline void getGroups(std::set<std::string>& groups) const {
134  for (const auto& iter : mHandles) {
135  groups.insert(iter.first);
136  }
137  }
138 
139  /// @brief Compact all arrays stored on this object. This does not invalidate
140  /// any active write handles.
141  ///
142  inline void compact() {
143  for (auto& array : mArrays) array->compact();
144  }
145 
146 
147  ////////////////////////////////////////////////////////////////////////
148 
149  /// String methods
150 
151  /// @brief Get any new string data associated with a particular point on a
152  /// particular string attribute array. Returns true if data was set,
153  /// false if no data was found.
154  ///
155  /// @param array The array pointer to use as a key lookup
156  /// @param idx The point index
157  /// @param data The string to set if data is stored
158  ///
159  inline bool
160  getNewStringData(const points::AttributeArray* array, const uint64_t idx, std::string& data) const {
161  const auto arrayMapIter = mStringMap.find(const_cast<points::AttributeArray*>(array));
162  if (arrayMapIter == mStringMap.end()) return false;
163  const auto iter = arrayMapIter->second.find(idx);
164  if (iter == arrayMapIter->second.end()) return false;
165  data = iter->second;
166  return true;
167  }
168 
169  /// @brief Set new string data associated with a particular point on a
170  /// particular string attribute array.
171  ///
172  /// @param array The array pointer to use as a key lookup
173  /// @param idx The point index
174  /// @param data The string to set
175  ///
176  inline void
177  setNewStringData(points::AttributeArray* array, const uint64_t idx, const std::string& data) {
178  mStringMap[array][idx] = data;
179  }
180 
181  /// @brief Remove any new string data associated with a particular point on a
182  /// particular string attribute array. Does nothing if no data exists
183  ///
184  /// @param array The array pointer to use as a key lookup
185  /// @param idx The point index
186  ///
187  inline void
188  removeNewStringData(points::AttributeArray* array, const uint64_t idx) {
189  const auto arrayMapIter = mStringMap.find(array);
190  if (arrayMapIter == mStringMap.end()) return;
191  arrayMapIter->second.erase(idx);
192  if (arrayMapIter->second.empty()) mStringMap.erase(arrayMapIter);
193  }
194 
195  /// @brief Insert all new point strings stored across all collected string
196  /// attribute arrays into a StringMetaInserter. Returns false if the
197  /// inserter was not accessed and true if it was potentially modified.
198  ///
199  /// @param inserter The string meta inserter to update
200  ///
201  inline bool
203  for (const auto& arrayIter : mStringMap) {
204  for (const auto& iter : arrayIter.second) {
205  inserter.insert(iter.second);
206  }
207  }
208  return !mStringMap.empty();
209  }
210 
211  /// @brief Returns a const reference to the string array map
212  ///
213  inline const StringArrayMap& getStringArrayMap() const {
214  return mStringMap;
215  }
216 
217 private:
218 
219  const size_t mPointCount;
220  std::vector<std::unique_ptr<GroupArrayT>> mArrays;
221  points::GroupType mOffset;
222  std::map<std::string, std::unique_ptr<GroupHandleT>> mHandles;
223  StringArrayMap mStringMap;
224 };
225 
226 } // codegen_internal
227 
228 } // namespace compiler
229 } // namespace ax
230 } // namespace OPENVDB_VERSION_NAME
231 } // namespace openvdb
232 
233 #endif // OPENVDB_AX_COMPILER_LEAF_LOCAL_DATA_HAS_BEEN_INCLUDED
234 
Index insert(const Name &name, Index hint=Index(0))
Insert the string into the metadata using the hint if non-zero.
openvdb::points::PointDataTree::LeafNodeType LeafNode
Definition: PointLeafLocalData.h:52
void removeNewStringData(points::AttributeArray *array, const uint64_t idx)
Remove any new string data associated with a particular point on a particular string attribute array...
Definition: PointLeafLocalData.h:188
bool insertNewStrings(points::StringMetaInserter &inserter) const
Insert all new point strings stored across all collected string attribute arrays into a StringMetaIns...
Definition: PointLeafLocalData.h:202
openvdb::points::GroupAttributeArray GroupArrayT
Definition: PointLeafLocalData.h:46
Attribute Array storage templated on type and compression codec.
openvdb::points::GroupWriteHandle GroupHandleT
Definition: PointLeafLocalData.h:47
void setNewStringData(points::AttributeArray *array, const uint64_t idx, const std::string &data)
Set new string data associated with a particular point on a particular string attribute array...
Definition: PointLeafLocalData.h:177
const StringArrayMap & getStringArrayMap() const
Returns a const reference to the string array map.
Definition: PointLeafLocalData.h:213
Base class for storing attribute data.
Definition: AttributeArray.h:92
Point attribute manipulation in a VDB Point Grid.
Point group manipulation in a VDB Point Grid.
Various functions can request the use and initialization of point data from within the kernel that do...
Definition: PointLeafLocalData.h:43
void getGroups(std::set< std::string > &groups) const
Populate a set with all the groups which have been inserted into this object. Used to compute a final...
Definition: PointLeafLocalData.h:133
std::unique_ptr< PointLeafLocalData > UniquePtr
Definition: PointLeafLocalData.h:45
PointLeafLocalData(const size_t count)
Construct a new data object to keep track of various data objects created per leaf by the point compu...
Definition: PointLeafLocalData.h:60
Definition: Exceptions.h:13
TypedAttributeArray< GroupType, GroupCodec > GroupAttributeArray
Definition: AttributeGroup.h:40
GroupHandleT * getOrInsert(const std::string &name)
Group methods.
Definition: PointLeafLocalData.h:78
uint8_t GroupType
Definition: AttributeSet.h:31
std::map< uint64_t, std::string > PointStringMap
Definition: PointLeafLocalData.h:49
bool getNewStringData(const points::AttributeArray *array, const uint64_t idx, std::string &data) const
String methods.
Definition: PointLeafLocalData.h:160
Attribute-owned data structure for points. Point attributes are stored in leaf nodes and ordered by v...
void compact()
Compact all arrays stored on this object. This does not invalidate any active write handles...
Definition: PointLeafLocalData.h:142
const std::enable_if<!VecTraits< T >::IsVec, T >::type & max(const T &a, const T &b)
Definition: Composite.h:110
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition: version.h.in:121
std::map< points::AttributeArray *, PointStringMap > StringArrayMap
Definition: PointLeafLocalData.h:50
bool hasGroup(const std::string &name) const
Return true if a valid group handle exists.
Definition: PointLeafLocalData.h:123
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h.in:212
Class to help with insertion of keyed string values into metadata.
Definition: AttributeArrayString.h:88