[Bf-blender-cvs] [c6acfdf] input_method_editor: Refactor: Move part of vgroup handling code from ED_mesh/object_vgroup.c to BKE_object_deform.

Bastien Montagne noreply at git.blender.org
Mon Nov 24 00:44:44 CET 2014


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. @@




More information about the Bf-blender-cvs mailing list