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:
authorCampbell Barton <ideasman42@gmail.com>2020-08-28 07:34:26 +0300
committerJeroen Bakker <jeroen@blender.org>2020-09-02 15:53:04 +0300
commit7071daaee3f65b155466c4da1ba825b0407b2fe4 (patch)
tree72f1d561e88c54f6de3959b270af89869de0997a
parent8cc52ef6e20878bc61b0ce5f61f6df8b11fe1250 (diff)
Fix T80135: Duplicate doesn't preserve active spline
Checks to preserve the active spline on duplication required an active vertex too. Now having no active vertex doesn't prevent duplicate from keeping the spline active. Reviewed by: @mano-wii Ref D8729
-rw-r--r--source/blender/editors/curve/editcurve.c105
1 files changed, 65 insertions, 40 deletions
diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c
index 240f5261960..dcf4d344e05 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -2169,12 +2169,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;
@@ -2424,26 +2434,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;
- }
- else 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;
+ }
}
}
}
@@ -2471,16 +2486,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;
+ }
}
}
}
@@ -2507,15 +2527,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;
+ }
}
}
}