[Bf-blender-cvs] [016bd284fbe] master: Fix T84465 Bevel Percent and Absolute when limit type is Weight.

Howard Trickey noreply at git.blender.org
Sat Jan 30 22:07:59 CET 2021


Commit: 016bd284fbe6806bbdf49e3dc0d0774e1a3ccb58
Author: Howard Trickey
Date:   Sat Jan 30 15:58:08 2021 -0500
Branches: master
https://developer.blender.org/rB016bd284fbe6806bbdf49e3dc0d0774e1a3ccb58

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



More information about the Bf-blender-cvs mailing list