[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53352] trunk/blender/source/blender: Add 'vertex_only' option to bevel tool.

Howard Trickey howard.trickey at gmail.com
Fri Dec 28 03:45:16 CET 2012


Revision: 53352
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53352
Author:   howardt
Date:     2012-12-28 02:45:10 +0000 (Fri, 28 Dec 2012)
Log Message:
-----------
Add 'vertex_only' option to bevel tool.
Right now, changing segments to > 1 doesn't do anything,
but intend to work on making that cause rounded corners.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c
    trunk/blender/source/blender/bmesh/operators/bmo_bevel.c
    trunk/blender/source/blender/bmesh/tools/bmesh_bevel.c
    trunk/blender/source/blender/bmesh/tools/bmesh_bevel.h
    trunk/blender/source/blender/editors/mesh/editmesh_tools.c
    trunk/blender/source/blender/modifiers/intern/MOD_bevel.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2012-12-28 01:36:00 UTC (rev 53351)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2012-12-28 02:45:10 UTC (rev 53352)
@@ -1403,6 +1403,7 @@
 	{{"geom", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}},     /* input edges and vertices */
 	 {"offset", BMO_OP_SLOT_FLT},           /* amount to offset beveled edge */
 	 {"segments", BMO_OP_SLOT_INT},         /* number of segments in bevel */
+	 {"vertex_only", BMO_OP_SLOT_BOOL},	/* only bevel vertices, not edges */
 	 {{'\0'}},
 	},
 	/* slots_out */

Modified: trunk/blender/source/blender/bmesh/operators/bmo_bevel.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_bevel.c	2012-12-28 01:36:00 UTC (rev 53351)
+++ trunk/blender/source/blender/bmesh/operators/bmo_bevel.c	2012-12-28 02:45:10 UTC (rev 53352)
@@ -34,6 +34,7 @@
 {
 	const float offset = BMO_slot_float_get(op->slots_in, "offset");
 	const int   seg    = BMO_slot_int_get(op->slots_in,   "segments");
+	const int   vonly  = BMO_slot_bool_get(op->slots_in,  "vertex_only");
 
 	if (offset > 0) {
 		BMOIter siter;
@@ -54,7 +55,7 @@
 			}
 		}
 
-		BM_mesh_bevel(bm, offset, seg);
+		BM_mesh_bevel(bm, offset, seg, vonly);
 
 		BMO_slot_buffer_from_enabled_hflag(bm, op, op->slots_out, "faces.out", BM_FACE, BM_ELEM_TAG);
 	}

Modified: trunk/blender/source/blender/bmesh/tools/bmesh_bevel.c
===================================================================
--- trunk/blender/source/blender/bmesh/tools/bmesh_bevel.c	2012-12-28 01:36:00 UTC (rev 53351)
+++ trunk/blender/source/blender/bmesh/tools/bmesh_bevel.c	2012-12-28 02:45:10 UTC (rev 53352)
@@ -119,6 +119,7 @@
 
 	float offset;           /* blender units to offset each side of a beveled edge */
 	int seg;                /* number of segments in beveled edge profile */
+	int vertex_only;	/* bevel vertices only */
 } BevelParams;
 
 // #pragma GCC diagnostic ignored "-Wpadded"
@@ -698,8 +699,9 @@
  * of a vertex on the the boundary of the beveled vertex bv->v.
  * Also decide on the mesh pattern that will be used inside the boundary.
  * Doesn't make the actual BMVerts */
