[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44629] trunk/blender/source/blender: bmesh: add back feature from 2. 4x Ctrl+Shift+T subdivides quads in the alternate direction.

Campbell Barton ideasman42 at gmail.com
Sun Mar 4 03:18:23 CET 2012


Revision: 44629
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44629
Author:   campbellbarton
Date:     2012-03-04 02:18:17 +0000 (Sun, 04 Mar 2012)
Log Message:
-----------
bmesh: add back feature from 2.4x Ctrl+Shift+T subdivides quads in the alternate direction.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c
    trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c
    trunk/blender/source/blender/bmesh/intern/bmesh_polygon.h
    trunk/blender/source/blender/bmesh/operators/bmo_triangulate.c
    trunk/blender/source/blender/editors/mesh/bmesh_tools.c
    trunk/blender/source/blender/editors/mesh/mesh_ops.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2012-03-04 02:09:02 UTC (rev 44628)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2012-03-04 02:18:17 UTC (rev 44629)
@@ -676,6 +676,7 @@
 	 {BMO_OP_SLOT_ELEMENT_BUF, "edgeout"},
 	 {BMO_OP_SLOT_ELEMENT_BUF, "faceout"},
 	 {BMO_OP_SLOT_MAPPING, "facemap"},
+	 {BMO_OP_SLOT_BOOL, "use_beauty"},
 	 {0} /* null-terminating sentine */},
 	bmo_triangulate_exec,
 	BMO_OP_FLAG_UNTAN_MULTIRES

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c	2012-03-04 02:09:02 UTC (rev 44628)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c	2012-03-04 02:18:17 UTC (rev 44629)
@@ -703,56 +703,78 @@
 }
 
 /**
- * \brief FIND EAR
+ * \brief Find Ear
  *
  * Used by tesselator to find
  * the next triangle to 'clip off'
  * of a polygon while tessellating.
+ *
+ * \param use_beauty Currently only applies to quads, can be extended later on.
+ *
  */
