Fix #143360: Vertex Weight Proximity sets Normalize Weights checkbox to default state after options switch.

Proper fix, using `RNA_def_property_enum_bitflag_sdna` to mask the
affected bitflags when setting the value, and not overwrite unrelated
other bitflags.

Also similar fix/cleanup in DataTransfer modifier, who was also using
custom setters to handle this masking, instead of defining the
properties with `RNA_def_property_enum_bitflag_sdna`.

And added some documentation to `RNA_def_property_enum_sdna` and
`RNA_def_property_enum_bitflag_sdna`, to try to make it more explicit
what they are doing and what are their expected usecases.
This commit is contained in:
Bastien Montagne
2025-07-31 12:50:03 +02:00
parent 83306cdbf4
commit 474abdd7eb
2 changed files with 38 additions and 45 deletions

View File

@@ -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);

View File

@@ -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. */