From 10dababb0935b6cf30fca20fab9cd939cc0be810 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Thu, 2 Oct 2025 21:25:11 +0200 Subject: [PATCH] Geometry Nodes: Set Grid Background node It's useful when creating a grid procedurally to be explicit about what background value it gets. This PR adds a very simple node just to do that. Pull Request: https://projects.blender.org/blender/blender/pulls/147235 --- .../startup/bl_ui/node_add_menu_geometry.py | 3 +- .../blender/makesrna/intern/rna_nodetree.cc | 1 + source/blender/nodes/geometry/CMakeLists.txt | 1 + .../nodes/node_geo_set_grid_background.cc | 101 ++++++++++++++++++ 4 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 source/blender/nodes/geometry/nodes/node_geo_set_grid_background.cc diff --git a/scripts/startup/bl_ui/node_add_menu_geometry.py b/scripts/startup/bl_ui/node_add_menu_geometry.py index 3f21ac6d32e..e3e76c91ae8 100644 --- a/scripts/startup/bl_ui/node_add_menu_geometry.py +++ b/scripts/startup/bl_ui/node_add_menu_geometry.py @@ -911,7 +911,6 @@ class NODE_MT_gn_volume_read_base(node_add_menu.NodeMenu): layout = self.layout self.node_operator(layout, "GeometryNodeGetNamedGrid") self.node_operator(layout, "GeometryNodeGridInfo") - self.node_operator(layout, "GeometryNodeSetGridTransform") self.draw_assets_for_catalog(layout, self.menu_path) @@ -923,6 +922,8 @@ class NODE_MT_gn_volume_write_base(node_add_menu.NodeMenu): def draw(self, context): layout = self.layout self.node_operator(layout, "GeometryNodeStoreNamedGrid") + self.node_operator(layout, "GeometryNodeSetGridBackground") + self.node_operator(layout, "GeometryNodeSetGridTransform") self.draw_assets_for_catalog(layout, self.menu_path) diff --git a/source/blender/makesrna/intern/rna_nodetree.cc b/source/blender/makesrna/intern/rna_nodetree.cc index 2203a40beb4..524a16e613d 100644 --- a/source/blender/makesrna/intern/rna_nodetree.cc +++ b/source/blender/makesrna/intern/rna_nodetree.cc @@ -10284,6 +10284,7 @@ static void rna_def_nodes(BlenderRNA *brna) define("GeometryNode", "GeometryNodeSetGreasePencilColor"); define("GeometryNode", "GeometryNodeSetGreasePencilDepth"); define("GeometryNode", "GeometryNodeSetGreasePencilSoftness"); + define("GeometryNode", "GeometryNodeSetGridBackground"); define("GeometryNode", "GeometryNodeSetGridTransform"); define("GeometryNode", "GeometryNodeSetID"); define("GeometryNode", "GeometryNodeSetInstanceTransform"); diff --git a/source/blender/nodes/geometry/CMakeLists.txt b/source/blender/nodes/geometry/CMakeLists.txt index 931a34aa238..ba92034737c 100644 --- a/source/blender/nodes/geometry/CMakeLists.txt +++ b/source/blender/nodes/geometry/CMakeLists.txt @@ -221,6 +221,7 @@ set(SRC nodes/node_geo_set_grease_pencil_color.cc nodes/node_geo_set_grease_pencil_depth_mode.cc nodes/node_geo_set_grease_pencil_softness.cc + nodes/node_geo_set_grid_background.cc nodes/node_geo_set_grid_transform.cc nodes/node_geo_set_id.cc nodes/node_geo_set_instance_transform.cc diff --git a/source/blender/nodes/geometry/nodes/node_geo_set_grid_background.cc b/source/blender/nodes/geometry/nodes/node_geo_set_grid_background.cc new file mode 100644 index 00000000000..b20fb74ac35 --- /dev/null +++ b/source/blender/nodes/geometry/nodes/node_geo_set_grid_background.cc @@ -0,0 +1,101 @@ +/* SPDX-FileCopyrightText: 2025 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "node_geometry_util.hh" + +#include "BKE_volume_grid_process.hh" + +#include "NOD_rna_define.hh" + +#include "UI_interface_layout.hh" +#include "UI_resources.hh" + +#include "RNA_enum_types.hh" + +namespace blender::nodes::node_geo_set_grid_background { + +static void node_declare(NodeDeclarationBuilder &b) +{ + const bNode *node = b.node_or_null(); + if (!node) { + return; + } + + const eNodeSocketDatatype data_type = eNodeSocketDatatype(node->custom1); + + b.use_custom_socket_order(); + b.allow_any_socket_order(); + b.add_default_layout(); + b.add_input(data_type, "Grid") + .hide_value() + .structure_type(StructureType::Grid) + .is_default_link_socket(); + b.add_output(data_type, "Grid").structure_type(StructureType::Grid).align_with_previous(); + b.add_input(data_type, "Background").structure_type(StructureType::Single); +} + +static void node_layout(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr) +{ + layout->use_property_split_set(true); + layout->use_property_decorate_set(false); + layout->prop(ptr, "data_type", UI_ITEM_NONE, "", ICON_NONE); +} + +static void node_geo_exec(GeoNodeExecParams params) +{ +#ifdef WITH_OPENVDB + bke::GVolumeGrid grid = params.extract_input("Grid"); + if (!grid) { + params.set_default_remaining_outputs(); + return; + } + + const auto background = params.extract_input("Background"); + + bke::VolumeTreeAccessToken tree_token; + openvdb::GridBase &grid_base = grid.get_for_write().grid_for_write(tree_token); + bke::volume_grid::set_grid_background(grid_base, background.get_single_ptr()); + + params.set_output("Grid", std::move(grid)); +#else + node_geo_exec_with_missing_openvdb(params); +#endif +} + +static void node_init(bNodeTree * /*tree*/, bNode *node) +{ + node->custom1 = SOCK_FLOAT; +} + +static void node_rna(StructRNA *srna) +{ + RNA_def_node_enum(srna, + "data_type", + "Data Type", + "Node socket data type", + rna_enum_node_socket_data_type_items, + NOD_inline_enum_accessors(custom1), + SOCK_FLOAT, + grid_socket_type_items_filter_fn); +} + +static void node_register() +{ + static blender::bke::bNodeType ntype; + + geo_node_type_base(&ntype, "GeometryNodeSetGridBackground"); + ntype.ui_name = "Set Grid Background"; + ntype.ui_description = "Set the background value used for inactive voxels and tiles"; + ntype.nclass = NODE_CLASS_GEOMETRY; + ntype.initfunc = node_init; + ntype.geometry_node_execute = node_geo_exec; + ntype.draw_buttons = node_layout; + ntype.declare = node_declare; + blender::bke::node_register_type(ntype); + + node_rna(ntype.rna_ext.srna); +} +NOD_REGISTER_NODE(node_register) + +} // namespace blender::nodes::node_geo_set_grid_background