[Bf-blender-cvs] [aef01c47e63] master: Fix T58113 Multiple problems with bevel harden normals.

Howard Trickey noreply at git.blender.org
Thu Jan 3 19:53:37 CET 2019


Commit: aef01c47e6334b214520f14c72b01de99387f122
Author: Howard Trickey
Date:   Thu Jan 3 13:39:52 2019 -0500
Branches: master
https://developer.blender.org/rBaef01c47e6334b214520f14c72b01de99387f122

Fix T58113 Multiple problems with bevel harden normals.

Move the bevel hardening code all into bmesh_bevel.c.
Based on user feedback, rewrote the bevel hardening algorithm
to be more what users want.
Based on user feedback, changed the UI, removing some
not-useful options. Now hardening normals while beveling
is enabled by a simple checkbox.
Now setting face strength gives options for which faces
get their face strength set.

===================================================================

M	release/datafiles/locale
M	release/scripts/addons
M	release/scripts/startup/bl_ui/properties_data_modifier.py
M	source/blender/bmesh/intern/bmesh_opdefines.c
M	source/blender/bmesh/intern/bmesh_operators.h
M	source/blender/bmesh/operators/bmo_bevel.c
M	source/blender/bmesh/tools/bmesh_bevel.c
M	source/blender/bmesh/tools/bmesh_bevel.h
M	source/blender/editors/mesh/editmesh_bevel.c
M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/makesrna/intern/rna_modifier.c
M	source/blender/modifiers/intern/MOD_bevel.c

===================================================================

diff --git a/release/datafiles/locale b/release/datafiles/locale
index fec9a7e88c8..345b7d27872 160000
--- a/release/datafiles/locale
+++ b/release/datafiles/locale
@@ -1 +1 @@
-Subproject commit fec9a7e88c8686830e9210099818a61489e699e4
+Subproject commit 345b7d27872d87ae5074a83d8b9995b37bc56f1b
diff --git a/release/scripts/addons b/release/scripts/addons
index e3c9be92624..25ae9e13447 160000
--- a/release/scripts/addons
+++ b/release/scripts/addons
@@ -1 +1 @@
-Subproject commit e3c9be92624d93ba3eb78731887455fbf41040d6
+Subproject commit 25ae9e134472c5bca62add0a1db3cdfc2d86aaa7
diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index 3d4f3037a84..52af0512a0c 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -147,6 +147,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
         col.prop(md, "loop_slide")
         col.prop(md, "mark_seam")
         col.prop(md, "mark_sharp")
+        col.prop(md, "harden_normals")
 
         layout.label(text="Limit Method:")
         layout.row().prop(md, "limit_method", expand=True)
@@ -159,10 +160,8 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel):
         layout.label(text="Width Method:")
         layout.row().prop(md, "offset_type", expand=True)
 
-        layout.label(text="Normal Mode")
-        layout.row().prop(md, "hnmode", expand=True)
-        layout.prop(md, "hn_strength")
-        layout.prop(md, "set_wn_strength")
+        layout.label(text="Set Face Strength Mode")
+        layout.row().prop(md, "face_strength_mode", expand=True)
 
     def BOOLEAN(self, layout, ob, md):
         split = layout.split()
diff --git a/source/blender/bmesh/intern/bmesh_opdefines.c b/source/blender/bmesh/intern/bmesh_opdefines.c
index 519ffa5ed59..7a6cb814cc9 100644
--- a/source/blender/bmesh/intern/bmesh_opdefines.c
+++ b/source/blender/bmesh/intern/bmesh_opdefines.c
@@ -1734,11 +1734,11 @@ static BMO_FlagSet bmo_enum_bevel_offset_type[] = {
 	{0, NULL},
 };
 