-static BMLoop *find_ear(BMesh *UNUSED(bm), BMFace *f, float (*verts)[3], const int nvert)
+static BMLoop *find_ear(BMesh *UNUSED(bm), BMFace *f, float (*verts)[3], const int nvert, const int use_beauty)
 {
-	BMVert *v1, *v2, *v3;
 	BMLoop *bestear = NULL;
 
 	BMLoop *l_iter;
 	BMLoop *l_first;
-	/* float angle, bestangle = 180.0f; */
-	int isear /*, i = 0 */;
-	
-	l_iter = l_first = BM_FACE_FIRST_LOOP(f);
-	do {
-		isear = 1;
-		
-		v1 = l_iter->prev->v;
-		v2 = l_iter->v;
-		v3 = l_iter->next->v;
 
-		if (BM_edge_exists(v1, v3)) {
-			isear = 0;
-		}
-		else if (!goodline(verts, f, BM_elem_index_get(v1), BM_elem_index_get(v2), BM_elem_index_get(v3), nvert)) {
-			isear = 0;
-		}
+	if (f->len == 4) {
+		BMLoop *larr[4];
+		int i = 0;
 
-		if (isear) {
-#if 0
-			/* if this code comes back, it needs to be converted to radians */
-			angle = angle_v3v3v3(verts[v1->head.eflag2], verts[v2->head.eflag2], verts[v3->head.eflag2]);
-			if (!bestear || ABS(angle - 45.0f) < bestangle) {
-				bestear = l;
-				bestangle = ABS(45.0f - angle);
+		l_iter = l_first = BM_FACE_FIRST_LOOP(f);
+		do {
+			larr[i] = l_iter;
+			i++;
+		} while ((l_iter = l_iter->next) != l_first);
+
+		/* pick 0/1 based on best lenth */
+		bestear = larr[(((len_squared_v3v3(larr[0]->v->co, larr[2]->v->co) >
+		                  len_squared_v3v3(larr[1]->v->co, larr[3]->v->co))) != use_beauty)];
+
+	}
+	else {
+		BMVert *v1, *v2, *v3;
+
+		/* float angle, bestangle = 180.0f; */
+		int isear /*, i = 0 */;
+
+		l_iter = l_first = BM_FACE_FIRST_LOOP(f);
+		do {
+			isear = 1;
+
+			v1 = l_iter->prev->v;
+			v2 = l_iter->v;
+			v3 = l_iter->next->v;
+
+			if (BM_edge_exists(v1, v3)) {
+				isear = 0;
 			}
-			
-			if (angle > 20 && angle < 90) break;
-			if (angle < 100 && i > 5) break;
-			i += 1;
-#endif
+			else if (!goodline(verts, f, BM_elem_index_get(v1), BM_elem_index_get(v2), BM_elem_index_get(v3), nvert)) {
+				isear = 0;
+			}
 
-			bestear = l_iter;
-			break;
-		}
-	} while ((l_iter = l_iter->next) != l_first);
+			if (isear) {
+	#if 0
+				/* if this code comes back, it needs to be converted to radians */
+				angle = angle_v3v3v3(verts[v1->head.eflag2], verts[v2->head.eflag2], verts[v3->head.eflag2]);
+				if (!bestear || ABS(angle - 45.0f) < bestangle) {
+					bestear = l;
+					bestangle = ABS(45.0f - angle);
+				}
 
+				if (angle > 20 && angle < 90) break;
+				if (angle < 100 && i > 5) break;
+				i += 1;
+	#endif
+
+				bestear = l_iter;
+				break;
+			}
+		} while ((l_iter = l_iter->next) != l_first);
+	}
+
 	return bestear;
 }
 
@@ -772,7 +794,8 @@
  * \note newedgeflag sets a flag layer flag, obviously not the header flag.
  */
 void BM_face_triangulate(BMesh *bm, BMFace *f, float (*projectverts)[3],
-                         const short newedge_oflag, const short newface_oflag, BMFace **newfaces)
+                         const short newedge_oflag, const short newface_oflag, BMFace **newfaces,
+                         const short use_beauty)
 {
 	int i, done, nvert, nf_i = 0;
 	BMLoop *newl, *nextloop;
@@ -806,7 +829,7 @@
 	done = 0;
 	while (!done && f->len > 3) {
 		done = 1;
-		l_iter = find_ear(bm, f, projectverts, nvert);
+		l_iter = find_ear(bm, f, projectverts, nvert, use_beauty);
 		if (l_iter) {
 			done = 0;
 			/* v = l->v; */ /* UNUSED */
@@ -848,7 +871,7 @@
 			if (!f) {
 				printf("triangle fan step of triangulator failed.\n");
 
-				/* NULL-terminat */
+				/* NULL-terminate */
 				if (newfaces) newfaces[nf_i] = NULL;
 				return;
 			}
@@ -861,7 +884,7 @@
 		}
 	}
 	
-	/* NULL-terminat */
+	/* NULL-terminate */
 	if (newfaces) newfaces[nf_i] = NULL;
 }
 

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_polygon.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_polygon.h	2012-03-04 02:09:02 UTC (rev 44628)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_polygon.h	2012-03-04 02:18:17 UTC (rev 44629)
@@ -43,7 +43,8 @@
 int   BM_face_point_inside_test(BMesh *bm, BMFace *f, const float co[3]);
 
 void  BM_face_triangulate(BMesh *bm, BMFace *f, float (*projectverts)[3],
-                         const short newedge_oflag, const short newface_oflag, BMFace **newfaces);
+                          const short newedge_oflag, const short newface_oflag, BMFace **newfaces,
+                          const short use_beauty);
 
 void  BM_face_legal_splits(BMesh *bm, BMFace *f, BMLoop *(*loops)[2], int len);
 

Modified: trunk/blender/source/blender/bmesh/operators/bmo_triangulate.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_triangulate.c	2012-03-04 02:09:02 UTC (rev 44628)
+++ trunk/blender/source/blender/bmesh/operators/bmo_triangulate.c	2012-03-04 02:18:17 UTC (rev 44629)
@@ -47,7 +47,8 @@
 	float (*projectverts)[3] = NULL;
 	BLI_array_declare(projectverts);
 	int i, lastlen = 0 /* , count = 0 */;
