[Bf-blender-cvs] [3e780507bd6] master: Fix T63759 Vertex Bevel works for width and depth offset types.

Howard Trickey noreply at git.blender.org
Tue Apr 30 13:14:42 CEST 2019


Commit: 3e780507bd613d2b7e2ca3de178bf8108dcae9bc
Author: Howard Trickey
Date:   Tue Apr 30 07:13:22 2019 -0400
Branches: master
https://developer.blender.org/rB3e780507bd613d2b7e2ca3de178bf8108dcae9bc

Fix T63759 Vertex Bevel works for width and depth offset types.

>From D4719 by George Vogiatzis (Gvgeo).

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

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 fab58914c8b..2ebf89937b0 100644
--- a/source/blender/bmesh/tools/bmesh_bevel.c
+++ b/source/blender/bmesh/tools/bmesh_bevel.c
@@ -5222,6 +5222,7 @@ static BevVert *bevel_vert_construct(BMesh *bm, BevelParams *bp, BMVert *v)
   BMIter iter;
   EdgeHalf *e;
   float weight, z;
+  float vert_axis[3];
   int i, ccw_test_sum;
   int nsel = 0;
   int ntot = 0;
@@ -5290,21 +5291,6 @@ static BevVert *bevel_vert_construct(BMesh *bm, BevelParams *bp, BMVert *v)
   bv->vmesh = (VMesh *)BLI_memarena_alloc(bp->mem_arena, sizeof(VMesh));
   bv->vmesh->seg = bp->seg;
 
-  if (bp->vertex_only) {
-    /* if weighted, modify offset by weight */
-    if (bp->dvert != NULL && bp->vertex_group != -1) {
-      weight = defvert_find_weight(bp->dvert + BM_elem_index_get(v), bp->vertex_group);
-      if (weight <= 0.0f) {
-        BM_elem_flag_disable(v, BM_ELEM_TAG);
-        return NULL;
-      }
-      bv->offset *= weight;
-    }
-    else if (bp->use_weights) {
-      weight = BM_elem_float_data_get(&bm->vdata, v, CD_BWEIGHT);
-      bv->offset *= weight;
-    }
-  }
   BLI_ghash_insert(bp->vert_hash, v, bv);
 
   find_bevel_edge_order(bm, bv, first_bme);
@@ -5352,6 +5338,29 @@ static BevVert *bevel_vert_construct(BMesh *bm, BevelParams *bp, BMVert *v)
     }
   }
 
+  if (bp->vertex_only) {
+    /* if weighted, modify offset by weight */
+    if (bp->dvert != NULL && bp->vertex_group != -1) {
+      weight = defvert_find_weight(bp->dvert + BM_elem_index_get(v), bp->vertex_group);
+      bv->offset *= weight;
+    }
+    else if (bp->use_weights) {
+      weight = BM_elem_float_data_get(&bm->vdata, v, CD_BWEIGHT);
+      bv->offset *= weight;
+    }
+    /* Find center axis. Note: Don't use vert normal, can give unwanted results. */
+    if (ELEM(bp->offset_type, BEVEL_AMT_WIDTH, BEVEL_AMT_DEPTH)) {
+      float edge_dir[3];
+      for (i = 0, e = bv->edges; i < ntot; i++, e++) {
+        v2 = BM_edge_other_vert(e->e, bv->v);
+        sub_v3_v3v3(edge_dir, bv->v->co, v2->co);
+        normalize_v3(edge_dir);
+        add_v3_v3v3(vert_axis, vert_axis, edge_dir);
+      }
+      mul_v3_fl(vert_axis, 1 / ntot);
+    }
+  }
+
   for (i = 0, e = bv->edges; i < ntot; i++, e++) {
     e->next = &bv->edges[(i + 1) % ntot];
     e->prev = &bv->edges[(i + ntot - 1) % ntot];
@@ -5411,13 +5420,43 @@ static BevVert *bevel_vert_construct(BMesh *bm, BevelParams *bp, BMVert *v)
     }
     else if (bp->vertex_only) {
       /* Weight has already been applied to bv->offset, if present.
-       * Transfer to e->offset_[lr]_spec and treat percent as special case */
-      if (bp->offset_type == BEVEL_AMT_PERCENT) {
-        v2 = BM_edge_other_vert(e->e, bv->v);
-        e->offset_l_spec = BM_edge_calc_length(e->e) * bv->offset / 100.0f;
-      }
-      else {
-        e->offset_l_spec = bv->offset;
+       * Transfer to e->offset_[lr]_spec according to offset_type. */
+      float edge_dir[3];
+      switch (bp->offset_type) {
+        case BEVEL_AMT_OFFSET: {
+          e->offset_l_spec = bv->offset;
+          break;
+        }
+        case BEVEL_AMT_WIDTH: {
+          v2 = BM_edge_other_vert(e->e, bv->v);
+          sub_v3_v3v3(edge_dir, bv->v->co, v2->co);
+          normalize_v3(edge_dir);
+          z = fabsf(2.0f * sinf(angle_normalized_v3v3(vert_axis, edge_dir)));
+          if (z < BEVEL_EPSILON) {
+            e->offset_l_spec = 0.01f * bp->offset; /* undefined behavior, so tiny bevel. */
+          }
+          else {
+            e->offset_l_spec = bp->offset / z;
+          }
+          break;
+        }
+        case BEVEL_AMT_DEPTH: {
+          v2 = BM_edge_other_vert(e->e, bv->v);
+          sub_v3_v3v3(edge_dir, bv->v->co, v2->co);
+          normalize_v3(edge_dir);
+          z = fabsf(cosf(angle_normalized_v3v3(vert_axis, edge_dir)));
+          if (z < BEVEL_EPSILON) {
+            e->offset_l_spec = 0.01f * bp->offset; /* undefined behavior, so tiny bevel. */
+          }
+          else {
+            e->offset_l_spec = bp->offset / z;
+          }
+          break;
+        }
+        case BEVEL_AMT_PERCENT: {
+          e->offset_l_spec = BM_edge_calc_length(e->e) * bv->offset / 100.0f;
+          break;
+        }
       }
       e->offset_r_spec = e->offset_l_spec;
     }



More information about the Bf-blender-cvs mailing list