[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57468] trunk/blender/source/blender/ editors: Added support for Vertex Weight panel in weight Paint Mode

Gaia Clary gaia.clary at machinimatrix.org
Sat Jun 15 12:18:16 CEST 2013


Revision: 57468
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57468
Author:   gaiaclary
Date:     2013-06-15 10:18:16 +0000 (Sat, 15 Jun 2013)
Log Message:
-----------
Added support for Vertex Weight panel in weight Paint Mode

Modified Paths:
--------------
    trunk/blender/source/blender/editors/mesh/editface.c
    trunk/blender/source/blender/editors/space_view3d/view3d_buttons.c
    trunk/blender/source/blender/editors/space_view3d/view3d_select.c

Modified: trunk/blender/source/blender/editors/mesh/editface.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editface.c	2013-06-15 10:16:01 UTC (rev 57467)
+++ trunk/blender/source/blender/editors/mesh/editface.c	2013-06-15 10:18:16 UTC (rev 57468)
@@ -619,6 +619,17 @@
 		}
 	}
 
+	/* handle mselect */
+	if (action == SEL_SELECT) {
+		/* pass */
+	}
+	else if (ELEM(action, SEL_DESELECT, SEL_INVERT)) {
+		BKE_mesh_mselect_clear(me);
+	}
+	else {
+		BKE_mesh_mselect_validate(me);
+	}
+
 	if (flush_flags) {
 		paintvert_flush_flags(ob);
 	}

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_buttons.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_buttons.c	2013-06-15 10:16:01 UTC (rev 57467)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_buttons.c	2013-06-15 10:18:16 UTC (rev 57468)
@@ -776,9 +776,22 @@
 #define B_VGRP_PNL_EDIT_SINGLE 8 /* or greater */
 #define B_VGRP_PNL_COPY_SINGLE 16384 /* or greater */
 
-static void act_vert_def(Object *ob, BMVert **r_eve, MDeformVert **r_dvert)
+static MDeformVert *ED_mesh_active_dvert_get_ob(Object *ob, int *r_index)
 {
-	if (ob && ob->mode & OB_MODE_EDIT && ob->type == OB_MESH && ob->defbase.first) {
+	Mesh *me = ob->data;
+	int index = BKE_mesh_mselect_active_get(me, ME_VSEL);
+	if (r_index) *r_index = index;
+	if (index == -1 || me->dvert == NULL) {
+		return NULL;
+	}
+	else {
+		return me->dvert + index;
+	}
+}
+
+static MDeformVert *ED_mesh_active_dvert_get_em(Object *ob, BMVert **r_eve)
+{
+	if (ob->mode & OB_MODE_EDIT && ob->type == OB_MESH && ob->defbase.first) {
 		Mesh *me = ob->data;
 		BMEditMesh *em = me->edit_btmesh;
 		const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
@@ -789,167 +802,254 @@
 			if (ese && ese->htype == BM_VERT) {
 				BMVert *eve = (BMVert *)ese->ele;
 				if (r_eve) *r_eve = eve;
-				*r_dvert = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
-				return;
+				return BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
 			}
 		}
 	}
 
 	if (r_eve) *r_eve = NULL;
-	*r_dvert = NULL;
+	return NULL;
 }
 
-static void editvert_mirror_update(Object *ob, BMVert *eve, int def_nr, int index,
-                                   const int cd_dvert_offset)
+static MDeformVert *ED_mesh_active_dvert_get_only(Object *ob)
 {
+	if (ob->type == OB_MESH) {
+		if (ob->mode & OB_MODE_EDIT) {
+			return ED_mesh_active_dvert_get_em(ob, NULL);
+		}
+		else {
+			return ED_mesh_active_dvert_get_ob(ob, NULL);
+		}
+	}
+	else {
+		return NULL;
+	}
+}
+
+/* TODO, cache flip data to speedup calls within a loop. */
+static void mesh_defvert_mirror_update_internal(Object *ob,
+                                                MDeformVert *dvert_dst, MDeformVert *dvert_src,
+                                                const int def_nr)
+{
+	if (def_nr == -1) {
+		/* all vgroups, add groups where neded  */
+		int flip_map_len;
+		int *flip_map = defgroup_flip_map(ob, &flip_map_len, true);
+		defvert_sync_mapped(dvert_dst, dvert_src, flip_map, flip_map_len, true);
+		MEM_freeN(flip_map);
+	}
+	else {
+		/* single vgroup */
+		MDeformWeight *dw = defvert_verify_index(dvert_dst, defgroup_flip_index(ob, def_nr, 1));
+		if (dw) {
+			dw->weight = defvert_find_weight(dvert_src, def_nr);
+		}
+	}
+}
+
+static void ED_mesh_defvert_mirror_update_em(Object *ob, BMVert *eve, int def_nr, int vidx,
+                                             const int cd_dvert_offset)
+{
 	Mesh *me = ob->data;
 	BMEditMesh *em = me->edit_btmesh;
 	BMVert *eve_mirr;
 
-	eve_mirr = editbmesh_get_x_mirror_vert(ob, em, eve, eve->co, index);
+	eve_mirr = editbmesh_get_x_mirror_vert(ob, em, eve, eve->co, vidx);
 
 	if (eve_mirr && eve_mirr != eve) {
 		MDeformVert *dvert_src = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
 		MDeformVert *dvert_dst = BM_ELEM_CD_GET_VOID_P(eve_mirr, cd_dvert_offset);
-		if (dvert_dst) {
-			if (def_nr == -1) {
-				/* all vgroups, add groups where neded  */
-				int flip_map_len;
-				int *flip_map = defgroup_flip_map(ob, &flip_map_len, true);
-				defvert_sync_mapped(dvert_dst, dvert_src, flip_map, flip_map_len, true);
-				MEM_freeN(flip_map);
-			}
-			else {
-				/* single vgroup */
-				MDeformWeight *dw = defvert_verify_index(dvert_dst, defgroup_flip_index(ob, def_nr, 1));
-				if (dw) {
-					dw->weight = defvert_find_weight(dvert_src, def_nr);
-				}
-			}
-		}
+		mesh_defvert_mirror_update_internal(ob, dvert_dst, dvert_src, def_nr);
 	}
 }
 
