[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54713] trunk/blender: Enable new bevel tool code in bevel modifier.

Howard Trickey howard.trickey at gmail.com
Thu Feb 21 18:29:35 CET 2013


Revision: 54713
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54713
Author:   howardt
Date:     2013-02-21 17:29:35 +0000 (Thu, 21 Feb 2013)
Log Message:
-----------
Enable new bevel tool code in bevel modifier.

Now modifier takes a segments parameter.
Bevel edge weights will multiply the overall amount.
For vertex-only, you can give a vertex group name,
and the weights in that will multiply the overall amount.

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_ui/properties_data_modifier.py
    trunk/blender/source/blender/blenkernel/BKE_bmesh.h
    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/makesrna/intern/rna_modifier.c
    trunk/blender/source/blender/modifiers/intern/MOD_bevel.c

Modified: trunk/blender/release/scripts/startup/bl_ui/properties_data_modifier.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/properties_data_modifier.py	2013-02-21 17:18:27 UTC (rev 54712)
+++ trunk/blender/release/scripts/startup/bl_ui/properties_data_modifier.py	2013-02-21 17:29:35 UTC (rev 54713)
@@ -124,20 +124,17 @@
         split.prop(md, "width")
         split.prop(md, "use_only_vertices")
 
-        # -- new modifier only, this may be reverted in favor of 2.62 mod.
-        '''
-        split = layout.split()
-        split.prop(md, "use_even_offset")
-        split.prop(md, "use_distance_offset")
-        '''
-        # -- end
+        layout.prop(md, "segments")
 
         layout.label(text="Limit Method:")
         layout.row().prop(md, "limit_method", expand=True)
         if md.limit_method == 'ANGLE':
             layout.prop(md, "angle_limit")
-        elif md.limit_method == 'WEIGHT':
-            layout.row().prop(md, "edge_weight_method", expand=True)
+        elif md.limit_method == 'VGROUP':
+            layout.label(text="Vertex Group:")
+            layout.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
+        # elif md.limit_method == 'WEIGHT':
+        #    layout.row().prop(md, "edge_weight_method", expand=True)
 
     def BOOLEAN(self, layout, ob, md):
         split = layout.split()

Modified: trunk/blender/source/blender/blenkernel/BKE_bmesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_bmesh.h	2013-02-21 17:18:27 UTC (rev 54712)
+++ trunk/blender/source/blender/blenkernel/BKE_bmesh.h	2013-02-21 17:29:35 UTC (rev 54713)
@@ -38,7 +38,7 @@
 /*NOTE: this is the bmesh 1.0 code.  it's completely outdated.*/
 
 /* uncomment to use the new bevel operator as a modifier */
-// #define USE_BM_BEVEL_OP_AS_MOD
+#define USE_BM_BEVEL_OP_AS_MOD
 
 /* bevel tool defines */
 /* element flags */
@@ -53,6 +53,7 @@
 #define BME_BEVEL_RADIUS        (1 << 2)
 #define BME_BEVEL_ANGLE         (1 << 3)
 #define BME_BEVEL_WEIGHT        (1 << 4)
+#define BME_BEVEL_VGROUP        (1 << 5)
 //~ #define BME_BEVEL_EWEIGHT		(1<<4)
 //~ #define BME_BEVEL_VWEIGHT		(1<<5)
 #define BME_BEVEL_PERCENT       (1 << 6)

Modified: trunk/blender/source/blender/bmesh/operators/bmo_bevel.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_bevel.c	2013-02-21 17:18:27 UTC (rev 54712)
+++ trunk/blender/source/blender/bmesh/operators/bmo_bevel.c	2013-02-21 17:29:35 UTC (rev 54713)
@@ -55,7 +55,7 @@
 			}
 		}
 
-		BM_mesh_bevel(bm, offset, seg, vonly);
+		BM_mesh_bevel(bm, offset, seg, vonly, false, NULL, -1);
 
 		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	2013-02-21 17:18:27 UTC (rev 54712)
+++ trunk/blender/source/blender/bmesh/tools/bmesh_bevel.c	2013-02-21 17:29:35 UTC (rev 54713)
@@ -30,11 +30,15 @@
 
 #include "MEM_guardedalloc.h"
 
+#include "DNA_object_types.h"
+#include "DNA_meshdata_types.h"
+
 #include "BLI_array.h"
 #include "BLI_math.h"
 #include "BLI_memarena.h"
 
 #include "BKE_customdata.h"
