From d47fbece5130fccc7aaaee6046f99a38d3762636 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 21 Nov 2015 10:07:18 +1100 Subject: BMesh: improve face-path-picking w/ tri-fans Face paths including triangle-fans would often be avoided because the face center and edge would 'zig-zag'. Resolve using wighted face center and picking an edge-point between face centers. --- source/blender/bmesh/tools/bmesh_path.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) (limited to 'source/blender/bmesh/tools/bmesh_path.c') diff --git a/source/blender/bmesh/tools/bmesh_path.c b/source/blender/bmesh/tools/bmesh_path.c index 6633803414b..1c05b8ae5d4 100644 --- a/source/blender/bmesh/tools/bmesh_path.c +++ b/source/blender/bmesh/tools/bmesh_path.c @@ -306,9 +306,27 @@ static float facetag_cut_cost(BMFace *f_a, BMFace *f_b, BMEdge *e) float f_b_cent[3]; float e_cent[3]; - BM_face_calc_center_mean(f_a, f_a_cent); - BM_face_calc_center_mean(f_b, f_b_cent); + BM_face_calc_center_mean_weighted(f_a, f_a_cent); + BM_face_calc_center_mean_weighted(f_b, f_b_cent); +#if 0 mid_v3_v3v3(e_cent, e->v1->co, e->v2->co); +#else + /* for triangle fans it gives better results to pick a point on the edge */ + { + float ix_e[3], ix_f[3], f; + isect_line_line_v3(e->v1->co, e->v2->co, f_a_cent, f_b_cent, ix_e, ix_f); + f = line_point_factor_v3(ix_e, e->v1->co, e->v2->co); + if (f < 0.0) { + copy_v3_v3(e_cent, e->v1->co); + } + else if (f > 1.0) { + copy_v3_v3(e_cent, e->v2->co); + } + else { + copy_v3_v3(e_cent, ix_e); + } + } +#endif return step_cost_3_v3(f_a_cent, e_cent, f_b_cent); } -- cgit v1.2.3