Camera tracking integration

===========================

- Fixed "sliding" when panning footage in high zoom.
  This was most noticeable near right top corner of footage.
- Fixed 1px flickering of marker during playback with
  "Lock to Selection" toggled on. This was caused by
  precision errors. Used UI_view2d_to_region_no_clip-like
  offsets calculations, but in float values. Maybe there
  could be something smarter..
- Implemented tarcking along single frame.
  Hotkey is ALT+left/right array. Also changed a bit
  tracking tools buttons in Tools panel.
- Fixed "Lock to Selection" during tracking -- tracks
  synchronization should happen before centering view.
- Approximate marker's position for frames, which haven't
  got marker for them.
  Use the nearest marker from left side for approximation.
  For frames above  first marker's framenr sue first marker
  position.
- Markers now could be disabled. Added checkbox to
  "Active Marker" panel.
- Changes in cache line:
  * Bright line means active track has marker for frame.
  * Dark line means marker's position is approximated.
  * Yellow-less line means marker is disabled for that frames.

NOTE: .blend files which are saved with previous tomato version
      would fail to work properly. I don't want to spend time
      on making that files work properly atm, so don't blame on this.
This commit is contained in:
Sergey Sharybin
2011-06-27 14:24:23 +00:00
parent 70eb9e85c5
commit 08407e79ea
10 changed files with 331 additions and 137 deletions

View File

@@ -66,11 +66,20 @@ class CLIP_PT_tools(bpy.types.Panel):
col = layout.column(align=True)
col.label(text="2D tracking:")
col.operator("clip.track_markers")
col.operator("clip.track_markers", text="Track Backwards").backwards=True
col.operator("clip.clear_track_path")
row = col.row(align=True)
op = row.operator("clip.track_markers", text="", icon='REW')
op.sequence = True
op.backwards = True
op = row.operator("clip.track_markers", text="", icon='PLAY_REVERSE')
op.backwards = True
row.operator("clip.track_markers", text="", icon='PLAY')
op = row.operator("clip.track_markers", text="", icon='FF')
op.sequence = True
layout.operator("clip.clear_track_path")
else:
layout.operator('clip.open')
layout.operator('clip.open')
class CLIP_PT_marker_preview(bpy.types.Panel):

View File

@@ -45,6 +45,7 @@ void BKE_tracking_clamp_track(struct MovieTrackingTrack *track, int event);
void BKE_tracking_track_flag(struct MovieTrackingTrack *track, int area, int flag, int clear);
void BKE_tracking_insert_marker(struct MovieTrackingTrack *track, struct MovieTrackingMarker *marker);
struct MovieTrackingMarker *BKE_tracking_get_marker(struct MovieTrackingTrack *track, int framenr);
struct MovieTrackingMarker *BKE_tracking_ensure_marker(struct MovieTrackingTrack *track, int framenr);
int BKE_tracking_has_marker(struct MovieTrackingTrack *track, int framenr);
void BKE_tracking_free_track(struct MovieTrackingTrack *track);

View File

