Fix #119617: crash because node sockets depend on experimental feature flag #119620

Merged
Jacques Lucke merged 3 commits from JacquesLucke/blender:crash-with-grease-pencil-3-option into main 2024-03-18 13:57:27 +01:00
2 changed files with 28 additions and 4 deletions
Showing only changes of commit bfcb7c874c - Show all commits

View File

@ -31,6 +31,7 @@
#include "BKE_addon.h"
#include "BKE_appdir.hh"
#include "BKE_callbacks.h"
#include "BKE_node_tree_update.hh"
#include "BKE_sound.h"
#include "BKE_studiolight.h"
@ -49,6 +50,8 @@
#include "BLT_lang.h"
#include "ED_node.hh"
const EnumPropertyItem rna_enum_preference_section_items[] = {
{USER_SECTION_INTERFACE, "INTERFACE", 0, "Interface", ""},
{USER_SECTION_THEME, "THEMES", 0, "Themes", ""},
@ -638,6 +641,18 @@ static void rna_userdef_keyconfig_reload_update(bContext *C,
USERDEF_TAG_DIRTY;
}
static void rna_userdef_use_grease_pencil_version3_update(bContext *C, PointerRNA *ptr)
{
Main *bmain = CTX_data_main(C);
rna_userdef_keyconfig_reload_update(C, bmain, nullptr, ptr);
/* Update nodes because some sockets may only exist depending on whether grease pencil 3 is
* enabled. */
LISTBASE_FOREACH (bNodeTree *, ntree, &bmain->nodetrees) {
BKE_ntree_update_tag_all(ntree);
}
ED_node_tree_propagate_change(C, bmain, nullptr);
}
static void rna_userdef_timecode_style_set(PointerRNA *ptr, int value)
{
UserDef *userdef = (UserDef *)ptr->data;
@ -7170,7 +7185,7 @@ static void rna_def_userdef_experimental(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Grease Pencil 3.0", "Enable the new grease pencil 3.0 codebase");
/* The key-map depends on this setting, it needs to be reloaded. */
RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
RNA_def_property_update(prop, 0, "rna_userdef_keyconfig_reload_update");
RNA_def_property_update(prop, 0, "rna_userdef_use_grease_pencil_version3_update");
prop = RNA_def_property(srna, "use_viewport_debug", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, nullptr, "use_viewport_debug", 1);

View File

@ -11,9 +11,7 @@ static void node_declare(NodeDeclarationBuilder &b)
b.add_input<decl::Geometry>("Geometry");
b.add_output<decl::Geometry>("Mesh").propagate_all();
b.add_output<decl::Geometry>("Curve").propagate_all();
if (U.experimental.use_grease_pencil_version3) {
b.add_output<decl::Geometry>("Grease Pencil").propagate_all();
}
b.add_output<decl::Geometry>("Grease Pencil").propagate_all();
b.add_output<decl::Geometry>("Point Cloud").propagate_all();
b.add_output<decl::Geometry>("Volume")
.translation_context(BLT_I18NCONTEXT_ID_ID)
@ -21,6 +19,16 @@ static void node_declare(NodeDeclarationBuilder &b)
b.add_output<decl::Geometry>("Instances").propagate_all();
}
static void node_update(bNodeTree *ntree, bNode *node)
{
LISTBASE_FOREACH (bNodeSocket *, socket, &node->outputs) {
if (STREQ(socket->identifier, "Grease Pencil")) {
bke::nodeSetSocketAvailability(ntree, socket, U.experimental.use_grease_pencil_version3);
break;
}
}
}
static void node_geo_exec(GeoNodeExecParams params)
{
GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry");
@ -69,6 +77,7 @@ static void node_register()
&ntype, GEO_NODE_SEPARATE_COMPONENTS, "Separate Components", NODE_CLASS_GEOMETRY);
ntype.declare = node_declare;
ntype.geometry_node_execute = node_geo_exec;
ntype.updatefunc = node_update;
nodeRegisterType(&ntype);
}
NOD_REGISTER_NODE(node_register)