[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