From f48efbf4642e1352b9f606e2a9d88bb6352f16f5 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 20 Aug 2013 17:38:29 +0000 Subject: [PATCH] inset depth wasn't working right with relative offset, also make it work for inset individual. --- source/blender/bmesh/operators/bmo_inset.c | 39 ++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/source/blender/bmesh/operators/bmo_inset.c b/source/blender/bmesh/operators/bmo_inset.c index d57f4605b11..fee73507c33 100644 --- a/source/blender/bmesh/operators/bmo_inset.c +++ b/source/blender/bmesh/operators/bmo_inset.c @@ -126,6 +126,7 @@ static void bmo_face_inset_individual( BMLoop *l_iter, *l_first; BMLoop *l_other; unsigned int i; + float e_length_prev; l_first = BM_FACE_FIRST_LOOP(f); @@ -184,6 +185,11 @@ static void bmo_face_inset_individual( /* Calculate translation vector for new */ l_iter = l_first; i = 0; + + if (depth != 0.0f) { + e_length_prev = BM_edge_calc_length(l_iter->prev->e); + } + do { const float *eno_prev = edge_nors[(i ? i : f->len) - 1]; const float *eno_next = edge_nors[i]; @@ -209,7 +215,15 @@ static void bmo_face_inset_individual( /* Set normal, add depth and write new vertex position*/ copy_v3_v3(l_iter->v->no, f->no); - madd_v3_v3fl(v_new_co, f->no, depth); + if (depth != 0.0f) { + const float e_length = BM_edge_calc_length(l_iter->e); + const float fac = depth * (use_relative_offset ? ((e_length_prev + e_length) * 0.5f) : 1.0f); + e_length_prev = e_length; + + madd_v3_v3fl(v_new_co, f->no, fac); + } + + copy_v3_v3(coords[i], v_new_co); } while (i++, ((l_iter = l_iter->next) != l_first)); @@ -339,6 +353,27 @@ static BMLoop *bm_edge_is_mixed_face_tag(BMLoop *l) } } +static float bm_edge_info_average_length(BMVert *v, SplitEdgeInfo *edge_info) +{ + BMIter iter; + BMEdge *e; + + float len = 0.0f; + int tot = 0; + + + BM_ITER_ELEM (e, &iter, v, BM_EDGES_OF_VERT) { + const int i = BM_elem_index_get(e); + if (i != -1) { + len += edge_info[i].length; + tot++; + } + } + + BLI_assert(tot != 0); + return len / (float)tot; +} + /** * implementation is as follows... * @@ -883,7 +918,7 @@ void bmo_inset_region_exec(BMesh *bm, BMOperator *op) BM_ITER_MESH_INDEX (v, &iter, bm, BM_VERTS_OF_MESH, i) { if (BM_elem_flag_test(v, BM_ELEM_TAG)) { const float fac = (depth * - (use_relative_offset ? BM_vert_calc_mean_tagged_edge_length(v) : 1.0f) * + (use_relative_offset ? bm_edge_info_average_length(v, edge_info) : 1.0f) * (use_even_boundry ? BM_vert_calc_shell_factor(v) : 1.0f)); madd_v3_v3v3fl(varr_co[i], v->co, v->no, fac); }