-static BMO_FlagSet bmo_enum_bevel_harden_normal_type[] = {
-	{BEVEL_HN_NONE, "NONE"},
-	{BEVEL_HN_FACE, "FACE"},
-	{BEVEL_HN_ADJ, "ADJACENT"},
-	{BEVEL_HN_FIX_SHA, "FIXED_NORMAL_SHADING"},
+static BMO_FlagSet bmo_enum_bevel_face_strength_type[] = {
+	{BEVEL_FACE_STRENGTH_NONE, "NONE"},
+	{BEVEL_FACE_STRENGTH_NEW, "NEW"},
+	{BEVEL_FACE_STRENGTH_AFFECTED, "AFFECTED"},
+	{BEVEL_FACE_STRENGTH_ALL, "ALL"},
 	{0, NULL},
 };
 
@@ -1761,15 +1761,15 @@ static BMOpDefine bmo_bevel_def = {
 	 {"loop_slide", BMO_OP_SLOT_BOOL},      /* prefer to slide along edges to having even widths */
 	 {"mark_seam", BMO_OP_SLOT_BOOL},		/* extend edge data to allow seams to run across bevels */
 	 {"mark_sharp", BMO_OP_SLOT_BOOL},		/* extend edge data to allow sharp edges to run across bevels */
-	 {"strength", BMO_OP_SLOT_FLT},			/* strength of calculated normal in range (0, 1) for custom clnors */
-	 {"hnmode", BMO_OP_SLOT_INT, {(int)BMO_OP_SLOT_SUBTYPE_INT_ENUM}, bmo_enum_bevel_harden_normal_type}, /* harden normals mode used in bevel, if enabled */
+	 {"harden_normals", BMO_OP_SLOT_BOOL},  /* harden normals */
+	 {"face_strength_mode", BMO_OP_SLOT_INT, {(int)BMO_OP_SLOT_SUBTYPE_INT_ENUM},
+	 	bmo_enum_bevel_face_strength_type}, /* whether to set face strength, and which faces to set if so */
 	 {{'\0'}},
 	},
 	/* slots_out */
 	{{"faces.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_FACE}}, /* output faces */
 	 {"edges.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* output edges */
 	 {"verts.out", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* output verts */
-	 {"normals.out", BMO_OP_SLOT_MAPPING,  {(int)BMO_OP_SLOT_SUBTYPE_MAP_INTERNAL}}, /* output normals per vertex for beveled edges */
 	 {{'\0'}},
 	},
 
diff --git a/source/blender/bmesh/intern/bmesh_operators.h b/source/blender/bmesh/intern/bmesh_operators.h
index 21b356155ed..365b5eb4681 100644
--- a/source/blender/bmesh/intern/bmesh_operators.h
+++ b/source/blender/bmesh/intern/bmesh_operators.h
@@ -117,11 +117,12 @@ enum {
 	BEVEL_AMT_PERCENT
 };
 
+/* Bevel face_strength_mode values: should match face_str mode enum in DNA_modifer_types.h */
 enum {
-	BEVEL_HN_NONE,			/* Disable harden normals */
-	BEVEL_HN_FACE,			/* harden normals according to face area */
-	BEVEL_HN_ADJ,			/* harden normals according to adjacent 'beveled' faces */
-	BEVEL_HN_FIX_SHA,		/* Special mode to fix normal shading continuity */
+	BEVEL_FACE_STRENGTH_NONE,
+	BEVEL_FACE_STRENGTH_NEW,
+	BEVEL_FACE_STRENGTH_AFFECTED,
+	BEVEL_FACE_STRENGTH_ALL,
 };
 
 extern const BMOpDefine *bmo_opdefines[];
diff --git a/source/blender/bmesh/operators/bmo_bevel.c b/source/blender/bmesh/operators/bmo_bevel.c
index 656a446d5ab..1ef8531397f 100644
--- a/source/blender/bmesh/operators/bmo_bevel.c
+++ b/source/blender/bmesh/operators/bmo_bevel.c
@@ -45,7 +45,8 @@ void bmo_bevel_exec(BMesh *bm, BMOperator *op)
 	const bool  loop_slide    = BMO_slot_bool_get(op->slots_in,  "loop_slide");
 	const bool	mark_seam	  = BMO_slot_bool_get(op->slots_in, "mark_seam");
 	const bool	mark_sharp	  = BMO_slot_bool_get(op->slots_in, "mark_sharp");
-	const int hnmode		  = BMO_slot_int_get(op->slots_in, "hnmode");
+	const bool  harden_normals = BMO_slot_bool_get(op->slots_in, "harden_normals");
+	const int   face_strength_mode = BMO_slot_int_get(op->slots_in, "face_strength_mode");
 
 	if (offset > 0) {
 		BMOIter siter;
@@ -71,7 +72,7 @@ void bmo_bevel_exec(BMesh *bm, BMOperator *op)
 
 		BM_mesh_bevel(
 		        bm, offset, offset_type, seg, profile, vonly, false, clamp_overlap, NULL, -1, material,
-		        loop_slide, mark_seam, mark_sharp, hnmode, op);
+		        loop_slide, mark_seam, mark_sharp, harden_normals, face_strength_mode);
 
 		BMO_slot_buffer_from_enabled_hflag(bm, op, op->slots_out, "faces.out", BM_FACE, BM_ELEM_TAG);
 		BMO_slot_buffer_from_enabled_hflag(bm, op, op->slots_out, "edges.out", BM_EDGE, BM_ELEM_TAG);
diff --git a/source/blender/bmesh/tools/bmesh_bevel.c b/source/blender/bmesh/tools/bmesh_bevel.c
index e48616ea231..7149df7dc4e 100644
--- a/source/blender/bmesh/tools/bmesh_bevel.c
+++ b/source/blender/bmesh/tools/bmesh_bevel.c
@@ -34,12 +34,15 @@
 
 #include "DNA_meshdata_types.h"
 #include "DNA_modifier_types.h"
+#include "DNA_scene_types.h"
 
 #include "BLI_array.h"
 #include "BLI_alloca.h"
 #include "BLI_gsqueue.h"
+#include "BLI_linklist_stack.h"
 #include "BLI_math.h"
 #include "BLI_memarena.h"
+#include "BLI_utildefines.h"
 
 #include "BKE_customdata.h"
 #include "BKE_deform.h"
@@ -167,7 +170,6 @@ typedef struct VMesh {
 		M_POLY,         /* a simple polygon */
 		M_ADJ,          /* "adjacent edges" mesh pattern */
 		M_TRI_FAN,      /* a simple polygon - fan filled */
-		M_QUAD_STRIP,   /* a simple polygon - cut into parallel strips */
 	} mesh_kind;
 //	int _pad;
 } VMesh;
@@ -186,13 +188,21 @@ typedef struct BevVert {
 	VMesh *vmesh;           /* mesh structure for replacing vertex */
 } BevVert;
 
+/* face classification: note depend on F_RECON > F_EDGE > F_VERT */
+typedef enum {
+	F_NONE,				/* used when there is no face at all */
+	F_ORIG,				/* original face, not touched */
+	F_VERT,				/* face for construction aroun a vert */
+	F_EDGE,				/* face for a beveled edge */
+	F_RECON,			/* reconstructed original face with some new verts */
+} FKind;
+
+// static const char* fkind_names[] = {"F_NONE", "F_ORIG", "F_VERT", "F_EDGE", "F_RECON"}; /* DEBUG */
+
 /* Bevel parameters and state */
 typedef struct BevelParams {
-	/* hash of BevVert for each vertex involved in bevel
-	 * GHash: (key=(BMVert *), value=(BevVert *)) */
-	GHash    *vert_hash;
-	/* Hash set used to store resultant beveled faces for VMesh when poly is ring */
-	GHash    *faceHash;
+	GHash    *vert_hash;	/* records BevVerts made: key BMVert*, value BevVert* */
+	GHash    *face_hash;    /* records new faces: key BMFace*, value one of {VERT/EDGE/RECON}_POLY */
 	MemArena *mem_arena;    /* use for all allocs while bevel runs, if we need to free we can switch to mempool */
 	ProfileSpacing pro_spacing; /* parameter values for evenly spaced profiles */
 
@@ -205,12 +215,13 @@ typedef struct BevelParams {
 	bool loop_slide;	    /* should bevel prefer to slide along edges rather than keep widths spec? */
 	bool limit_offset;      /* should offsets be limited by collisions? */
 	bool offset_adjust;     /* should offsets be adjusted to try to get even widths? */
-	bool mark_seam;
-	bool mark_sharp;
+	bool mark_seam;         /* should we propagate seam edge markings? */
+	bool mark_sharp;        /* should we propagate sharp edge markings? */
+	bool harden_normals;    /* should we harden normals? */
 	const struct MDeformVert *dvert; /* vertex group array, maybe set if vertex_only */
 	int vertex_group;       /* vertex group index, maybe set if vertex_only */
 	int mat_nr;             /* if >= 0, material number for bevel; else material comes from adjacent faces */
-	int hnmode;
+	int face_strength_mode; /* setting face strength if > 0 */
 } BevelParams;
 
 // #pragma GCC diagnostic ignored "-Wpadded"
@@ -223,8 +234,10 @@ static int bev_debug_flags = 0;
 #define DEBUG_OLD_PROJ_TO_PERP_PLANE (bev_debug_flags & 2)
 #define DEBUG_OLD_FLAT_MID (bev_debug_flags & 4)
 
+/* use the unused _BM_ELEM_TAG_ALT flag to flag the 'long' loops (parallel to beveled edge) of edge-polygons */
+#define BM_ELEM_LONG_TAG (1<<6)
 
-/* this flag values will get set on geom we want to return in 'out' slots for edges and verts */
+/* these flag values will get set on geom we want to return in 'out' slots for edges and verts */
 #define EDGE_OUT 4
 #define VERT_OUT 8
 
@@ -247,6 +260,18 @@ static void disable_flag_out_edge(BMesh *bm, BMEdge *bme)
 		BMO_edge_flag_disable(bm, bme, EDGE_OUT);
 }
 
+static void record_face_kind(BevelParams *bp, BMFace *f, FKind fkind)
+{
+	if (bp->face_hash)
+		BLI_ghash_insert(bp->face_hash, f, POINTER_FROM_INT(fkind));
+}
+
+static FKind get_face_kind(BevelParams *bp, BMFace *f)
+{
+	void *val = BLI_ghash_lookup(bp->face_hash, f);
+	return val ? (FKind)POINTER_AS_INT(val) : F_ORIG;
+}
+
 /* Are d1 and d2 parallel or nearly so? */
 static bool nearly_parallel(const float d1[3], const float d2[3])
 {
@@ -1678,76 +1703,166 @@ s

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list