+#include "BKE_deform.h"
 
 #include "bmesh.h"
 #include "./intern/bmesh_private.h"
@@ -104,6 +108,7 @@
 	BMVert *v;          /* original mesh vertex */
 	int edgecount;          /* total number of edges around the vertex */
 	int selcount;           /* number of selected edges around the vertex */
+	float offset;           /* offset for this vertex, if vertex_only bevel */
 	EdgeHalf *edges;        /* array of size edgecount; CCW order from vertex normal side */
 	VMesh *vmesh;           /* mesh structure for replacing vertex */
 } BevVert;
@@ -117,7 +122,10 @@
 
 	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 */
+	bool vertex_only;       /* bevel vertices only */
+	bool use_weights;       /* bevel amount affected by weights on edges or verts */
+	const struct MDeformVert *dvert; /* vertex group array, maybe set if vertex_only */
+	int vertex_group;       /* vertex group index, maybe set if vertex_only */
 } BevelParams;
 
 // #pragma GCC diagnostic ignored "-Wpadded"
@@ -665,7 +673,7 @@
 		return;
 	}
 
-	lastd = bp->vertex_only ? bp->offset : e->offset;
+	lastd = bp->vertex_only? bv->offset : e->offset;
 	vm->boundstart = NULL;
 	do {
 		if (e->is_bev) {
@@ -1722,6 +1730,7 @@
 	BMFace *f;
 	BMIter iter, iter2;
 	EdgeHalf *e;
+	float weight;
 	int i, found_shared_face, ccw_test_sum;
 	int nsel = 0;
 	int ntot = 0;
@@ -1760,11 +1769,24 @@
 	bv->v = v;
 	bv->edgecount = ntot;
 	bv->selcount = nsel;
+	bv->offset = bp->offset;
 	bv->edges = (EdgeHalf *)BLI_memarena_alloc(bp->mem_arena, ntot * sizeof(EdgeHalf));
 	bv->vmesh = (VMesh *)BLI_memarena_alloc(bp->mem_arena, sizeof(VMesh));
 	bv->vmesh->seg = bp->seg;
 	BLI_ghash_insert(bp->vert_hash, v, bv);
 
+	if (bp->vertex_only) {
+		/* if weighted, modify offset by weight */
+		if (bp->dvert != NULL && bp->vertex_group != -1) {
+			weight = defvert_find_weight(bp->dvert + BM_elem_index_get(v), bp->vertex_group);
+			if (weight <= 0.0f) {
+				BM_elem_flag_disable(v, BM_ELEM_TAG);
+				return;
+			}
+			bv->offset *= weight;
+		}
+	}
+
 	/* add edges to bv->edges in order that keeps adjacent edges sharing
 	 * a face, if possible */
 	i = 0;
@@ -1815,7 +1837,16 @@
 			e->seg = 0;
 		}
 		e->is_rev = (bme->v2 == v);
-		e->offset = e->is_bev ? bp->offset : 0.0f;
+		if (e->is_bev) {
+			e->offset = bp->offset;
+			if (bp->use_weights) {
+				weight = BM_elem_float_data_get(&bm->edata, bme, CD_BWEIGHT);
+				e->offset *= weight;
+			}
+		}
+		else {
+			e->offset = 0.0f;
+		}
 	}
 	/* find wrap-around shared face */
 	BM_ITER_ELEM (f, &iter2, bme, BM_FACES_OF_EDGE) {
@@ -2034,7 +2065,9 @@
  *
  * \warning all tagged edges _must_ be manifold.
  */
-void BM_mesh_bevel(BMesh *bm, const float offset, const float segments, const int vertex_only)
+void BM_mesh_bevel(BMesh *bm, const float offset, const float segments,
+                   const bool vertex_only, const bool use_weights,
+                   const struct MDeformVert *dvert, const int vertex_group)
 {
 	BMIter iter;
 	BMVert *v;
@@ -2044,6 +2077,9 @@
 	bp.offset = offset;
 	bp.seg    = segments;
 	bp.vertex_only = vertex_only;
+	bp.use_weights = use_weights;
+	bp.dvert = dvert;
+	bp.vertex_group = vertex_group;
 
 	if (bp.offset > 0) {
 		/* primary alloc */

Modified: trunk/blender/source/blender/bmesh/tools/bmesh_bevel.h
===================================================================
--- trunk/blender/source/blender/bmesh/tools/bmesh_bevel.h	2013-02-21 17:18:27 UTC (rev 54712)
+++ trunk/blender/source/blender/bmesh/tools/bmesh_bevel.h	2013-02-21 17:29:35 UTC (rev 54713)
@@ -27,6 +27,10 @@
  *  \ingroup bmesh
  */
 
-void BM_mesh_bevel(BMesh *bm, const float offset, const float segments, const int vertex_only);
+struct MDeformVert;
 
+void BM_mesh_bevel(BMesh *bm, const float offset, const float segments,
+                   const bool vertex_only, const bool use_weights,
+                   const struct MDeformVert *dvert, const int vertex_group);
+
 #endif /* __BMESH_BEVEL_H__ */

Modified: trunk/blender/source/blender/makesrna/intern/rna_modifier.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_modifier.c	2013-02-21 17:18:27 UTC (rev 54712)
+++ trunk/blender/source/blender/makesrna/intern/rna_modifier.c	2013-02-21 17:29:35 UTC (rev 54713)
@@ -749,6 +749,12 @@
 	md->bevel_angle = (int)value;
 }
 
+static void rna_BevelModifier_defgrp_name_set(PointerRNA *ptr, const char *value)
+{
+	BevelModifierData *md = (BevelModifierData *)ptr->data;
+	rna_object_vgroup_name_set(ptr, value, md->defgrp_name, sizeof(md->defgrp_name));
+}
+
 static void rna_UVWarpModifier_vgroup_set(PointerRNA *ptr, const char *value)
 {
 	UVWarpModifierData *umd = (UVWarpModifierData *)ptr->data;
@@ -2291,11 +2297,13 @@
 		{0, "NONE", 0, "None", "Bevel the entire mesh by a constant amount"},
 		{BME_BEVEL_ANGLE, "ANGLE", 0, "Angle", "Only bevel edges with sharp enough angles between faces"},
 		{BME_BEVEL_WEIGHT, "WEIGHT", 0, "Weight",
-		                   "Use bevel weights to determine how much bevel is applied; "
-		                   "apply them separately in vert/edge select mode"},
+		                   "Use bevel weights to determine how much bevel is applied in edge mode"},
+		{BME_BEVEL_VGROUP, "VGROUP", 0, "Vertex Group",
+		                   "Use vertex group weights to determine how much bevel is applied in vertex mode"},
 		{0, NULL, 0, NULL, NULL}
 	};
 
+	/* TO BE DEPRECATED */
 	static EnumPropertyItem prop_edge_weight_method_items[] = {
 		{0, "AVERAGE", 0, "Average", ""},
 		{BME_BEVEL_EMIN, "SHARPEST", 0, "Sharpest", ""},
@@ -2315,6 +2323,12 @@
 	RNA_def_property_ui_text(prop, "Width", "Bevel value/amount");
 	RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
+	prop = RNA_def_property(srna, "segments", PROP_INT, PROP_NONE);
+	RNA_def_property_int_sdna(prop, NULL, "res");
+	RNA_def_property_range(prop, 1, 100);
+	RNA_def_property_ui_text(prop, "Segments", "Number of segments for round edges/verts");
+	RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
 	prop = RNA_def_property(srna, "use_only_vertices", PROP_BOOLEAN, PROP_NONE);
 	RNA_def_property_boolean_sdna(prop, NULL, "flags", BME_BEVEL_VERT);
 	RNA_def_property_ui_text(prop, "Only Vertices", "Bevel verts/corners, not edges");
@@ -2326,6 +2340,7 @@
 	RNA_def_property_ui_text(prop, "Limit Method", "");
 	RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
+	/* TO BE DEPRECATED */
 	prop = RNA_def_property(srna, "edge_weight_method", PROP_ENUM, PROP_NONE);
 	RNA_def_property_enum_sdna(prop, NULL, "e_flags");
 	RNA_def_property_enum_items(prop, prop_edge_weight_method_items);
@@ -2348,16 +2363,11 @@
 	RNA_def_property_update(prop, 0, "rna_Modifier_update");
 
 #ifdef USE_BM_BEVEL_OP_AS_MOD
-	prop = RNA_def_property(srna, "use_even_offset", PROP_BOOLEAN, PROP_NONE); /* name matches solidify */
-	RNA_def_property_boolean_sdna(prop, NULL, "flags", BME_BEVEL_EVEN);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list