+static void ED_mesh_defvert_mirror_update_ob(Object *ob, int def_nr, int vidx)
+{
+	int vidx_mirr;
+	Mesh *me = ob->data;
+	if (vidx == -1)
+		return;
+
+	vidx_mirr = mesh_get_x_mirror_vert(ob, vidx);
+
+	if ((vidx_mirr) >= 0 && (vidx_mirr != vidx)) {
+		MDeformVert *dvert_src = &me->dvert[vidx];
+		MDeformVert *dvert_dst = &me->dvert[vidx_mirr];
+		mesh_defvert_mirror_update_internal(ob, dvert_dst, dvert_src, def_nr);
+	}
+}
+
 static void vgroup_adjust_active(Object *ob, int def_nr)
 {
 	Mesh *me = ob->data;
 	BMEditMesh *em = me->edit_btmesh;
-	const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
-	BMVert *eve_act;
 	MDeformVert *dvert_act;
 
-	act_vert_def(ob, &eve_act, &dvert_act);
-
-	if (dvert_act) {
-		if (me->editflag & ME_EDIT_MIRROR_X)
-			editvert_mirror_update(ob, eve_act, def_nr, -1, cd_dvert_offset);
+	if (me->editflag & ME_EDIT_MIRROR_X) {
+		if (em) {
+			BMVert *eve_act;
+			dvert_act = ED_mesh_active_dvert_get_em(ob, &eve_act);
+			if (dvert_act) {
+				const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
+				ED_mesh_defvert_mirror_update_em(ob, eve_act, def_nr, -1, cd_dvert_offset);
+			}
+		}
+		else {
+			int v_act;
+			dvert_act = ED_mesh_active_dvert_get_ob(ob, &v_act);
+			if (dvert_act) {
+				ED_mesh_defvert_mirror_update_ob(ob, def_nr, v_act);
+			}
+		}
 	}
 }
 
 static void vgroup_copy_active_to_sel(Object *ob)
 {
-	BMVert *eve_act;
+	Mesh *me = ob->data;
+	BMEditMesh *em = me->edit_btmesh;
 	MDeformVert *dvert_act;
+	int i;
 
-	act_vert_def(ob, &eve_act, &dvert_act);
-
-	if (dvert_act == NULL) {
-		return;
-	}
-	else {
-		Mesh *me = ob->data;
-		BMEditMesh *em = me->edit_btmesh;
+	if (em) {
+		BMIter iter;
+		BMVert *eve, *eve_act;
 		const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
 
-		BMIter iter;
-		BMVert *eve;
-		MDeformVert *dvert;
-		int index = 0;
+		dvert_act = ED_mesh_active_dvert_get_em(ob, &eve_act);
+		if (dvert_act == NULL) {
+			return;
+		}
 
-		BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
+		BM_ITER_MESH_INDEX (eve, &iter, em->bm, BM_VERTS_OF_MESH, i) {
 			if (BM_elem_flag_test(eve, BM_ELEM_SELECT) && eve != eve_act) {
-				dvert = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
-				if (dvert) {
-					defvert_copy(dvert, dvert_act);
+				MDeformVert *dv = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
+				defvert_copy(dv, dvert_act);
+				if (me->editflag & ME_EDIT_MIRROR_X) {
+					ED_mesh_defvert_mirror_update_em(ob, eve, -1, i, cd_dvert_offset);
+				}
+			}
+		}
+	}
+	else {
+		MDeformVert *dv;
+		int v_act;
 
-					if (me->editflag & ME_EDIT_MIRROR_X)
-						editvert_mirror_update(ob, eve, -1, index, cd_dvert_offset);
+		dvert_act = ED_mesh_active_dvert_get_ob(ob, &v_act);
+		if (dvert_act == NULL) {
+			return;
+		}
 
+		dv  = me->dvert;
+		for (i = 0; i < me->totvert; i++, dv++) {
+			if ((me->mvert[i].flag & SELECT) && dv != dvert_act) {
+				defvert_copy(dv, dvert_act);
+				if (me->editflag & ME_EDIT_MIRROR_X) {
+					ED_mesh_defvert_mirror_update_ob(ob, -1, i);
 				}
 			}
-
-			index++;
 		}
 	}
 }
 
 static void vgroup_copy_active_to_sel_single(Object *ob, const int def_nr)
 {
-	BMVert *eve_act;
-	MDeformVert *dv_act;
+	MDeformVert *dvert_act;
 
-	act_vert_def(ob, &eve_act, &dv_act);
+	Mesh *me = ob->data;
+	BMEditMesh *em = me->edit_btmesh;
+	float weight_act;
+	int i;
 
-	if (dv_act == NULL) {
-		return;
-	}
-	else {
-		Mesh *me = ob->data;
-		BMEditMesh *em = me->edit_btmesh;
+	if (em) {
 		const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
 		BMIter iter;
-		BMVert *eve;
-		MDeformVert *dv;
-		MDeformWeight *dw;
-		float weight_act;
-		int index = 0;
+		BMVert *eve, *eve_act;
 
-		dw = defvert_find_index(dv_act, def_nr);
-
-		if (dw == NULL)
+		dvert_act = ED_mesh_active_dvert_get_em(ob, &eve_act);
+		if (dvert_act == NULL) {
 			return;
+		}
+		weight_act = defvert_find_weight(dvert_act, def_nr);
 
-		weight_act = dw->weight;
-
-		eve = BM_iter_new(&iter, em->bm, BM_VERTS_OF_MESH, NULL);
-		for (index = 0; eve; eve = BM_iter_step(&iter), index++) {
-			if (BM_elem_flag_test(eve, BM_ELEM_SELECT) && eve != eve_act) {
-				dv = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
-				dw = defvert_find_index(dv, def_nr);
+		BM_ITER_MESH_INDEX (eve, &iter, em->bm, BM_VERTS_OF_MESH, i) {
+			if (BM_elem_flag_test(eve, BM_ELEM_SELECT) && (eve != eve_act)) {
+				MDeformVert *dv = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
+				MDeformWeight *dw = defvert_find_index(dv, def_nr);
 				if (dw) {
 					dw->weight = weight_act;
 
 					if (me->editflag & ME_EDIT_MIRROR_X) {
-						editvert_mirror_update(ob, eve, -1, index, cd_dvert_offset);
+						ED_mesh_defvert_mirror_update_em(ob, eve, -1, i, cd_dvert_offset);
 					}
 				}
 			}
 		}
 
 		if (me->editflag & ME_EDIT_MIRROR_X) {
-			editvert_mirror_update(ob, eve_act, -1, -1, cd_dvert_offset);
+			ED_mesh_defvert_mirror_update_em(ob, eve_act, -1, -1, cd_dvert_offset);
 		}
 	}
+	else {
+		MDeformVert *dv;
+		int v_act;
+
+		dvert_act = ED_mesh_active_dvert_get_ob(ob, &v_act);
+		if (dvert_act == NULL) {
+			return;
+		}
+		weight_act = defvert_find_weight(dvert_act, def_nr);
+
+		dv  = me->dvert;
+		for (i = 0; i < me->totvert; i++, dv++) {
+			if ((me->mvert[i].flag & SELECT) && (dv != dvert_act)) {
+				MDeformWeight *dw = defvert_find_index(dv, def_nr);
+				if (dw) {
+					dw->weight = weight_act;
+					if (me->editflag & ME_EDIT_MIRROR_X) {
+						ED_mesh_defvert_mirror_update_ob(ob, -1, i);
+					}
+				}
+			}
+		}
+
+		if (me->editflag & ME_EDIT_MIRROR_X) {
+			ED_mesh_defvert_mirror_update_ob(ob, -1, v_act);
+		}
+	}
 }
 
 static void vgroup_normalize_active(Object *ob)
 {
 	Mesh *me = ob->data;
 	BMEditMesh *em = me->edit_btmesh;
-	const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
-
 	BMVert *eve_act;
+	int v_act;
 	MDeformVert *dvert_act;
 
-	act_vert_def(ob, &eve_act, &dvert_act);
+	if (em) {

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list