[Bf-blender-cvs] [4be87e97f48] blender-v3.1-release: Fix T94435: remove anonymous attributes when applying modifier
Jacques Lucke
noreply at git.blender.org
Thu Feb 3 16:58:55 CET 2022
Commit: 4be87e97f48533e16594b6ec73980ffb2ba12ade
Author: Jacques Lucke
Date: Thu Feb 3 16:52:16 2022 +0100
Branches: blender-v3.1-release
https://developer.blender.org/rB4be87e97f48533e16594b6ec73980ffb2ba12ade
Fix T94435: remove anonymous attributes when applying modifier
Differential Revision: https://developer.blender.org/D13994
===================================================================
M source/blender/blenkernel/BKE_customdata.h
M source/blender/blenkernel/intern/customdata.cc
M source/blender/editors/object/object_modifier.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h
index 76389b0c66f..38b43e36feb 100644
--- a/source/blender/blenkernel/BKE_customdata.h
+++ b/source/blender/blenkernel/BKE_customdata.h
@@ -253,6 +253,11 @@ bool CustomData_free_layer_active(struct CustomData *data, int type, int totelem
*/
void CustomData_free_layers(struct CustomData *data, int type, int totelem);
+/**
+ * Free all anonymous attributes.
+ */
+void CustomData_free_layers_anonymous(struct CustomData *data, int totelem);
+
/**
* Returns true if a layer with the specified type exists.
*/
diff --git a/source/blender/blenkernel/intern/customdata.cc b/source/blender/blenkernel/intern/customdata.cc
index 02b50027ef9..e4c18325d76 100644
--- a/source/blender/blenkernel/intern/customdata.cc
+++ b/source/blender/blenkernel/intern/customdata.cc
@@ -2780,6 +2780,24 @@ void CustomData_free_layers(CustomData *data, int type, int totelem)
}
}
+void CustomData_free_layers_anonymous(struct CustomData *data, int totelem)
+{
+ while (true) {
+ bool found_anonymous_layer = false;
+ for (int i = 0; i < data->totlayer; i++) {
+ const CustomDataLayer *layer = &data->layers[i];
+ if (layer->anonymous_id != NULL) {
+ CustomData_free_layer(data, layer->type, totelem, i);
+ found_anonymous_layer = true;
+ break;
+ }
+ }
+ if (!found_anonymous_layer) {
+ break;
+ }
+ }
+}
+
bool CustomData_has_layer(const CustomData *data, int type)
{
return (CustomData_get_layer_index(data, type) != -1);
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index 71ad54383a6..4ac2a9dca62 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -763,6 +763,12 @@ static bool modifier_apply_obdata(
BKE_object_material_from_eval_data(bmain, ob, &mesh_applied->id);
BKE_mesh_nomain_to_mesh(mesh_applied, me, ob, &CD_MASK_MESH, true);
+ /* Anonymous attributes shouldn't by available on the applied geometry. */
+ CustomData_free_layers_anonymous(&me->vdata, me->totvert);
+ CustomData_free_layers_anonymous(&me->edata, me->totedge);
+ CustomData_free_layers_anonymous(&me->pdata, me->totpoly);
+ CustomData_free_layers_anonymous(&me->ldata, me->totloop);
+
if (md_eval->type == eModifierType_Multires) {
multires_customdata_delete(me);
}
More information about the Bf-blender-cvs
mailing list