[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20964] branches/bmesh/blender/source/ blender: click-extrude works again

Joseph Eagar joeedh at gmail.com
Thu Jun 18 04:05:57 CEST 2009


Revision: 20964
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20964
Author:   joeedh
Date:     2009-06-18 04:05:56 +0200 (Thu, 18 Jun 2009)

Log Message:
-----------
click-extrude works again

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h
    branches/bmesh/blender/source/blender/bmesh/operators/utils.c
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2009-06-18 01:31:50 UTC (rev 20963)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2009-06-18 02:05:56 UTC (rev 20964)
@@ -27,6 +27,16 @@
 	0,
 };
 
+BMOpDefine def_rotate = {
+	"rotate",
+	{{BMOP_OPSLOT_VEC, "cent"},
+	 {BMOP_OPSLOT_MAT, "mat"},
+	{BMOP_OPSLOT_ELEMENT_BUF, "verts"},
+	{0, /*null-terminating sentinel*/}},
+	bmesh_rotate_exec,
+	0,
+};
+
 BMOpDefine def_translate= {
 	"translate",
 	{{BMOP_OPSLOT_VEC, "vec"},
@@ -235,6 +245,7 @@
 	&def_object_load_bmesh,
 	&def_transform,
 	&def_translate,
+	&def_rotate,
 	&def_edgenet_fill,
 	&def_contextual_create,
 };

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h	2009-06-18 01:31:50 UTC (rev 20963)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h	2009-06-18 02:05:56 UTC (rev 20964)
@@ -27,5 +27,6 @@
 void bmesh_transform_exec(BMesh *bm, BMOperator *op);
 void bmesh_contextual_create_exec(BMesh *bm, BMOperator *op);
 void bmesh_edgenet_fill_exec(BMesh *bm, BMOperator *op);
+void bmesh_rotate_exec(BMesh *bm, BMOperator *op);
 
 #endif

Modified: branches/bmesh/blender/source/blender/bmesh/operators/utils.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/utils.c	2009-06-18 01:31:50 UTC (rev 20963)
+++ branches/bmesh/blender/source/blender/bmesh/operators/utils.c	2009-06-18 02:05:56 UTC (rev 20964)
@@ -53,7 +53,7 @@
 	BMVert *v;
 	float mat[4][4], vec[3];
 	
-	BMO_Get_Vec(op, "offset", vec);
+	BMO_Get_Vec(op, "vec", vec);
 
 	Mat4One(mat);
 	VECCOPY(mat[3], vec);
@@ -61,3 +61,22 @@
 	BMO_CallOpf(bm, "transform mat=%m4 verts=%s", mat, op, "verts");
 }
 
+void bmesh_rotate_exec(BMesh *bm, BMOperator *op) {
+	BMOIter iter;
+	BMVert *v;
+	float mat[4][4], vec[3];
+	
+	BMO_Get_Vec(op, "cent", vec);
+	
+	/*there has to be a proper matrix way to do this, but
+	  this is how editmesh did it and I'm too tired to think
+	  through the math right now.*/
+	VecMulf(vec, -1);
+	BMO_CallOpf(bm, "translate verts=%s vec=%v", op, "verts", vec);
+
+	BMO_CallOpf(bm, "transform mat=%s verts=%s", op, "mat", op, "verts");
+
+	VecMulf(vec, -1);
+	BMO_CallOpf(bm, "translate verts=%s vec=%v", op, "verts", vec);
+}
+

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c	2009-06-18 01:31:50 UTC (rev 20963)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c	2009-06-18 02:05:56 UTC (rev 20964)
@@ -831,9 +831,9 @@
 
 static int dupli_extrude_cursor(bContext *C, wmOperator *op, wmEvent *event)
 {
-#if 0 //BMESH_TODO
 	ViewContext vc;
-	EditVert *eve, *v1;
+	BMVert *eve, *v1;
+	BMIter iter;
 	float min[3], max[3];
 	int done= 0;
 	
@@ -841,8 +841,8 @@
 	
 	INIT_MINMAX(min, max);
 	
-	for(v1= vc.em->verts.first;v1; v1=v1->next) {
-		if(v1->f & SELECT) {
+	BM_ITER(v1, &iter, vc.em->bm, BM_VERTS_OF_MESH, NULL) {
+		if(BM_TestHFlag(v1, BM_SELECT)) {
 			DO_MINMAX(v1->co, min, max);
 			done= 1;
 		}
@@ -850,16 +850,18 @@
 
 	/* call extrude? */
 	if(done) {
-		EditEdge *eed;
+		BMEdge *eed;
 		float vec[3], cent[3], mat[3][3];
 		float nor[3]= {0.0, 0.0, 0.0};
 		
 		/* check for edges that are half selected, use for rotation */
 		done= 0;
-		for(eed= vc.em->edges.first; eed; eed= eed->next) {
-			if( (eed->v1->f & SELECT)+(eed->v2->f & SELECT) == SELECT ) {
-				if(eed->v1->f & SELECT) VecSubf(vec, eed->v1->co, eed->v2->co);
-				else VecSubf(vec, eed->v2->co, eed->v1->co);
+		BM_ITER(eed, &iter, vc.em->bm, BM_EDGES_OF_MESH, NULL) {
+			if (BM_TestHFlag(eed->v1, BM_SELECT) ^ BM_TestHFlag(eed->v2, BM_SELECT)) {
+				if(BM_TestHFlag(eed->v1, BM_SELECT)) 
+					VecSubf(vec, eed->v1->co, eed->v2->co);
+				else 
+					VecSubf(vec, eed->v2->co, eed->v1->co);
 				VecAddf(nor, nor, vec);
 				done= 1;
 			}
@@ -903,12 +905,14 @@
 			}
 		}
 		
-		extrudeflag(vc.obedit, vc.em, SELECT, nor);
-		rotateflag(vc.em, SELECT, cent, mat);
-		translateflag(vc.em, SELECT, min);
-		
-		recalc_editnormals(vc.em);
+
+		EDBM_Extrude_edge(vc.obedit, vc.em, SELECT, nor);
+		EDBM_CallOpf(vc.em, op, "rotate verts=%hv cent=%v mat=%m3",
+			BM_SELECT, cent, mat);
+		EDBM_CallOpf(vc.em, op, "translate verts=%hv vec=%v",
+			BM_SELECT, min);
 	}
+	/*
 	else {
 		float mat[3][3],imat[3][3];
 		float *curs= give_cursor(vc.scene, vc.v3d);
@@ -927,13 +931,13 @@
 		
 		eve->f= SELECT;
 	}
-	
+	*/
+
 	//retopo_do_all();
 	WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, vc.obedit); 
 	DAG_object_flush_update(vc.scene, vc.obedit, OB_RECALC_DATA);
 	
 	return OPERATOR_FINISHED;
-#endif
 }
 
 void MESH_OT_dupli_extrude_cursor(wmOperatorType *ot)





More information about the Bf-blender-cvs mailing list