34struct LazyLoadedGrid {
40 std::shared_ptr<openvdb::GridBase> grid;
41 ImplicitSharingPtr<> tree_sharing_info;
70class VolumeGridData :
public ImplicitSharingMixin {
76 const VolumeGridData &grid;
78 AccessToken(
const VolumeGridData &grid) : grid(grid) {}
100 mutable std::shared_ptr<openvdb::GridBase> grid_;
104 mutable ImplicitSharingPtr<> tree_sharing_info_;
107 mutable bool tree_loaded_ =
false;
109 mutable bool transform_loaded_ =
false;
111 mutable bool meta_data_loaded_ =
false;
116 std::function<LazyLoadedGrid()> lazy_load_grid_;
120 mutable std::string error_message_;
122 mutable CacheMutex active_voxels_mutex_;
123 mutable int64_t active_voxels_ = 0;
124 mutable CacheMutex active_leaf_voxels_mutex_;
125 mutable int64_t active_leaf_voxels_ = 0;
126 mutable CacheMutex active_tiles_mutex_;
127 mutable int64_t active_tiles_ = 0;
128 mutable CacheMutex size_in_bytes_mutex_;
129 mutable int64_t size_in_bytes_ = 0;
130 mutable CacheMutex active_bounds_mutex_;
131 mutable openvdb::CoordBBox active_bounds_;
139 std::shared_ptr<AccessToken> tree_access_token_;
141 friend class VolumeTreeAccessToken;
157 explicit VolumeGridData(std::shared_ptr<openvdb::GridBase> grid);
168 explicit VolumeGridData(std::function<LazyLoadedGrid()> lazy_load_grid,
169 std::shared_ptr<openvdb::GridBase> meta_data_and_transform_grid = {});
171 ~VolumeGridData()
override;
180 GVolumeGrid
copy()
const;
186 const openvdb::GridBase &grid(VolumeTreeAccessToken &r_token)
const;
191 openvdb::GridBase &grid_for_write(VolumeTreeAccessToken &r_token);
198 std::shared_ptr<const openvdb::GridBase> grid_ptr(VolumeTreeAccessToken &r_token)
const;
199 std::shared_ptr<openvdb::GridBase> grid_ptr_for_write(VolumeTreeAccessToken &r_token);
204 std::string
name()
const;
208 void set_name(StringRef
name);
214 const openvdb::math::Transform &
transform()
const;
219 openvdb::math::Transform &transform_for_write();
230 std::optional<VolumeGridType> grid_type_without_load()
const;
235 openvdb::GridClass grid_class()
const;
247 std::string error_message()
const;
252 bool is_reloadable()
const;
254 void tag_tree_modified()
const;
257 int64_t active_leaf_voxels()
const;
260 const openvdb::CoordBBox &active_bounds()
const;
266 void unload_tree_if_possible()
const;
268 void ensure_grid_loaded()
const;
269 void delete_self()
override;
277class OpenvdbTreeSharingInfo :
public ImplicitSharingInfo {
279 std::shared_ptr<openvdb::tree::TreeBase> tree_;
282 OpenvdbTreeSharingInfo(std::shared_ptr<openvdb::tree::TreeBase>
tree);
284 static ImplicitSharingPtr<>
make(std::shared_ptr<openvdb::tree::TreeBase>
tree);
286 void delete_self_with_data()
override;
287 void delete_data_only()
override;
290class VolumeTreeAccessToken {
292 std::shared_ptr<VolumeGridData::AccessToken> token_;
294 friend VolumeGridData;
302 VolumeTreeAccessToken() =
default;
303 VolumeTreeAccessToken(
const VolumeTreeAccessToken &) =
default;
304 VolumeTreeAccessToken(VolumeTreeAccessToken &&) =
default;
305 VolumeTreeAccessToken &
operator=(
const VolumeTreeAccessToken &) =
default;
306 VolumeTreeAccessToken &
operator=(VolumeTreeAccessToken &&) =
default;
307 ~VolumeTreeAccessToken();
310 bool valid_for(
const VolumeGridData &grid)
const;
322 ImplicitSharingPtr<VolumeGridData> data_;
328 GVolumeGrid() =
default;
333 explicit GVolumeGrid(
const VolumeGridData *
data);
337 explicit GVolumeGrid(std::shared_ptr<openvdb::GridBase> grid);
347 const VolumeGridData &
get()
const;
353 VolumeGridData &get_for_write();
358 const VolumeGridData *release();
361 const VolumeGridData *operator->()
const;
364 operator bool()
const;
367 template<
typename T> VolumeGrid<T> typed()
const;
374template<
typename T>
class VolumeGrid :
public GVolumeGrid {
378 VolumeGrid() =
default;
379 explicit VolumeGrid(
const VolumeGridData *
data);
380 explicit VolumeGrid(std::shared_ptr<OpenvdbGridType<T>> grid);
385 const OpenvdbGridType<T> &grid(VolumeTreeAccessToken &r_token)
const;
386 OpenvdbGridType<T> &grid_for_write(VolumeTreeAccessToken &r_token);
389 void assert_correct_type()
const;
405inline GVolumeGrid::GVolumeGrid(
const VolumeGridData *
data) : data_(
data) {}
407inline const VolumeGridData &GVolumeGrid::get()
const
413inline const VolumeGridData *GVolumeGrid::release()
415 return data_.release();
418inline GVolumeGrid::operator bool()
const
423template<
typename T>
inline VolumeGrid<T> GVolumeGrid::typed()
const
428 return VolumeGrid<T>(data_.get());
431inline const VolumeGridData *GVolumeGrid::operator->()
const
438inline VolumeGrid<T>::VolumeGrid(
const VolumeGridData *
data) : GVolumeGrid(
data)
440 this->assert_correct_type();
444inline VolumeGrid<T>::VolumeGrid(std::shared_ptr<OpenvdbGridType<T>> grid)
445 : GVolumeGrid(std::move(grid))
447 this->assert_correct_type();
451inline const OpenvdbGridType<T> &VolumeGrid<T>::grid(VolumeTreeAccessToken &r_token)
const
453 return static_cast<const OpenvdbGridType<T> &
>(data_->grid(r_token));
457inline OpenvdbGridType<T> &VolumeGrid<T>::grid_for_write(VolumeTreeAccessToken &r_token)
459 return static_cast<OpenvdbGridType<T> &
>(this->get_for_write().grid_for_write(r_token));
462template<
typename T>
inline void VolumeGrid<T>::assert_correct_type()
const
466 const VolumeGridType expected_type = VolumeGridTraits<T>::EnumType;
467 if (
const std::optional<VolumeGridType> actual_type = data_->grid_type_without_load()) {
474inline bool VolumeTreeAccessToken::valid_for(
const VolumeGridData &grid)
const
476 return grid.tree_access_token_ == token_;
479inline void VolumeTreeAccessToken::reset()
BMesh const char void * data
SIMD_FORCE_INLINE btVector3 transform(const btVector3 &point) const
btGeneric6DofConstraint & operator=(btGeneric6DofConstraint &other)
void reset()
clear internal cached data and reset random seed
static int make(const char *input_file_name, const char *output_file_name)
void count_memory(const VolumeGridData &grid, MemoryCounter &memory)
VolumeGridType get_type(const VolumeGridData &grid)
bool is_loaded(const VolumeGridData &grid)
std::shared_ptr< const T > get(const GenericKey &key, FunctionRef< std::unique_ptr< T >()> compute_fn)
static void copy(bNodeTree *dest_ntree, bNode *dest_node, const bNode *src_node)