[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52557] trunk/blender/source/blender: Fix #33285: loop cut is not supposed to cut through triangles/ngons, but it

Brecht Van Lommel brechtvanlommel at pandora.be
Mon Nov 26 08:00:00 CET 2012


Revision: 52557
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52557
Author:   blendix
Date:     2012-11-26 06:59:59 +0000 (Mon, 26 Nov 2012)
Log Message:
-----------
Fix #33285: loop cut is not supposed to cut through triangles/ngons, but it
still happened  when the loop would go all the way around the mesh with just one
triangle/ngon inbetween to close the loop.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c
    trunk/blender/source/blender/bmesh/intern/bmesh_operators.h
    trunk/blender/source/blender/bmesh/intern/bmesh_queries.c
    trunk/blender/source/blender/bmesh/intern/bmesh_queries.h
    trunk/blender/source/blender/bmesh/operators/bmo_subdivide.c
    trunk/blender/source/blender/editors/mesh/editmesh_loopcut.c
    trunk/blender/source/blender/editors/mesh/editmesh_tools.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2012-11-26 06:59:50 UTC (rev 52556)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2012-11-26 06:59:59 UTC (rev 52557)
@@ -911,6 +911,7 @@
 	 {"quad_corner_type",  BMO_OP_SLOT_INT}, /* quad corner type, see bmesh_operators.h */
 	 {"use_gridfill", BMO_OP_SLOT_BOOL},   /* fill in fully-selected faces with a grid */
 	 {"use_singleedge", BMO_OP_SLOT_BOOL}, /* tessellate the case of one edge selected in a quad or triangle */
+	 {"use_onlyquads", BMO_OP_SLOT_BOOL},  /* only subdivide quads (for loopcut) */
 	 {"use_sphere", BMO_OP_SLOT_BOOL},     /* for making new primitives only */
 	 {{'\0'}},
 	},

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_operators.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_operators.h	2012-11-26 06:59:50 UTC (rev 52556)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_operators.h	2012-11-26 06:59:59 UTC (rev 52557)
@@ -98,6 +98,7 @@
                         int numcuts,
                         int seltype, int cornertype,
                         const short use_singleedge, const short use_gridfill,
+                        const short use_onlyquads,
                         int seed);
 
 #include "intern/bmesh_operator_api_inline.h"

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_queries.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_queries.c	2012-11-26 06:59:50 UTC (rev 52556)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_queries.c	2012-11-26 06:59:59 UTC (rev 52557)
@@ -824,6 +824,29 @@
 }
 
 /**
+ *	Test if e1 shares any quad faces with e2
+ */
+int BM_edge_share_quad_check(BMEdge *e1, BMEdge *e2)
+{
+	BMLoop *l;
+	BMFace *f;
+
+	if (e1->l && e2->l) {
+		l = e1->l;
+		do {
+			f = l->f;
+			if (f->len == 4) {
+				if (bmesh_radial_face_find(e2, f)) {
+					return TRUE;
+				}
+			}
+			l = l->radial_next;
+		} while (l != e1->l);
+	}
+	return FALSE;
+}
+
+/**
  *	Tests to see if e1 shares a vertex with e2
  */
 int BM_edge_share_vert_check(BMEdge *e1, BMEdge *e2)

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_queries.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_queries.h	2012-11-26 06:59:50 UTC (rev 52556)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_queries.h	2012-11-26 06:59:59 UTC (rev 52557)
@@ -90,6 +90,7 @@
 int     BM_face_share_face_check(BMFace *f1, BMFace *f2);
 int     BM_face_share_edge_check(BMFace *f1, BMFace *f2);
 int     BM_edge_share_face_check(BMEdge *e1, BMEdge *e2);
+int     BM_edge_share_quad_check(BMEdge *e1, BMEdge *e2);
 int     BM_edge_share_vert_check(BMEdge *e1, BMEdge *e2);
 
 BMVert *BM_edge_share_vert(BMEdge *e1, BMEdge *e2);

Modified: trunk/blender/source/blender/bmesh/operators/bmo_subdivide.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_subdivide.c	2012-11-26 06:59:50 UTC (rev 52556)
+++ trunk/blender/source/blender/bmesh/operators/bmo_subdivide.c	2012-11-26 06:59:59 UTC (rev 52557)
@@ -715,7 +715,7 @@
 	BMFace *face;
 	BLI_array_declare(verts);
 	float smooth, fractal, along_normal;
