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
This commit is contained in:
Hans Goudey
2025-10-02 21:25:11 +02:00
committed by Hans Goudey
parent b14b5a1aa0
commit 10dababb09
4 changed files with 105 additions and 1 deletions

View File

@@ -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)

View File

@@ -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");

View File

@@ -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

View File

@@ -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<bke::GVolumeGrid>("Grid");
if (!grid) {
params.set_default_remaining_outputs();
return;
}
const auto background = params.extract_input<bke::SocketValueVariant>("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