Geometry Nodes: initial Volume Grid socket support #115270
@ -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 */
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
|
@ -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);
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user