diff options
author | Campbell Barton <ideasman42@gmail.com> | 2014-03-28 14:30:22 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2014-03-28 14:38:12 +0400 |
commit | 2a2567616876a9fa4561143d731875801a2df8e3 (patch) | |
tree | 2ea3e7fadb01d1a541ba4b2e8593ab1c4c50c902 /source/blender/bmesh | |
parent | f88776bb5cc5cda8f283ee47992d786e55f88a32 (diff) |
Fix for inset bug (edge rail had feedback loop with direction)
also disable edge-rail by default.
Diffstat (limited to 'source/blender/bmesh')
-rw-r--r-- | source/blender/bmesh/operators/bmo_inset.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/source/blender/bmesh/operators/bmo_inset.c b/source/blender/bmesh/operators/bmo_inset.c index a255c534736..343d6cd4a1a 100644 --- a/source/blender/bmesh/operators/bmo_inset.c +++ b/source/blender/bmesh/operators/bmo_inset.c @@ -395,6 +395,9 @@ void bmo_inset_region_exec(BMesh *bm, BMOperator *op) const float thickness = BMO_slot_float_get(op->slots_in, "thickness"); const float depth = BMO_slot_float_get(op->slots_in, "depth"); + /* store vert coords in normals, needed for 'use_edge_rail' */ +#define USE_VERTNORMAL_HACK + int edge_info_len = 0; BMIter iter; @@ -453,6 +456,11 @@ void bmo_inset_region_exec(BMesh *bm, BMOperator *op) BM_elem_index_set(e, -1); /* set_dirty! */ } + +#ifdef USE_VERTNORMAL_HACK + copy_v3_v3(e->v1->no, e->v1->co); + copy_v3_v3(e->v2->no, e->v2->co); +#endif } bm->elem_index_dirty |= BM_EDGE; @@ -564,6 +572,9 @@ void bmo_inset_region_exec(BMesh *bm, BMOperator *op) /* in some cases the edge doesn't split off */ if (r_vout_len == 1) { +#ifdef USE_VERTNORMAL_HACK + copy_v3_v3(vout[0]->no, vout[0]->co); +#endif MEM_freeN(vout); continue; } @@ -575,6 +586,10 @@ void bmo_inset_region_exec(BMesh *bm, BMOperator *op) int vert_edge_tag_tot = 0; int vecpair[2]; +#ifdef USE_VERTNORMAL_HACK + copy_v3_v3(v_split->no, v_split->co); +#endif + /* find adjacent */ BM_ITER_ELEM (e, &iter, v_split, BM_EDGES_OF_VERT) { if (BM_elem_flag_test(e, BM_ELEM_TAG) && @@ -628,7 +643,17 @@ void bmo_inset_region_exec(BMesh *bm, BMOperator *op) if (l_other_a->v == l_other_b->v) { /* both edges faces are adjacent, but we don't need to know the shared edge * having both verts is enough. */ - sub_v3_v3v3(tvec, l_other_a->v->co, v_split->co); + const float *co_other; + + /* note that we can't use 'l_other_a->v' directly since it + * may be inset and give a feedback loop. */ +#ifdef USE_VERTNORMAL_HACK + co_other = l_other_a->v->no; +#else + co_other = l_other_a->v->co; +#endif + + sub_v3_v3v3(tvec, co_other, v_split->co); is_mid = false; } else if (compare_v3v3(f_a->no, f_b->no, 0.001f) == false) { |