[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57405] trunk/blender/source/blender: fix [#35710] Mesh explodes while using solidify modifier with tubular non-manifold base mesh .

Campbell Barton ideasman42 at gmail.com
Wed Jun 12 10:24:31 CEST 2013


Revision: 57405
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57405
Author:   campbellbarton
Date:     2013-06-12 08:24:31 +0000 (Wed, 12 Jun 2013)
Log Message:
-----------
fix [#35710] Mesh explodes while using solidify modifier with tubular non-manifold base mesh.

Modified Paths:
--------------
    trunk/blender/source/blender/makesdna/DNA_meshdata_types.h
    trunk/blender/source/blender/modifiers/intern/MOD_solidify.c

Modified: trunk/blender/source/blender/makesdna/DNA_meshdata_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_meshdata_types.h	2013-06-12 07:53:54 UTC (rev 57404)
+++ trunk/blender/source/blender/makesdna/DNA_meshdata_types.h	2013-06-12 08:24:31 UTC (rev 57405)
@@ -309,7 +309,7 @@
 						/* reserve 16 for ME_HIDE */
 #define ME_EDGERENDER		(1<<5)
 #define ME_LOOSEEDGE		(1<<7)
-/* #define ME_SEAM_LAST		(1<<8) */ /* UNUSED */
+#define ME_EDGE_TMP_TAG		(1 << 8)
 #define ME_SHARP			(1<<9)    /* only reason this flag remains a 'short' */
 
 /* puno = vertexnormal (mface) */

Modified: trunk/blender/source/blender/modifiers/intern/MOD_solidify.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_solidify.c	2013-06-12 07:53:54 UTC (rev 57404)
+++ trunk/blender/source/blender/modifiers/intern/MOD_solidify.c	2013-06-12 08:24:31 UTC (rev 57405)
@@ -60,7 +60,7 @@
 
 BLI_INLINE bool edgeref_is_init(const EdgeFaceRef *edge_ref)
 {
-	return (edge_ref->f1 != 0) && (edge_ref->f2 != 0);
+	return !((edge_ref->f1 == 0) && (edge_ref->f2 == 0));
 }
 
 static void dm_calc_normal(DerivedMesh *dm, float (*temp_nors)[3])
@@ -128,6 +128,7 @@
 				else {
 					/* 3+ faces using an edge, we can't handle this usefully */
 					edge_ref->f1 = edge_ref->f2 = -1;
+					medge[ml->e].flag |= ME_EDGE_TMP_TAG;
 				}
 				/* --- done --- */
 			}
@@ -501,6 +502,7 @@
 	}
 	else {
 		/* make a face normal layer if not present */
+		const bool check_non_manifold = (smd->flag & MOD_SOLIDIFY_NORMAL_CALC) != 0;
 		float (*face_nors)[3];
 		bool face_nors_calc = false;
 
@@ -551,9 +553,20 @@
 				if (angle < FLT_EPSILON) {
 					angle = FLT_EPSILON;
 				}
+
 				vidx = ml[i_this].v;
 				vert_accum[vidx] += angle;
-				vert_angles[vidx] += shell_angle_to_dist(angle_normalized_v3v3(vert_nors[vidx], face_nors[i])) * angle;
+
+				/* skip 3+ face user edges */
+				if ((check_non_manifold == false) ||
+				    LIKELY(((orig_medge[ml[i_this].e].flag & ME_EDGE_TMP_TAG) == 0) &&
+				           ((orig_medge[ml[i_next].e].flag & ME_EDGE_TMP_TAG) == 0)))
+				{
+					vert_angles[vidx] += shell_angle_to_dist(angle_normalized_v3v3(vert_nors[vidx], face_nors[i])) * angle;
+				}
+				else {
+					vert_angles[vidx] += angle;
+				}
 				/* --- end non-angle-calc section --- */
 
 




More information about the Bf-blender-cvs mailing list