diff --git a/source/blender/makesrna/intern/rna_linestyle.cc b/source/blender/makesrna/intern/rna_linestyle.cc index 8286e0f7394..2954c025cba 100644 --- a/source/blender/makesrna/intern/rna_linestyle.cc +++ b/source/blender/makesrna/intern/rna_linestyle.cc @@ -276,60 +276,64 @@ static char *rna_LineStyle_geometry_modifier_path(const PointerRNA *ptr) return BLI_sprintfN("geometry_modifiers[\"%s\"]", name_esc); } -static void rna_LineStyleColorModifier_name_set(PointerRNA *ptr, const char *value) -{ - FreestyleLineStyle *linestyle = (FreestyleLineStyle *)ptr->owner_id; - LineStyleModifier *m = (LineStyleModifier *)ptr->data; - - STRNCPY_UTF8(m->name, value); - BLI_uniquename(&linestyle->color_modifiers, - m, - "ColorModifier", - '.', - offsetof(LineStyleModifier, name), - sizeof(m->name)); -} - -static void rna_LineStyleAlphaModifier_name_set(PointerRNA *ptr, const char *value) +static void rna_LineStyleModifier_name_set(PointerRNA *ptr, const char *value) { FreestyleLineStyle *linestyle = (FreestyleLineStyle *)ptr->owner_id; LineStyleModifier *m = (LineStyleModifier *)ptr->data; + struct { + size_t offset; + const char *default_name; + const StructRNA *type; + } modifier_type_info[] = { + { + offsetof(FreestyleLineStyle, color_modifiers), + "ColorModifier", + &RNA_LineStyleColorModifier, + }, + { + offsetof(FreestyleLineStyle, alpha_modifiers), + "AlphaModifier", + &RNA_LineStyleAlphaModifier, + }, + { + offsetof(FreestyleLineStyle, thickness_modifiers), + "ThicknessModifier", + &RNA_LineStyleThicknessModifier, + }, + { + offsetof(FreestyleLineStyle, geometry_modifiers), + "GeometryModifier", + &RNA_LineStyleGeometryModifier, + }, + }; STRNCPY_UTF8(m->name, value); - BLI_uniquename(&linestyle->alpha_modifiers, - m, - "AlphaModifier", - '.', - offsetof(LineStyleModifier, name), - sizeof(m->name)); -} -static void rna_LineStyleThicknessModifier_name_set(PointerRNA *ptr, const char *value) -{ - FreestyleLineStyle *linestyle = (FreestyleLineStyle *)ptr->owner_id; - LineStyleModifier *m = (LineStyleModifier *)ptr->data; + int type_index = -1; + for (int i = 0; i < ARRAY_SIZE(modifier_type_info); i++) { + if (RNA_struct_is_a(ptr->type, modifier_type_info[i].type)) { + type_index = i; + break; + } + } - STRNCPY_UTF8(m->name, value); - BLI_uniquename(&linestyle->thickness_modifiers, - m, - "ThicknessModifier", - '.', - offsetof(LineStyleModifier, name), - sizeof(m->name)); -} + if (UNLIKELY(type_index == -1)) { + for (int i = 0; i < ARRAY_SIZE(modifier_type_info); i++) { + ListBase *lb = (ListBase *)((char *)linestyle) + modifier_type_info[i].offset; + if (BLI_findindex(lb, ptr->data) != -1) { + type_index = i; + break; + } + } + } -static void rna_LineStyleGeometryModifier_name_set(PointerRNA *ptr, const char *value) -{ - FreestyleLineStyle *linestyle = (FreestyleLineStyle *)ptr->owner_id; - LineStyleModifier *m = (LineStyleModifier *)ptr->data; + if (type_index == -1) { + return; + } - STRNCPY_UTF8(m->name, value); - BLI_uniquename(&linestyle->geometry_modifiers, - m, - "GeometryModifier", - '.', - offsetof(LineStyleModifier, name), - sizeof(m->name)); + ListBase *lb = (ListBase *)(((char *)linestyle) + modifier_type_info[type_index].offset); + const char *default_name = modifier_type_info[type_index].default_name; + BLI_uniquename(lb, m, default_name, '.', offsetof(LineStyleModifier, name), sizeof(m->name)); } static void rna_LineStyle_mtex_begin(CollectionPropertyIterator *iter, PointerRNA *ptr) @@ -634,7 +638,6 @@ static void rna_def_linestyle_mtex(BlenderRNA *brna) static void rna_def_modifier_type_common(StructRNA *srna, const EnumPropertyItem *modifier_type_items, - const char *set_name_func, const bool blend, const bool color) { @@ -659,13 +662,6 @@ static void rna_def_modifier_type_common(StructRNA *srna, RNA_def_property_clear_flag(prop, PROP_EDITABLE); RNA_def_property_ui_text(prop, "Modifier Type", "Type of the modifier"); - prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); - RNA_def_property_string_sdna(prop, nullptr, "modifier.name"); - RNA_def_property_string_funcs(prop, nullptr, nullptr, set_name_func); - RNA_def_property_ui_text(prop, "Modifier Name", "Name of the modifier"); - RNA_def_property_update(prop, NC_LINESTYLE, nullptr); - RNA_def_struct_name_property(srna, prop); - if (blend) { prop = RNA_def_property(srna, "blend", PROP_ENUM, PROP_NONE); RNA_def_property_enum_sdna(prop, nullptr, "modifier.blend"); @@ -694,38 +690,24 @@ static void rna_def_modifier_type_common(StructRNA *srna, static void rna_def_color_modifier(StructRNA *srna) { - rna_def_modifier_type_common(srna, - rna_enum_linestyle_color_modifier_type_items, - "rna_LineStyleColorModifier_name_set", - true, - true); + rna_def_modifier_type_common(srna, rna_enum_linestyle_color_modifier_type_items, true, true); } static void rna_def_alpha_modifier(StructRNA *srna) { - rna_def_modifier_type_common(srna, - rna_enum_linestyle_alpha_modifier_type_items, - "rna_LineStyleAlphaModifier_name_set", - true, - false); + rna_def_modifier_type_common(srna, rna_enum_linestyle_alpha_modifier_type_items, true, false); } static void rna_def_thickness_modifier(StructRNA *srna) { - rna_def_modifier_type_common(srna, - rna_enum_linestyle_thickness_modifier_type_items, - "rna_LineStyleThicknessModifier_name_set", - true, - false); + rna_def_modifier_type_common( + srna, rna_enum_linestyle_thickness_modifier_type_items, true, false); } static void rna_def_geometry_modifier(StructRNA *srna) { - rna_def_modifier_type_common(srna, - rna_enum_linestyle_geometry_modifier_type_items, - "rna_LineStyleGeometryModifier_name_set", - false, - false); + rna_def_modifier_type_common( + srna, rna_enum_linestyle_geometry_modifier_type_items, false, false); } static void rna_def_modifier_color_ramp_common(StructRNA *srna, int range) @@ -873,6 +855,13 @@ static void rna_def_linestyle_modifiers(BlenderRNA *brna) srna = RNA_def_struct(brna, "LineStyleModifier", nullptr); RNA_def_struct_ui_text(srna, "Line Style Modifier", "Base type to define modifiers"); + prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, nullptr, "name"); + RNA_def_property_string_funcs(prop, nullptr, nullptr, "rna_LineStyleModifier_name_set"); + RNA_def_property_ui_text(prop, "Modifier Name", "Name of the modifier"); + RNA_def_property_update(prop, NC_LINESTYLE, nullptr); + RNA_def_struct_name_property(srna, prop); + /* line color modifiers */ srna = RNA_def_struct(brna, "LineStyleColorModifier", "LineStyleModifier");