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>2019-04-30 14:13:22 +0300
committerHoward Trickey <howard.trickey@gmail.com>2019-04-30 14:13:22 +0300
commit3e780507bd613d2b7e2ca3de178bf8108dcae9bc (patch)
treebe0ea2b6b3389a8ba9b7d1e2f1c5d535cbd2eb6d /source/blender/bmesh/tools
parente15c8ee4478ebad705c4286f7f2289a4278ea6c3 (diff)
Fix T63759 Vertex Bevel works for width and depth offset types.
From D4719 by George Vogiatzis (Gvgeo).
Diffstat (limited to 'source/blender/bmesh/tools')
-rw-r--r--source/blender/bmesh/tools/bmesh_bevel.c83
1 files changed, 61 insertions, 22 deletions
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;
}