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>2020-10-24 21:44:28 +0300
committerHoward Trickey <howard.trickey@gmail.com>2020-10-24 21:44:28 +0300
commit574d711008ab430228ce26eac05e9de3b0b828f2 (patch)
tree16ed06b2230fc84cd18fbbed9ca9f8b966bbf043
parentd65e5e8bc56858997073e960d8aea7112aaaa384 (diff)
Fix T81884, clamping with percent, addendum.
The previous fix forgot the case where there is an intermediate edge and everything isn't in one plane. Differential Revision: https://developer.blender.org/D9336
-rw-r--r--source/blender/bmesh/tools/bmesh_bevel.c33
1 files changed, 28 insertions, 5 deletions
diff --git a/source/blender/bmesh/tools/bmesh_bevel.c b/source/blender/bmesh/tools/bmesh_bevel.c
index f54db513d0f..3a6ae9883e2 100644
--- a/source/blender/bmesh/tools/bmesh_bevel.c
+++ b/source/blender/bmesh/tools/bmesh_bevel.c
@@ -1520,9 +1520,16 @@ static bool good_offset_on_edge_between(EdgeHalf *e1, EdgeHalf *e2, EdgeHalf *em
* in-between edge emid. Viewed from the vertex normal side, the CCW order of these edges is e1,
* emid, e2. Return true if we placed meetco as compromise between where two edges met. If we did,
* put the ratio of sines of angles in *r_sinratio too.
+ * However, if the bp->offset_type is BEVEL_AMT_PERCENT or BEVEL_AMT_ABSOLUTE, we just slide
+ * along emid by the specified amount.
*/
-static bool offset_on_edge_between(
- EdgeHalf *e1, EdgeHalf *e2, EdgeHalf *emid, BMVert *v, float meetco[3], float *r_sinratio)
+static bool offset_on_edge_between(BevelParams *bp,
+ EdgeHalf *e1,
+ EdgeHalf *e2,
+ EdgeHalf *emid,
+ BMVert *v,
+ float meetco[3],
+ float *r_sinratio)
{
bool retval = false;
@@ -1532,6 +1539,22 @@ static bool offset_on_edge_between(
float meet1[3], meet2[3];
bool ok1 = offset_meet_edge(e1, emid, v, meet1, &ang1);
bool ok2 = offset_meet_edge(emid, e2, v, meet2, &ang2);
+ if (bp->offset_type == BEVEL_AMT_PERCENT || bp->offset_type == 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);
+ }
+ else {
+ float dir[3];
+ sub_v3_v3v3(dir, v2->co, v->co);
+ normalize_v3(dir);
+ madd_v3_v3v3fl(meetco, v->co, dir, bp->offset);
+ }
+ if (r_sinratio) {
+ *r_sinratio = (ang1 == 0.0f) ? 1.0f : sinf(ang2) / sinf(ang1);
+ }
+ return true;
+ }
if (ok1 && ok2) {
mid_v3_v3v3(meetco, meet1, meet2);
if (r_sinratio) {
@@ -2953,7 +2976,7 @@ static void build_boundary(BevelParams *bp, BevVert *bv, bool construct)
}
else if (not_in_plane > 0) {
if (bp->loop_slide && not_in_plane == 1 && good_offset_on_edge_between(e, e2, enip, bv->v)) {
- if (offset_on_edge_between(e, e2, enip, bv->v, co, &r)) {
+ if (offset_on_edge_between(bp, e, e2, enip, bv->v, co, &r)) {
eon = enip;
}
}
@@ -2964,7 +2987,7 @@ static void build_boundary(BevelParams *bp, BevVert *bv, bool construct)
else {
/* n_in_plane > 0 and n_not_in_plane == 0. */
if (bp->loop_slide && in_plane == 1 && good_offset_on_edge_between(e, e2, eip, bv->v)) {
- if (offset_on_edge_between(e, e2, eip, bv->v, co, &r)) {
+ if (offset_on_edge_between(bp, e, e2, eip, bv->v, co, &r)) {
eon = eip;
}
}
@@ -7195,7 +7218,7 @@ static float geometry_collide_offset(BevelParams *bp, EdgeHalf *eb)
if (bp->offset_type == BEVEL_AMT_PERCENT || bp->offset_type == BEVEL_AMT_ABSOLUTE) {
if (ea->is_bev && ebother != NULL && ebother->prev->is_bev) {
if (bp->offset_type == BEVEL_AMT_PERCENT) {
- return bp->offset > 50.0f ? 50.0f : 100.f;
+ return 50.0f;
}
/* This is only right sometimes. The exact answer is very hard to calculate. */
float blen = BM_edge_calc_length(eb->e);