Commit: c6acfdf2a0464b4437cfaa43cc3b951c2f2909bf
Author: Bastien Montagne
Date:   Tue Nov 18 23:52:17 2014 +0100
Branches: input_method_editor
https://developer.blender.org/rBc6acfdf2a0464b4437cfaa43cc3b951c2f2909bf

Refactor: Move part of vgroup handling code from ED_mesh/object_vgroup.c to 
BKE_object_deform.

Along with some minor cleanup and simplifications.

Reviewers: campbellbarton

Subscribers: sergey

Differential Revision: https://developer.blender.org/D903

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

M       source/blender/blenkernel/BKE_object_deform.h
M       source/blender/blenkernel/intern/DerivedMesh.c
M       source/blender/blenkernel/intern/object_deform.c
M       source/blender/collada/SkinInfo.cpp
M       source/blender/editors/armature/armature_skinning.c
M       source/blender/editors/include/ED_mesh.h
M       source/blender/editors/include/ED_object.h
M       source/blender/editors/object/object_modifier.c
M       source/blender/editors/object/object_vgroup.c
M       source/blender/editors/physics/dynamicpaint_ops.c
M       source/blender/editors/sculpt_paint/paint_vertex.c
M       source/blender/editors/space_view3d/view3d_buttons.c
M       source/blender/makesrna/intern/rna_object.c
M       source/blenderplayer/bad_level_call_stubs/stubs.c

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

diff --git a/source/blender/blenkernel/BKE_object_deform.h 
b/source/blender/blenkernel/BKE_object_deform.h
index 6de7ff9..0e5ad2d 100644
--- a/source/blender/blenkernel/BKE_object_deform.h
+++ b/source/blender/blenkernel/BKE_object_deform.h
@@ -29,10 +29,47 @@
  *        used by painting and tools.
  */
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 struct Object;
+struct ID;
+struct MDeformVert;
+struct bDeformGroup;
+
+/* General vgroup operations */
+void BKE_object_defgroup_remap_update_users(struct Object *ob, int *map);
+
+bool BKE_object_defgroup_array_get(struct ID *id, struct MDeformVert 
**dvert_arr, int *dvert_tot);
+
+struct bDeformGroup *BKE_object_defgroup_add(struct Object *ob);
+struct bDeformGroup *BKE_object_defgroup_add_name(struct Object *ob, const 
char *name);
+struct MDeformVert  *BKE_object_defgroup_data_create(struct ID *id);
+
+bool BKE_object_defgroup_clear(struct Object *ob, struct bDeformGroup *dg, 
const bool use_selection);
+bool BKE_object_defgroup_clear_all(struct Object *ob, const bool 
use_selection);
+
+void BKE_object_defgroup_remove(struct Object *ob, struct bDeformGroup 
*defgroup);
+void BKE_object_defgroup_remove_all(struct Object *ob);
+
+
+/* Select helpers */
+enum eVGroupSelect;
+bool *BKE_object_defgroup_subset_from_select_type(
+        struct Object *ob, enum eVGroupSelect subset_type, int 
*r_defgroup_tot, int *r_subset_count);
+void BKE_object_defgroup_subset_to_index_array(
+        const bool *defgroup_validmap, const int defgroup_tot, int 
*r_defgroup_subset_map);
+
+
+/* ********** */
+
+bool *BKE_object_defgroup_lock_flags_get(struct Object *ob, const int 
defbase_tot);
+bool *BKE_object_defgroup_validmap_get(struct Object *ob, const int 
defbase_tot);
+bool *BKE_object_defgroup_selected_get(struct Object *ob, int defbase_tot, int 
*r_dg_flags_sel_tot);
 
