[Bf-blender-cvs] [7bea1e12238] geometry-nodes-level-set-nodes: Run level set to mask once per nested geometry, process all grids

Hans Goudey noreply at git.blender.org
Mon Nov 1 04:34:04 CET 2021


Commit: 7bea1e12238def1aa68da229768aa1f92a980e0f
Author: Hans Goudey
Date:   Sun Oct 31 22:33:57 2021 -0500
Branches: geometry-nodes-level-set-nodes
https://developer.blender.org/rB7bea1e12238def1aa68da229768aa1f92a980e0f

Run level set to mask once per nested geometry, process all grids

===================================================================

M	source/blender/nodes/geometry/nodes/node_geo_level_set_to_mask.cc

===================================================================

diff --git a/source/blender/nodes/geometry/nodes/node_geo_level_set_to_mask.cc b/source/blender/nodes/geometry/nodes/node_geo_level_set_to_mask.cc
index 1bba95c0bcb..63b35e6c920 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_level_set_to_mask.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_level_set_to_mask.cc
@@ -40,30 +40,33 @@ static void geo_node_level_set_to_mask_declare(NodeDeclarationBuilder &b)
 
 static Volume *level_set_to_mask(const Volume &volume, const GeoNodeExecParams &params)
 {
-  Volume *mask_volume = (Volume *)BKE_id_new_nomain(ID_VO, nullptr);
-  BKE_volume_init_grids(mask_volume);
-
-  const VolumeGrid *volume_grid = BKE_volume_grid_get_for_read(&volume, 0);
-  if (volume_grid == nullptr) {
+  if (BKE_volume_num_grids(&volume) == 0) {
     params.error_message_add(NodeWarningType::Error, TIP_("Volume is empty"));
-    return mask_volume;
+    return nullptr;
   }
 
-  openvdb::GridBase::ConstPtr grid_base = BKE_volume_grid_openvdb_for_read(&volume, volume_grid);
-  if (grid_base->getGridClass() != openvdb::GridClass::GRID_LEVEL_SET) {
-    params.error_message_add(NodeWarningType::Error, TIP_("Volume is not a level set"));
-  }
+  Volume *mask_volume = (Volume *)BKE_id_new_nomain(ID_VO, nullptr);
+  BKE_volume_init_grids(mask_volume);
+
+  for (const int i : IndexRange(BKE_volume_num_grids(&volume))) {
+    const VolumeGrid *volume_grid = BKE_volume_grid_get_for_read(&volume, i);
 
-  openvdb::BoolGrid::Ptr mask_grid;
-  bke::volume::to_static_type(BKE_volume_grid_type(volume_grid), [&](auto dummy) {
-    using GridType = decltype(dummy);
-    if constexpr (std::is_same_v<GridType, openvdb::FloatGrid>) {
-      const GridType &grid = static_cast<const GridType &>(*grid_base);
-      mask_grid = openvdb::tools::sdfInteriorMask(grid);
+    openvdb::GridBase::ConstPtr grid_base = BKE_volume_grid_openvdb_for_read(&volume, volume_grid);
+    if (grid_base->getGridClass() != openvdb::GridClass::GRID_LEVEL_SET) {
+      params.error_message_add(NodeWarningType::Error,
+                               std::string(TIP_("Volume grid is not a level set: ")) +
+                                   BKE_volume_grid_name(volume_grid));
     }
-  });
 
-  BKE_volume_grid_add_vdb(mask_volume, "mask", std::move(mask_grid));
+    bke::volume::to_static_type(BKE_volume_grid_type(volume_grid), [&](auto dummy) {
+      using GridType = decltype(dummy);
+      if constexpr (std::is_same_v<GridType, openvdb::FloatGrid>) {
+        const GridType &grid = static_cast<const GridType &>(*grid_base);
+        openvdb::BoolGrid::Ptr mask_grid = openvdb::tools::sdfInteriorMask(grid);
+        BKE_volume_grid_add_vdb(*mask_volume, "mask_" + i, std::move(mask_grid));
+      }
+    });
+  }
 
   return mask_volume;
 }
@@ -74,18 +77,23 @@ static void geo_node_level_set_to_mask_exec(GeoNodeExecParams params)
 {
 #ifdef WITH_OPENVDB
   GeometrySet geometry_set = params.extract_input<GeometrySet>("Level Set");
-  const Volume *volume = geometry_set.get_volume_for_read();
 
-  if (volume == nullptr) {
-    params.set_output("Mask Volume", std::move(geometry_set));
-    return;
-  }
+  geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) {
+    const Volume *volume = geometry_set.get_volume_for_read();
 
-  const Main *bmain = DEG_get_bmain(params.depsgraph());
-  BKE_volume_load(volume, bmain);
+    if (volume == nullptr) {
+      params.set_output("Mask Volume", std::move(geometry_set));
+      return;
+    }
+
+    const Main *bmain = DEG_get_bmain(params.depsgraph());
+    BKE_volume_load(volume, bmain);
+
+    Volume *mask_volume = level_set_to_mask(*volume, params);
+    geometry_set.replace_volume(mask_volume);
+  });
 
-  Volume *mask_volume = level_set_to_mask(*volume, params);
-  params.set_output("Mask Volume", GeometrySet::create_with_volume(mask_volume));
+  params.set_output("Mask Volume", geometry_set);
 #else
   params.set_output("Mask Volume", GeometrySet());
 #endif



More information about the Bf-blender-cvs mailing list