diff options
author | Howard Trickey <howard.trickey@gmail.com> | 2019-04-30 14:13:22 +0300 |
---|---|---|
committer | Howard Trickey <howard.trickey@gmail.com> | 2019-04-30 14:13:22 +0300 |
commit | 3e780507bd613d2b7e2ca3de178bf8108dcae9bc (patch) | |
tree | be0ea2b6b3389a8ba9b7d1e2f1c5d535cbd2eb6d /source | |
parent | e15c8ee4478ebad705c4286f7f2289a4278ea6c3 (diff) |
Fix T63759 Vertex Bevel works for width and depth offset types.
From D4719 by George Vogiatzis (Gvgeo).
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/bmesh/tools/bmesh_bevel.c | 83 |
1 files changed, 61 insertions, 22 deletions
diff --git a/source/blender/bmesh/tools/bmesh_bevel.c b/source/blender/bmesh/tools/bmesh_bevel.c index fab58914c8b..2ebf89937b0 100644 --- a/source/blender/bmesh/tools/bmesh_bevel.c +++ b/source/blender/bmesh/tools/bmesh_bevel.c @@ -5222,6 +5222,7 @@ static BevVert *bevel_vert_construct(BMesh *bm, BevelParams *bp, BMVert *v) BMIter iter; EdgeHalf *e; float weight, z; + float vert_axis[3]; int i, ccw_test_sum; int nsel = 0; int ntot = 0; @@ -5290,21 +5291,6 @@ static BevVert *bevel_vert_construct(BMesh *bm, BevelParams *bp, BMVert *v) bv->vmesh = (VMesh *)BLI_memarena_alloc(bp->mem_arena, sizeof(VMesh)); bv->vmesh->seg = bp->seg; - if (bp->vertex_only) { - /* if weighted, modify offset by weight */ - if (bp->dvert != NULL && bp->vertex_group != -1) { - weight = defvert_find_weight(bp->dvert + BM_elem_index_get(v), bp->vertex_group); - if (weight <= 0.0f) { - BM_elem_flag_disable(v, BM_ELEM_TAG); - return NULL; - } - bv->offset *= weight; - } - else if (bp->use_weights) { - weight = BM_elem_float_data_get(&bm->vdata, v, CD_BWEIGHT); - bv->offset *= weight; - } - } BLI_ghash_insert(bp->vert_hash, v, bv); find_bevel_edge_order(bm, bv, first_bme); @@ -5352,6 +5338,29 @@ static BevVert *bevel_vert_construct(BMesh *bm, BevelParams *bp, BMVert *v) } } + if (bp->vertex_only) { + /* if weighted, modify offset by weight */ + if (bp->dvert != NULL && bp->vertex_group != -1) { + weight = defvert_find_weight(bp->dvert + BM_elem_index_get(v), bp->vertex_group); + bv->offset *= weight; + } + else if (bp->use_weights) { + weight = BM_elem_float_data_get(&bm->vdata, v, CD_BWEIGHT); + bv->offset *= weight; + } + /* Find center axis. Note: Don't use vert normal, can give unwanted results. */ + if (ELEM(bp->offset_type, BEVEL_AMT_WIDTH, BEVEL_AMT_DEPTH)) { + float edge_dir[3]; + for (i = 0, e = bv->edges; i < ntot; i++, e++) { + v2 = BM_edge_other_vert(e->e, bv->v); + sub_v3_v3v3(edge_dir, bv->v->co, v2->co); + normalize_v3(edge_dir); + add_v3_v3v3(vert_axis, vert_axis, edge_dir); + } + mul_v3_fl(vert_axis, 1 / ntot); + } + } + for (i = 0, e = bv->edges; i < ntot; i++, e++) { e->next = &bv->edges[(i + 1) % ntot]; e->prev = &bv->edges[(i + ntot - 1) % ntot]; @@ -5411,13 +5420,43 @@ static BevVert *bevel_vert_construct(BMesh *bm, BevelParams *bp, BMVert *v) } else if (bp->vertex_only) { /* Weight has already been applied to bv->offset, if present. - * Transfer to e->offset_[lr]_spec and treat percent as special case */ - if (bp->offset_type == BEVEL_AMT_PERCENT) { - v2 = BM_edge_other_vert(e->e, bv->v); - e->offset_l_spec = BM_edge_calc_length(e->e) * bv->offset / 100.0f; - } - else { - e->offset_l_spec = bv->offset; + * Transfer to e->offset_[lr]_spec according to offset_type. */ + float edge_dir[3]; + switch (bp->offset_type) { + case BEVEL_AMT_OFFSET: { + e->offset_l_spec = bv->offset; + break; + } + case BEVEL_AMT_WIDTH: { + v2 = BM_edge_other_vert(e->e, bv->v); + sub_v3_v3v3(edge_dir, bv->v->co, v2->co); + normalize_v3(edge_dir); + z = fabsf(2.0f * sinf(angle_normalized_v3v3(vert_axis, edge_dir))); + if (z < BEVEL_EPSILON) { + e->offset_l_spec = 0.01f * bp->offset; /* undefined behavior, so tiny bevel. */ + } + else { + e->offset_l_spec = bp->offset / z; + } + break; + } + case BEVEL_AMT_DEPTH: { + v2 = BM_edge_other_vert(e->e, bv->v); + sub_v3_v3v3(edge_dir, bv->v->co, v2->co); + normalize_v3(edge_dir); + z = fabsf(cosf(angle_normalized_v3v3(vert_axis, edge_dir))); + if (z < BEVEL_EPSILON) { + e->offset_l_spec = 0.01f * bp->offset; /* undefined behavior, so tiny bevel. */ + } + else { + e->offset_l_spec = bp->offset / z; + } + break; + } + case BEVEL_AMT_PERCENT: { + e->offset_l_spec = BM_edge_calc_length(e->e) * bv->offset / 100.0f; + break; + } } e->offset_r_spec = e->offset_l_spec; } |