diff --git a/source/blender/makesrna/RNA_define.hh b/source/blender/makesrna/RNA_define.hh index d90ec28dca9..dd646437eac 100644 --- a/source/blender/makesrna/RNA_define.hh +++ b/source/blender/makesrna/RNA_define.hh @@ -397,7 +397,40 @@ void RNA_def_property_boolean_bitset_array_sdna( void RNA_def_property_int_sdna(PropertyRNA *prop, const char *structname, const char *propname); void RNA_def_property_float_sdna(PropertyRNA *prop, const char *structname, const char *propname); void RNA_def_property_string_sdna(PropertyRNA *prop, const char *structname, const char *propname); +/** + * Define a regular, non-bitflags-aware enum property. + * + * The key aspect of using this call is that when setting the property, the whole underlying DNA + * property will be overwritten. + * + * This should typically be used for: + * - Non-bitflags enums. + * - Bitflags enums using a callback function to define their items. + * + * \note This behavior is the only one available for runtime-defined enum properties. C++-defined + * runtime properties can work around this limitation by defining their own setter to handle the + * bitmasking. + * + * \note This is not related to the #PROP_ENUM_FLAG property option. + */ void RNA_def_property_enum_sdna(PropertyRNA *prop, const char *structname, const char *propname); +/** + * Define a bitflags-aware enum property. + * + * The key aspect of using this call is that when setting the property, a bitmask is used to avoid + * overwriting unrelated bits in the underlying DNA property. + * + * The bitmask is computed from the values defined in the static 'items' array defined by + * `RNA_def_property_enum_items`, so it won't be valid in case an `items` callback function is + * defined, that may use bitflags outside of that statically computed bitmask. + * + * This should typically be used for bitflags enums. It is especially critical when several + * bitflags enums and/or bitflag booleans (defined with `RNA_def_property_boolean_sdna` or + * `RNA_def_property_boolean_negative_sdna`) share the same DNA variable. Otherwise, setting one + * RNA property may affect unrelated bitflags. + * + * \note This is not related to the #PROP_ENUM_FLAG property option. + */ void RNA_def_property_enum_bitflag_sdna(PropertyRNA *prop, const char *structname, const char *propname); diff --git a/source/blender/makesrna/intern/rna_modifier.cc b/source/blender/makesrna/intern/rna_modifier.cc index ce2f5443b25..40f2a495de9 100644 --- a/source/blender/makesrna/intern/rna_modifier.cc +++ b/source/blender/makesrna/intern/rna_modifier.cc @@ -1513,38 +1513,6 @@ static void rna_DataTransferModifier_data_types_update(Main *bmain, Scene *scene rna_Modifier_dependency_update(bmain, scene, ptr); } -static void rna_DataTransferModifier_verts_data_types_set(PointerRNA *ptr, int value) -{ - DataTransferModifierData *dtmd = (DataTransferModifierData *)ptr->data; - - dtmd->data_types &= ~DT_TYPE_VERT_ALL; - dtmd->data_types |= value; -} - -static void rna_DataTransferModifier_edges_data_types_set(PointerRNA *ptr, int value) -{ - DataTransferModifierData *dtmd = (DataTransferModifierData *)ptr->data; - - dtmd->data_types &= ~DT_TYPE_EDGE_ALL; - dtmd->data_types |= value; -} - -static void rna_DataTransferModifier_loops_data_types_set(PointerRNA *ptr, int value) -{ - DataTransferModifierData *dtmd = (DataTransferModifierData *)ptr->data; - - dtmd->data_types &= ~DT_TYPE_LOOP_ALL; - dtmd->data_types |= value; -} - -static void rna_DataTransferModifier_polys_data_types_set(PointerRNA *ptr, int value) -{ - DataTransferModifierData *dtmd = (DataTransferModifierData *)ptr->data; - - dtmd->data_types &= ~DT_TYPE_POLY_ALL; - dtmd->data_types |= value; -} - static const EnumPropertyItem *rna_DataTransferModifier_layers_select_src_itemf(bContext *C, PointerRNA *ptr, PropertyRNA *prop, @@ -6211,7 +6179,7 @@ static void rna_def_modifier_weightvgproximity(BlenderRNA *brna) RNA_def_property_update(prop, 0, "rna_Modifier_update"); prop = RNA_def_property(srna, "proximity_geometry", PROP_ENUM, PROP_NONE); - RNA_def_property_enum_sdna(prop, nullptr, "proximity_flags"); + RNA_def_property_enum_bitflag_sdna(prop, nullptr, "proximity_flags"); RNA_def_property_enum_items(prop, proximity_geometry_items); RNA_def_property_flag(prop, PROP_ENUM_FLAG); /* important to run before default set */ RNA_def_property_enum_default(prop, MOD_WVG_PROXIMITY_GEOM_FACES); @@ -7286,9 +7254,7 @@ static void rna_def_modifier_datatransfer(BlenderRNA *brna) "Vertex Data Types", "Which vertex data layers to transfer"); RNA_def_property_flag(prop, PROP_ENUM_FLAG); - RNA_def_property_enum_sdna(prop, nullptr, "data_types"); - RNA_def_property_enum_funcs( - prop, nullptr, "rna_DataTransferModifier_verts_data_types_set", nullptr); + RNA_def_property_enum_bitflag_sdna(prop, nullptr, "data_types"); RNA_def_property_update(prop, 0, "rna_DataTransferModifier_data_types_update"); prop = RNA_def_enum(srna, @@ -7298,9 +7264,7 @@ static void rna_def_modifier_datatransfer(BlenderRNA *brna) "Edge Data Types", "Which edge data layers to transfer"); RNA_def_property_flag(prop, PROP_ENUM_FLAG); - RNA_def_property_enum_sdna(prop, nullptr, "data_types"); - RNA_def_property_enum_funcs( - prop, nullptr, "rna_DataTransferModifier_edges_data_types_set", nullptr); + RNA_def_property_enum_bitflag_sdna(prop, nullptr, "data_types"); RNA_def_property_update(prop, 0, "rna_DataTransferModifier_data_types_update"); prop = RNA_def_enum(srna, @@ -7310,9 +7274,7 @@ static void rna_def_modifier_datatransfer(BlenderRNA *brna) "Face Corner Data Types", "Which face corner data layers to transfer"); RNA_def_property_flag(prop, PROP_ENUM_FLAG); - RNA_def_property_enum_sdna(prop, nullptr, "data_types"); - RNA_def_property_enum_funcs( - prop, nullptr, "rna_DataTransferModifier_loops_data_types_set", nullptr); + RNA_def_property_enum_bitflag_sdna(prop, nullptr, "data_types"); RNA_def_property_update(prop, 0, "rna_DataTransferModifier_data_types_update"); prop = RNA_def_enum(srna, @@ -7322,9 +7284,7 @@ static void rna_def_modifier_datatransfer(BlenderRNA *brna) "Poly Data Types", "Which face data layers to transfer"); RNA_def_property_flag(prop, PROP_ENUM_FLAG); - RNA_def_property_enum_sdna(prop, nullptr, "data_types"); - RNA_def_property_enum_funcs( - prop, nullptr, "rna_DataTransferModifier_polys_data_types_set", nullptr); + RNA_def_property_enum_bitflag_sdna(prop, nullptr, "data_types"); RNA_def_property_update(prop, 0, "rna_DataTransferModifier_data_types_update"); /* Mapping methods. */