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:
authorHoward Trickey <howard.trickey@gmail.com>2021-01-30 23:50:58 +0300
committerHoward Trickey <howard.trickey@gmail.com>2021-01-30 23:50:58 +0300
commit40061911d2459a60ee23740bf4816a08f55b6ea5 (patch)
tree7053c3ce2dd971a3564b6fbb3ae9cfe0ae43018e
parent38bb26342227759e8e2ccd98e1b4e800ca141fb2 (diff)
Fix T84465 Bevel Percent and Absolute when limit type is Weight.
The previous fix to the width modes Percent and Absolute did not take into account that with limit mode Weight, the amount needs to be scaled by the bevel weight of the beveled edge in question. (Sometimes there are two beveled edges in question, in which case an average is used.)
-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 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),