Geometry Nodes: initial Volume Grid socket support #115270

Merged
Jacques Lucke merged 193 commits from LukasTonne/blender:volume-grid-sockets into main 2023-12-20 22:33:26 +01:00
6 changed files with 23 additions and 12 deletions
Showing only changes of commit 821d98d0f1 - Show all commits

View File

@ -181,6 +181,17 @@ template<typename T> struct VolumeGridPtr : public VolumeGridPtrCommon {
/** \} */
/* -------------------------------------------------------------------- */
/** \name Implicit Sharing Pointer Constructors
* \{ */
template<typename... Args> inline GVolumeGridPtr make_volume_grid_ptr(Args &&...args)
{
return GVolumeGridPtr(new VolumeGrid(std::forward<Args>(args)...));
}
/** \} */
/* -------------------------------------------------------------------- */
/** \name Grid Utility Functions
* \{ */
@ -213,7 +224,7 @@ template<typename T> VolumeGridPtr<T> make_empty_grid(const T background_value)
else {
grid = GridType::create(grids::AttributeConverter<T>::convert(background_value));
}
return VolumeGridPtr<T>(make_implicit_shared<VolumeGrid>(grid));
return make_volume_grid_ptr(grid).template typed<T>();
#else
return nullptr;
#endif /* WITH_OPENVDB */

View File

@ -507,7 +507,7 @@ bool BKE_volume_load(const Volume *volume, const Main *bmain)
/* Add grids read from file to own vector, filtering out any null pointers. */
for (const openvdb::GridBase::Ptr &vdb_grid : vdb_grids) {
if (vdb_grid) {
grids.emplace_back(blender::make_implicit_shared<VolumeGrid>(
grids.emplace_back(blender::bke::make_volume_grid_ptr(
filepath, vdb_grid, volume->runtime.default_simplify_level));
}
}
@ -1138,7 +1138,7 @@ VolumeGrid *BKE_volume_grid_add(Volume *volume, const char *name, VolumeGridType
}
vdb_grid->setName(name);
grids.emplace_back(blender::make_implicit_shared<VolumeGrid>(vdb_grid));
grids.emplace_back(blender::bke::make_volume_grid_ptr(vdb_grid));
return const_cast<VolumeGrid *>(grids.back().get());
#else
UNUSED_VARS(volume, name, type);
@ -1156,7 +1156,7 @@ VolumeGrid *BKE_volume_grid_add_vdb(Volume &volume,
BLI_assert(BKE_volume_grid_type_openvdb(*vdb_grid) != VOLUME_GRID_UNKNOWN);
vdb_grid->setName(name);
grids.emplace_back(blender::make_implicit_shared<VolumeGrid>(vdb_grid));
grids.emplace_back(blender::bke::make_volume_grid_ptr(vdb_grid));
return const_cast<VolumeGrid *>(grids.back().get());
}
#endif

View File

@ -41,8 +41,8 @@ void VolumeData::init()
const int num_grids = BKE_volume_num_grids(volume);
if (num_grids) {
for (const int i : IndexRange(num_grids)) {
const GVolumeGridPtr grid = BKE_volume_grid_get_for_read(volume, i);
const std::string grid_name = BKE_volume_grid_name(grid.get());
const VolumeGrid *grid = BKE_volume_grid_get_for_read(volume, i);
const std::string grid_name = BKE_volume_grid_name(grid);
field_descriptors_.emplace_back(pxr::TfToken(grid_name),
pxr::UsdVolImagingTokens->openvdbAsset,

View File

@ -73,8 +73,8 @@ void USDVolumeWriter::do_write(HierarchyContext &context)
pxr::UsdVolVolume usd_volume = pxr::UsdVolVolume::Define(stage, volume_path);
for (const int i : IndexRange(num_grids)) {
const GVolumeGridPtr grid = BKE_volume_grid_get_for_read(volume, i);
const std::string grid_name = BKE_volume_grid_name(grid.get());
const VolumeGrid *grid = BKE_volume_grid_get_for_read(volume, i);
const std::string grid_name = BKE_volume_grid_name(grid);
const std::string grid_id = pxr::TfMakeValidIdentifier(grid_name);
const pxr::SdfPath grid_path = volume_path.AppendPath(pxr::SdfPath(grid_id));
pxr::UsdVolOpenVDBAsset usd_grid = pxr::UsdVolOpenVDBAsset::Define(stage, grid_path);

View File

@ -65,8 +65,8 @@ static void try_dilate_grid(GeoNodeExecParams params,
openvdb::tools::dilateActiveValues(
grid->tree(), iterations, grids::get_vdb_neighbors_mode(neighbors_mode));
params.set_output(
"Grid", bke::ValueOrField<T>(bke::VolumeGridPtr<T>(make_implicit_shared<VolumeGrid>(grid))));
params.set_output("Grid",
bke::ValueOrField<T>(bke::make_volume_grid_ptr(grid).template typed<T>()));
}
static void node_geo_exec(GeoNodeExecParams params)

View File

@ -65,8 +65,8 @@ static void try_erode_grid(GeoNodeExecParams params,
openvdb::tools::erodeActiveValues(
grid->tree(), iterations, grids::get_vdb_neighbors_mode(neighbors_mode));
params.set_output(
"Grid", bke::ValueOrField<T>(bke::VolumeGridPtr<T>(grid)));
params.set_output("Grid",
bke::ValueOrField<T>(bke::make_volume_grid_ptr(grid).template typed<T>()));
}
static void node_geo_exec(GeoNodeExecParams params)