-static void build_boundary(MemArena *mem_arena, BevVert *bv)
+static void build_boundary(BevelParams *bp, BevVert *bv)
 {
+	MemArena *mem_arena = bp->mem_arena;
 	EdgeHalf *efirst, *e;
 	BoundVert *v;
 	VMesh *vm;
@@ -707,9 +709,13 @@
 	const float  *no;
 	float lastd;
 
-	e = efirst = next_bev(bv, NULL);
 	vm = bv->vmesh;
 
+	if (bp->vertex_only)
+		e = efirst = &bv->edges[0];
+	else
+		e = efirst = next_bev(bv, NULL);
+
 	BLI_assert(bv->edgecount >= 2);  /* since bevel edges incident to 2 faces */
 
 	if (bv->edgecount == 2 && bv->selcount == 1) {
@@ -734,7 +740,7 @@
 		return;
 	}
 
-	lastd = e->offset;
+	lastd = bp->vertex_only ? bp->offset : e->offset;
 	vm->boundstart = NULL;
 	do {
 		if (e->is_bev) {
@@ -1325,8 +1331,9 @@
 
 /* Given that the boundary is built, now make the actual BMVerts
  * for the boundary and the interior of the vertex mesh. */
-static void build_vmesh(MemArena *mem_arena, BMesh *bm, BevVert *bv)
+static void build_vmesh(BevelParams *bp, BMesh *bm, BevVert *bv)
 {
+	MemArena *mem_arena = bp->mem_arena;
 	VMesh *vm = bv->vmesh;
 	BoundVert *v, *weld1, *weld2;
 	int n, ns, ns2, i, k, weld;
@@ -1504,7 +1511,7 @@
 	 */
 
 	BM_ITER_ELEM (bme, &iter, v, BM_EDGES_OF_VERT) {
-		if (BM_elem_flag_test(bme, BM_ELEM_TAG)) {
+		if (BM_elem_flag_test(bme, BM_ELEM_TAG) && !bp->vertex_only) {
 			BLI_assert(BM_edge_is_manifold(bme));
 			nsel++;
 		}
@@ -1513,7 +1520,7 @@
 		BM_BEVEL_EDGE_TAG_DISABLE(bme);
 	}
 
-	if (nsel == 0) {
+	if ((nsel == 0 && !bp->vertex_only) || (ntot < 3 && bp->vertex_only)) {
 		/* signal this vert isn't being beveled */
 		BM_elem_flag_disable(v, BM_ELEM_TAG);
 		return;
@@ -1570,7 +1577,7 @@
 		}
 		bme = e->e;
 		BM_BEVEL_EDGE_TAG_ENABLE(bme);
-		if (BM_elem_flag_test(bme, BM_ELEM_TAG)) {
+		if (BM_elem_flag_test(bme, BM_ELEM_TAG) && !bp->vertex_only) {
 			e->is_bev = TRUE;
 			e->seg = bp->seg;
 		}
@@ -1626,8 +1633,8 @@
 		BM_BEVEL_EDGE_TAG_DISABLE(e->e);
 	}
 
-	build_boundary(bp->mem_arena, bv);
-	build_vmesh(bp->mem_arena, bm, bv);
+	build_boundary(bp, bv);
+	build_vmesh(bp, bm, bv);
 }
 
 /* Face f has at least one beveled vertex.  Rebuild f */
@@ -1790,7 +1797,7 @@
  *
  * \warning all tagged edges _must_ be manifold.
  */
-void BM_mesh_bevel(BMesh *bm, const float offset, const float segments)
+void BM_mesh_bevel(BMesh *bm, const float offset, const float segments, const int vertex_only)
 {
 	BMIter iter;
 	BMVert *v;
@@ -1799,6 +1806,7 @@
 
 	bp.offset = offset;
 	bp.seg    = segments;
+	bp.vertex_only = vertex_only;
 
 	if (bp.offset > 0) {
 		/* primary alloc */
@@ -1814,9 +1822,11 @@
 		}
 
 		/* Build polygons for edges */
-		BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
-			if (BM_elem_flag_test(e, BM_ELEM_TAG)) {
-				bevel_build_edge_polygons(bm, &bp, e);
+		if (!bp.vertex_only) {
+			BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
+				if (BM_elem_flag_test(e, BM_ELEM_TAG)) {
+					bevel_build_edge_polygons(bm, &bp, e);
+				}
 			}
 		}
 

Modified: trunk/blender/source/blender/bmesh/tools/bmesh_bevel.h
===================================================================
--- trunk/blender/source/blender/bmesh/tools/bmesh_bevel.h	2012-12-28 01:36:00 UTC (rev 53351)
+++ trunk/blender/source/blender/bmesh/tools/bmesh_bevel.h	2012-12-28 02:45:10 UTC (rev 53352)
@@ -27,6 +27,6 @@
  *  \ingroup bmesh
  */
 
-void BM_mesh_bevel(BMesh *bm, const float offset, const float segments);
+void BM_mesh_bevel(BMesh *bm, const float offset, const float segments, const int vertex_only);
 
 #endif /* __BMESH_BEVEL_H__ */

Modified: trunk/blender/source/blender/editors/mesh/editmesh_tools.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_tools.c	2012-12-28 01:36:00 UTC (rev 53351)
+++ trunk/blender/source/blender/editors/mesh/editmesh_tools.c	2012-12-28 02:45:10 UTC (rev 53352)
@@ -4768,6 +4768,7 @@
 #ifdef NEW_BEVEL
 	float offset = RNA_float_get(op->ptr, "offset");
 	int segments = RNA_int_get(op->ptr, "segments");
+	int vertex_only = RNA_boolean_get(op->ptr, "vertex_only");
 
 	/* revert to original mesh */
 	if (opdata->is_modal) {
@@ -4775,8 +4776,8 @@
 	}
 
 	if (!EDBM_op_init(em, &bmop, op,
-		              "bevel geom=%hev offset=%f segments=%i",
-		              BM_ELEM_SELECT, offset, segments))
+		              "bevel geom=%hev offset=%f segments=%i vertex_only=%b",
+		              BM_ELEM_SELECT, offset, segments, vertex_only))
 	{
 		return 0;
 	}
@@ -5101,6 +5102,7 @@
 #ifdef NEW_BEVEL
 	RNA_def_float(ot->srna, "offset", 0.0f, -FLT_MAX, FLT_MAX, "Offset", "", 0.0f, 1.0f);
 	RNA_def_int(ot->srna, "segments", 1, 1, 50, "Segments", "Segments for curved edge", 1, 8);
+	RNA_def_boolean(ot->srna, "vertex_only", FALSE, "Vertex only", "Bevel only vertices");
 #else
 	/* take note, used as a factor _and_ a distance depending on 'use_dist' */
 	RNA_def_float(ot->srna, "percent", 0.0f, -FLT_MAX, FLT_MAX, "Percentage", "", 0.0f, 1.0f);

Modified: trunk/blender/source/blender/modifiers/intern/MOD_bevel.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_bevel.c	2012-12-28 01:36:00 UTC (rev 53351)
+++ trunk/blender/source/blender/modifiers/intern/MOD_bevel.c	2012-12-28 02:45:10 UTC (rev 53352)
@@ -140,7 +140,7 @@
 		}
 	}
 
-	BM_mesh_bevel(bm, bmd->value, segments);
+	BM_mesh_bevel(bm, bmd->value, segments, bmd->flags & BME_BEVEL_VERT);
 
 	result = CDDM_from_bmesh(bm, TRUE);
 




More information about the Bf-blender-cvs mailing list