-bool *BKE_objdef_lock_flags_get(struct Object *ob, const int defbase_tot);
-bool *BKE_objdef_validmap_get(struct Object *ob, const int defbase_tot);
-bool *BKE_objdef_selected_get(struct Object *ob, int defbase_tot, int 
*r_dg_flags_sel_tot);
+#ifdef __cplusplus
+}
+#endif
 
 #endif  /* __BKE_OBJECT_DEFORM_H__ */
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c 
b/source/blender/blenkernel/intern/DerivedMesh.c
index 0d029b1..bd35754 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -1228,7 +1228,7 @@ static void calc_weightpaint_vert_array(Object *ob, 
DerivedMesh *dm, int const d
                bool *defbase_sel = NULL;
 
                if (draw_flag & CALC_WP_MULTIPAINT) {
-                       defbase_sel = BKE_objdef_selected_get(ob, defbase_tot, 
&defbase_sel_tot);
+                       defbase_sel = BKE_object_defgroup_selected_get(ob, 
defbase_tot, &defbase_sel_tot);
                }
 
                for (i = numVerts; i != 0; i--, wc++, dv++) {
diff --git a/source/blender/blenkernel/intern/object_deform.c 
b/source/blender/blenkernel/intern/object_deform.c
index a3f5e56..e46929d 100644
--- a/source/blender/blenkernel/intern/object_deform.c
+++ b/source/blender/blenkernel/intern/object_deform.c
@@ -27,18 +27,457 @@
 
 #include "MEM_guardedalloc.h"
 
+#include "BLF_translation.h"
+
 #include "BLI_utildefines.h"
 #include "BLI_ghash.h"
 #include "BLI_listbase.h"
 
+#include "DNA_armature_types.h"
+#include "DNA_cloth_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_lattice_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_object_types.h"
+#include "DNA_object_force.h"
+#include "DNA_particle_types.h"
+#include "DNA_scene_types.h"
+
 #include "BKE_action.h"
+#include "BKE_deform.h"
+#include "BKE_editmesh.h"
 #include "BKE_object_deform.h"  /* own include */
 #include "BKE_object.h"
 #include "BKE_modifier.h"
 
-#include "DNA_armature_types.h"
-#include "DNA_modifier_types.h"
-#include "DNA_object_types.h"
+/** \name Misc helpers
+ * \{ */
+
+static Lattice *object_defgroup_lattice_get(ID *id)
+{
+       Lattice *lt = (Lattice *)id;
+       BLI_assert(GS(id->name) == ID_LT);
+       return (lt->editlatt) ? lt->editlatt->latt : lt;
+}
+
+/**
+ * Update users of vgroups from this object, according to given map.
+ *
+ * Use it when you remove or reorder vgroups in the object.
+ *
+ * \param map an array mapping old indices to new indices.
+ */
+void BKE_object_defgroup_remap_update_users(Object *ob, int *map)
+{
+       ModifierData *md;
+       ParticleSystem *psys;
+       int a;
+
+       /* these cases don't use names to refer to vertex groups, so when
+        * they get removed the numbers get out of sync, this corrects that */
+
+       if (ob->soft) {
+               ob->soft->vertgroup = map[ob->soft->vertgroup];
+       }
+
+       for (md = ob->modifiers.first; md; md = md->next) {
+               if (md->type == eModifierType_Explode) {
+                       ExplodeModifierData *emd = (ExplodeModifierData *)md;
+                       emd->vgroup = map[emd->vgroup];
+               }
+               else if (md->type == eModifierType_Cloth) {
+                       ClothModifierData *clmd = (ClothModifierData *)md;
+                       ClothSimSettings *clsim = clmd->sim_parms;
+
+                       if (clsim) {
+                               clsim->vgroup_mass = map[clsim->vgroup_mass];
+                               clsim->vgroup_bend = map[clsim->vgroup_bend];
+                               clsim->vgroup_struct = 
map[clsim->vgroup_struct];
+                       }
+               }
+       }
+
+       for (psys = ob->particlesystem.first; psys; psys = psys->next) {
+               for (a = 0; a < PSYS_TOT_VG; a++) {
+                       psys->vgroup[a] = map[psys->vgroup[a]];
+               }
+       }
+}
+/** \} */
+
+
+/** \name Group creation
+ * \{ */
+
+/**
+ * Add a vgroup of given name to object. *Does not* handle MDeformVert data at 
all!
+ */
+bDeformGroup *BKE_object_defgroup_add_name(Object *ob, const char *name)
+{
+       bDeformGroup *defgroup;
+
+       if (!ob || !OB_TYPE_SUPPORT_VGROUP(ob->type))
+               return NULL;
+
+       defgroup = BKE_defgroup_new(ob, name);
+
+       ob->actdef = BLI_listbase_count(&ob->defbase);
+
+       return defgroup;
+}
+
+/**
+ * Add a vgroup of default name to object. *Does not* handle MDeformVert data 
at all!
+ */
+bDeformGroup *BKE_object_defgroup_add(Object *ob) 
+{
+       return BKE_object_defgroup_add_name(ob, DATA_("Group"));
+}
+
+/**
+ * Create MDeformVert data for given ID. Work in Object mode only.
+ */
+MDeformVert *BKE_object_defgroup_data_create(ID *id)
+{
+       if (GS(id->name) == ID_ME) {
+               Mesh *me = (Mesh *)id;
+               me->dvert = CustomData_add_layer(&me->vdata, CD_MDEFORMVERT, 
CD_CALLOC, NULL, me->totvert);
+               return me->dvert;
+       }
+       else if (GS(id->name) == ID_LT) {
+               Lattice *lt = (Lattice *)id;
+               lt->dvert = MEM_callocN(sizeof(MDeformVert) * lt->pntsu * 
lt->pntsv * lt->pntsw, "lattice deformVert");
+               return lt->dvert;
+       }
+
+       return NULL;
+}
+/** \} */
+
+
+/** \name Group clearing
+ * \{ */
+
+/**
+ * Remove all verts (or only selected ones) from given vgroup. Work in Object 
and Edit modes.
+ *
+ * \param allverts If true, remove all vertices, else only selected ones.
+ * \return True if any vertex was removed, false otherwise.
+ */
+bool BKE_object_defgroup_clear(Object *ob, bDeformGroup *dg, const bool 
use_selection)
+{
+       MDeformVert *dv;
+       const int def_nr = BLI_findindex(&ob->defbase, dg);
+       bool changed = false;
+
+       if (ob->type == OB_MESH) {
+               Mesh *me = ob->data;
+
+               if (me->edit_btmesh) {
+                       BMEditMesh *em = me->edit_btmesh;
+                       const int cd_dvert_offset = 
CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
+
+                       if (cd_dvert_offset != -1) {
+                               BMVert *eve;
+                               BMIter iter;
+
+                               BM_ITER_MESH (eve, &iter, em->bm, 
BM_VERTS_OF_MESH) {
+                                       dv = BM_ELEM_CD_GET_VOID_P(eve, 
cd_dvert_offset);
+
+                                       if (dv && dv->dw && (!use_selection || 
BM_elem_flag_test(eve, BM_ELEM_SELECT))) {
+                                               MDeformWeight *dw = 
defvert_find_index(dv, def_nr);
+                                               defvert_remove_group(dv, dw); 
/* dw can be NULL */
+                                               changed = true;
+                                       }
+                               }
+                       }
+               }
+               else {
+                       if (me->dvert) {
+                               MVert *mv;
+                               int i;
+
+                               mv = me->mvert;
+                               dv = me->dvert;
+
+                               for (i = 0; i < me->totvert; i++, mv++, dv++) {
+                                       if (mv->flag & SELECT) {
+                                               if (dv->dw && (!use_selection 
|| (mv->flag & SELECT))) {
+                                                       MDeformWeight *dw = 
defvert_find_index(dv, def_nr);
+                                                       
defvert_remove_group(dv, dw);  /* dw can be NULL */
+                                                       changed = true;
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+       else if (ob->type == OB_LATTICE) {
+               Lattice *lt = object_defgroup_lattice_get((ID *)(ob->data));
+
+               if (lt->dvert) {
+                       BPoint *bp;
+                       int i, tot = lt->pntsu * lt->pntsv * lt->pntsw;
+
+                       for (i = 0, bp = lt->def; i < tot; i++, bp++) {
+                               if (!use_selection || (bp->f1 & SELECT)) {
+                                       MDeformWeight *dw;
+
+                                       dv = &lt->dvert[i];
+
+                                       dw = defvert_find_index(dv, def_nr);
+                                       defvert_remove_group(dv, dw);  /* dw 
can be NULL */
+                                       changed = true;
+                               }
+                       }
+               }
+       }
+
+       return changed;
+}
+
+/**
+ * Remove all verts (or only selected ones) from all vgroups. Work in Object 
and Edit modes.
+ *
+ * \param allverts If true, remove all vertices, else only selected ones.
+ * \return True if any vertex was removed, false otherwise.
+ */
+bool BKE_object_defgroup_clear_all(Object *ob, const bool use_selection)
+{
+       bDeformGroup *dg;
+       bool changed = false;
+
+       for (dg = ob->defbase.first; dg; dg = dg->next) {
+               if (BKE_object_defgroup_clear(ob, dg, use_selection)) {
+                       changed = true;
+               }
+       }
+
+       return changed;
+}
+/** \} */
+
+
+/** \name Group removal
+ * \{ */
+
+static void object_defgroup_remove_update_users(Object *ob, const int idx)
+{
+       int i, defbase_tot = BLI_listbase_count(&ob->defbase) + 1;
+       int *map = MEM_mallocN(sizeof(int) * defbase_tot, "vgroup del");
+
+       map[idx] = map[0] = 0;
+       for (i = 1; i < idx; i++) {
+               map[i] = i;
+       }
+       for (i = idx + 1; i < defbase_tot; i++) {
+               map[i] = i - 1;
+       }
+
+       BKE_object_defgroup_remap_update_users(ob, map);
+       MEM_freeN(map);
+}
+
+static void object_defgroup_remove_common(Object *ob, bDeformGroup *dg, const 
int def_nr)
+{
+       object_defgroup_remove_update_users(ob, def_nr + 1);
+
+       /* Remove the group */
+       BLI_freelinkN(&ob->defbase, dg);
+
+       /* Update the active deform index if necessary */
+       if (ob->actdef > def_nr)
+               ob->actdef--;
+
+       /* remove all dverts */
+       if (BLI_listbase_is_empty(&ob->defbase)) {
+               if (ob->type == OB_MESH) {
+                       Mesh *me = ob->data;
+                       CustomData_free_layer_active(&me->vdata, 
CD_MDEFORMVERT, me->totvert);
+                       me->dvert = NULL;
+               }
+               else if (ob->type == OB_LATTICE) {
+                       Lattice *lt = object_defgroup_lattice_get((ID 
*)(ob->data));
+                       if 

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to