Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2013-06-12 12:24:31 +0400
committerCampbell Barton <ideasman42@gmail.com>2013-06-12 12:24:31 +0400
commit8e2e590484dbdb2da433649fac8521b91f384ca2 (patch)
tree2dc36d6976756302ca1a513e83754a7988fc36b1 /source/blender/modifiers
parent0b316d72cabb0d604587f98c37c394b4cac35189 (diff)
fix [#35710] Mesh explodes while using solidify modifier with tubular non-manifold base mesh.
Diffstat (limited to 'source/blender/modifiers')
-rw-r--r--source/blender/modifiers/intern/MOD_solidify.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/source/blender/modifiers/intern/MOD_solidify.c b/source/blender/modifiers/intern/MOD_solidify.c
index 6d5dda61f23..2c9170522d5 100644
--- a/source/blender/modifiers/intern/MOD_solidify.c
+++ b/source/blender/modifiers/intern/MOD_solidify.c
@@ -60,7 +60,7 @@ typedef struct EdgeFaceRef {
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 @@ static void dm_calc_normal(DerivedMesh *dm, float (*temp_nors)[3])
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 @@ static DerivedMesh *applyModifier(
}
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 @@ static DerivedMesh *applyModifier(
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 --- */