[Bf-blender-cvs] [cc93e09b5d3] refactor-vertex-group-names: Add small API to retrieve vertex group indices and lists from an ID

Hans Goudey noreply at git.blender.org
Tue Jul 13 01:41:11 CEST 2021


Commit: cc93e09b5d338ed68c10ffcd2e26e9a81fc310b4
Author: Hans Goudey
Date:   Tue Jun 29 16:41:45 2021 -0500
Branches: refactor-vertex-group-names
https://developer.blender.org/rBcc93e09b5d338ed68c10ffcd2e26e9a81fc310b4

Add small API to retrieve vertex group indices and lists from an ID

===================================================================

M	source/blender/blenkernel/BKE_deform.h
M	source/blender/blenkernel/intern/data_transfer.c
M	source/blender/blenkernel/intern/deform.c
M	source/blender/blenkernel/intern/lattice_deform.c
M	source/blender/blenkernel/intern/object_deform.c
M	source/blender/blenkernel/intern/softbody.c
M	source/blender/editors/object/object_vgroup.c
M	source/blender/modifiers/intern/MOD_curve.c
M	source/blender/modifiers/intern/MOD_mask.cc
M	source/blender/modifiers/intern/MOD_solidify_extrude.c
M	source/blender/modifiers/intern/MOD_solidify_nonmanifold.c
M	source/blender/modifiers/intern/MOD_util.c
M	source/blender/modifiers/intern/MOD_weightvg_util.c
M	source/blender/modifiers/intern/MOD_weightvgedit.c
M	source/blender/modifiers/intern/MOD_weightvgmix.c
M	source/blender/modifiers/intern/MOD_weightvgproximity.c
M	source/blender/modifiers/intern/MOD_weld.c
M	source/blender/modifiers/intern/MOD_wireframe.c
M	source/blender/render/intern/texture_pointdensity.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_deform.h b/source/blender/blenkernel/BKE_deform.h
index 3a9475e2f6c..81136822ca9 100644
--- a/source/blender/blenkernel/BKE_deform.h
+++ b/source/blender/blenkernel/BKE_deform.h
@@ -37,6 +37,7 @@ struct MLoop;
 struct MPoly;
 struct Object;
 struct bDeformGroup;
+struct ID;
 
 const struct ListBase *BKE_object_defgroup_list_for_read(const struct Object *ob);
 struct ListBase *BKE_object_defgroup_list_for_write(struct Object *ob);
@@ -45,6 +46,10 @@ int BKE_object_defgroup_count(const struct Object *ob);
 int BKE_object_defgroup_active_index_get(const struct Object *ob);
 void BKE_object_defgroup_active_index_set(struct Object *ob, const int new_index);
 
+const struct ListBase *BKE_id_defgroup_list_get(const struct ID *id);
+struct ListBase *BKE_id_defgroup_list_get_mutable(struct ID *id);
+int BKE_id_defgroup_name_index(const struct ID *id, const char *name);
+
 struct bDeformGroup *BKE_object_defgroup_new(struct Object *ob, const char *name);
 void BKE_defgroup_copy_list(struct ListBase *outbase, const struct ListBase *inbase);
 struct bDeformGroup *BKE_defgroup_duplicate(const struct bDeformGroup *ingroup);
diff --git a/source/blender/blenkernel/intern/data_transfer.c b/source/blender/blenkernel/intern/data_transfer.c
index 12269cf0d51..d9d79c326e8 100644
--- a/source/blender/blenkernel/intern/data_transfer.c
+++ b/source/blender/blenkernel/intern/data_transfer.c
@@ -1437,7 +1437,7 @@ bool BKE_object_data_transfer_ex(struct Depsgraph *depsgraph,
   if (vgroup_name) {
     mdef = CustomData_get_layer(&me_dst->vdata, CD_MDEFORMVERT);
     if (mdef) {
-      vg_idx = BKE_object_defgroup_name_index(ob_dst, vgroup_name);
+      vg_idx = BKE_id_defgroup_name_index(&me_dst->id, vgroup_name);
     }
   }
 
diff --git a/source/blender/blenkernel/intern/deform.c b/source/blender/blenkernel/intern/deform.c
index 1a375c4b452..9a885bf2359 100644
--- a/source/blender/blenkernel/intern/deform.c
+++ b/source/blender/blenkernel/intern/deform.c
@@ -506,46 +506,66 @@ int BKE_object_defgroup_name_index(const Object *ob, const char *name)
   return BLI_findstringindex(defbase, name, offsetof(bDeformGroup, name));
 }
 
-const ListBase *BKE_object_defgroup_list_for_read(const Object *ob)
+int BKE_id_defgroup_name_index(const ID *id, const char *name)
 {
-  switch (ob->type) {
-    case OB_MESH: {
-      const Mesh *mesh = (const Mesh *)ob->data;
-      return &mesh->vertex_group_names;
+  const ListBase *defbase = BKE_id_defgroup_list_get(id);
+  return BLI_findstringindex(defbase, name, offsetof(bDeformGroup, name));
+}
+
+const ListBase *BKE_id_defgroup_list_get(const ID *id)
+{
+  switch (GS(id->name)) {
+    case ID_ME: {
+      const Mesh *me = (const Mesh *)id;
+      return &me->vertex_group_names;
     }
-    case OB_LATTICE: {
-      const Lattice *lattice = (const Lattice *)ob->data;
-      return &lattice->vertex_group_names;
+    case ID_LT: {
+      const Lattice *lt = (const Lattice *)id;
+      return &lt->vertex_group_names;
     }
-    case OB_GPENCIL: {
-      const bGPdata *gpd = (const bGPdata *)ob->data;
+    case ID_GD: {
+      const bGPdata *gpd = (const bGPdata *)id;
       return &gpd->vertex_group_names;
     }
+    default: {
+      BLI_assert_unreachable();
+    }
   }
-  BLI_assert_unreachable();
   return NULL;
 }
 
-ListBase *BKE_object_defgroup_list_for_write(Object *ob)
+ListBase *BKE_id_defgroup_list_get_mutable(ID *id)
 {
-  switch (ob->type) {
-    case OB_MESH: {
-      Mesh *mesh = (Mesh *)ob->data;
-      return &mesh->vertex_group_names;
+  switch (GS(id->name)) {
+    case ID_ME: {
+      Mesh *me = (Mesh *)id;
+      return &me->vertex_group_names;
     }
-    case OB_LATTICE: {
-      Lattice *lattice = (Lattice *)ob->data;
-      return &lattice->vertex_group_names;
+    case ID_LT: {
+      Lattice *lt = (Lattice *)id;
+      return &lt->vertex_group_names;
     }
-    case OB_GPENCIL: {
-      bGPdata *gpd = (bGPdata *)ob->data;
+    case ID_GD: {
+      bGPdata *gpd = (bGPdata *)id;
       return &gpd->vertex_group_names;
     }
+    default: {
+      BLI_assert_unreachable();
+    }
   }
-  BLI_assert_unreachable();
   return NULL;
 }
 
+const ListBase *BKE_object_defgroup_list_for_read(const Object *ob)
+{
+  return BKE_id_defgroup_list_get((const ID *)ob->data);
+}
+
+ListBase *BKE_object_defgroup_list_for_write(Object *ob)
+{
+  return BKE_id_defgroup_list_get_mutable((ID *)ob->data);
+}
+
 int BKE_object_defgroup_count(const Object *ob)
 {
   return BLI_listbase_count(BKE_object_defgroup_list_for_read(ob));
diff --git a/source/blender/blenkernel/intern/lattice_deform.c b/source/blender/blenkernel/intern/lattice_deform.c
index a3133b58a0a..618ec5bc301 100644
--- a/source/blender/blenkernel/intern/lattice_deform.c
+++ b/source/blender/blenkernel/intern/lattice_deform.c
@@ -112,7 +112,7 @@ LatticeDeformData *BKE_lattice_deform_data_create(const Object *oblatt, const Ob
   int defgrp_index = -1;
   const MDeformVert *dvert = BKE_lattice_deform_verts_get(oblatt);
   if (lt->vgroup[0] && dvert) {
-    defgrp_index = BKE_object_defgroup_name_index(oblatt, lt->vgroup);
+    defgrp_index = BKE_id_defgroup_name_index(lt, lt->vgroup);
 
     if (defgrp_index != -1) {
       lattice_weights = MEM_malloc_arrayN(sizeof(float), num_points, "lattice_weights");
@@ -364,7 +364,7 @@ static void lattice_deform_coords_impl(const Object *ob_lattice,
    * We want either a Mesh/Lattice with no derived data, or derived data with deformverts.
    */
   if (defgrp_name && defgrp_name[0] && ob_target && ELEM(ob_target->type, OB_MESH, OB_LATTICE)) {
-    defgrp_index = BKE_object_defgroup_name_index(ob_target, defgrp_name);
+    defgrp_index = BKE_id_defgroup_name_index(&((Lattice *)ob_target->data)->id, defgrp_name);
 
     if (defgrp_index != -1) {
       /* if there's derived data without deformverts, don't use vgroups */
diff --git a/source/blender/blenkernel/intern/object_deform.c b/source/blender/blenkernel/intern/object_deform.c
index 6659dd058db..bc844fbc7c5 100644
--- a/source/blender/blenkernel/intern/object_deform.c
+++ b/source/blender/blenkernel/intern/object_deform.c
@@ -33,6 +33,7 @@
 #include "DNA_armature_types.h"
 #include "DNA_cloth_types.h"
 #include "DNA_curve_types.h"
+#include "DNA_gpencil_types.h"
 #include "DNA_lattice_types.h"
 #include "DNA_mesh_types.h"
 #include "DNA_meshdata_types.h"
diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c
index 123843c88db..b4964c5e324 100644
--- a/source/blender/blenkernel/intern/softbody.c
+++ b/source/blender/blenkernel/intern/softbody.c
@@ -2704,8 +2704,8 @@ static void mesh_to_softbody(Object *ob)
   bp = sb->bpoint;
 
   defgroup_index = me->dvert ? (sb->vertgroup - 1) : -1;
-  defgroup_index_mass = me->dvert ? BKE_object_defgroup_name_index(ob, sb->namedVG_Mass) : -1;
-  defgroup_index_spring = me->dvert ? BKE_object_defgroup_name_index(ob, sb->namedVG_Spring_K) :
+  defgroup_index_mass = me->dvert ? BKE_id_defgroup_name_index(&me->id, sb->namedVG_Mass) : -1;
+  defgroup_index_spring = me->dvert ? BKE_id_defgroup_name_index(&me->id, sb->namedVG_Spring_K) :
                                       -1;
 
   for (a = 0; a < me->totvert; a++, bp++) {
@@ -2934,8 +2934,8 @@ static void lattice_to_softbody(Object *ob)
   bp = sb->bpoint;
 
   defgroup_index = lt->dvert ? (sb->vertgroup - 1) : -1;
-  defgroup_index_mass = lt->dvert ? BKE_object_defgroup_name_index(ob, sb->namedVG_Mass) : -1;
-  defgroup_index_spring = lt->dvert ? BKE_object_defgroup_name_index(ob, sb->namedVG_Spring_K) :
+  defgroup_index_mass = lt->dvert ? BKE_id_defgroup_name_index(&lt->id, sb->namedVG_Mass) : -1;
+  defgroup_index_spring = lt->dvert ? BKE_id_defgroup_name_index(&lt->id, sb->namedVG_Spring_K) :
                                       -1;
 
   /* same code used as for mesh vertices */
diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c
index 451d91f4693..102336d4dd9 100644
--- a/source/blender/editors/object/object_vgroup.c
+++ b/source/blender/editors/object/object_vgroup.c
@@ -396,7 +396,9 @@ bool ED_vgroup_array_copy(Object *ob, Object *ob_from)
   int defbase_tot = BLI_listbase_count(defbase_dst);
   bool new_vgroup = false;
 
-  if (ob == ob_from) {
+  BLI_assert(ob != ob_from);
+
+  if (ob->data == ob_from->data) {
     return true;
   }
 
diff --git a/source/blender/modifiers/intern/MOD_curve.c b/source/blender/modifiers/intern/MOD_curve.c
index 20dbb299767..aae6d257766 100644
--- a/source/blender/modifiers/intern/MOD_curve.c
+++ b/source/blender/modifiers/intern/MOD_curve.c
@@ -167,7 +167,7 @@ static void deformVertsEM(ModifierData *md,
   int defgrp_index = -1;
 
   if (ctx->object->type == OB_MESH && cmd->name[0] != '\0') {
-    defgrp_index = BKE_object_defgroup_name_index(ctx->object, cmd->name);
+    defgrp_index = BKE_id_defgroup_name_index(&mesh->id, cmd->name);
     if (defgrp_index != -1) {
       use_dverts = true;
     }
diff --git a/source/blender/modifiers/intern/MOD_mask.cc b/source/blender/modifiers/intern/MOD_mask.cc
index 655458722c5..9aa8e3dd7c8 100644
--- a/source/blender/modifiers/intern/MOD_mask.cc
+++ b/source/blender/modifiers/intern/MOD_mask.cc
@@ -119,7 +119,7 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
 
 /* A vertex will be in the mask if a selected bone influences it more than a certain threshold. */
 static void compute_vertex_mask__armature_mode(MDeformVert *dvert,
-                                               Object *ob,
+                                               Mesh *mesh,
                                                Object *armature_ob,
                                                float threshold,
                                                MutableSpan<bool> r_vertex_mask)
@@ -127,8 +127,7 @@ static void compute_vertex_mask__armature_mode(MDeformVert *dvert,
   /* Element i is true if there is a selected bone that uses vertex group i. */
   Vector<bool> selected_bone_uses_group;
 
-  const ListBase *defbase = BKE_object_defgroup_list_for_read(ob);
-  LISTBASE_FOREACH (bDeformGroup *, def, defbase) {
+  LISTBASE_FOREACH (bDeformGroup *, def, &mesh->vertex_gr

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list