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 ¶ms) +{ + 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); +} _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs