[Bf-blender-cvs] [e537bb57a35] geometry-nodes-level-set-nodes: Add volume sample node and level set to mask node

Hans Goudey noreply at git.blender.org
Sat Aug 14 03:30:00 CEST 2021


Commit: e537bb57a358031ec8a2cdbe134c3f6e224522d8
Author: Hans Goudey
Date:   Fri Aug 13 20:29:47 2021 -0500
Branches: geometry-nodes-level-set-nodes
https://developer.blender.org/rBe537bb57a358031ec8a2cdbe134c3f6e224522d8

Add volume sample node and level set to mask node

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

M	release/scripts/startup/nodeitems_builtins.py
M	source/blender/blenkernel/BKE_node.h
M	source/blender/blenkernel/BKE_volume.h
M	source/blender/blenkernel/intern/node.cc
M	source/blender/blenkernel/intern/volume.cc
M	source/blender/nodes/CMakeLists.txt
M	source/blender/nodes/NOD_geometry.h
M	source/blender/nodes/NOD_static_types.h
A	source/blender/nodes/geometry/nodes/node_geo_level_set_to_mask.cc
M	source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc
A	source/blender/nodes/geometry/nodes/node_geo_volume_sample.cc

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

diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py
index ed2c2c1cab7..c92b1dd4bc5 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -600,7 +600,9 @@ geometry_node_categories = [
         NodeItem("GeometryNodeLevelSetBoolean"),
         NodeItem("GeometryNodeLevelSetFilter"),
         NodeItem("GeometryNodeLevelSetToFogVolume"),
+        NodeItem("GeometryNodeLevelSetToMask"),
         NodeItem("GeometryNodeLevelSetMorph"),
+        NodeItem("GeometryNodeVolumeSample"),
     ]),
         GeometryNodeCategory("GEO_PRIMITIVES_VOLUME", "Volume Primitives", items=[
         NodeItem("GeometryNodeLevelSetSphere"),
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index abca5ea6412..f2320c85dbb 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -1484,6 +1484,8 @@ int ntreeTexExecTree(struct bNodeTree *ntree,
 #define GEO_NODE_LEVEL_SET_PRIMITIVE_SPHERE 1079
 #define GEO_NODE_LEVEL_SET_PRIMITIVE_PLATONIC 1080
 #define GEO_NODE_LEVEL_SET_MORPH 1081
+#define GEO_NODE_VOLUME_SAMPLE 1082
+#define GEO_NODE_LEVEL_SET_TO_MASK 1083
 
 /** \} */
 
diff --git a/source/blender/blenkernel/BKE_volume.h b/source/blender/blenkernel/BKE_volume.h
index 10e023c201f..d9965c88f76 100644
--- a/source/blender/blenkernel/BKE_volume.h
+++ b/source/blender/blenkernel/BKE_volume.h
@@ -171,7 +171,7 @@ bool BKE_volume_min_max(const Volume *volume, blender::float3 &r_min, blender::f
 
 VolumeGrid *BKE_volume_grid_add_vdb(Volume *volume,
                                     blender::StringRef name,
-                                    openvdb::FloatGrid::Ptr vdb_grid);
+                                    openvdb::GridBase::Ptr vdb_grid);
 
 bool BKE_volume_grid_bounds(openvdb::GridBase::ConstPtr grid,
                             blender::float3 &r_min,
diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index c21c23466b3..ef1603e83fb 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -5166,6 +5166,7 @@ static void registerGeometryNodes()
   register_node_type_geo_level_set_primitive_platonic();
   register_node_type_geo_level_set_primitive_sphere();
   register_node_type_geo_level_set_to_fog_volume();
+  register_node_type_geo_level_set_to_mask();
   register_node_type_geo_material_assign();
   register_node_type_geo_material_replace();
   register_node_type_geo_mesh_primitive_circle();
@@ -5197,6 +5198,7 @@ static void registerGeometryNodes()
   register_node_type_geo_transform();
   register_node_type_geo_triangulate();
   register_node_type_geo_viewer();
+  register_node_type_geo_volume_sample();
   register_node_type_geo_volume_to_mesh();
 }
 
diff --git a/source/blender/blenkernel/intern/volume.cc b/source/blender/blenkernel/intern/volume.cc
index e787a9a52ce..f576dd381dc 100644
--- a/source/blender/blenkernel/intern/volume.cc
+++ b/source/blender/blenkernel/intern/volume.cc
@@ -1470,7 +1470,7 @@ VolumeGrid *BKE_volume_grid_add(Volume *volume, const char *name, VolumeGridType
 #ifdef WITH_OPENVDB
 VolumeGrid *BKE_volume_grid_add_vdb(Volume *volume,
                                     const StringRef name,
-                                    openvdb::FloatGrid::Ptr vdb_grid)
+                                    openvdb::GridBase::Ptr vdb_grid)
 {
   VolumeGridVector &grids = *volume->runtime.grids;
   BLI_assert(BKE_volume_grid_find_for_read(volume, name.data()) == nullptr);
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index 2a8ce01bf80..8050007bec0 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -193,6 +193,7 @@ set(SRC
   geometry/nodes/node_geo_level_set_primitive_platonic.cc
   geometry/nodes/node_geo_level_set_primitive_sphere.cc
   geometry/nodes/node_geo_level_set_to_fog_volume.cc
+  geometry/nodes/node_geo_level_set_to_mask.cc
   geometry/nodes/node_geo_material_assign.cc
   geometry/nodes/node_geo_material_replace.cc
   geometry/nodes/node_geo_mesh_primitive_circle.cc
@@ -222,6 +223,7 @@ set(SRC
   geometry/nodes/node_geo_transform.cc
   geometry/nodes/node_geo_triangulate.cc
   geometry/nodes/node_geo_viewer.cc
+  geometry/nodes/node_geo_volume_sample.cc
   geometry/nodes/node_geo_volume_to_mesh.cc
   geometry/node_geometry_exec.cc
   geometry/node_geometry_tree.cc
diff --git a/source/blender/nodes/NOD_geometry.h b/source/blender/nodes/NOD_geometry.h
index df653c21b2d..9b34d93fa24 100644
--- a/source/blender/nodes/NOD_geometry.h
+++ b/source/blender/nodes/NOD_geometry.h
@@ -79,6 +79,7 @@ void register_node_type_geo_level_set_morph(void);
 void register_node_type_geo_level_set_primitive_platonic(void);
 void register_node_type_geo_level_set_primitive_sphere(void);
 void register_node_type_geo_level_set_to_fog_volume(void);
+void register_node_type_geo_level_set_to_mask(void);
 void register_node_type_geo_material_assign(void);
 void register_node_type_geo_material_replace(void);
 void register_node_type_geo_mesh_primitive_circle(void);
@@ -111,6 +112,7 @@ void register_node_type_geo_transform(void);
 void register_node_type_geo_triangulate(void);
 void register_node_type_geo_viewer(void);
 void register_node_type_geo_volume_to_mesh(void);
+void register_node_type_geo_volume_sample(void);
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h
index bdf60d6aa21..b77f069ffad 100644
--- a/source/blender/nodes/NOD_static_types.h
+++ b/source/blender/nodes/NOD_static_types.h
@@ -320,6 +320,7 @@ DefNode(GeometryNode, GEO_NODE_LEVEL_SET_MORPH , def_geo_level_set_morph, "LEVEL
 DefNode(GeometryNode, GEO_NODE_LEVEL_SET_PRIMITIVE_SPHERE , 0, "LEVEL_SET_PRIMITIVE_SPHERE", LevelSetSphere, "Level Set Sphere", "")
 DefNode(GeometryNode, GEO_NODE_LEVEL_SET_PRIMITIVE_PLATONIC , def_geo_level_set_primitive_platonic, "LEVEL_SET_PRIMITIVE_PLATONIC", LevelSetPlatonic, "Level Set Platonic", "")
 DefNode(GeometryNode, GEO_NODE_LEVEL_SET_TO_FOG_VOLUME , 0, "LEVEL_SET_TO_FOG", LevelSetToFogVolume, "Level Set to Fog Volume", "")
+DefNode(GeometryNode, GEO_NODE_LEVEL_SET_TO_MASK , 0, "LEVEL_SET_TO_Mask", LevelSetToMask, "Level Set to Mask", "")
 DefNode(GeometryNode, GEO_NODE_MATERIAL_ASSIGN, 0, "MATERIAL_ASSIGN", MaterialAssign, "Material Assign", "")
 DefNode(GeometryNode, GEO_NODE_MATERIAL_REPLACE, 0, "MATERIAL_REPLACE", MaterialReplace, "Material Replace", "")
 DefNode(GeometryNode, GEO_NODE_MESH_PRIMITIVE_CIRCLE, def_geo_mesh_circle, "MESH_PRIMITIVE_CIRCLE", MeshCircle, "Mesh Circle", "")
@@ -350,6 +351,7 @@ DefNode(GeometryNode, GEO_NODE_TRANSFORM, 0, "TRANSFORM", Transform, "Transform"
 DefNode(GeometryNode, GEO_NODE_TRIANGULATE, def_geo_triangulate, "TRIANGULATE", Triangulate, "Triangulate", "")
 DefNode(GeometryNode, GEO_NODE_VIEWER, 0, "VIEWER", Viewer, "Viewer", "")
 DefNode(GeometryNode, GEO_NODE_VOLUME_TO_MESH, def_geo_volume_to_mesh, "VOLUME_TO_MESH", VolumeToMesh, "Volume to Mesh", "")
+DefNode(GeometryNode, GEO_NODE_VOLUME_SAMPLE, 0, "VOLUME_SAMPLE", VolumeSample, "Sample Volume", "")
 
 /* undefine macros */
 #undef DefNode
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
new file mode 100644
index 00000000000..0a88a021e16
--- /dev/null
+++ b/source/blender/nodes/geometry/nodes/node_geo_level_set_to_mask.cc
@@ -0,0 +1,112 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifdef WITH_OPENVDB
+#  include <openvdb/tools/LevelSetUtil.h>
+#endif
+
+#include "BKE_lib_id.h"
+#include "BKE_volume.h"
+
+#include "UI_interface.h"
+#include "UI_resources.h"
+
+#include "DEG_depsgraph_query.h"
+
+#include "node_geometry_util.hh"
+
+static bNodeSocketTemplate geo_node_level_set_to_mask_in[] = {
+    {SOCK_GEOMETRY, N_("Level Set")},
+    {-1, ""},
+};
+
+static bNodeSocketTemplate geo_node_level_set_to_mask_out[] = {
+    {SOCK_GEOMETRY, N_("Mask Volume")},
+    {-1, ""},
+};
+
+namespace blender::nodes {
+
+#ifdef WITH_OPENVDB
+
+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) {
+    params.error_message_add(NodeWarningType::Error, TIP_("Volume is empty"));
+    return mask_volume;
+  }
+
+  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"));
+  }
+
+  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);
+    }
+  });
+
+  BKE_volume_grid_add_vdb(mask_volume, "mask", std::move(mask_grid));
+
+  return mask_volume;
+}
+
+#endif /* WITH_OPENVDB */
+
+static void geo_node_level_set_to_mask_exec(GeoNodeExecParams params)
+{
+
+#ifdef WITH_OPENVDB
+  GeometrySet geometry_set = params.extract_input<GeometrySet

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list