diff options
Diffstat (limited to 'source/blender/bmesh/tools/bmesh_bevel.c')
-rw-r--r-- | source/blender/bmesh/tools/bmesh_bevel.c | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/source/blender/bmesh/tools/bmesh_bevel.c b/source/blender/bmesh/tools/bmesh_bevel.c index 9497466723a..cd12a260f82 100644 --- a/source/blender/bmesh/tools/bmesh_bevel.c +++ b/source/blender/bmesh/tools/bmesh_bevel.c @@ -326,6 +326,8 @@ typedef struct BevelParams { ProfileSpacing pro_spacing_miter; /** Information about 'math' loop layers, like UV layers. */ MathLayerInfo math_layer_info; + /** The argument BMesh. */ + BMesh *bm; /** Blender units to offset each side of a beveled edge. */ float offset; /** How offset is measured; enum defined in bmesh_operators.h. */ @@ -1230,6 +1232,7 @@ static void offset_meet_lines_percent_or_absolute(BevelParams *bp, EdgeHalf e0, e3, e4, e5; BMFace *f1, *f2; float d0, d3, d4, d5; + float e1_wt, e2_wt; v1 = BM_edge_other_vert(e1->e, v); v2 = BM_edge_other_vert(e2->e, v); f1 = e1->fnext; @@ -1259,10 +1262,19 @@ static void offset_meet_lines_percent_or_absolute(BevelParams *bp, d4 = bp->offset * BM_edge_calc_length(e4.e) / 100.0f; d5 = bp->offset * BM_edge_calc_length(e5.e) / 100.0f; } - slide_dist(&e4, v, d4, r_l1a); - slide_dist(&e0, v1, d0, r_l1b); - slide_dist(&e5, v, d5, r_l2a); - slide_dist(&e3, v2, d3, r_l2b); + if (bp->use_weights) { + CustomData *cd = &bp->bm->edata; + e1_wt = BM_elem_float_data_get(cd, e1->e, CD_BWEIGHT); + e2_wt = BM_elem_float_data_get(cd, e2->e, CD_BWEIGHT); + } + else { + e1_wt = 1.0f; + e2_wt = 1.0f; + } + slide_dist(&e4, v, d4 * e1_wt, r_l1a); + slide_dist(&e0, v1, d0 * e1_wt, r_l1b); + slide_dist(&e5, v, d5 * e2_wt, r_l2a); + slide_dist(&e3, v2, d3 * e2_wt, r_l2b); } } if (no_offsets) { @@ -1573,7 +1585,13 @@ static bool offset_on_edge_between(BevelParams *bp, if (ELEM(bp->offset_type, BEVEL_AMT_PERCENT, BEVEL_AMT_ABSOLUTE)) { BMVert *v2 = BM_edge_other_vert(emid->e, v); if (bp->offset_type == BEVEL_AMT_PERCENT) { - interp_v3_v3v3(meetco, v->co, v2->co, bp->offset / 100.0f); + float wt = 1.0; + if (bp->use_weights) { + CustomData *cd = &bp->bm->edata; + wt = 0.5f * (BM_elem_float_data_get(cd, e1->e, CD_BWEIGHT) + + BM_elem_float_data_get(cd, e2->e, CD_BWEIGHT)); + } + interp_v3_v3v3(meetco, v->co, v2->co, wt * bp->offset / 100.0f); } else { float dir[3]; @@ -7458,6 +7476,7 @@ void BM_mesh_bevel(BMesh *bm, BMLoop *l; BevVert *bv; BevelParams bp = { + .bm = bm, .offset = offset, .offset_type = offset_type, .seg = max_ii(segments, 1), |