Tracking: Refactor, generalize curve iteration API

Make it generic enough to support iterating over reprojection error
in the same manner as coordinate speed.
This commit is contained in:
Sergey Sharybin 2019-07-28 15:55:02 +02:00
parent 1c40227bfa
commit bf637984d1
4 changed files with 97 additions and 81 deletions

View File

@ -57,7 +57,7 @@ typedef struct TrackMotionCurveUserData {
static void tracking_segment_point_cb(void *userdata,
MovieTrackingTrack *UNUSED(track),
MovieTrackingMarker *UNUSED(marker),
int UNUSED(coord),
eClipCurveValueSource UNUSED(value_source),
int scene_framenr,
float val)
{
@ -68,13 +68,22 @@ static void tracking_segment_point_cb(void *userdata,
static void tracking_segment_start_cb(void *userdata,
MovieTrackingTrack *track,
int coord,
eClipCurveValueSource value_source,
bool is_point)
{
TrackMotionCurveUserData *data = (TrackMotionCurveUserData *)userdata;
float col[4] = {0.0f, 0.0f, 0.0f, 0.0f};
col[coord] = 1.0f;
switch (value_source) {
case CLIP_VALUE_SOURCE_SPEED_X:
col[0] = 1.0f;
break;
case CLIP_VALUE_SOURCE_SPEED_Y:
col[1] = 1.0f;
break;
default:
return;
}
if (track == data->act_track) {
col[3] = 1.0f;
@ -96,7 +105,8 @@ static void tracking_segment_start_cb(void *userdata,
}
}
static void tracking_segment_end_cb(void *UNUSED(userdata), int UNUSED(coord))
static void tracking_segment_end_cb(void *UNUSED(userdata),
eClipCurveValueSource UNUSED(value_source))
{
immEnd();
}
@ -104,7 +114,7 @@ static void tracking_segment_end_cb(void *UNUSED(userdata), int UNUSED(coord))
static void tracking_segment_knot_cb(void *userdata,
MovieTrackingTrack *track,
MovieTrackingMarker *marker,
int coord,
eClipCurveValueSource value_source,
int scene_framenr,
float val)
{
@ -114,8 +124,11 @@ static void tracking_segment_knot_cb(void *userdata,
if (track != data->act_track) {
return;
}
if (!ELEM(value_source, CLIP_VALUE_SOURCE_SPEED_X, CLIP_VALUE_SOURCE_SPEED_Y)) {
return;
}
sel_flag = coord == 0 ? MARKER_GRAPH_SEL_X : MARKER_GRAPH_SEL_Y;
sel_flag = value_source == CLIP_VALUE_SOURCE_SPEED_X ? MARKER_GRAPH_SEL_X : MARKER_GRAPH_SEL_Y;
sel = (marker->flag & sel_flag) ? 1 : 0;
if (sel == data->sel) {
@ -196,11 +209,11 @@ typedef struct TrackErrorCurveUserData {
static void tracking_error_segment_point_cb(void *userdata,
MovieTrackingTrack *track,
MovieTrackingMarker *marker,
int coord,
eClipCurveValueSource value_source,
int scene_framenr,
float UNUSED(value))
{
if (coord == 1) {
if (value_source == CLIP_VALUE_SOURCE_SPEED_Y) {
TrackErrorCurveUserData *data = (TrackErrorCurveUserData *)userdata;
float reprojected_position[4], bundle_position[4], marker_position[2], delta[2];
float reprojection_error;
@ -238,10 +251,10 @@ static void tracking_error_segment_point_cb(void *userdata,
static void tracking_error_segment_start_cb(void *userdata,
MovieTrackingTrack *track,
int coord,
eClipCurveValueSource value_source,
bool is_point)
{
if (coord == 1) {
if (value_source == CLIP_VALUE_SOURCE_SPEED_Y) {
TrackErrorCurveUserData *data = (TrackErrorCurveUserData *)userdata;
float col[4] = {0.0f, 0.0f, 1.0f, 1.0f};
@ -266,9 +279,10 @@ static void tracking_error_segment_start_cb(void *userdata,
}
}
static void tracking_error_segment_end_cb(void *UNUSED(userdata), int coord)
static void tracking_error_segment_end_cb(void *UNUSED(userdata),
eClipCurveValueSource value_source)
{
if (coord == 1) {
if (value_source == CLIP_VALUE_SOURCE_SPEED_Y) {
immEnd();
}
}

View File

@ -93,13 +93,13 @@ static void toggle_selection_cb(void *userdata, MovieTrackingMarker *marker)
/******************** mouse select operator ********************/
typedef struct {
int coord; /* coordinate index of found entity (0 = X-axis, 1 = Y-axis) */
eClipCurveValueSource value_source;
bool has_prev; /* if there's valid coordinate of previous point of curve segment */
float min_dist_sq, /* minimal distance between mouse and currently found entity */
mouse_co[2], /* mouse coordinate */
prev_co[2], /* coordinate of previous point of segment */
min_co[2]; /* coordinate of entity with minimal distance */
float min_dist_sq; /* minimal distance between mouse and currently found entity */
float mouse_co[2]; /* mouse coordinate */
float prev_co[2]; /* coordinate of previous point of segment */
float min_co[2]; /* coordinate of entity with minimal distance */
MovieTrackingTrack *track; /* nearest found track */
MovieTrackingMarker *marker; /* nearest found marker */
@ -108,7 +108,7 @@ typedef struct {
static void find_nearest_tracking_segment_cb(void *userdata,
MovieTrackingTrack *track,
MovieTrackingMarker *UNUSED(marker),
int coord,
eClipCurveValueSource value_source,
int scene_framenr,
float val)
{
@ -121,7 +121,7 @@ static void find_nearest_tracking_segment_cb(void *userdata,
if (data->track == NULL || dist_sq < data->min_dist_sq) {
data->track = track;
data->min_dist_sq = dist_sq;
data->coord = coord;
data->value_source = value_source;
copy_v2_v2(data->min_co, co);
}
}
@ -130,7 +130,8 @@ static void find_nearest_tracking_segment_cb(void *userdata,
copy_v2_v2(data->prev_co, co);
}
static void find_nearest_tracking_segment_end_cb(void *userdata, int UNUSED(coord))
static void find_nearest_tracking_segment_end_cb(void *userdata,
eClipCurveValueSource UNUSED(source_value))
{
MouseSelectUserData *data = userdata;
@ -140,7 +141,7 @@ static void find_nearest_tracking_segment_end_cb(void *userdata, int UNUSED(coor
static void find_nearest_tracking_knot_cb(void *userdata,
MovieTrackingTrack *track,
MovieTrackingMarker *marker,
int coord,
eClipCurveValueSource value_source,
int scene_framenr,
float val)
{
@ -154,7 +155,7 @@ static void find_nearest_tracking_knot_cb(void *userdata,
data->track = track;
data->marker = marker;
data->min_dist_sq = dist_sq;
data->coord = coord;
data->value_source = value_source;
copy_v2_v2(data->min_co, co);
}
}
@ -199,7 +200,7 @@ static bool mouse_select_knot(bContext *C, float co[2], bool extend)
toggle_selection_cb);
}
if (userdata.coord == 0) {
if (userdata.value_source == CLIP_VALUE_SOURCE_SPEED_X) {
if (extend && (userdata.marker->flag & MARKER_GRAPH_SEL_X) != 0) {
userdata.marker->flag &= ~MARKER_GRAPH_SEL_X;
}
@ -207,7 +208,7 @@ static bool mouse_select_knot(bContext *C, float co[2], bool extend)
userdata.marker->flag |= MARKER_GRAPH_SEL_X;
}
}
else {
else if (userdata.value_source == CLIP_VALUE_SOURCE_SPEED_Y) {
if (extend && (userdata.marker->flag & MARKER_GRAPH_SEL_Y) != 0) {
userdata.marker->flag &= ~MARKER_GRAPH_SEL_Y;
}
@ -356,16 +357,19 @@ typedef struct BoxSelectuserData {
static void box_select_cb(void *userdata,
MovieTrackingTrack *UNUSED(track),
MovieTrackingMarker *marker,
int coord,
eClipCurveValueSource value_source,
int scene_framenr,
float val)
{
BoxSelectuserData *data = (BoxSelectuserData *)userdata;
if (!ELEM(value_source, CLIP_VALUE_SOURCE_SPEED_X, CLIP_VALUE_SOURCE_SPEED_Y)) {
return;
}
if (BLI_rctf_isect_pt(&data->rect, scene_framenr, val)) {
int flag = 0;
if (coord == 0) {
if (value_source == CLIP_VALUE_SOURCE_SPEED_X) {
flag = MARKER_GRAPH_SEL_X;
}
else {
@ -591,7 +595,7 @@ typedef struct {
static void view_all_cb(void *userdata,
MovieTrackingTrack *UNUSED(track),
MovieTrackingMarker *UNUSED(marker),
int UNUSED(coord),
eClipCurveValueSource UNUSED(value_source),
int UNUSED(scene_framenr),
float val)
{

View File

@ -112,35 +112,42 @@ void CLIP_OT_cursor_set(struct wmOperatorType *ot);
struct ARegion *ED_clip_has_properties_region(struct ScrArea *sa);
/* clip_utils.c */
void clip_graph_tracking_values_iterate_track(
struct SpaceClip *sc,
struct MovieTrackingTrack *track,
void *userdata,
void (*func)(void *userdata,
struct MovieTrackingTrack *track,
struct MovieTrackingMarker *marker,
int coord,
int scene_framenr,
float val),
void (*segment_start)(
void *userdata, struct MovieTrackingTrack *track, int coord, bool is_point),
void (*segment_end)(void *userdata, int coord));
typedef enum {
CLIP_VALUE_SOURCE_SPEED_X,
CLIP_VALUE_SOURCE_SPEED_Y,
CLIP_VALUE_SOURCE_REPROJECTION_ERROR,
} eClipCurveValueSource;
typedef void (*ClipTrackValueCallback)(void *userdata,
struct MovieTrackingTrack *track,
struct MovieTrackingMarker *marker,
eClipCurveValueSource value_source,
int scene_framenr,
float val);
typedef void (*ClipTrackValueSegmentStartCallback)(void *userdata,
struct MovieTrackingTrack *track,
eClipCurveValueSource value_source,
bool is_point);
typedef void (*ClipTrackValueSegmentEndCallback)(void *userdata,
eClipCurveValueSource value_source);
void clip_graph_tracking_values_iterate_track(struct SpaceClip *sc,
struct MovieTrackingTrack *track,
void *userdata,
ClipTrackValueCallback func,
ClipTrackValueSegmentStartCallback segment_start,
ClipTrackValueSegmentEndCallback segment_end);
void clip_graph_tracking_values_iterate(struct SpaceClip *sc,
bool selected_only,
bool include_hidden,
void *userdata,
void (*func)(void *userdata,
struct MovieTrackingTrack *track,
struct MovieTrackingMarker *marker,
int coord,
int scene_framenr,
float val),
void (*segment_start)(void *userdata,
struct MovieTrackingTrack *track,
int coord,
bool is_point),
void (*segment_end)(void *userdata, int coord));
ClipTrackValueCallback func,
ClipTrackValueSegmentStartCallback segment_start,
ClipTrackValueSegmentEndCallback segment_end);
void clip_graph_tracking_iterate(struct SpaceClip *sc,
bool selected_only,

View File

@ -52,18 +52,12 @@
#include "clip_intern.h" // own include
void clip_graph_tracking_values_iterate_track(
SpaceClip *sc,
MovieTrackingTrack *track,
void *userdata,
void (*func)(void *userdata,
MovieTrackingTrack *track,
MovieTrackingMarker *marker,
int coord,
int scene_framenr,
float val),
void (*segment_start)(void *userdata, MovieTrackingTrack *track, int coord, bool is_point),
void (*segment_end)(void *userdata, int coord))
void clip_graph_tracking_values_iterate_track(SpaceClip *sc,
MovieTrackingTrack *track,
void *userdata,
ClipTrackValueCallback func,
ClipTrackValueSegmentStartCallback segment_start,
ClipTrackValueSegmentEndCallback segment_end)
{
MovieClip *clip = ED_space_clip_get_clip(sc);
int width, height, coord;
@ -71,6 +65,8 @@ void clip_graph_tracking_values_iterate_track(
BKE_movieclip_get_size(clip, &sc->user, &width, &height);
for (coord = 0; coord < 2; coord++) {
eClipCurveValueSource value_source = (coord == 0) ? CLIP_VALUE_SOURCE_SPEED_X :
CLIP_VALUE_SOURCE_SPEED_Y;
int i, prevfra = track->markers[0].framenr;
bool open = false;
float prevval = 0.0f;
@ -82,7 +78,7 @@ void clip_graph_tracking_values_iterate_track(
if (marker->flag & MARKER_DISABLED) {
if (open) {
if (segment_end) {
segment_end(userdata, coord);
segment_end(userdata, value_source);
}
open = false;
@ -94,10 +90,11 @@ void clip_graph_tracking_values_iterate_track(
if (!open) {
if (segment_start) {
if ((i + 1) == track->markersnr) {
segment_start(userdata, track, coord, true);
segment_start(userdata, track, value_source, true);
}
else {
segment_start(userdata, track, coord, (track->markers[i + 1].flag & MARKER_DISABLED));
segment_start(
userdata, track, value_source, (track->markers[i + 1].flag & MARKER_DISABLED));
}
}
@ -112,7 +109,7 @@ void clip_graph_tracking_values_iterate_track(
if (func) {
int scene_framenr = BKE_movieclip_remap_clip_to_scene_frame(clip, marker->framenr);
func(userdata, track, marker, coord, scene_framenr, val);
func(userdata, track, marker, value_source, scene_framenr, val);
}
prevval = marker->pos[coord];
@ -121,25 +118,19 @@ void clip_graph_tracking_values_iterate_track(
if (open) {
if (segment_end) {
segment_end(userdata, coord);
segment_end(userdata, value_source);
}
}
}
}
void clip_graph_tracking_values_iterate(
SpaceClip *sc,
bool selected_only,
bool include_hidden,
void *userdata,
void (*func)(void *userdata,
MovieTrackingTrack *track,
MovieTrackingMarker *marker,
int coord,
int scene_framenr,
float val),
void (*segment_start)(void *userdata, MovieTrackingTrack *track, int coord, bool is_point),
void (*segment_end)(void *userdata, int coord))
void clip_graph_tracking_values_iterate(SpaceClip *sc,
bool selected_only,
bool include_hidden,
void *userdata,
ClipTrackValueCallback func,
ClipTrackValueSegmentStartCallback segment_start,
ClipTrackValueSegmentEndCallback segment_end)
{
MovieClip *clip = ED_space_clip_get_clip(sc);
MovieTracking *tracking = &clip->tracking;