-	
+	const int use_beauty = BMO_slot_bool_get(op, "use_beauty");
+
 	face = BMO_iter_new(&siter, bm, op, "faces", BM_FACE);
 	for ( ; face; face = BMO_iter_step(&siter)) {
 		if (lastlen < face->len) {
@@ -61,7 +62,7 @@
 			}
 		}
 
-		BM_face_triangulate(bm, face, projectverts, EDGE_NEW, FACE_NEW, newfaces);
+		BM_face_triangulate(bm, face, projectverts, EDGE_NEW, FACE_NEW, newfaces, use_beauty);
 
 		BMO_slot_map_ptr_insert(bm, op, "facemap", face, face);
 		for (i = 0; newfaces[i]; i++) {
@@ -159,7 +160,7 @@
 	BMOIter siter;
 	BMEdge *e;
 	BMOperator bmop;
-	ScanFillEdge *eed;
+	/* ScanFillEdge *eed; */ /* UNUSED */
 	ScanFillVert *eve, *v1, *v2;
 	ScanFillFace *efa;
 	SmallHash hash;
@@ -185,7 +186,7 @@
 		
 		v1 = BLI_smallhash_lookup(&hash, (uintptr_t)e->v1);
 		v2 = BLI_smallhash_lookup(&hash, (uintptr_t)e->v2);
-		eed = BLI_addfilledge(v1, v2);
+		/* eed = */ BLI_addfilledge(v1, v2);
 		/* eed->tmp.p = e; */ /* UNUSED */
 	}
 	

Modified: trunk/blender/source/blender/editors/mesh/bmesh_tools.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/bmesh_tools.c	2012-03-04 02:09:02 UTC (rev 44628)
+++ trunk/blender/source/blender/editors/mesh/bmesh_tools.c	2012-03-04 02:18:17 UTC (rev 44629)
@@ -3450,8 +3450,9 @@
 {
 	Object *obedit = CTX_data_edit_object(C);
 	BMEditMesh *em = BMEdit_FromObject(obedit);
+	int use_beauty = RNA_boolean_get(op->ptr, "use_beauty");
 
-	if (!EDBM_CallOpf(em, op, "triangulate faces=%hf", BM_ELEM_SELECT))
+	if (!EDBM_CallOpf(em, op, "triangulate faces=%hf use_beauty=%b", BM_ELEM_SELECT, use_beauty))
 		return OPERATOR_CANCELLED;
 
 	DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
@@ -3472,6 +3473,8 @@
 
 	/* flags */
 	ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
+
+	RNA_def_boolean(ot->srna, "use_beauty", 1, "Beauty", "Use best triangulation division (currently quads only)");
 }
 
 static int tris_convert_to_quads_exec(bContext *C, wmOperator *op)

Modified: trunk/blender/source/blender/editors/mesh/mesh_ops.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/mesh_ops.c	2012-03-04 02:09:02 UTC (rev 44628)
+++ trunk/blender/source/blender/editors/mesh/mesh_ops.c	2012-03-04 02:18:17 UTC (rev 44629)
@@ -309,6 +309,9 @@
 	WM_keymap_add_item(keymap, "MESH_OT_beautify_fill", FKEY, KM_PRESS, KM_SHIFT|KM_ALT, 0);
 
 	WM_keymap_add_item(keymap, "MESH_OT_quads_convert_to_tris", TKEY, KM_PRESS, KM_CTRL, 0);
+	kmi = WM_keymap_add_item(keymap, "MESH_OT_quads_convert_to_tris", TKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
+	RNA_boolean_set(kmi->ptr, "use_beauty", FALSE);
+
 	WM_keymap_add_item(keymap, "MESH_OT_tris_convert_to_quads", JKEY, KM_PRESS, KM_ALT, 0);
 
 	WM_keymap_add_item(keymap, "MESH_OT_rip_move",VKEY, KM_PRESS, 0, 0);




More information about the Bf-blender-cvs mailing list