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:
@@ -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);
|
||||
|
||||
@@ -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. */
|
||||
|
||||
Reference in New Issue
Block a user