Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/bmesh/tools/bmesh_bevel.c')
-rw-r--r--source/blender/bmesh/tools/bmesh_bevel.c29
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 44d146bc155..36fe6ee655c 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),