Tracking: Make transform cancel use explicit frame number

Before transform cancel will request marker at a current frame number
and restore transform flags to it. This worked fine if there was only
one marker from track in the transform data. This did not work correct
when multiple markers from track were added to transform data.

This allows to implement proportional editing in the clip editor.
This commit is contained in:
Sergey Sharybin 2021-01-14 11:32:28 +01:00
parent 4b1112c8c9
commit 9e038a2c6b
1 changed files with 14 additions and 5 deletions

View File

@ -52,6 +52,7 @@ typedef struct TransDataTracking {
float (*smarkers)[2];
int markersnr;
int framenr;
MovieTrackingMarker *markers;
/* marker transformation from curves editor */
@ -75,6 +76,8 @@ enum transDataTracking_Mode {
typedef struct TransformInitContext {
SpaceClip *space_clip;
TransInfo *t;
TransDataContainer *tc;
/* MOTE: There pointers will be nullptr during counting step.
@ -110,6 +113,7 @@ static void markerToTransDataInit(TransformInitContext *init_context,
int anchor = area == TRACK_AREA_POINT && off;
tdt->flag = marker->flag;
tdt->framenr = marker->framenr;
tdt->mode = transDataTracking_ModeTracks;
if (anchor) {
@ -264,6 +268,7 @@ static void planeMarkerToTransDataInit(TransformInitContext *init_context,
}
tdt->flag = plane_marker->flag;
tdt->framenr = plane_marker->framenr;
tdt->mode = transDataTracking_ModePlaneTracks;
tdt->plane_track = plane_track;
@ -350,6 +355,7 @@ static void createTransTrackingTracksData(bContext *C, TransInfo *t)
TransformInitContext init_context = {NULL};
init_context.space_clip = space_clip;
init_context.t = t;
init_context.tc = tc;
/* Count required tranformation data. */
@ -567,17 +573,17 @@ void createTransTrackingData(bContext *C, TransInfo *t)
static void cancelTransTracking(TransInfo *t)
{
TransDataContainer *tc = TRANS_DATA_CONTAINER_FIRST_SINGLE(t);
SpaceClip *sc = t->area->spacedata.first;
int i, framenr = ED_space_clip_get_clip_frame_number(sc);
TransDataTracking *tdt_array = tc->custom.type.data;
i = 0;
int i = 0;
while (i < tc->data_len) {
TransDataTracking *tdt = &tdt_array[i];
if (tdt->mode == transDataTracking_ModeTracks) {
MovieTrackingTrack *track = tdt->track;
MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr);
MovieTrackingMarker *marker = BKE_tracking_marker_get_exact(track, tdt->framenr);
BLI_assert(marker != NULL);
marker->flag = tdt->flag;
@ -613,7 +619,10 @@ static void cancelTransTracking(TransInfo *t)
}
else if (tdt->mode == transDataTracking_ModePlaneTracks) {
MovieTrackingPlaneTrack *plane_track = tdt->plane_track;
MovieTrackingPlaneMarker *plane_marker = BKE_tracking_plane_marker_get(plane_track, framenr);
MovieTrackingPlaneMarker *plane_marker = BKE_tracking_plane_marker_get(plane_track,
tdt->framenr);
BLI_assert(plane_marker != NULL);
plane_marker->flag = tdt->flag;
i += 3;