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:58:08 +0300
committerHoward Trickey <howard.trickey@gmail.com>2021-01-30 23:58:08 +0300
commit016bd284fbe6806bbdf49e3dc0d0774e1a3ccb58 (patch)
tree6e496cbf0c3d39da75228792cf168e6179942438 /source/blender/bmesh/tools/bmesh_bevel.c
parent216ebe0b7392d6da484cbf369402c65b3c6352f8 (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.)
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),