[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43707] branches/bmesh/blender/source/ blender/bmesh/operators/createops.c: fix [#28577] TODO: Make Face (Fkey) fails with isolated verts

Campbell Barton ideasman42 at gmail.com
Thu Jan 26 07:26:32 CET 2012


Revision: 43707
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43707
Author:   campbellbarton
Date:     2012-01-26 06:26:17 +0000 (Thu, 26 Jan 2012)
Log Message:
-----------
fix [#28577] TODO: Make Face (Fkey) fails with isolated verts

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/operators/createops.c

Modified: branches/bmesh/blender/source/blender/bmesh/operators/createops.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/createops.c	2012-01-26 03:27:10 UTC (rev 43706)
+++ branches/bmesh/blender/source/blender/bmesh/operators/createops.c	2012-01-26 06:26:17 UTC (rev 43707)
@@ -1200,6 +1200,76 @@
 		BMO_SetFlag(bm, h, ELE_NEW);
 	}
 	
+	/* --- Support for Special Case ---
+	 * where there is a contiguous edge ring with one isolated vertex.
+	 *
+	 * This example shows 2 edges created from 3 verts
+	 * with 1 free standing vertex. Dotted lines denote the 2 edges that are created.
+	 *
+	 * note that this works for any sided shape.
+	 *
+	 * +--------+
+	 * |        .
+	 * |        .
+	 * |        .
+	 * |        .
+	 * +........+ <-- starts out free standing.
+	 *
+	 */
+
+	/* Here we check for consistancy and create 2 edges */
+	if (totf == 0 && totv >= 4 && totv == tote + 2) {
+		/* find a free standing vertex and 2 endpoint verts */
+		BMVert *v_free = NULL, *v_a = NULL, *v_b = NULL;
+		int ok = TRUE;
+
+
+		BMO_ITER(v, &oiter, bm, op, "geom", BM_VERT) {
+			int tot_edges = 0;
+			BM_ITER(e, &iter, bm, BM_EDGES_OF_VERT, v) {
+				if (BMO_TestFlag(bm, e, ELE_NEW)) {
+					tot_edges++;
+					if (tot_edges > 2) {
+						break;
+					}
+				}
+			}
+
+			if (tot_edges == 0) {
+				/* only accept 1 free vert */
+				if (v_free == NULL)  v_free = v;
+				else                 ok = FALSE;
+			}
+			else if (tot_edges == 1) {
+				if (v_a == NULL)       v_a = v;
+				else if (v_b == NULL)  v_b = v;
+				else                   ok = FALSE;
+			}
+			else if (tot_edges == 2) {
+				/* do nothing, common case */
+			}
+			else {
+				ok = FALSE;
+			}
+
+			if (ok == FALSE) {
+				break;
+			}
+		}
+
+		if (ok == TRUE && v_free && v_a && v_b) {
+			/* now find 2 verts that only have 1 edge, */
+			e = BM_Make_Edge(bm, v_free, v_a, NULL, 1);
+			BMO_SetFlag(bm, &e->head, ELE_NEW);
+
+			e = BM_Make_Edge(bm, v_free, v_b, NULL, 1);
+			BMO_SetFlag(bm, &e->head, ELE_NEW);
+		}
+	}
+	/* --- end special case support, continue as normal --- */
+
+
+
 	/*call edgenet create*/
 	/*  call edgenet prepare op so additional face creation cases work*/
 	BMO_InitOpf(bm, &op2, "edgenet_prepare edges=%fe", ELE_NEW);



More information about the Bf-blender-cvs mailing list