-	int use_sphere, cornertype, use_singleedge, use_gridfill;
+	int use_sphere, cornertype, use_singleedge, use_gridfill, use_onlyquads;
 	int skey, seed, i, j, matched, a, b, numcuts, totesel;
 	
 	BMO_slot_buffer_flag_enable(bm, op->slots_in, "edges", BM_EDGE, SUBD_SPLIT);
@@ -729,6 +729,7 @@
 
 	use_singleedge = BMO_slot_bool_get(op->slots_in, "use_singleedge");
 	use_gridfill   = BMO_slot_bool_get(op->slots_in, "use_gridfill");
+	use_onlyquads  = BMO_slot_bool_get(op->slots_in, "use_onlyquads");
 	use_sphere     = BMO_slot_bool_get(op->slots_in, "use_sphere");
 	
 	BLI_srandom(seed);
@@ -804,6 +805,10 @@
 		BMEdge *e1 = NULL, *e2 = NULL;
 		float vec1[3], vec2[3];
 
+		/* skip non-quads if requested */
+		if(use_onlyquads && face->len != 4)
+			continue;
+
 		/* figure out which pattern to use */
 
 		BLI_array_empty(edges);
@@ -1089,6 +1094,7 @@
                         int numcuts,
                         int seltype, int cornertype,
                         const short use_singleedge, const short use_gridfill,
+                        const short use_onlyquads,
                         int seed)
 {
 	BMOperator op;
@@ -1100,12 +1106,14 @@
 	             "cuts=%i "
 	             "quad_corner_type=%i "
 	             "use_singleedge=%b use_gridfill=%b "
+				 "use_onlyquads=%b "
 	             "seed=%i",
 	             edge_hflag,
 	             smooth, fractal, along_normal,
 	             numcuts,
 	             cornertype,
 	             use_singleedge, use_gridfill,
+				 use_onlyquads,
 	             seed);
 	
 	BMO_op_exec(bm, &op);

Modified: trunk/blender/source/blender/editors/mesh/editmesh_loopcut.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_loopcut.c	2012-11-26 06:59:50 UTC (rev 52556)
+++ trunk/blender/source/blender/editors/mesh/editmesh_loopcut.c	2012-11-26 06:59:59 UTC (rev 52557)
@@ -261,7 +261,11 @@
 		lasteed = eed;
 	}
 	
+#ifdef BMW_EDGERING_NGON
 	if (lasteed != startedge && BM_edge_share_face_check(lasteed, startedge)) {
+#else
+	if (lasteed != startedge && BM_edge_share_quad_check(lasteed, startedge)) {
+#endif
 		v[1][0] = v[0][0];
 		v[1][1] = v[0][1];
 
@@ -309,6 +313,11 @@
 	RingSelOpData *lcd = op->customdata;
 	const int cuts = RNA_int_get(op->ptr, "number_cuts");
 	const float smoothness = 0.292f * RNA_float_get(op->ptr, "smoothness");
+#ifdef BMW_EDGERING_NGON
+	const int use_onlyquads = FALSE;
+#else
+	const int use_onlyquads = TRUE;
+#endif
 
 	if (lcd->eed) {
 		BMEditMesh *em = lcd->em;
@@ -322,7 +331,8 @@
 			BM_mesh_esubdivide(em->bm, BM_ELEM_SELECT,
 			                   smoothness, 0.0f, 0.0f,
 			                   cuts,
-			                   SUBDIV_SELECT_LOOPCUT, SUBD_PATH, 0, TRUE, 0);
+			                   SUBDIV_SELECT_LOOPCUT, SUBD_PATH, 0, TRUE,
+							   use_onlyquads, 0);
 
 			/* force edge slide to edge select mode in in face select mode */
 			if (em->selectmode & SCE_SELECT_FACE) {

Modified: trunk/blender/source/blender/editors/mesh/editmesh_tools.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_tools.c	2012-11-26 06:59:50 UTC (rev 52556)
+++ trunk/blender/source/blender/editors/mesh/editmesh_tools.c	2012-11-26 06:59:59 UTC (rev 52557)
@@ -109,7 +109,7 @@
 	                   smooth, fractal, along_normal,
 	                   cuts,
 	                   SUBDIV_SELECT_ORIG, RNA_enum_get(op->ptr, "quadcorner"),
-	                   RNA_boolean_get(op->ptr, "quadtri"), TRUE,
+	                   RNA_boolean_get(op->ptr, "quadtri"), TRUE, FALSE,
 	                   RNA_int_get(op->ptr, "seed"));
 
 	EDBM_update_generic(C, em, TRUE);




More information about the Bf-blender-cvs mailing list