[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [24432] branches/bmesh/blender/source/ blender/editors/mesh: fixed loopcut preview issues for the most part, though there's still an occasional problem I need to track down

Joseph Eagar joeedh at gmail.com
Mon Nov 9 23:47:58 CET 2009


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);





More information about the Bf-blender-cvs mailing list