Geometry Nodes: move bundle and closure nodes out of experimental

This moves the bundles and closures features out of experimental,
making them an official part of Blender 5.0.

Also see #134029.

Pull Request: https://projects.blender.org/blender/blender/pulls/143750
This commit is contained in:
Jacques Lucke
2025-08-08 13:48:02 +02:00
parent 8873dff159
commit 24c4e0a3f7
12 changed files with 4 additions and 52 deletions

View File

@@ -658,9 +658,8 @@ class NODE_MT_category_GEO_UTILITIES(Menu):
layout.menu("NODE_MT_category_GEO_TEXT") layout.menu("NODE_MT_category_GEO_TEXT")
layout.menu("NODE_MT_category_GEO_VECTOR") layout.menu("NODE_MT_category_GEO_VECTOR")
layout.separator() layout.separator()
if context.preferences.experimental.use_bundle_and_closure_nodes: layout.menu("NODE_MT_category_utilities_bundle")
layout.menu("NODE_MT_category_utilities_bundle") layout.menu("NODE_MT_category_utilities_closure")
layout.menu("NODE_MT_category_utilities_closure")
layout.menu("NODE_MT_category_GEO_UTILITIES_FIELD") layout.menu("NODE_MT_category_GEO_UTILITIES_FIELD")
if context.preferences.experimental.use_geometry_nodes_lists: if context.preferences.experimental.use_geometry_nodes_lists:
layout.menu("NODE_MT_category_utilities_list") layout.menu("NODE_MT_category_utilities_list")

View File

@@ -2868,7 +2868,6 @@ class USERPREF_PT_experimental_new_features(ExperimentalPanel, Panel):
("blender/blender/projects/10", "Pipeline, Assets & IO Project Page")), ("blender/blender/projects/10", "Pipeline, Assets & IO Project Page")),
({"property": "use_new_volume_nodes"}, ("blender/blender/issues/103248", "#103248")), ({"property": "use_new_volume_nodes"}, ("blender/blender/issues/103248", "#103248")),
({"property": "use_shader_node_previews"}, ("blender/blender/issues/110353", "#110353")), ({"property": "use_shader_node_previews"}, ("blender/blender/issues/110353", "#110353")),
({"property": "use_bundle_and_closure_nodes"}, ("blender/blender/issues/134029", "#134029")),
({"property": "use_geometry_nodes_lists"}, ("blender/blender/issues/140918", "#140918")), ({"property": "use_geometry_nodes_lists"}, ("blender/blender/issues/140918", "#140918")),
), ),
) )

View File

@@ -225,9 +225,8 @@ typedef struct UserDef_Experimental {
char use_sculpt_texture_paint; char use_sculpt_texture_paint;
char use_new_volume_nodes; char use_new_volume_nodes;
char use_shader_node_previews; char use_shader_node_previews;
char use_bundle_and_closure_nodes;
char use_geometry_nodes_lists; char use_geometry_nodes_lists;
char _pad[5]; char _pad[6];
} UserDef_Experimental; } UserDef_Experimental;
#define USER_EXPERIMENTAL_TEST(userdef, member) \ #define USER_EXPERIMENTAL_TEST(userdef, member) \

View File

@@ -431,12 +431,6 @@ static bool is_socket_type_supported(blender::bke::bNodeTreeType *ntreetype,
} }
} }
if (!U.experimental.use_bundle_and_closure_nodes) {
if (ELEM(socket_type->type, SOCK_BUNDLE, SOCK_CLOSURE)) {
return false;
}
}
return true; return true;
} }

View File

