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 /** \name Grid Utility Functions
* \{ */ * \{ */
@ -213,7 +224,7 @@ template<typename T> VolumeGridPtr<T> make_empty_grid(const T background_value)
else { else {
grid = GridType::create(grids::AttributeConverter<T>::convert(background_value)); 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 #else
return nullptr; return nullptr;
#endif /* WITH_OPENVDB */ #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. */ /* Add grids read from file to own vector, filtering out any null pointers. */
for (const openvdb::GridBase::Ptr &vdb_grid : vdb_grids) { for (const openvdb::GridBase::Ptr &vdb_grid : vdb_grids) {
if (vdb_grid) { 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)); 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); 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()); return const_cast<VolumeGrid *>(grids.back().get());
#else #else
UNUSED_VARS(volume, name, type); 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); BLI_assert(BKE_volume_grid_type_openvdb(*vdb_grid) != VOLUME_GRID_UNKNOWN);
vdb_grid->setName(name); 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()); return const_cast<VolumeGrid *>(grids.back().get());
} }
#endif #endif

View File

@ -41,8 +41,8 @@ void VolumeData::init()
const int num_grids = BKE_volume_num_grids(volume); const int num_grids = BKE_volume_num_grids(volume);
if (num_grids) { if (num_grids) {
for (const int i : IndexRange(num_grids)) { for (const int i : IndexRange(num_grids)) {
const GVolumeGridPtr grid = BKE_volume_grid_get_for_read(volume, i); const VolumeGrid *grid = BKE_volume_grid_get_for_read(volume, i);
const std::string grid_name = BKE_volume_grid_name(grid.get()); const std::string grid_name = BKE_volume_grid_name(grid);
field_descriptors_.emplace_back(pxr::TfToken(grid_name), field_descriptors_.emplace_back(pxr::TfToken(grid_name),
pxr::UsdVolImagingTokens->openvdbAsset, 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); pxr::UsdVolVolume usd_volume = pxr::UsdVolVolume::Define(stage, volume_path);
for (const int i : IndexRange(num_grids)) { for (const int i : IndexRange(num_grids)) {
const GVolumeGridPtr grid = BKE_volume_grid_get_for_read(volume, i); const VolumeGrid *grid = BKE_volume_grid_get_for_read(volume, i);
const std::string grid_name = BKE_volume_grid_name(grid.get()); const std::string grid_name = BKE_volume_grid_name(grid);
const std::string grid_id = pxr::TfMakeValidIdentifier(grid_name); const std::string grid_id = pxr::TfMakeValidIdentifier(grid_name);
const pxr::SdfPath grid_path = volume_path.AppendPath(pxr::SdfPath(grid_id)); const pxr::SdfPath grid_path = volume_path.AppendPath(pxr::SdfPath(grid_id));
pxr::UsdVolOpenVDBAsset usd_grid = pxr::UsdVolOpenVDBAsset::Define(stage, grid_path); 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( openvdb::tools::dilateActiveValues(
grid->tree(), iterations, grids::get_vdb_neighbors_mode(neighbors_mode)); grid->tree(), iterations, grids::get_vdb_neighbors_mode(neighbors_mode));
params.set_output( params.set_output("Grid",
"Grid", bke::ValueOrField<T>(bke::VolumeGridPtr<T>(make_implicit_shared<VolumeGrid>(grid)))); bke::ValueOrField<T>(bke::make_volume_grid_ptr(grid).template typed<T>()));
} }
static void node_geo_exec(GeoNodeExecParams params) static void node_geo_exec(GeoNodeExecParams params)

View File

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