Revision: 24432
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=24432
Author:   joeedh
Date:     2009-11-09 23:47:55 +0100 (Mon, 09 Nov 2009)

Log Message:
-----------
fixed loopcut preview issues for the most part, though there's still an 
occasional problem I need to track down

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c
    branches/bmesh/blender/source/blender/editors/mesh/loopcut.c

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c   
2009-11-09 22:42:41 UTC (rev 24431)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmesh_select.c   
2009-11-09 22:47:55 UTC (rev 24432)
@@ -494,9 +494,14 @@
 
        if(vc->v3d->drawtype>OB_WIRE && (vc->v3d->flag & V3D_ZBUF_SELECT)) {
                int distance;
-               unsigned int index = view3d_sample_backbuf_rect(vc, vc->mval, 
50, bm_solidoffs, bm_wireoffs, &distance,0, NULL, NULL);
-               BMEdge *eed = BMIter_AtIndex(vc->em->bm, BM_EDGES_OF_MESH, 
NULL, index-1);
-
+               unsigned int index;
+               BMEdge *eed;
+               
+               view3d_validate_backbuf(vc);
+               
+               index = view3d_sample_backbuf_rect(vc, vc->mval, 50, 
bm_solidoffs, bm_wireoffs, &distance,0, NULL, NULL);
+               eed = BMIter_AtIndex(vc->em->bm, BM_EDGES_OF_MESH, NULL, 
index-1);
+               
                if (eed && distance<*dist) {
                        *dist = distance;
                        return eed;

Modified: branches/bmesh/blender/source/blender/editors/mesh/loopcut.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/loopcut.c        
2009-11-09 22:42:41 UTC (rev 24431)
+++ branches/bmesh/blender/source/blender/editors/mesh/loopcut.c        
2009-11-09 22:47:55 UTC (rev 24432)
@@ -123,12 +123,55 @@
        glEnable(GL_DEPTH_TEST);
 }
 
+/*given two opposite edges in a face, finds the ordering of their vertices so
+  that cut preview lines won't cross each other*/
+static void edgering_find_order(BMEditMesh *em, BMEdge *lasteed, BMEdge *eed, 
+                                BMVert *lastv1, BMVert *v[2][2])
+{
+       BMIter iter, liter;
+       BMLoop *l, *l2;
+       int rev;
+
+       l = eed->loop;
+
+       /*find correct order for v[1]*/
+       if (!(BM_Edge_In_Face(l->f, eed) && BM_Edge_In_Face(l->f, lasteed))) {
+               BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_LOOP, l) {
+                       if (BM_Edge_In_Face(l->f, eed) && BM_Edge_In_Face(l->f, 
lasteed))
+                               break;
+               }
+       }
+       
+       /*this should never happen*/
+       if (!l) {
+               v[0][0] = eed->v1;
+               v[0][1] = eed->v2;
+               v[1][0] = lasteed->v1;
+               v[1][1] = lasteed->v2;
+               return;
+       }
+       
+       l2 = BM_OtherFaceLoop(l->e, l->f, eed->v1);
+       rev = (l2 == (BMLoop*)l->head.prev);
+       while (l2->v != lasteed->v1 && l2->v != lasteed->v2) {
+               l2 = rev ? (BMLoop*)l2->head.prev : (BMLoop*)l2->head.next;
+       }
+
+       if (l2->v == lastv1) {
+               v[0][0] = eed->v1;
+               v[0][1] = eed->v2;
+       } else {
+               v[0][0] = eed->v2;
+               v[0][1] = eed->v1;
+       }
+}
+
 static void edgering_sel(tringselOpData *lcd, int previewlines, int select)
 {
        BMEditMesh *em = lcd->em;
        BMEdge *startedge = lcd->eed;
        BMEdge *eed, *lasteed;
-       BMVert *v[2][2];
+       BMVert *v[2][2], *lastv1;
        BMWalker walker;
        float (*edges)[2][3] = NULL;
        BLI_array_declare(edges);
@@ -161,48 +204,25 @@
 
        BMW_Init(&walker, em->bm, BMW_EDGERING, 0, 0);
        eed = startedge = BMW_Begin(&walker, startedge);
+       lastv1 = NULL;
        for (lasteed=NULL; eed; eed=BMW_Step(&walker)) {
                if (lasteed) {
                        BMIter liter;
                        BMLoop *l, *l2;
                        int rev;
 
-                       v[0][0] = eed->v1;
-                       v[0][1] = eed->v2;
-                       v[1][0] = lasteed->v1;
-                       v[1][1] = lasteed->v2;
-
-#if 0 //hrm.  this code may be useful later.
-                       /*find correct order for v[1]*/
-
-                       l = eed->loop;
-                       if (!(BM_Edge_In_Face(l->f, eed) && 
BM_Edge_In_Face(l->f, lasteed))) {
-                               BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_LOOP, l) 
{
-                                       if (BM_Edge_In_Face(l->f, eed) && 
BM_Edge_In_Face(l->f, lasteed))
-                                               break;
-                               }
-                       }
-                       
-                       /*this should never happen*/
-                       if (!l) {
-                               lasteed = eed;
-                               continue;
-                       }
-                       
-                       l2 = BM_OtherFaceLoop(l->e, l->f, l->v);
-                       rev = (l2 == (BMLoop*)l->head.prev);
-                       while (l2->v != lasteed->v1 && l2->v != lasteed->v2) {
-                               l2 = rev ? (BMLoop*)l2->head.prev : 
(BMLoop*)l2->head.next;
-                       }
-
-                       if (l2->v == lasteed->v1) {
+                       if (lastv1) {
+                               v[1][0] = v[0][0];
+                               v[1][1] = v[0][1];
+                       } else {
                                v[1][0] = lasteed->v1;
                                v[1][1] = lasteed->v2;
-                       } else {
-                               v[1][0] = lasteed->v2;
-                               v[1][1] = lasteed->v1;
+                               lastv1 = lasteed->v1;
                        }
-#endif
+
+                       edgering_find_order(em, lasteed, eed, lastv1, v);
+                       lastv1 = v[0][0];
+
                        for(i=1;i<=previewlines;i++){
                                co[0][0] = (v[0][1]->co[0] - 
v[0][0]->co[0])*(i/((float)previewlines+1))+v[0][0]->co[0];
                                co[0][1] = (v[0][1]->co[1] - 
v[0][0]->co[1])*(i/((float)previewlines+1))+v[0][0]->co[1];
@@ -222,10 +242,8 @@
        }
        
        if (BM_Edge_Share_Faces(lasteed, startedge)) {
-               v[0][0] = startedge->v1;
-               v[0][1] = startedge->v2;
-               v[1][0] = lasteed->v1;
-               v[1][1] = lasteed->v2;
+               edgering_find_order(em, lasteed, startedge, lastv1, v);
+
                for(i=1;i<=previewlines;i++){
                        co[0][0] = (v[0][1]->co[0] - 
v[0][0]->co[0])*(i/((float)previewlines+1))+v[0][0]->co[0];
                        co[0][1] = (v[0][1]->co[1] - 
v[0][0]->co[1])*(i/((float)previewlines+1))+v[0][0]->co[1];
@@ -412,20 +430,6 @@
                        
                        ED_region_tag_redraw(lcd->ar);
                        break;
-               case WHEELUPMOUSE:  /* change number of cuts */
-                       cuts++;
-                       RNA_int_set(op->ptr,"number_cuts",cuts);
-                       ringsel_find_edge(lcd, C, lcd->ar, cuts);
-                       
-                       ED_region_tag_redraw(lcd->ar);
-                       break;
-               case WHEELDOWNMOUSE:  /* change number of cuts */
-                       cuts=MAX2(cuts-1,1);
-                       RNA_int_set(op->ptr,"number_cuts",cuts);
-                       ringsel_find_edge(lcd, C, lcd->ar,cuts);
-                       
-                       ED_region_tag_redraw(lcd->ar);
-                       break;
                case MOUSEMOVE: { /* mouse moved somewhere to select another 
loop */
                        int dist = 75;
                        BMEdge *edge;
@@ -485,14 +489,22 @@
                        
                        ED_region_tag_redraw(lcd->ar);
                        break;
+               case PAGEUPKEY:
                case WHEELUPMOUSE:  /* change number of cuts */
+                       if (event->val == KM_RELEASE)
+                               break;
+
                        cuts++;
                        RNA_int_set(op->ptr,"number_cuts",cuts);
                        ringsel_find_edge(lcd, C, lcd->ar, cuts);
                        
                        ED_region_tag_redraw(lcd->ar);
                        break;
+               case PAGEDOWNKEY:
                case WHEELDOWNMOUSE:  /* change number of cuts */
+                       if (event->val == KM_RELEASE)
+                               break;
+
                        cuts=MAX2(cuts-1,1);
                        RNA_int_set(op->ptr,"number_cuts",cuts);
                        ringsel_find_edge(lcd, C, lcd->ar,cuts);


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

Reply via email to