@@ -7606,10 +7606,6 @@ static void rna_def_userdef_experimental(BlenderRNA *brna)
prop, "Shader Node Previews", "Enables previews in the shader node editor"); prop, "Shader Node Previews", "Enables previews in the shader node editor");
RNA_def_property_update(prop, 0, "rna_userdef_ui_update"); RNA_def_property_update(prop, 0, "rna_userdef_ui_update");
prop = RNA_def_property(srna, "use_bundle_and_closure_nodes", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_ui_text(
prop, "Bundle and Closure Nodes", "Enables bundle and closure nodes in Geometry Nodes");
prop = RNA_def_property(srna, "use_geometry_nodes_lists", PROP_BOOLEAN, PROP_NONE); prop = RNA_def_property(srna, "use_geometry_nodes_lists", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_ui_text(prop, "Geometry Nodes Lists", "Enable new list types and nodes"); RNA_def_property_ui_text(prop, "Geometry Nodes Lists", "Enable new list types and nodes");

View File

@@ -105,11 +105,6 @@ static void node_operators()
static void node_geo_exec(GeoNodeExecParams params) static void node_geo_exec(GeoNodeExecParams params)
{ {
if (!U.experimental.use_bundle_and_closure_nodes) {
params.set_default_remaining_outputs();
return;
}
const bNode &node = params.node(); const bNode &node = params.node();
const NodeCombineBundle &storage = node_storage(node); const NodeCombineBundle &storage = node_storage(node);

View File

@@ -334,11 +334,6 @@ static void node_rna(StructRNA *srna)
*r_free = true; *r_free = true;
return enum_items_filter(rna_enum_node_socket_data_type_items, return enum_items_filter(rna_enum_node_socket_data_type_items,
[](const EnumPropertyItem &item) -> bool { [](const EnumPropertyItem &item) -> bool {
if (!U.experimental.use_bundle_and_closure_nodes) {
if (ELEM(item.value, SOCK_BUNDLE, SOCK_CLOSURE)) {
return false;
}
}
return ELEM(item.value, return ELEM(item.value,
SOCK_FLOAT, SOCK_FLOAT,
SOCK_INT, SOCK_INT,

View File

@@ -109,11 +109,6 @@ static void node_operators()
static void node_geo_exec(GeoNodeExecParams params) static void node_geo_exec(GeoNodeExecParams params)
{ {
if (!U.experimental.use_bundle_and_closure_nodes) {
params.set_default_remaining_outputs();
return;
}
nodes::BundlePtr bundle = params.extract_input<nodes::BundlePtr>("Bundle"); nodes::BundlePtr bundle = params.extract_input<nodes::BundlePtr>("Bundle");
if (!bundle) { if (!bundle) {
params.set_default_remaining_outputs(); params.set_default_remaining_outputs();

View File

@@ -592,9 +592,7 @@ class LazyFunctionForSimulationOutputNode final : public LazyFunction {
if (geo_eval_log::GeoTreeLogger *tree_logger = local_user_data.try_get_tree_logger( if (geo_eval_log::GeoTreeLogger *tree_logger = local_user_data.try_get_tree_logger(
user_data)) user_data))
{ {
const StringRefNull message = U.experimental.use_bundle_and_closure_nodes ? const StringRefNull message = TIP_("Simulation must not be in a loop or closure");
TIP_("Simulation must not be in a loop or closure") :
TIP_("Simulation must not be in a loop");
tree_logger->node_warnings.append(*tree_logger->allocator, tree_logger->node_warnings.append(*tree_logger->allocator,
{node_.identifier, {NodeWarningType::Error, message}}); {node_.identifier, {NodeWarningType::Error, message}});
} }

View File

@@ -242,11 +242,6 @@ static void node_rna(StructRNA *srna)
*r_free = true; *r_free = true;
return enum_items_filter(rna_enum_node_socket_data_type_items, return enum_items_filter(rna_enum_node_socket_data_type_items,
[](const EnumPropertyItem &item) -> bool { [](const EnumPropertyItem &item) -> bool {
if (!U.experimental.use_bundle_and_closure_nodes) {
if (ELEM(item.value, SOCK_BUNDLE, SOCK_CLOSURE)) {
return false;
}
}
return ELEM(item.value, return ELEM(item.value,
SOCK_FLOAT, SOCK_FLOAT,
SOCK_INT, SOCK_INT,

View File

@@ -141,11 +141,6 @@ class LazyFunctionForClosureZone : public LazyFunction {
for (const int i : zone_.border_links.index_range()) { for (const int i : zone_.border_links.index_range()) {
params.set_output(zone_info_.indices.outputs.border_link_usages[i], true); params.set_output(zone_info_.indices.outputs.border_link_usages[i], true);
} }
if (!U.experimental.use_bundle_and_closure_nodes) {
params.set_output(zone_info_.indices.outputs.main[0],
bke::SocketValueVariant::From(ClosurePtr()));
return;
}
const auto &storage = *static_cast<const NodeClosureOutput *>(output_bnode_.storage); const auto &storage = *static_cast<const NodeClosureOutput *>(output_bnode_.storage);

View File

@@ -5,18 +5,10 @@
import os import os
import sys import sys
import bpy
sys.path.append(os.path.dirname(os.path.realpath(__file__))) sys.path.append(os.path.dirname(os.path.realpath(__file__)))
from modules.mesh_test import BlendFileTest from modules.mesh_test import BlendFileTest
if "closure" in bpy.data.filepath:
if bpy.app.version_cycle == "alpha":
bpy.context.preferences.experimental.use_bundle_and_closure_nodes = True
else:
print("Skipped because bundles and closures are still experimental.")
sys.exit(0)
geo_node_test = BlendFileTest("test_object", "expected_object", threshold=1e-4) geo_node_test = BlendFileTest("test_object", "expected_object", threshold=1e-4)
result = geo_node_test.run_test() result = geo_node_test.run_test()