[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