Fix T99125: Curve mapping widget removes all vector points

Add a new flag value `CUMA_REMOVE` to explicitly tag duplicate points
for removal. This prevents a bug where all curve points with vector
handles were deleted, when removing duplicate curve points while
updating the widget. This happened, because the flag value used to tag
points for removal was the same as the value of `CUMA_HANDLE_VECTOR`
used to store the handle type of the curve point.

Reviewed By: Hans Goudey

Differential Revision: http://developer.blender.org/D16463
This commit is contained in:
Leon Schittek 2022-11-17 21:54:30 +01:00
parent 609a681fb5
commit 8d77973dd7
Notes: blender-bot 2023-09-08 04:55:43 +02:00
Referenced by issue #99125, Curve Mapping UI Template: All points disappear when two points gets too close
2 changed files with 5 additions and 3 deletions

View File

@ -908,13 +908,13 @@ void BKE_curvemapping_changed(CurveMapping *cumap, const bool rem_doubles)
dy = cmp[a].y - cmp[a + 1].y;
if (sqrtf(dx * dx + dy * dy) < thresh) {
if (a == 0) {
cmp[a + 1].flag |= CUMA_HANDLE_VECTOR;
cmp[a + 1].flag |= CUMA_REMOVE;
if (cmp[a + 1].flag & CUMA_SELECT) {
cmp[a].flag |= CUMA_SELECT;
}
}
else {
cmp[a].flag |= CUMA_HANDLE_VECTOR;
cmp[a].flag |= CUMA_REMOVE;
if (cmp[a].flag & CUMA_SELECT) {
cmp[a + 1].flag |= CUMA_SELECT;
}
@ -923,7 +923,7 @@ void BKE_curvemapping_changed(CurveMapping *cumap, const bool rem_doubles)
}
}
if (a != cuma->totpoint - 1) {
BKE_curvemap_remove(cuma, 2);
BKE_curvemap_remove(cuma, CUMA_REMOVE);
}
}
curvemap_make_table(cumap, cuma);

View File

@ -35,6 +35,8 @@ enum {
CUMA_SELECT = (1 << 0),
CUMA_HANDLE_VECTOR = (1 << 1),
CUMA_HANDLE_AUTO_ANIM = (1 << 2),
/** Temporary tag for point deletion. */
CUMA_REMOVE = (1 << 3),
};
typedef struct CurveMap {