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)


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to