[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [24009] trunk/blender: - editmesh select mirror (in editmode select menu)

Campbell Barton ideasman42 at gmail.com
Tue Oct 20 18:31:03 CEST 2009


Revision: 24009
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24009
Author:   campbellbarton
Date:     2009-10-20 18:31:03 +0200 (Tue, 20 Oct 2009)

Log Message:
-----------
- editmesh select mirror (in editmode select menu)
- weight blending (Vertex specials menu), currently blends from surrounding unselected verts (nice for blending edge loops), but will eventually support face mask mode.

Modified Paths:
--------------
    trunk/blender/release/scripts/ui/space_view3d.py
    trunk/blender/source/blender/editors/include/ED_mesh.h
    trunk/blender/source/blender/editors/mesh/editmesh_mods.c
    trunk/blender/source/blender/editors/mesh/mesh_intern.h
    trunk/blender/source/blender/editors/mesh/mesh_ops.c
    trunk/blender/source/blender/editors/object/object_intern.h
    trunk/blender/source/blender/editors/object/object_ops.c
    trunk/blender/source/blender/editors/object/object_vgroup.c

Modified: trunk/blender/release/scripts/ui/space_view3d.py
===================================================================
--- trunk/blender/release/scripts/ui/space_view3d.py	2009-10-20 16:02:41 UTC (rev 24008)
+++ trunk/blender/release/scripts/ui/space_view3d.py	2009-10-20 16:31:03 UTC (rev 24009)
@@ -827,6 +827,8 @@
 		layout.itemO("mesh.select_vertex_path")
 		
 		layout.itemO("mesh.blend_from_shape")
+		
+		layout.itemO("object.vertex_group_blend")
 		# uiItemO(layout, "Propagate to All Shapes", 0, "mesh.shape_propagate_to_all");
 
 class VIEW3D_MT_edit_mesh_edges(bpy.types.Menu):

Modified: trunk/blender/source/blender/editors/include/ED_mesh.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_mesh.h	2009-10-20 16:02:41 UTC (rev 24008)
+++ trunk/blender/source/blender/editors/include/ED_mesh.h	2009-10-20 16:31:03 UTC (rev 24009)
@@ -147,6 +147,7 @@
 /* editmesh_mods.c */
 extern unsigned int em_vertoffs, em_solidoffs, em_wireoffs;
 
+void		EM_cache_x_mirror_vert(struct Object *ob, struct EditMesh *em);
 void		mouse_mesh(struct bContext *C, short mval[2], short extend);
 int			EM_check_backbuf(unsigned int index);
 int			EM_mask_init_backbuf_border(struct ViewContext *vc, short mcords[][2], short tot, short xmin, short ymin, short xmax, short ymax);

Modified: trunk/blender/source/blender/editors/mesh/editmesh_mods.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_mods.c	2009-10-20 16:02:41 UTC (rev 24008)
+++ trunk/blender/source/blender/editors/mesh/editmesh_mods.c	2009-10-20 16:31:03 UTC (rev 24009)
@@ -100,23 +100,43 @@
 
 /* ****************************** MIRROR **************** */
 
-void EM_select_mirrored(Object *obedit, EditMesh *em)
+void EM_cache_x_mirror_vert(struct Object *ob, struct EditMesh *em)
 {
-	if(em->selectmode & SCE_SELECT_VERTEX) {
-		EditVert *eve, *v1;
-		
-		for(eve= em->verts.first; eve; eve= eve->next) {
-			if(eve->f & SELECT) {
-				v1= editmesh_get_x_mirror_vert(obedit, em, eve->co);
-				if(v1) {
-					eve->f &= ~SELECT;
-					v1->f |= SELECT;
-				}
-			}
+	EditVert *eve, *eve_mirror;
+
+	for(eve= em->verts.first; eve; eve= eve->next) {
+		eve->tmp.v= NULL;
+	}
+
+	for(eve= em->verts.first; eve; eve= eve->next) {
+		if(eve->tmp.v==NULL) {
+			eve_mirror = editmesh_get_x_mirror_vert(ob, em, eve->co);
+			eve->tmp.v= eve_mirror;
+			eve_mirror->tmp.v = eve;
 		}
 	}
 }
 
+void EM_select_mirrored(Object *obedit, EditMesh *em, int extend)
+{
+
+	EditVert *eve;
+
+	EM_cache_x_mirror_vert(obedit, em);
+
+	for(eve= em->verts.first; eve; eve= eve->next) {
+		if(eve->f & SELECT && eve->tmp.v) {
+			eve->tmp.v->f |= SELECT;
+
+			if(extend==FALSE)
+				eve->f &= ~SELECT;
+
+			/* remove the interference */
+			eve->tmp.v->tmp.v= eve->tmp.v= NULL;
+		}
+	}
+}
+
 void EM_automerge(Scene *scene, Object *obedit, int update)
 {
 	Mesh *me= obedit ? obedit->data : NULL; /* can be NULL */
@@ -2825,6 +2845,39 @@
 	RNA_def_enum(ot->srna, "type", type_items, 3, "Type", "Type of elements to select.");
 }
 
+
+int select_mirror_exec(bContext *C, wmOperator *op)
+{
+	Object *obedit= CTX_data_edit_object(C);
+	EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)obedit->data));
+
+	int extend= RNA_boolean_get(op->ptr, "extend");
+
+	EM_select_mirrored(obedit, em, extend);
+
+	WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
+
+	return OPERATOR_FINISHED;
+}
+
+void MESH_OT_select_mirror(wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name= "Select Mirror";
+	ot->description= "Select mesh items at mirrored locations.";
+	ot->idname= "MESH_OT_select_mirror";
+
+	/* api callbacks */
+	ot->exec= select_mirror_exec;
+	ot->poll= ED_operator_editmesh;
+
+	/* flags */
+	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+	/* props */
+	RNA_def_boolean(ot->srna, "extend", 0, "Extend", "Extend the existing selection");
+}
+
 static int select_sharp_edges_exec(bContext *C, wmOperator *op)
 {
 	/* Find edges that have exactly two neighboring faces,

Modified: trunk/blender/source/blender/editors/mesh/mesh_intern.h
===================================================================
--- trunk/blender/source/blender/editors/mesh/mesh_intern.h	2009-10-20 16:02:41 UTC (rev 24008)
+++ trunk/blender/source/blender/editors/mesh/mesh_intern.h	2009-10-20 16:31:03 UTC (rev 24009)
@@ -151,6 +151,7 @@
 void MESH_OT_hide(struct wmOperatorType *ot);
 void MESH_OT_reveal(struct wmOperatorType *ot);
 void MESH_OT_select_by_number_vertices(struct wmOperatorType *ot);
+void MESH_OT_select_mirror(struct wmOperatorType *ot);
 void MESH_OT_normals_make_consistent(struct wmOperatorType *ot);
 void MESH_OT_faces_select_linked_flat(struct wmOperatorType *ot);
 void MESH_OT_edges_select_sharp(struct wmOperatorType *ot);

Modified: trunk/blender/source/blender/editors/mesh/mesh_ops.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/mesh_ops.c	2009-10-20 16:02:41 UTC (rev 24008)
+++ trunk/blender/source/blender/editors/mesh/mesh_ops.c	2009-10-20 16:31:03 UTC (rev 24009)
@@ -80,6 +80,7 @@
 	WM_operatortype_append(MESH_OT_hide);
 	WM_operatortype_append(MESH_OT_reveal);
 	WM_operatortype_append(MESH_OT_select_by_number_vertices);
+	WM_operatortype_append(MESH_OT_select_mirror);
 	WM_operatortype_append(MESH_OT_normals_make_consistent);
 	WM_operatortype_append(MESH_OT_merge);
 	WM_operatortype_append(MESH_OT_subdivide);

Modified: trunk/blender/source/blender/editors/object/object_intern.h
===================================================================
--- trunk/blender/source/blender/editors/object/object_intern.h	2009-10-20 16:02:41 UTC (rev 24008)
+++ trunk/blender/source/blender/editors/object/object_intern.h	2009-10-20 16:31:03 UTC (rev 24009)
@@ -169,6 +169,7 @@
 void OBJECT_OT_vertex_group_normalize(struct wmOperatorType *ot);
 void OBJECT_OT_vertex_group_normalize_all(struct wmOperatorType *ot);
 void OBJECT_OT_vertex_group_invert(struct wmOperatorType *ot);
+void OBJECT_OT_vertex_group_blend(struct wmOperatorType *ot);
 void OBJECT_OT_vertex_group_clean(struct wmOperatorType *ot);
 void OBJECT_OT_vertex_group_menu(struct wmOperatorType *ot);
 void OBJECT_OT_vertex_group_set_active(struct wmOperatorType *ot);

Modified: trunk/blender/source/blender/editors/object/object_ops.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_ops.c	2009-10-20 16:02:41 UTC (rev 24008)
+++ trunk/blender/source/blender/editors/object/object_ops.c	2009-10-20 16:31:03 UTC (rev 24009)
@@ -166,6 +166,7 @@
 	WM_operatortype_append(OBJECT_OT_vertex_group_normalize);
 	WM_operatortype_append(OBJECT_OT_vertex_group_normalize_all);
 	WM_operatortype_append(OBJECT_OT_vertex_group_invert);
+	WM_operatortype_append(OBJECT_OT_vertex_group_blend);
 	WM_operatortype_append(OBJECT_OT_vertex_group_clean);
 	WM_operatortype_append(OBJECT_OT_vertex_group_menu);
 	WM_operatortype_append(OBJECT_OT_vertex_group_set_active);

Modified: trunk/blender/source/blender/editors/object/object_vgroup.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_vgroup.c	2009-10-20 16:02:41 UTC (rev 24008)
+++ trunk/blender/source/blender/editors/object/object_vgroup.c	2009-10-20 16:31:03 UTC (rev 24009)
@@ -733,6 +733,90 @@
 	}
 }
 
+static void vgroup_blend(Object *ob)
+{
+	bDeformGroup *dg;
+	MDeformWeight *dw;
+	MDeformVert *dvert_array=NULL, *dvert;
+	int i, def_nr, dvert_tot=0;
+
+	EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)ob->data));
+	// ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot);
+
+	if(em==NULL)
+		return;
+
+	dg = BLI_findlink(&ob->defbase, (ob->actdef-1));
+
+	if(dg) {
+		int sel1, sel2;
+		int i1, i2;
+
+		EditEdge *eed;
+		EditVert *eve;
+		float *vg_weights;
+		float *vg_users;
+
+		def_nr= ob->actdef-1;
+
+		i= 0;
+		for(eve= em->verts.first; eve; eve= eve->next)
+			eve->tmp.l= i++;
+
+		dvert_tot= i;
+
+		vg_weights= MEM_callocN(sizeof(float)*dvert_tot, "vgroup_blend_f");
+		vg_users= MEM_callocN(sizeof(int)*dvert_tot, "vgroup_blend_i");
+
+		for(eed= em->edges.first; eed; eed= eed->next) {
+			sel1= eed->v1->f & SELECT;
+			sel2= eed->v2->f & SELECT;
+
+			if(sel1 != sel2) {
+				/* i1 is always the selected one */
+				if(sel1==TRUE && sel2==FALSE) {
+					i1= eed->v1->tmp.l;
+					i2= eed->v2->tmp.l;
+					eve= eed->v2;
+				}
+				else {
+					i2= eed->v1->tmp.l;
+					i1= eed->v2->tmp.l;
+					eve= eed->v1;
+				}
+
+				vg_users[i1]++;
+
+				/* TODO, we may want object mode blending */
+				if(em)	dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
+				else	dvert= dvert_array+i2;
+
+				dw= ED_vgroup_weight_get(dvert, def_nr);
+
+				if(dw) {
+					vg_weights[i1] += dw->weight;
+				}
+			}
+		}
+
+		i= 0;
+		for(eve= em->verts.first; eve; eve= eve->next) {
+			if(eve->f & SELECT && vg_users[i] > 0) {
+				/* TODO, we may want object mode blending */
+				if(em)	dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
+				else	dvert= dvert_array+i;
+
+				dw= ED_vgroup_weight_verify(dvert, def_nr);
+				dw->weight= vg_weights[i] / (float)vg_users[i];
+			}
+
+			i++;
+		}
+		MEM_freeN(vg_weights);
+		MEM_freeN(vg_users);
+	}
+}
+
 static void vgroup_clean(Object *ob, float eul, int keep_single)
 {
 	bDeformGroup *dg;
@@ -1472,6 +1556,35 @@
 	RNA_def_boolean(ot->srna, "auto_remove", TRUE, "Remove Weights", "Remove verts from groups that have zero weight after inverting.");
 }
 
+
+static int vertex_group_blend_exec(bContext *C, wmOperator *op)
+{
+	Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+
+	vgroup_blend(ob);
+
+	DAG_id_flush_update(&ob->id, OB_RECALC_DATA);
+	WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
+	WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data);
+
+	return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_vertex_group_blend(wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name= "Blend Vertex Group";
+	ot->idname= "OBJECT_OT_vertex_group_blend";
+
+	/* api callbacks */
+	ot->poll= vertex_group_poll;
+	ot->exec= vertex_group_blend_exec;
+
+	/* flags */
+	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+
 static int vertex_group_clean_exec(bContext *C, wmOperator *op)
 {
 	Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data;





More information about the Bf-blender-cvs mailing list