[Bf-blender-cvs] [40061911d24] blender-v2.92-release: Fix T84465 Bevel Percent and Absolute when limit type is Weight.

Howard Trickey noreply at git.blender.org
Sat Jan 30 21:53:49 CET 2021


Commit: 40061911d2459a60ee23740bf4816a08f55b6ea5
Author: Howard Trickey
Date:   Sat Jan 30 15:50:58 2021 -0500
Branches: blender-v2.92-release
https://developer.blender.org/rB40061911d2459a60ee23740bf4816a08f55b6ea5

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.)

===================================================================

M	source/blender/bmesh/tools/bmesh_bevel.c

===================================================================

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),



More information about the Bf-blender-cvs mailing list