Cleanup: Strong type for track path clear API

Replace a generic int value with an enum.

Should be no functional changes.
This commit is contained in:
Sergey Sharybin 2022-05-12 10:16:33 +02:00
parent 81f23ad57a
commit a0e63bac02
3 changed files with 72 additions and 63 deletions

View File

@ -32,12 +32,6 @@ struct rcti;
* Common types and constants.
*/
enum {
TRACK_CLEAR_UPTO = 0,
TRACK_CLEAR_REMAINED = 1,
TRACK_CLEAR_ALL = 2,
};
enum {
CLAMP_PAT_DIM = 1,
CLAMP_PAT_POS = 2,
@ -235,15 +229,21 @@ bool BKE_tracking_track_has_marker_at_frame(struct MovieTrackingTrack *track, in
bool BKE_tracking_track_has_enabled_marker_at_frame(struct MovieTrackingTrack *track, int framenr);
/**
* Clear track's path:
*
* - If action is #TRACK_CLEAR_REMAINED path from `ref_frame+1` up to end will be clear.
* - If action is #TRACK_CLEAR_UPTO path from the beginning up to `ref_frame-1` will be clear.
* - If action is #TRACK_CLEAR_ALL only marker at frame ref_frame will remain.
* Clear track's path.
*
* \note frame number should be in clip space, not scene space.
*/
void BKE_tracking_track_path_clear(struct MovieTrackingTrack *track, int ref_frame, int action);
typedef enum eTrackClearAction {
/* Clear path from `ref_frame+1` up to the . */
TRACK_CLEAR_UPTO,
/* Clear path from the beginning up to `ref_frame-1`. */
TRACK_CLEAR_REMAINED,
/* Only marker at frame `ref_frame` will remain. */
TRACK_CLEAR_ALL,
} eTrackClearAction;
void BKE_tracking_track_path_clear(struct MovieTrackingTrack *track,
int ref_frame,
eTrackClearAction action);
void BKE_tracking_tracks_join(struct MovieTracking *tracking,
struct MovieTrackingTrack *dst_track,

View File

@ -727,69 +727,78 @@ bool BKE_tracking_track_has_enabled_marker_at_frame(MovieTrackingTrack *track, i
return marker && (marker->flag & MARKER_DISABLED) == 0;
}
void BKE_tracking_track_path_clear(MovieTrackingTrack *track, int ref_frame, int action)
static void path_clear_remained(MovieTrackingTrack *track, const int ref_frame)
{
int a;
for (int a = 1; a < track->markersnr; a++) {
if (track->markers[a].framenr > ref_frame) {
track->markersnr = a;
track->markers = MEM_reallocN(track->markers,
sizeof(MovieTrackingMarker) * track->markersnr);
if (action == TRACK_CLEAR_REMAINED) {
a = 1;
while (a < track->markersnr) {
if (track->markers[a].framenr > ref_frame) {
track->markersnr = a;
track->markers = MEM_reallocN(track->markers,
sizeof(MovieTrackingMarker) * track->markersnr);
break;
}
a++;
}
if (track->markersnr) {
tracking_marker_insert_disabled(track, &track->markers[track->markersnr - 1], false, true);
break;
}
}
else if (action == TRACK_CLEAR_UPTO) {
a = track->markersnr - 1;
while (a >= 0) {
if (track->markers[a].framenr <= ref_frame) {
memmove(track->markers,
track->markers + a,
(track->markersnr - a) * sizeof(MovieTrackingMarker));
if (track->markersnr) {
tracking_marker_insert_disabled(track, &track->markers[track->markersnr - 1], false, true);
}
}
track->markersnr = track->markersnr - a;
track->markers = MEM_reallocN(track->markers,
sizeof(MovieTrackingMarker) * track->markersnr);
static void path_clear_up_to(MovieTrackingTrack *track, const int ref_frame)
{
for (int a = track->markersnr - 1; a >= 0; a--) {
if (track->markers[a].framenr <= ref_frame) {
memmove(track->markers,
track->markers + a,
(track->markersnr - a) * sizeof(MovieTrackingMarker));
break;
}
track->markersnr = track->markersnr - a;
track->markers = MEM_reallocN(track->markers,
sizeof(MovieTrackingMarker) * track->markersnr);
a--;
}
if (track->markersnr) {
tracking_marker_insert_disabled(track, &track->markers[0], true, true);
break;
}
}
else if (action == TRACK_CLEAR_ALL) {
MovieTrackingMarker *marker, marker_new;
marker = BKE_tracking_marker_get(track, ref_frame);
marker_new = *marker;
MEM_freeN(track->markers);
track->markers = NULL;
track->markersnr = 0;
BKE_tracking_marker_insert(track, &marker_new);
tracking_marker_insert_disabled(track, &marker_new, true, true);
tracking_marker_insert_disabled(track, &marker_new, false, true);
if (track->markersnr) {
tracking_marker_insert_disabled(track, &track->markers[0], true, true);
}
}
static void path_clear_all(MovieTrackingTrack *track, const int ref_frame)
{
MovieTrackingMarker *marker, marker_new;
marker = BKE_tracking_marker_get(track, ref_frame);
marker_new = *marker;
MEM_freeN(track->markers);
track->markers = NULL;
track->markersnr = 0;
BKE_tracking_marker_insert(track, &marker_new);
tracking_marker_insert_disabled(track, &marker_new, true, true);
tracking_marker_insert_disabled(track, &marker_new, false, true);
}
void BKE_tracking_track_path_clear(MovieTrackingTrack *track,
const int ref_frame,
const eTrackClearAction action)
{
switch (action) {
case TRACK_CLEAR_REMAINED:
path_clear_remained(track, ref_frame);
break;
case TRACK_CLEAR_UPTO:
path_clear_up_to(track, ref_frame);
break;
case TRACK_CLEAR_ALL:
path_clear_all(track, ref_frame);
break;
};
}
void BKE_tracking_tracks_join(MovieTracking *tracking,
MovieTrackingTrack *dst_track,
MovieTrackingTrack *src_track)

View File

@ -1012,9 +1012,9 @@ static int clear_track_path_exec(bContext *C, wmOperator *op)
MovieClip *clip = ED_space_clip_get_clip(sc);
MovieTracking *tracking = &clip->tracking;
ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking);
int action = RNA_enum_get(op->ptr, "action");
const eTrackClearAction action = RNA_enum_get(op->ptr, "action");
const bool clear_active = RNA_boolean_get(op->ptr, "clear_active");
int framenr = ED_space_clip_get_clip_frame_number(sc);
const int framenr = ED_space_clip_get_clip_frame_number(sc);
if (clear_active) {
MovieTrackingTrack *track = BKE_tracking_track_get_active(tracking);