33struct LazyLoadedGrid {
39 std::shared_ptr<openvdb::GridBase> grid;
40 ImplicitSharingPtr<> tree_sharing_info;
69class VolumeGridData :
public ImplicitSharingMixin {
75 const VolumeGridData &grid;
77 AccessToken(
const VolumeGridData &grid) : grid(grid) {}
83 mutable std::mutex mutex_;
99 mutable std::shared_ptr<openvdb::GridBase> grid_;
103 mutable ImplicitSharingPtr<> tree_sharing_info_;
106 mutable bool tree_loaded_ =
false;
108 mutable bool transform_loaded_ =
false;
110 mutable bool meta_data_loaded_ =
false;
115 std::function<LazyLoadedGrid()> lazy_load_grid_;
119 mutable std::string error_message_;
126 std::shared_ptr<AccessToken> tree_access_token_;
128 friend class VolumeTreeAccessToken;
144 explicit VolumeGridData(std::shared_ptr<openvdb::GridBase> grid);
155 explicit VolumeGridData(std::function<LazyLoadedGrid()> lazy_load_grid,
156 std::shared_ptr<openvdb::GridBase> meta_data_and_transform_grid = {});
167 GVolumeGrid
copy()
const;
173 const openvdb::GridBase &grid(VolumeTreeAccessToken &r_token)
const;
178 openvdb::GridBase &grid_for_write(VolumeTreeAccessToken &r_token);
185 std::shared_ptr<const openvdb::GridBase> grid_ptr(VolumeTreeAccessToken &r_token)
const;
186 std::shared_ptr<openvdb::GridBase> grid_ptr_for_write(VolumeTreeAccessToken &r_token);
191 std::string name()
const;
195 void set_name(StringRef name);
201 const openvdb::math::Transform &
transform()
const;
206 openvdb::math::Transform &transform_for_write();
217 std::optional<VolumeGridType> grid_type_without_load()
const;
222 openvdb::GridClass grid_class()
const;
234 std::string error_message()
const;
239 bool is_reloadable()
const;
245 void unload_tree_if_possible()
const;
247 void ensure_grid_loaded()
const;
256class OpenvdbTreeSharingInfo :
public ImplicitSharingInfo {
258 std::shared_ptr<openvdb::tree::TreeBase> tree_;
261 OpenvdbTreeSharingInfo(std::shared_ptr<openvdb::tree::TreeBase>
tree);
263 static ImplicitSharingPtr<>
make(std::shared_ptr<openvdb::tree::TreeBase>
tree);
265 void delete_self_with_data()
override;
266 void delete_data_only()
override;
269class VolumeTreeAccessToken {
271 std::shared_ptr<VolumeGridData::AccessToken> token_;
273 friend VolumeGridData;
281 VolumeTreeAccessToken() =
default;
282 VolumeTreeAccessToken(
const VolumeTreeAccessToken &) =
default;
283 VolumeTreeAccessToken(VolumeTreeAccessToken &&) =
default;
284 VolumeTreeAccessToken &
operator=(
const VolumeTreeAccessToken &) =
default;
285 VolumeTreeAccessToken &
operator=(VolumeTreeAccessToken &&) =
default;
286 ~VolumeTreeAccessToken();
289 bool valid_for(
const VolumeGridData &grid)
const;
301 ImplicitSharingPtr<VolumeGridData> data_;
307 GVolumeGrid() =
default;
312 explicit GVolumeGrid(
const VolumeGridData *data);
316 explicit GVolumeGrid(std::shared_ptr<openvdb::GridBase> grid);
326 const VolumeGridData &
get()
const;
332 VolumeGridData &get_for_write();
337 const VolumeGridData *release();
340 const VolumeGridData *operator->()
const;
343 operator bool()
const;
346 template<
typename T> VolumeGrid<T> typed()
const;
353template<
typename T>
class VolumeGrid :
public GVolumeGrid {
357 VolumeGrid() =
default;
358 explicit VolumeGrid(
const VolumeGridData *data);
359 explicit VolumeGrid(std::shared_ptr<OpenvdbGridType<T>> grid);
364 const OpenvdbGridType<T> &grid(VolumeTreeAccessToken &r_token)
const;
365 OpenvdbGridType<T> &grid_for_write(VolumeTreeAccessToken &r_token);
368 void assert_correct_type()
const;
380inline GVolumeGrid::GVolumeGrid(
const VolumeGridData *data) : data_(data) {}
382inline const VolumeGridData &GVolumeGrid::get()
const
388inline const VolumeGridData *GVolumeGrid::release()
390 return data_.release();
393inline GVolumeGrid::operator bool()
const
398template<
typename T>
inline VolumeGrid<T> GVolumeGrid::typed()
const
403 return VolumeGrid<T>(data_.get());
406inline const VolumeGridData *GVolumeGrid::operator->()
const
413inline VolumeGrid<T>::VolumeGrid(
const VolumeGridData *data) : GVolumeGrid(data)
415 this->assert_correct_type();
419inline VolumeGrid<T>::VolumeGrid(std::shared_ptr<OpenvdbGridType<T>> grid)
420 : GVolumeGrid(std::move(grid))
422 this->assert_correct_type();
426inline const OpenvdbGridType<T> &VolumeGrid<T>::grid(VolumeTreeAccessToken &r_token)
const
428 return static_cast<const OpenvdbGridType<T> &
>(data_->grid(r_token));
432inline OpenvdbGridType<T> &VolumeGrid<T>::grid_for_write(VolumeTreeAccessToken &r_token)
434 return static_cast<OpenvdbGridType<T> &
>(this->get_for_write().grid_for_write(r_token));
437template<
typename T>
inline void VolumeGrid<T>::assert_correct_type()
const
441 const VolumeGridType expected_type = VolumeGridTraits<T>::EnumType;
442 if (
const std::optional<VolumeGridType> actual_type = data_->grid_type_without_load()) {
449inline bool VolumeTreeAccessToken::valid_for(
const VolumeGridData &grid)
const
451 return grid.tree_access_token_ == token_;
454inline void VolumeTreeAccessToken::reset()
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)