@@ -150,7 +150,7 @@ void BKE_tracking_insert_marker(MovieTrackingTrack *track, MovieTrackingMarker *
{
MovieTrackingMarker *old_marker= BKE_tracking_get_marker(track, marker->framenr);
if(old_marker) {
if(old_marker && old_marker->framenr==marker->framenr) {
*old_marker= *marker;
} else {
int a= track->markersnr;
@@ -167,6 +167,8 @@ void BKE_tracking_insert_marker(MovieTrackingTrack *track, MovieTrackingMarker *
memmove(track->markers+a+2, track->markers+a+1, (track->markersnr-a-2)*sizeof(MovieTrackingMarker));
track->markers[a+1]= *marker;
track->last_marker= a+1;
}
}
@@ -177,39 +179,58 @@ MovieTrackingMarker *BKE_tracking_get_marker(MovieTrackingTrack *track, int fram
if(!track->markersnr)
return NULL;
if((track->flag&TRACK_PROCESSED)==0) {
/* non-precessed tracks contains the only marker
which should be used independelntly from current frame number. */
if(track->markersnr)
return &track->markers[0];
return NULL;
}
/* approximate pre-first framenr marker with first marker */
if(framenr<track->markers[0].framenr)
return &track->markers[0];
if(track->last_marker<track->markersnr)
a= track->last_marker;
if(track->markers[a].framenr<=framenr) {
while(a<track->markersnr) {
while(a<track->markersnr && track->markers[a].framenr<=framenr) {
if(track->markers[a].framenr==framenr) {
track->last_marker= a;
return &track->markers[a];
}
a++;
}
/* if there's no marker for exact position, use nearest marker from left side */
return &track->markers[a-1];
} else {
while(a--) {
while(a>=0 && track->markers[a].framenr>=framenr) {
if(track->markers[a].framenr==framenr) {
track->last_marker= a;
return &track->markers[a];
}
a--;
}
/* if there's no marker for exact position, use nearest marker from left side */
return &track->markers[a];
}
return NULL;
}
MovieTrackingMarker *BKE_tracking_ensure_marker(MovieTrackingTrack *track, int framenr)
{
MovieTrackingMarker *marker= BKE_tracking_get_marker(track, framenr);
if(marker && marker->framenr!=framenr) {
MovieTrackingMarker marker_new;
marker_new= *marker;
marker_new.framenr= framenr;
BKE_tracking_insert_marker(track, &marker_new);
marker= BKE_tracking_get_marker(track, framenr);
}
return marker;
}
int BKE_tracking_has_marker(MovieTrackingTrack *track, int framenr)
{
return BKE_tracking_get_marker(track, framenr) != 0;
@@ -515,7 +536,7 @@ int BKE_tracking_next(MovieTrackingContext *context)
while(track) {
MovieTrackingMarker *marker= BKE_tracking_get_marker(track, curfra);
if(marker) {
if(marker && marker->framenr==curfra) {
#ifdef WITH_LIBMV
int width, height, pos[2];
float *patch= acquire_search_floatbuf(ibuf, track, marker, &width, &height, pos);
@@ -533,17 +554,13 @@ int BKE_tracking_next(MovieTrackingContext *context)
x1, y1, &x2, &y2)) {
MovieTrackingMarker marker_new;
memset(&marker_new, 0, sizeof(marker_new));
marker_new.pos[0]= marker->pos[0]+track->search_min[0]+x2/ibuf_new->x;
marker_new.pos[1]= marker->pos[1]+track->search_min[1]+y2/ibuf_new->y;
if(context->backwards) marker_new.framenr= curfra-1;
else marker_new.framenr= curfra+1;
/* happens when current frame was changed after placing marker
but before tracking it */
if(marker->framenr!=curfra)
marker->framenr= curfra;
track->flag|= TRACK_PROCESSED;
BKE_tracking_insert_marker(track, &marker_new);

View File

@@ -66,6 +66,7 @@
#define B_MARKER_PAT_DIM 5
#define B_MARKER_SEARCH_POS 6
#define B_MARKER_SEARCH_DIM 7
#define B_MARKER_FLAG 8
static void to_pixel_space(float r[2], float a[2], int width, int height)
{
@@ -74,7 +75,7 @@ static void to_pixel_space(float r[2], float a[2], int width, int height)
r[1]*= height;
}
static void trackingMarker_buttons(const bContext *C, uiBlock *block)
static void trackingMarker_buttons(const bContext *C, uiLayout *layout)
{
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
@@ -82,6 +83,8 @@ static void trackingMarker_buttons(const bContext *C, uiBlock *block)
MovieTrackingTrack *track;
MovieTrackingMarker *marker;
float pat_dim[2], pat_pos[2], search_dim[2], search_pos[2];
uiBlock *block;
uiLayout *col;
ED_space_clip_size(sc, &width, &height);
BKE_movieclip_last_selection(clip, &type, (void**)&track);
@@ -106,6 +109,17 @@ static void trackingMarker_buttons(const bContext *C, uiBlock *block)
to_pixel_space(sc->track_search, search_dim, width, height);
to_pixel_space(sc->track_search_pos, search_pos, width, height);
sc->marker_flag= marker->flag;
block= uiLayoutAbsoluteBlock(layout);
uiDefButBitI(block, OPTION, MARKER_DISABLED, B_MARKER_FLAG, "Disabled", 10, 190, 145, 19, &sc->marker_flag,
0, 0, 0, 0, "Marker is disabled for current frame.");
col= uiLayoutColumn(layout, 1);
uiLayoutSetActive(col, (sc->marker_flag&MARKER_DISABLED)==0);
block= uiLayoutAbsoluteBlock(col);
uiBlockBeginAlign(block);
uiDefBut(block, LABEL, 0, "Position:", 0, 171, 145, 19, NULL, 0, 0, 0, 0, "");
@@ -133,6 +147,7 @@ static void trackingMarker_buttons(const bContext *C, uiBlock *block)
10.0*width, step, digits, "Width of marker's search in screen soordinates.");
uiDefButF(block, NUM, B_MARKER_SEARCH_DIM, "Height:", 10, 0, 300, 19, &sc->track_search[1], 3.0f,
10.0*height, step, digits, "Height of marker's search in screen soordinates.");
uiBlockEndAlign(block);
}
@@ -147,7 +162,8 @@ static void do_tracking_marker(bContext *C, void *UNUSED(arg), int event)
ED_space_clip_size(sc, &width, &height);
BKE_movieclip_last_selection(clip, &type, (void**)&track);
marker= BKE_tracking_get_marker(track, sc->user.framenr);
marker= BKE_tracking_ensure_marker(track, sc->user.framenr);
if(event==B_MARKER_POS) {
marker->pos[0]= sc->marker_pos[0]/width;
@@ -211,6 +227,10 @@ static void do_tracking_marker(bContext *C, void *UNUSED(arg), int event)
BKE_tracking_clamp_track(track, CLAMP_SEARCH_DIM);
ok= 1;
} else if(event==B_MARKER_FLAG) {
marker->flag= sc->marker_flag;
ok= 1;
}
@@ -222,7 +242,6 @@ static void do_tracking_marker(bContext *C, void *UNUSED(arg), int event)
static int clip_panel_marker_poll(const bContext *C, PanelType *UNUSED(pt))
{
Scene *scene= CTX_data_scene(C);
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip;
int type;
@@ -251,7 +270,7 @@ static void clip_panel_marker(const bContext *C, Panel *pa)
block= uiLayoutAbsoluteBlock(pa->layout);
uiBlockSetHandleFunc(block, do_tracking_marker, NULL);
trackingMarker_buttons(C, block);
trackingMarker_buttons(C, pa->layout);
}
void ED_clip_buttons_register(ARegionType *art)

View File

@@ -69,14 +69,18 @@
static void draw_movieclip_cache(SpaceClip *sc, ARegion *ar, MovieClip *clip, Scene *scene)
{
float x;
int *points, totseg;
int *points, totseg, sel_type;
float sfra= SFRA, efra= EFRA;
void *sel;
float framelen= ar->winx/(efra-sfra+1);
BKE_movieclip_last_selection(clip, &sel_type, &sel);
glEnable(GL_BLEND);
/* cache background */
glColor4ub(128, 128, 255, 64);
glRecti(0, 0, ar->winx, 5);
glRecti(0, 0, ar->winx, 8);
/* cached segments -- could be usefu lto debug caching strategies */
BKE_movieclip_get_cache_segments(clip, &totseg, &points);
@@ -91,7 +95,40 @@ static void draw_movieclip_cache(SpaceClip *sc, ARegion *ar, MovieClip *clip, Sc
x1= (points[a*2]-sfra)/(efra-sfra+1)*ar->winx;
x2= (points[a*2+1]-sfra+1)/(efra-sfra+1)*ar->winx;
glRecti(x1, 0, x2, 5);
glRecti(x1, 0, x2, 8);
}
}
/* track */
if(sel_type==MCLIP_SEL_TRACK) {
int i, a= 0;
MovieTrackingTrack *track= (MovieTrackingTrack *)sel;
for(i= sfra; i <= efra; i++) {
int framenr;
MovieTrackingMarker *marker;
while(a<track->markersnr) {
if(track->markers[a].framenr>=i)
break;
if(a<track->markersnr-1 && track->markers[a+1].framenr>i)
break;
a++;
}
if(a<track->markersnr) marker= &track->markers[a];
else marker= &track->markers[track->markersnr-1];
if((marker->flag&MARKER_DISABLED)==0) {
framenr= marker->framenr;
if(framenr!=i) glColor4ub(128, 128, 0, 96);
else glColor4ub(255, 255, 0, 96);
glRecti((i-1)*framelen, 0, i*framelen, 4);
}
}
}
@@ -101,15 +138,15 @@ static void draw_movieclip_cache(SpaceClip *sc, ARegion *ar, MovieClip *clip, Sc
x= (sc->user.framenr-sfra)/(efra-sfra+1)*ar->winx;
UI_ThemeColor(TH_CFRAME);
glRecti(x, 0, x+ar->winx/(efra-sfra), 5);
glRecti(x, 0, x+framelen, 8);
}
static void draw_movieclip_buffer(SpaceClip *sc, ARegion *ar, ImBuf *ibuf)
static void draw_movieclip_buffer(ARegion *ar, ImBuf *ibuf, float zoomx, float zoomy)
{
int x, y;
/* set zoom */
glPixelZoom(sc->zoom, sc->zoom);
glPixelZoom(zoomx, zoomy);
/* find window pixel coordinates of origin */
UI_view2d_to_region_no_clip(&ar->v2d, 0.f, 0.f, &x, &y);
@@ -129,7 +166,7 @@ static void draw_track_path(SpaceClip *sc, MovieClip *clip, MovieTrackingTrack *
int count= sc->path_length;
int i, a, b, sel_type, curindex= -1;
float path[102][2];
int tiny= sc->flag&SC_SHOW_TINY_MARKER;
int tiny= sc->flag&SC_SHOW_TINY_MARKER, framenr;
MovieTrackingMarker *marker;
void *sel;
@@ -142,37 +179,44 @@ static void draw_track_path(SpaceClip *sc, MovieClip *clip, MovieTrackingTrack *
if((track->flag&TRACK_PROCESSED)==0)
return;
if(!BKE_tracking_has_marker(track, sc->user.framenr))
marker= BKE_tracking_get_marker(track, sc->user.framenr);
if(marker==NULL || marker->flag&MARKER_DISABLED)
return;
framenr= marker->framenr;
a= count;
i= sc->user.framenr-1;
while(i>=sc->user.framenr-count) {
i= framenr-1;
while(i>=framenr-count) {
marker= BKE_tracking_get_marker(track, i);
if(!marker)
if(!marker || marker->flag&MARKER_DISABLED)
break;
copy_v2_v2(path[--a], marker->pos);
if(marker->framenr==i) {
copy_v2_v2(path[--a], marker->pos);
if(marker->framenr==sc->user.framenr)
curindex= a;
if(marker->framenr==sc->user.framenr)
curindex= a;
}
i--;
}
b= count;
i= sc->user.framenr;
while(i<=sc->user.framenr+count) {
i= framenr;
while(i<=framenr+count) {
marker= BKE_tracking_get_marker(track, i);
if(!marker)
if(!marker || marker->flag&MARKER_DISABLED)
break;
if(marker->framenr==sc->user.framenr)
curindex= b;
if(marker->framenr==i) {
if(marker->framenr==sc->user.framenr)
curindex= b;
copy_v2_v2(path[b++], marker->pos);
copy_v2_v2(path[b++], marker->pos);
}
i++;
}
@@ -226,12 +270,15 @@ static void draw_marker_outline(SpaceClip *sc, MovieTrackingTrack *track, MovieT
int tiny= sc->flag&SC_SHOW_TINY_MARKER;
UI_ThemeColor(TH_MARKER_OUTLINE);
if(tiny) glPointSize(3.0f);
else glPointSize(4.0f);
glBegin(GL_POINTS);
glVertex2f(marker->pos[0], marker->pos[1]);
glEnd();
glPointSize(1.0f);
if((marker->flag&MARKER_DISABLED)==0) {
if(tiny) glPointSize(3.0f);
else glPointSize(4.0f);
glBegin(GL_POINTS);
glVertex2f(marker->pos[0], marker->pos[1]);
glEnd();
glPointSize(1.0f);
}
/* pattern and search outline */
glPushMatrix();
@@ -239,7 +286,7 @@ static void draw_marker_outline(SpaceClip *sc, MovieTrackingTrack *track, MovieT
if(!tiny) glLineWidth(3.0f);
if(sc->flag&SC_SHOW_MARKER_PATTERN) {
if(sc->flag&SC_SHOW_MARKER_PATTERN && (marker->flag&MARKER_DISABLED)==0) {
glBegin(GL_LINE_LOOP);
glVertex2f(track->pat_min[0], track->pat_min[1]);
glVertex2f(track->pat_max[0], track->pat_min[1]);
@@ -267,7 +314,7 @@ static void draw_marker_areas(SpaceClip *sc, MovieTrackingTrack *track, MovieTra
int tiny= sc->flag&SC_SHOW_TINY_MARKER;
/* marker position */
if((track->flag&SELECT)==sel) {
if((track->flag&SELECT)==sel && (marker->flag&MARKER_DISABLED)==0) {
if(track->flag&SELECT) UI_ThemeColor(color);
else UI_ThemeColor(TH_MARKER);
@@ -287,7 +334,7 @@ static void draw_marker_areas(SpaceClip *sc, MovieTrackingTrack *track, MovieTra
glPushMatrix();
glTranslatef(marker->pos[0], marker->pos[1], 0);
if((track->pat_flag&SELECT)==sel) {
if((track->pat_flag&SELECT)==sel && (marker->flag&MARKER_DISABLED)==0) {
if(track->pat_flag&SELECT) UI_ThemeColor(color);
else UI_ThemeColor(TH_MARKER);
@@ -322,9 +369,20 @@ static void draw_marker_areas(SpaceClip *sc, MovieTrackingTrack *track, MovieTra
glDisable(GL_LINE_STIPPLE);
}
static void draw_tracking_tracks(SpaceClip *sc, ARegion *ar, MovieClip *clip)
static void view2d_to_region_float(View2D *v2d, float x, float y, float *regionx, float *regiony)
{
int x, y;
/* express given coordinates as proportional values */
x= -v2d->cur.xmin / (v2d->cur.xmax-v2d->cur.xmin);
y= -v2d->cur.ymin / (v2d->cur.ymax-v2d->cur.ymin);
/* convert proportional distances to screen coordinates */
*regionx= v2d->mask.xmin + x*(v2d->mask.xmax-v2d->mask.xmin);
*regiony= v2d->mask.ymin + y*(v2d->mask.ymax-v2d->mask.ymin);
}
static void draw_tracking_tracks(SpaceClip *sc, ARegion *ar, MovieClip *clip, float zoomx, float zoomy)
{
float x, y;
MovieTrackingMarker *marker;
MovieTrackingTrack *track;
int width, height, sel_type;
@@ -335,12 +393,18 @@ static void draw_tracking_tracks(SpaceClip *sc, ARegion *ar, MovieClip *clip)
if(!width || !height) /* no image displayed for frame */
return;
/* find window pixel coordinates of origin */
UI_view2d_to_region_no_clip(&ar->v2d, 0.0f, 0.0f, &x, &y);
/* ** find window pixel coordinates of origin ** */
/* UI_view2d_to_region_no_clip return integer values, this could
lead to 1px flickering when view is locked to selection during playbeck.
to avoid this flickering, calclate base point in the same way as it happens
in UI_view2d_to_region_no_clip, but do it in floats here */
view2d_to_region_float(&ar->v2d, 0.0f, 0.0f, &x, &y);
glPushMatrix();
glTranslatef(x, y, 0);
glScalef(sc->zoom, sc->zoom, 0);
glScalef(zoomx, zoomy, 0);
glScalef(width, height, 0);
BKE_movieclip_last_selection(clip, &sel_type, &sel);
@@ -392,32 +456,30 @@ static void draw_tracking_tracks(SpaceClip *sc, ARegion *ar, MovieClip *clip)
glPopMatrix();
}
static void draw_tracking(SpaceClip *sc, ARegion *ar, MovieClip *clip)
static void draw_tracking(SpaceClip *sc, ARegion *ar, MovieClip *clip, float zoomx, float zoomy)
{
draw_tracking_tracks(sc, ar, clip);
draw_tracking_tracks(sc, ar, clip, zoomx, zoomy);
}
void draw_clip_main(SpaceClip *sc, ARegion *ar, Scene *scene)
{
MovieClip *clip= ED_space_clip(sc);
ImBuf *ibuf;
float zoomx, zoomy;
/* if no clip, nothing to do */
if(!clip)
return;
/* if trcking is in progress, we should sunchronize framenr from clipuser
so latest tracked frame would be shown */
if(clip->tracking_context)
BKE_tracking_sync_user(&sc->user, clip->tracking_context);
ED_space_clip_zoom(sc, ar, &zoomx, &zoomy);
ibuf= ED_space_clip_acquire_buffer(sc);
if(ibuf) {
draw_movieclip_buffer(sc, ar, ibuf);
draw_movieclip_buffer(ar, ibuf, zoomx, zoomy);
IMB_freeImBuf(ibuf);
draw_tracking(sc, ar, clip);
draw_tracking(sc, ar, clip, zoomx, zoomy);
}
if(sc->debug_flag&SC_DBG_SHOW_CACHE)
@@ -438,7 +500,14 @@ void draw_clip_track_widget(const bContext *C, void *trackp, void *userp, void *
if(track) {
MovieTrackingMarker *marker= BKE_tracking_get_marker(track, user->framenr);
if(marker) {
if(marker && marker->flag&MARKER_DISABLED) {
glColor4f(0.7f, 0.3f, 0.3f, 0.3f);
uiSetRoundBox(15);
uiDrawBox(GL_POLYGON, rect->xmin, rect->ymin, rect->xmax, rect->ymax, 3.0f);
ok= 1;
}
else if(marker) {
ImBuf* ibuf= BKE_movieclip_acquire_ibuf(clip, user);
if(ibuf && ibuf->rect) {

View File

@@ -46,6 +46,7 @@
#include "BKE_context.h"
#include "BKE_screen.h"
#include "BKE_movieclip.h"
#include "BKE_tracking.h"
#include "IMB_imbuf_types.h"
@@ -259,9 +260,14 @@ static void clip_keymap(struct wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "CLIP_OT_add_marker", LEFTMOUSE, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "CLIP_OT_track_markers", TKEY, KM_PRESS, KM_CTRL, 0);
kmi= WM_keymap_add_item(keymap, "CLIP_OT_track_markers", LEFTARROWKEY, KM_PRESS, KM_ALT, 0);
RNA_boolean_set(kmi->ptr, "backwards", 1);
WM_keymap_add_item(keymap, "CLIP_OT_track_markers", RIGHTARROWKEY, KM_PRESS, KM_ALT, 0);
kmi= WM_keymap_add_item(keymap, "CLIP_OT_track_markers", TKEY, KM_PRESS, KM_CTRL, 0);
RNA_boolean_set(kmi->ptr, "sequence", 1);
kmi= WM_keymap_add_item(keymap, "CLIP_OT_track_markers", TKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0);
RNA_boolean_set(kmi->ptr, "backwards", 1);
RNA_boolean_set(kmi->ptr, "sequence", 1);
WM_keymap_add_item(keymap, "CLIP_OT_clear_track_path", TKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "CLIP_OT_delete", XKEY, KM_PRESS, 0, 0);
@@ -359,6 +365,12 @@ static void clip_main_area_draw(const bContext *C, ARegion *ar)
/* draw entirely, view changes should be handled here */
SpaceClip *sc= CTX_wm_space_clip(C);
Scene *scene= CTX_data_scene(C);
MovieClip *clip= ED_space_clip(sc);
/* if trcking is in progress, we should sunchronize framenr from clipuser
so latest tracked frame would be shown */
if(clip->tracking_context)
BKE_tracking_sync_user(&sc->user, clip->tracking_context);
if(sc->flag&SC_LOCK_SELECTION)
ED_clip_view_selection(sc, ar, 0);

View File

@@ -116,6 +116,7 @@ static void add_marker(SpaceClip *sc, float x, float y)
track= MEM_callocN(sizeof(MovieTrackingTrack), "add_marker_exec track");
memset(&marker, 0, sizeof(marker));
marker.pos[0]= x;
marker.pos[1]= y;
marker.framenr= sc->user.framenr;
@@ -279,12 +280,14 @@ static int track_mouse_area(SpaceClip *sc, float co[2], MovieTrackingTrack *trac
epsx= MAX2(epsy, 2.0 / width);
epsy= MAX2(epsy, 2.0 / height);
if(fabsf(co[0]-marker->pos[0])< epsx && fabsf(co[1]-marker->pos[1])<=epsy)
return TRACK_AREA_POINT;
if((marker->flag&MARKER_DISABLED)==0) {
if(fabsf(co[0]-marker->pos[0])< epsx && fabsf(co[1]-marker->pos[1])<=epsy)
return TRACK_AREA_POINT;
if(sc->flag&SC_SHOW_MARKER_PATTERN)
if(mouse_on_rect(co, marker->pos, track->pat_min, track->pat_max, epsx, epsy))
return TRACK_AREA_PAT;
if(sc->flag&SC_SHOW_MARKER_PATTERN)
if(mouse_on_rect(co, marker->pos, track->pat_min, track->pat_max, epsx, epsy))
return TRACK_AREA_PAT;
}
if(sc->flag&SC_SHOW_MARKER_SEARCH)
if(mouse_on_rect(co, marker->pos, track->search_min, track->search_max, epsx, epsy))
@@ -673,6 +676,19 @@ static int track_markers_testbreak(void)
return G.afbreek;
}
static void track_init_markers(SpaceClip *sc, MovieClip *clip)
{
MovieTrackingTrack *track;
int framenr= sc->user.framenr;
track= clip->tracking.tracks.first;
while(track) {
BKE_tracking_ensure_marker(track, framenr);
track= track->next;
}
}
static void track_markers_initjob(bContext *C, TrackMarkersJob *tmj, int backwards)
{
SpaceClip *sc= CTX_wm_space_clip(C);
@@ -700,6 +716,8 @@ static void track_markers_initjob(bContext *C, TrackMarkersJob *tmj, int backwar
else if(settings->speed==TRACKING_SPEED_QUARTER) tmj->delay*= 4;
}
track_init_markers(sc, clip);
tmj->context= BKE_tracking_context_new(clip, &sc->user, backwards);
clip->tracking_context= tmj->context;
@@ -776,6 +794,54 @@ static void track_markers_freejob(void *tmv)
WM_main_add_notifier(NC_SCENE|ND_FRAME, tmj->scene);
}
static int track_markers_exec(bContext *C, wmOperator *op)
{
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
Scene *scene= CTX_data_scene(C);
struct MovieTrackingContext *context;
int framenr= sc->user.framenr;
int sfra= framenr, efra;
int backwards= RNA_boolean_get(op->ptr, "backwards");
int sequence= RNA_boolean_get(op->ptr, "sequence");
MovieTrackingSettings *settings= &clip->tracking.settings;
if(backwards) efra= SFRA;
else efra= EFRA;
/* limit frames to be tracked by user setting */
if(settings->flag&TRACKING_FRAMES_LIMIT) {
if(backwards) efra= MAX2(efra, sfra-settings->frames_limit);
else efra= MIN2(efra, sfra+settings->frames_limit);
}
track_init_markers(sc, clip);
context= BKE_tracking_context_new(clip, &sc->user, backwards);
while(framenr != efra) {
if(!BKE_tracking_next(context))
break;
if(backwards) framenr--;
else framenr++;
if(!sequence)
break;
}
BKE_tracking_sync(context);
BKE_tracking_context_free(context);
/* update scene current frame to the lastes tracked frame */
scene->r.cfra= framenr;
WM_event_add_notifier(C, NC_MOVIECLIP|NA_EVALUATED, clip);
WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene);
return OPERATOR_FINISHED;
}
static int track_markers_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
TrackMarkersJob *tmj;
@@ -784,10 +850,14 @@ static int track_markers_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(eve
wmJob *steve;
Scene *scene= CTX_data_scene(C);
int backwards= RNA_boolean_get(op->ptr, "backwards");
int sequence= RNA_boolean_get(op->ptr, "sequence");
if(clip->tracking_context)
return OPERATOR_CANCELLED;
if(!sequence)
return track_markers_exec(C, op);
tmj= MEM_callocN(sizeof(TrackMarkersJob), "TrackMarkersJob data");
track_markers_initjob(C, tmj, backwards);
@@ -815,48 +885,6 @@ static int track_markers_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(eve
return OPERATOR_RUNNING_MODAL;
}
static int track_markers_exec(bContext *C, wmOperator *op)
{
SpaceClip *sc= CTX_wm_space_clip(C);
MovieClip *clip= ED_space_clip(sc);
Scene *scene= CTX_data_scene(C);
struct MovieTrackingContext *context;
int framenr= sc->user.framenr;
int sfra= framenr, efra;
int backwards= RNA_boolean_get(op->ptr, "backwards");
MovieTrackingSettings *settings= &clip->tracking.settings;
if(backwards) efra= SFRA;
else efra= EFRA;
/* limit frames to be tracked by user setting */
if(settings->flag&TRACKING_FRAMES_LIMIT) {
if(backwards) efra= MAX2(efra, sfra-settings->frames_limit);
else efra= MIN2(efra, sfra+settings->frames_limit);
}
context= BKE_tracking_context_new(clip, &sc->user, backwards);
while(framenr != efra) {
if(!BKE_tracking_next(context))
break;
if(backwards) framenr--;
else framenr++;
}
BKE_tracking_sync(context);
BKE_tracking_context_free(context);
/* update scene current frame to the lastes tracked frame */
scene->r.cfra= framenr;
WM_event_add_notifier(C, NC_MOVIECLIP|NA_EVALUATED, clip);
WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene);
return OPERATOR_FINISHED;
}
static int track_marekrs_modal(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
{
/* no running blender, remove handler and pass through */
@@ -891,6 +919,7 @@ void CLIP_OT_track_markers(wmOperatorType *ot)
/* properties */
RNA_def_boolean(ot->srna, "backwards", 0, "Backwards", "Do backwards tarcking");
RNA_def_boolean(ot->srna, "sequence", 0, "Track Sequence", "Track marker during image sequence rather than single image");
}
/********************** clear track operator *********************/
@@ -988,14 +1017,12 @@ static int track_to_fcurves_exec(bContext *C, wmOperator *op)
kflag= ks->flag;
kflag |= ANIM_get_keyframing_flags(scene, 1);
(void)op;
BKE_movieclip_acquire_size(clip, &user, &width, &height);
while(fra<EFRA) {
MovieTrackingMarker *marker= BKE_tracking_get_marker(track, fra);
if(marker) {
if(marker && (marker->framenr&MARKER_DISABLED)==0) {
FCurve *fcu;
fcu= verify_fcurve(act, ks->name, "location", 0, 1);

View File

@@ -5243,17 +5243,26 @@ static void markerToTransDataInit(TransData *td, TransData2D *td2d, float *loc,
static void trackToTransData(SpaceClip *sc, TransData *td, TransData2D *td2d, MovieTrackingTrack *track)
{
MovieTrackingMarker *marker= BKE_tracking_get_marker(track, sc->user.framenr);
MovieTrackingMarker *marker= BKE_tracking_ensure_marker(track, sc->user.framenr);
if(track->flag&SELECT)
markerToTransDataInit(td++, td2d++, marker->pos, NULL);
if((marker->flag&MARKER_DISABLED)==0) {
if(track->flag&SELECT)
markerToTransDataInit(td++, td2d++, marker->pos, NULL);
if(track->pat_flag&SELECT) {
markerToTransDataInit(td++, td2d++, track->pat_min, marker->pos);
markerToTransDataInit(td++, td2d++, track->pat_max, marker->pos);
if(track->pat_flag&SELECT) {
markerToTransDataInit(td++, td2d++, track->pat_min, marker->pos);
markerToTransDataInit(td++, td2d++, track->pat_max, marker->pos);
}
}
if(track->search_flag&SELECT) {
if(marker->flag&MARKER_DISABLED) {
markerToTransDataInit(td++, td2d++, marker->pos, NULL);
markerToTransDataInit(td++, td2d++, track->pat_min, marker->pos);
markerToTransDataInit(td++, td2d++, track->pat_max, marker->pos);
}
markerToTransDataInit(td++, td2d++, track->search_min, marker->pos);
markerToTransDataInit(td++, td2d++, track->search_max, marker->pos);
}
@@ -5266,6 +5275,7 @@ static void createTransTrackingData(bContext *C, TransInfo *t)
SpaceClip *sc = CTX_wm_space_clip(C);
MovieClip *clip = ED_space_clip(sc);
MovieTrackingTrack *track;
MovieTrackingMarker *marker;
int framenr = sc->user.framenr;
if(clip && !BKE_movieclip_has_frame(clip, &sc->user)) {
@@ -5278,10 +5288,22 @@ static void createTransTrackingData(bContext *C, TransInfo *t)
track = clip->tracking.tracks.first;
while(track) {
if(BKE_tracking_has_marker(track, framenr)) {
if(track->flag&SELECT) t->total++;
if(track->pat_flag&SELECT) t->total+= 2;
if(track->search_flag&SELECT) t->total+= 2;
if(TRACK_SELECTED(track)) {
marker= BKE_tracking_get_marker(track, framenr);
if(marker) {
if((marker->flag&MARKER_DISABLED)==0) {
if(track->flag&SELECT) t->total++;
if(track->pat_flag&SELECT) t->total+= 2;
}
if(track->search_flag&SELECT) {
t->total+= 2;
if(marker->flag&MARKER_DISABLED)
t->total+= 3;
}
}
}
track = track->next;
@@ -5293,12 +5315,27 @@ static void createTransTrackingData(bContext *C, TransInfo *t)
/* create actual data */
track = clip->tracking.tracks.first;
while(track) {
if(TRACK_SELECTED(track) && BKE_tracking_has_marker(track, framenr)) {
trackToTransData(sc, td, td2d, track);
if(TRACK_SELECTED(track)) {
marker= BKE_tracking_get_marker(track, framenr);
if(track->flag&SELECT) {td++; td2d++;}
if(track->pat_flag&SELECT) {td+= 2; td2d+= 2;}
if(track->search_flag&SELECT) {td+= 2; td2d+= 2;};
if(marker) {
trackToTransData(sc, td, td2d, track);
if((marker->flag&MARKER_DISABLED)==0) {
if(track->flag&SELECT) {td++; td2d++;}
if(track->pat_flag&SELECT) {td+= 2; td2d+= 2;}
}
if(track->search_flag&SELECT) {
td+= 2;
td2d+= 2;
if(marker->flag&MARKER_DISABLED) {
td+= 3;
td2d+= 3;
}
};
}
}
track = track->next;

View File

@@ -580,13 +580,12 @@ typedef struct SpaceClip {
int path_length; /* length of displaying path, in frames */
int pad;
/* ** some runtime vars which aren't really in file ** */
/* marker data displayed in panel */
float marker_pos[2]; /* position of marker in pixel coords */
float track_pat_pos[2], track_pat[2]; /* position and dimensions of marker pattern in pixel coords */
float track_search_pos[2], track_search[2]; /* position and dimensions of marker search in pixel coords */
int marker_flag; /* marker's flags */
} SpaceClip;
/* view3d Now in DNA_view3d_types.h */

View File

@@ -55,6 +55,7 @@ typedef struct MovieTrackingCamera {
typedef struct MovieTrackingMarker {
float pos[2]; /* 2d position of marker on frame (in unified 0..1 space) */
int framenr; /* number of frame marker is associated with */
int flag, pad; /* Marker's flag (alive, ...) */
} MovieTrackingMarker;
typedef struct MovieTrackingBundle {
@@ -102,6 +103,9 @@ typedef struct MovieTracking {
ListBase bundles;
} MovieTracking;
/* MovieTrackingMarker->flag */
#define MARKER_DISABLED 1
/* MovieTrackingTrack->flag */
#define TRACK_PROCESSED 2