11#ifndef OPENVDB_AX_COMPILER_LEAF_LOCAL_DATA_HAS_BEEN_INCLUDED
12#define OPENVDB_AX_COMPILER_LEAF_LOCAL_DATA_HAS_BEEN_INCLUDED
15#include <openvdb/version.h>
29namespace codegen_internal {
44struct PointLeafLocalData
46 using UniquePtr = std::unique_ptr<PointLeafLocalData>;
47 using GroupArrayT = openvdb::points::GroupAttributeArray;
48 using GroupHandleT = openvdb::points::GroupWriteHandle;
50 using PointStringMap = std::map<uint64_t, std::string>;
51 using StringArrayMap = std::map<points::AttributeArray*, PointStringMap>;
53 using LeafNode = openvdb::points::PointDataTree::LeafNodeType;
61 PointLeafLocalData(
const size_t count)
79 inline GroupHandleT* getOrInsert(
const std::string& name)
81 GroupHandleT* ptr = get(name);
84 static const size_t maxGroupsInArray =
85#if (OPENVDB_LIBRARY_MAJOR_VERSION_NUMBER > 7 || \
86 (OPENVDB_LIBRARY_MAJOR_VERSION_NUMBER >= 7 && \
87 OPENVDB_LIBRARY_MINOR_VERSION_NUMBER >= 1))
88 points::AttributeSet::Descriptor::groupBits();
91 points::point_group_internal::GroupInfo::groupBits();
94 if (mArrays.empty() || mOffset == maxGroupsInArray) {
95 OPENVDB_ASSERT(mPointCount <
static_cast<size_t>(std::numeric_limits<openvdb::Index>::max()));
96 mArrays.emplace_back(
new GroupArrayT(
static_cast<openvdb::Index>(mPointCount)));
100 GroupArrayT* array = mArrays.back().get();
103 std::unique_ptr<GroupHandleT>& handle = mHandles[name];
104 handle.reset(
new GroupHandleT(*array, mOffset++));
113 inline GroupHandleT* get(
const std::string& name)
const
115 const auto iter = mHandles.find(name);
116 if (iter == mHandles.end())
return nullptr;
117 return iter->second.get();
124 inline bool hasGroup(
const std::string& name)
const {
125 return mHandles.find(name) != mHandles.end();
134 inline void getGroups(std::set<std::string>& groups)
const {
135 for (
const auto& iter : mHandles) {
136 groups.insert(iter.first);
143 inline void compact() {
144 for (
auto& array : mArrays) array->compact();
161 getNewStringData(
const points::AttributeArray* array,
const uint64_t idx, std::string& data)
const {
162 const auto arrayMapIter = mStringMap.find(
const_cast<points::AttributeArray*
>(array));
163 if (arrayMapIter == mStringMap.end())
return false;
164 const auto iter = arrayMapIter->second.find(idx);
165 if (iter == arrayMapIter->second.end())
return false;
178 setNewStringData(points::AttributeArray* array,
const uint64_t idx,
const std::string& data) {
179 mStringMap[array][idx] = data;
189 removeNewStringData(points::AttributeArray* array,
const uint64_t idx) {
190 const auto arrayMapIter = mStringMap.find(array);
191 if (arrayMapIter == mStringMap.end())
return;
192 arrayMapIter->second.erase(idx);
193 if (arrayMapIter->second.empty()) mStringMap.erase(arrayMapIter);
203 insertNewStrings(points::StringMetaInserter& inserter)
const {
204 for (
const auto& arrayIter : mStringMap) {
205 for (
const auto& iter : arrayIter.second) {
206 inserter.insert(iter.second);
209 return !mStringMap.empty();
214 inline const StringArrayMap& getStringArrayMap()
const {
220 const size_t mPointCount;
221 std::vector<std::unique_ptr<GroupArrayT>> mArrays;
222 points::GroupType mOffset;
223 std::map<std::string, std::unique_ptr<GroupHandleT>> mHandles;
224 StringArrayMap mStringMap;
#define OPENVDB_ASSERT(X)
Definition Assert.h:41
Attribute Array storage templated on type and compression codec.
Point attribute manipulation in a VDB Point Grid.
Attribute-owned data structure for points. Point attributes are stored in leaf nodes and ordered by v...
Point group manipulation in a VDB Point Grid.
Index32 Index
Definition Types.h:34
Definition Exceptions.h:13
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition version.h.in:121
#define OPENVDB_USE_VERSION_NAMESPACE
Definition version.h.in:218