[Bf-blender-cvs] [2399f664684] geometry-nodes-level-set-nodes: Add level set to fog volume node

Hans Goudey noreply at git.blender.org
Fri Aug 13 22:09:28 CEST 2021


Commit: 2399f66468421262fac6841fd651a8cd9d6e86e4
Author: Hans Goudey
Date:   Wed Aug 11 09:19:40 2021 -0500
Branches: geometry-nodes-level-set-nodes
https://developer.blender.org/rB2399f66468421262fac6841fd651a8cd9d6e86e4

Add level set to fog volume node

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

M	release/scripts/startup/nodeitems_builtins.py
M	source/blender/blenkernel/BKE_node.h
M	source/blender/blenkernel/intern/node.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_fog_volume.cc

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

diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py
index ef3324bdc03..c71a0976e24 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -599,6 +599,7 @@ geometry_node_categories = [
         NodeItem("GeometryNodeMeshToLevelSet"),
         NodeItem("GeometryNodeLevelSetBoolean"),
         NodeItem("GeometryNodeLevelSetFilter"),
+        NodeItem("GeometryNodeLevelSetToFogVolume"),
     ]),
     GeometryNodeCategory("GEO_GROUP", "Group", items=node_group_items),
     GeometryNodeCategory("GEO_LAYOUT", "Layout", items=[
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index e8d4f9e808d..6be4da99eea 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -1480,6 +1480,7 @@ int ntreeTexExecTree(struct bNodeTree *ntree,
 #define GEO_NODE_MESH_TO_LEVEL_SET 1075
 #define GEO_NODE_LEVEL_SET_BOOLEAN 1076
 #define GEO_NODE_LEVEL_SET_FILTER 1077
+#define GEO_NODE_LEVEL_SET_TO_FOG_VOLUME 1078
 
 /** \} */
 
diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index 82f2984cfa4..1a3cf6310bd 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -5161,6 +5161,7 @@ static void registerGeometryNodes()
   register_node_type_geo_join_geometry();
   register_node_type_geo_level_set_boolean();
   register_node_type_geo_level_set_filter();
+  register_node_type_geo_level_set_to_fog_volume();
   register_node_type_geo_material_assign();
   register_node_type_geo_material_replace();
   register_node_type_geo_mesh_primitive_circle();
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index 454f783512f..04bd9f9db22 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -189,6 +189,7 @@ set(SRC
   geometry/nodes/node_geo_join_geometry.cc
   geometry/nodes/node_geo_level_set_boolean.cc
   geometry/nodes/node_geo_level_set_filter.cc
+  geometry/nodes/node_geo_level_set_to_fog_volume.cc
   geometry/nodes/node_geo_material_assign.cc
   geometry/nodes/node_geo_material_replace.cc
   geometry/nodes/node_geo_mesh_primitive_circle.cc
diff --git a/source/blender/nodes/NOD_geometry.h b/source/blender/nodes/NOD_geometry.h
index 750cdbaf47f..a0d44b39934 100644
--- a/source/blender/nodes/NOD_geometry.h
+++ b/source/blender/nodes/NOD_geometry.h
@@ -75,6 +75,7 @@ void register_node_type_geo_is_viewport(void);
 void register_node_type_geo_join_geometry(void);
 void register_node_type_geo_level_set_boolean(void);
 void register_node_type_geo_level_set_filter(void);
+void register_node_type_geo_level_set_to_fog_volume(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);
diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h
index 1034b89b137..e4893254caf 100644
--- a/source/blender/nodes/NOD_static_types.h
+++ b/source/blender/nodes/NOD_static_types.h
@@ -346,6 +346,7 @@ DefNode(GeometryNode, GEO_NODE_VOLUME_TO_MESH, def_geo_volume_to_mesh, "VOLUME_T
 DefNode(GeometryNode, GEO_NODE_MESH_TO_LEVEL_SET , 0, "MESH_TO_LEVEL_SET", MeshToLevelSet, "Mesh to Level Set", "")
 DefNode(GeometryNode, GEO_NODE_LEVEL_SET_BOOLEAN , def_geo_level_set_boolean, "LEVEL_SET_BOOLEAN", LevelSetBoolean, "Level Set Boolean", "")
 DefNode(GeometryNode, GEO_NODE_LEVEL_SET_FILTER , def_geo_level_set_filter, "LEVEL_SET_FILTER", LevelSetFilter, "Level Set Filter", "")
+DefNode(GeometryNode, GEO_NODE_LEVEL_SET_TO_FOG_VOLUME , 0, "LEVEL_SET_TO_FOG", LevelSetToFogVolume, "Level Set to Fog Volume", "")
 
 /* undefine macros */
 #undef DefNode
diff --git a/source/blender/nodes/geometry/nodes/node_geo_level_set_to_fog_volume.cc b/source/blender/nodes/geometry/nodes/node_geo_level_set_to_fog_volume.cc
new file mode 100644
index 00000000000..a9aee445cd9
--- /dev/null
+++ b/source/blender/nodes/geometry/nodes/node_geo_level_set_to_fog_volume.cc
@@ -0,0 +1,111 @@
+/*
+ * 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_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_fog_volume_in[] = {
+    {SOCK_GEOMETRY, N_("Level Set")},
+    {SOCK_FLOAT, N_("Density"), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, FLT_MAX},
+    {-1, ""},
+};
+
+static bNodeSocketTemplate geo_node_level_set_to_fog_volume_out[] = {
+    {SOCK_GEOMETRY, N_("Fog Volume")},
+    {-1, ""},
+};
+
+namespace blender::nodes {
+
+#ifdef WITH_OPENVDB
+
+static void level_set_to_fog_volume(Volume &volume, const GeoNodeExecParams &params)
+{
+  VolumeGrid *volume_grid = BKE_volume_grid_get_for_write(&volume, 0);
+  if (volume_grid == nullptr) {
+    params.error_message_add(NodeWarningType::Error, TIP_("Volume is empty"));
+    return;
+  }
+
+  openvdb::GridBase::Ptr grid_base = BKE_volume_grid_openvdb_for_write(&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"));
+  }
+
+  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>) {
+      GridType &grid = static_cast<GridType &>(*grid_base);
+      openvdb::tools::sdfToFogVolume(grid);
+
+      const float density = params.get_input<float>("Density");
+      if (density != 1.0f) {
+        openvdb::tools::foreach (grid->beginValueOn(),
+                                 [&](const openvdb::FloatGrid::ValueOnIter &iter) {
+                                   iter.modifyValue([&](float &value) { value *= density; });
+                                 });
+      }
+    }
+  });
+}
+
+#endif /* WITH_OPENVDB */
+
+static void geo_node_level_set_to_fog_volume_exec(GeoNodeExecParams params)
+{
+  GeometrySet geometry_set = params.extract_input<GeometrySet>("Level Set");
+
+#ifdef WITH_OPENVDB
+  Volume *volume = geometry_set.get_volume_for_write();
+
+  const Main *bmain = DEG_get_bmain(params.depsgraph());
+  BKE_volume_load(volume, bmain);
+
+  if (volume == nullptr) {
+    params.set_output("Level Set", std::move(geometry_set));
+    return;
+  }
+
+  level_set_to_fog_volume(*volume, params);
+#endif
+
+  params.set_output("Fog Volume", std::move(geometry_set));
+}
+
+}  // namespace blender::nodes
+
+void register_node_type_geo_level_set_to_fog_volume()
+{
+  static bNodeType ntype;
+
+  geo_node_type_base(
+      &ntype, GEO_NODE_LEVEL_SET_TO_FOG_VOLUME, "Level Set to Fog Volume", NODE_CLASS_GEOMETRY, 0);
+  node_type_socket_templates(
+      &ntype, geo_node_level_set_to_fog_volume_in, geo_node_level_set_to_fog_volume_out);
+  ntype.geometry_node_execute = blender::nodes::geo_node_level_set_to_fog_volume_exec;
+
+  nodeRegisterType(&ntype);
+}



More information about the Bf-blender-cvs mailing list