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:
@@ -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)
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user