diff options
-rw-r--r-- | source/blender/makesdna/DNA_meshdata_types.h | 2 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_solidify.c | 17 |
2 files changed, 16 insertions, 3 deletions
diff --git a/source/blender/makesdna/DNA_meshdata_types.h b/source/blender/makesdna/DNA_meshdata_types.h index d1e123cb826..9f9bc25a61c 100644 --- a/source/blender/makesdna/DNA_meshdata_types.h +++ b/source/blender/makesdna/DNA_meshdata_types.h @@ -309,7 +309,7 @@ typedef struct FreestyleFace { /* 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) */ 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 --- */ |