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:
parent
1c40227bfa
commit
bf637984d1
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue