[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57239] trunk/blender/source/blender: fix own error with removing vertex weights not checking for non-existing weights .

Campbell Barton ideasman42 at gmail.com
Tue Jun 4 21:37:18 CEST 2013


Revision: 57239
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57239
Author:   campbellbarton
Date:     2013-06-04 19:37:18 +0000 (Tue, 04 Jun 2013)
Log Message:
-----------
fix own error with removing vertex weights not checking for non-existing weights.
however this exposed some other odd behavior.

removing a vertex group would add one if not found but only for meshes, not lattices.

now just skip removal if not found.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/operators/bmo_fill_grid.c
    trunk/blender/source/blender/editors/object/object_vgroup.c

Modified: trunk/blender/source/blender/bmesh/operators/bmo_fill_grid.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_fill_grid.c	2013-06-04 18:21:11 UTC (rev 57238)
+++ trunk/blender/source/blender/bmesh/operators/bmo_fill_grid.c	2013-06-04 19:37:18 UTC (rev 57239)
@@ -64,15 +64,15 @@
 
 static void quad_verts_to_barycentric_tri(
         float tri[3][3],
-        float co_a[3],
-        float co_b[3],
+        const float co_a[3],
+        const float co_b[3],
 
-        float co_a_next[3],
-        float co_b_next[3],
+        const float co_a_next[3],
+        const float co_b_next[3],
 
-        float co_a_prev[3],
-        float co_b_prev[3],
-        bool is_flip
+        const float co_a_prev[3],
+        const float co_b_prev[3],
+        const bool is_flip
         )
 {
 	float no[3];

Modified: trunk/blender/source/blender/editors/object/object_vgroup.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_vgroup.c	2013-06-04 18:21:11 UTC (rev 57238)
+++ trunk/blender/source/blender/editors/object/object_vgroup.c	2013-06-04 19:37:18 UTC (rev 57239)
@@ -2408,10 +2408,11 @@
 
 /* only in editmode */
 /* removes from active defgroup, if allverts==0 only selected vertices */
-static void vgroup_active_remove_verts(Object *ob, const bool allverts, bDeformGroup *dg)
+static bool vgroup_active_remove_verts(Object *ob, const bool allverts, bDeformGroup *dg)
 {
 	MDeformVert *dv;
 	const int def_nr = BLI_findindex(&ob->defbase, dg);
+	bool change = false;
 
 	if (ob->type == OB_MESH) {
 		Mesh *me = ob->data;
@@ -2420,34 +2421,36 @@
 			BMEditMesh *em = me->edit_btmesh;
 			const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
 
-			BMVert *eve;
-			BMIter iter;
+			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);
+				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 && (allverts || 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 */
+					if (dv && dv->dw && (allverts || 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 */
+						change = true;
+					}
 				}
 			}
 		}
 		else {
-			MVert *mv;
-			int i;
+			if (me->dvert) {
+				MVert *mv;
+				int i;
 
-			if (!me->dvert) {
-				ED_vgroup_data_create(&me->id);
-			}
+				mv = me->mvert;
+				dv = me->dvert;
 
-			mv = me->mvert;
-			dv = me->dvert;
-
-			for (i = 0; i < me->totvert; i++, mv++, dv++) {
-				if (mv->flag & SELECT) {
-					if (dv->dw && (allverts || (mv->flag & SELECT))) {
-						MDeformWeight *dw = defvert_find_index(dv, def_nr);
-						defvert_remove_group(dv, dw); /* dw can be NULL */
+				for (i = 0; i < me->totvert; i++, mv++, dv++) {
+					if (mv->flag & SELECT) {
+						if (dv->dw && (allverts || (mv->flag & SELECT))) {
+							MDeformWeight *dw = defvert_find_index(dv, def_nr);
+							defvert_remove_group(dv, dw); /* dw can be NULL */
+							change = true;
+						}
 					}
 				}
 			}
@@ -2468,10 +2471,13 @@
 
 					dw = defvert_find_index(dv, def_nr);
 					defvert_remove_group(dv, dw); /* dw can be NULL */
+					change = true;
 				}
 			}
 		}
 	}
+
+	return change;
 }
 
 static void vgroup_delete_edit_mode(Object *ob, bDeformGroup *dg)
@@ -2482,10 +2488,11 @@
 	assert(dg_index > -1);
 
 	/* Make sure that no verts are using this group */
-	vgroup_active_remove_verts(ob, true, dg);
-
+	if (vgroup_active_remove_verts(ob, true, dg) == false) {
+		/* do nothing */
+	}
 	/* Make sure that any verts with higher indices are adjusted accordingly */
-	if (ob->type == OB_MESH) {
+	else if (ob->type == OB_MESH) {
 		Mesh *me = ob->data;
 		BMEditMesh *em = me->edit_btmesh;
 		const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
@@ -2493,7 +2500,7 @@
 		BMIter iter;
 		BMVert *eve;
 		MDeformVert *dvert;
-		
+
 		BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
 			dvert = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
 
@@ -2508,7 +2515,7 @@
 		BPoint *bp;
 		MDeformVert *dvert = lt->dvert;
 		int a, tot;
-		
+
 		if (dvert) {
 			tot = lt->pntsu * lt->pntsv * lt->pntsw;
 			for (a = 0, bp = lt->def; a < tot; a++, bp++, dvert++) {
@@ -2691,16 +2698,18 @@
 
 /* only in editmode */
 /* removes from all defgroup, if allverts==0 only selected vertices */
-static void vgroup_remove_verts(Object *ob, int allverts)
+static bool vgroup_remove_verts(Object *ob, int allverts)
 {
+	bool change = false;
 	/* To prevent code redundancy, we just use vgroup_active_remove_verts, but that
 	 * only operates on the active vgroup. So we iterate through all groups, by changing
 	 * active group index
 	 */
 	bDeformGroup *dg;
 	for (dg = ob->defbase.first; dg; dg = dg->next) {
-		vgroup_active_remove_verts(ob, allverts, dg);
+		change |= vgroup_active_remove_verts(ob, allverts, dg);
 	}
+	return change;
 }
 
 /********************** vertex group operators *********************/
@@ -2840,16 +2849,17 @@
 {
 	Object *ob = ED_object_context(C);
 
-	if (RNA_boolean_get(op->ptr, "all"))
-		vgroup_remove_verts(ob, 0);
+	if (RNA_boolean_get(op->ptr, "all")) {
+		if (vgroup_remove_verts(ob, 0) == false) {
+			return OPERATOR_CANCELLED;
+		}
+	}
 	else {
 		bDeformGroup *dg = BLI_findlink(&ob->defbase, ob->actdef - 1);
 
-		if (dg == NULL) {
+		if ((dg == NULL) || (vgroup_active_remove_verts(ob, false, dg) == false)) {
 			return OPERATOR_CANCELLED;
 		}
-
-		vgroup_active_remove_verts(ob, false, dg);
 	}
 
 	DAG_id_tag_update(&ob->id, OB_RECALC_DATA);




More information about the Bf-blender-cvs mailing list