diff options
author | Howard Trickey <howard.trickey@gmail.com> | 2020-11-12 00:22:13 +0300 |
---|---|---|
committer | Howard Trickey <howard.trickey@gmail.com> | 2020-11-12 00:24:01 +0300 |
commit | b99faa0f567fdf139a8e357112f9b2c7a0458aa5 (patch) | |
tree | 5a031c22c80ef81f29056cb783c14b653b92c71c /source/blender/bmesh/tools | |
parent | 7ba971d6d855034d5a8f0e8dab1bcd892b5aabd3 (diff) |
Fix T80475, bad bevel: side vertex in bad plane in some cases.
Needed a better normal to for plane to offset into when there are
non in-plane edges between two beveled edges. It was using the vertex
normal, which is just wrong.
Differential Revision: https://developer.blender.org/D9508
Diffstat (limited to 'source/blender/bmesh/tools')
-rw-r--r-- | source/blender/bmesh/tools/bmesh_bevel.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/source/blender/bmesh/tools/bmesh_bevel.c b/source/blender/bmesh/tools/bmesh_bevel.c index e8ded83dfbe..309b6547a39 100644 --- a/source/blender/bmesh/tools/bmesh_bevel.c +++ b/source/blender/bmesh/tools/bmesh_bevel.c @@ -1334,7 +1334,21 @@ static void offset_meet(BevelParams *bp, copy_v3_v3(norm_v, f->no); } else { - copy_v3_v3(norm_v, v->no); + /* Get average of face norms of faces between e and e2. */ + int fcount = 0; + zero_v3(norm_v); + for (EdgeHalf *eloop = e1; eloop != e2; eloop = eloop->next) { + if (eloop->fnext != NULL) { + add_v3_v3(norm_v, eloop->fnext->no); + fcount++; + } + } + if (fcount == 0) { + copy_v3_v3(norm_v, v->no); + } + else { + mul_v3_fl(norm_v, 1.0f / fcount); + } } add_v3_v3(dir1, dir2); cross_v3_v3v3(norm_perp1, dir1, norm_v); |