From ceea1a4d99b74d9a8c35a18b42fc9940d9e6e83f Mon Sep 17 00:00:00 2001 From: Pratik Borhade Date: Wed, 16 Oct 2024 10:27:09 +0200 Subject: [PATCH] Fix #129024: GPv3: Renaming a vertex group removes group assignment GPv3 stores the vertex group inside `CurvesGeometry`. When the object level vertex group name is changed, we have to loop over the vertex group list of each drawing. If a matching name is found, copy the new name to the vertex group in `CurvesGeometry`. A separate function is created to handle this: `BKE_grease_pencil_vgroup_name_update`. Pull Request: https://projects.blender.org/blender/blender/pulls/129038 --- source/blender/blenkernel/BKE_deform.hh | 1 + source/blender/blenkernel/BKE_grease_pencil.hh | 2 ++ source/blender/blenkernel/intern/deform.cc | 13 +++++++++++++ source/blender/blenkernel/intern/grease_pencil.cc | 15 +++++++++++++++ source/blender/makesrna/intern/rna_object.cc | 3 +-- 5 files changed, 32 insertions(+), 2 deletions(-) diff --git a/source/blender/blenkernel/BKE_deform.hh b/source/blender/blenkernel/BKE_deform.hh index ba61eeac933..530b22a9c7c 100644 --- a/source/blender/blenkernel/BKE_deform.hh +++ b/source/blender/blenkernel/BKE_deform.hh @@ -92,6 +92,7 @@ int *BKE_object_defgroup_flip_map_single(const Object *ob, int BKE_object_defgroup_flip_index(const Object *ob, int index, bool use_default); int BKE_object_defgroup_name_index(const Object *ob, blender::StringRef name); void BKE_object_defgroup_unique_name(bDeformGroup *dg, Object *ob); +void BKE_object_defgroup_set_name(bDeformGroup *dg, Object *ob, const char *new_name); MDeformWeight *BKE_defvert_find_index(const MDeformVert *dv, int defgroup); /** diff --git a/source/blender/blenkernel/BKE_grease_pencil.hh b/source/blender/blenkernel/BKE_grease_pencil.hh index fe9dd684771..1f22d1d446e 100644 --- a/source/blender/blenkernel/BKE_grease_pencil.hh +++ b/source/blender/blenkernel/BKE_grease_pencil.hh @@ -1047,6 +1047,8 @@ void BKE_grease_pencil_copy_layer_group_parameters( void BKE_grease_pencil_nomain_to_grease_pencil(GreasePencil *grease_pencil_src, GreasePencil *grease_pencil_dst); +void BKE_grease_pencil_vgroup_name_update(Object *ob, const char *old_name, const char *new_name); + void BKE_grease_pencil_data_update(Depsgraph *depsgraph, Scene *scene, Object *object); void BKE_grease_pencil_duplicate_drawing_array(const GreasePencil *grease_pencil_src, GreasePencil *grease_pencil_dst); diff --git a/source/blender/blenkernel/intern/deform.cc b/source/blender/blenkernel/intern/deform.cc index 779ac90cbcc..9ef2ffcd5db 100644 --- a/source/blender/blenkernel/intern/deform.cc +++ b/source/blender/blenkernel/intern/deform.cc @@ -25,6 +25,7 @@ #include "BLI_listbase.h" #include "BLI_math_vector.h" #include "BLI_string.h" +#include "BLI_string_utf8.h" #include "BLI_string_utils.hh" #include "BLI_utildefines.h" @@ -754,6 +755,18 @@ void BKE_object_defgroup_unique_name(bDeformGroup *dg, Object *ob) BLI_uniquename_cb(defgroup_unique_check, &data, DATA_("Group"), '.', dg->name, sizeof(dg->name)); } +void BKE_object_defgroup_set_name(bDeformGroup *dg, Object *ob, const char *new_name) +{ + std::string old_name = dg->name; + STRNCPY_UTF8(dg->name, new_name); + BKE_object_defgroup_unique_name(dg, ob); + + if (ob->type == OB_GREASE_PENCIL) { + /* Update vgroup names stored in CurvesGeometry */ + BKE_grease_pencil_vgroup_name_update(ob, old_name.c_str(), dg->name); + } +} + float BKE_defvert_find_weight(const MDeformVert *dvert, const int defgroup) { MDeformWeight *dw = BKE_defvert_find_index(dvert, defgroup); diff --git a/source/blender/blenkernel/intern/grease_pencil.cc b/source/blender/blenkernel/intern/grease_pencil.cc index 8ce7ace6511..029359c65dd 100644 --- a/source/blender/blenkernel/intern/grease_pencil.cc +++ b/source/blender/blenkernel/intern/grease_pencil.cc @@ -1890,6 +1890,21 @@ void BKE_grease_pencil_nomain_to_grease_pencil(GreasePencil *grease_pencil_src, BKE_id_free(nullptr, grease_pencil_src); } +void BKE_grease_pencil_vgroup_name_update(Object *ob, const char *old_name, const char *new_name) +{ + using namespace blender::bke::greasepencil; + GreasePencil &grease_pencil = *static_cast(ob->data); + for (GreasePencilDrawingBase *base : grease_pencil.drawings()) { + Drawing &drawing = reinterpret_cast(base)->wrap(); + CurvesGeometry &curves = drawing.strokes_for_write(); + LISTBASE_FOREACH (bDeformGroup *, vgroup, &curves.vertex_group_names) { + if (strcmp(vgroup->name, old_name) == 0) { + STRNCPY(vgroup->name, new_name); + } + } + } +} + static void grease_pencil_evaluate_modifiers(Depsgraph *depsgraph, Scene *scene, Object *object, diff --git a/source/blender/makesrna/intern/rna_object.cc b/source/blender/makesrna/intern/rna_object.cc index 09aa19d6c9a..69fa98a4ead 100644 --- a/source/blender/makesrna/intern/rna_object.cc +++ b/source/blender/makesrna/intern/rna_object.cc @@ -902,8 +902,7 @@ static void rna_VertexGroup_name_set(PointerRNA *ptr, const char *value) } bDeformGroup *dg = static_cast(ptr->data); - STRNCPY_UTF8(dg->name, value); - BKE_object_defgroup_unique_name(dg, ob); + BKE_object_defgroup_set_name(dg, ob, value); } static int rna_VertexGroup_index_get(PointerRNA *ptr)