diff options
author | Campbell Barton <ideasman42@gmail.com> | 2020-08-28 07:37:05 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2020-08-28 07:37:05 +0300 |
commit | 94d6b54826f4bb7c5de1666c416bd5b19534cdd5 (patch) | |
tree | 762d6a63e4f4ccce199b7a66112885864a7286d9 /source/blender/editors/curve/editcurve.c | |
parent | bc2830a3ce15de65bc231a79f167bb32404f3c80 (diff) | |
parent | 1725e46cee167d615db6be1dba64090459ac2321 (diff) |
Merge branch 'blender-v2.90-release' into master
Diffstat (limited to 'source/blender/editors/curve/editcurve.c')
-rw-r--r-- | source/blender/editors/curve/editcurve.c | 105 |
1 files changed, 65 insertions, 40 deletions
diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index 4e12063544e..fb102574a85 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -2172,12 +2172,22 @@ bool ed_editnurb_extrude_flag(EditNurb *editnurb, const short flag) return ok; } +static void calc_duplicate_actnurb(const ListBase *editnurb, const ListBase *newnurb, Curve *cu) +{ + cu->actnu = BLI_listbase_count(editnurb) + BLI_listbase_count(newnurb); +} + static bool calc_duplicate_actvert( const ListBase *editnurb, const ListBase *newnurb, Curve *cu, int start, int end, int vert) { + if (cu->actvert == -1) { + calc_duplicate_actnurb(editnurb, newnurb, cu); + return true; + } + if ((start <= cu->actvert) && (end > cu->actvert)) { + calc_duplicate_actnurb(editnurb, newnurb, cu); cu->actvert = vert; - cu->actnu = BLI_listbase_count(editnurb) + BLI_listbase_count(newnurb); return true; } return false; @@ -2427,26 +2437,31 @@ static void adduplicateflagNurb( } if (cu->actnu == i) { - for (b = 0, diffa = 0; b < newv; b++, diffa += nu->pntsu - newu) { - starta = b * nu->pntsu + a; - if (calc_duplicate_actvert(editnurb, - newnurb, - cu, - cu->actvert, - starta, - cu->actvert % nu->pntsu + newu + - b * newnu->pntsu)) { - /* actvert in cyclicu selection */ - break; - } - if (calc_duplicate_actvert(editnurb, - newnurb, - cu, - starta, - starta + newu, - cu->actvert - starta + b * newnu->pntsu)) { - /* actvert in 'current' iteration selection */ - break; + if (cu->actvert == -1) { + calc_duplicate_actnurb(editnurb, newnurb, cu); + } + else { + for (b = 0, diffa = 0; b < newv; b++, diffa += nu->pntsu - newu) { + starta = b * nu->pntsu + a; + if (calc_duplicate_actvert(editnurb, + newnurb, + cu, + cu->actvert, + starta, + cu->actvert % nu->pntsu + newu + + b * newnu->pntsu)) { + /* actvert in cyclicu selection */ + break; + } + if (calc_duplicate_actvert(editnurb, + newnurb, + cu, + starta, + starta + newu, + cu->actvert - starta + b * newnu->pntsu)) { + /* actvert in 'current' iteration selection */ + break; + } } } } @@ -2474,16 +2489,21 @@ static void adduplicateflagNurb( /* general case if not handled by cyclicu or cyclicv */ if (cu->actnu == i) { - for (b = 0, diffa = 0; b < newv; b++, diffa += nu->pntsu - newu) { - starta = b * nu->pntsu + a; - if (calc_duplicate_actvert(editnurb, - newnurb, - cu, - starta, - starta + newu, - cu->actvert - (a / nu->pntsu * nu->pntsu + diffa + - (starta % nu->pntsu)))) { - break; + if (cu->actvert == -1) { + calc_duplicate_actnurb(editnurb, newnurb, cu); + } + else { + for (b = 0, diffa = 0; b < newv; b++, diffa += nu->pntsu - newu) { + starta = b * nu->pntsu + a; + if (calc_duplicate_actvert(editnurb, + newnurb, + cu, + starta, + starta + newu, + cu->actvert - (a / nu->pntsu * nu->pntsu + diffa + + (starta % nu->pntsu)))) { + break; + } } } } @@ -2510,15 +2530,20 @@ static void adduplicateflagNurb( /* check for actvert in the unused cyclicuv selection */ if (cu->actnu == i) { - for (b = 0, diffa = 0; b < newv; b++, diffa += nu->pntsu - newu) { - starta = b * nu->pntsu; - if (calc_duplicate_actvert(editnurb, - newnurb, - cu, - starta, - starta + newu, - cu->actvert - (diffa + (starta % nu->pntsu)))) { - break; + if (cu->actvert == -1) { + calc_duplicate_actnurb(editnurb, newnurb, cu); + } + else { + for (b = 0, diffa = 0; b < newv; b++, diffa += nu->pntsu - newu) { + starta = b * nu->pntsu; + if (calc_duplicate_actvert(editnurb, + newnurb, + cu, + starta, + starta + newu, + cu->actvert - (diffa + (starta % nu->pntsu)))) { + break; + } } } } |