[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37864] branches/soc-2011-tomato: Camera tracking integration
Sergey Sharybin
g.ulairi at gmail.com
Mon Jun 27 16:24:23 CEST 2011
Revision: 37864
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37864
Author: nazgul
Date: 2011-06-27 14:24:23 +0000 (Mon, 27 Jun 2011)
Log Message:
-----------
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.
Modified Paths:
--------------
branches/soc-2011-tomato/release/scripts/startup/bl_ui/space_clip.py
branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h
branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c
branches/soc-2011-tomato/source/blender/editors/space_clip/clip_buttons.c
branches/soc-2011-tomato/source/blender/editors/space_clip/clip_draw.c
branches/soc-2011-tomato/source/blender/editors/space_clip/space_clip.c
branches/soc-2011-tomato/source/blender/editors/space_clip/tracking_ops.c
branches/soc-2011-tomato/source/blender/editors/transform/transform_conversions.c
branches/soc-2011-tomato/source/blender/makesdna/DNA_space_types.h
branches/soc-2011-tomato/source/blender/makesdna/DNA_tracking_types.h
Modified: branches/soc-2011-tomato/release/scripts/startup/bl_ui/space_clip.py
===================================================================
--- branches/soc-2011-tomato/release/scripts/startup/bl_ui/space_clip.py 2011-06-27 14:20:48 UTC (rev 37863)
+++ branches/soc-2011-tomato/release/scripts/startup/bl_ui/space_clip.py 2011-06-27 14:24:23 UTC (rev 37864)
@@ -66,11 +66,20 @@
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):
Modified: branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h 2011-06-27 14:20:48 UTC (rev 37863)
+++ branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h 2011-06-27 14:24:23 UTC (rev 37864)
@@ -45,6 +45,7 @@
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);
Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c 2011-06-27 14:20:48 UTC (rev 37863)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c 2011-06-27 14:24:23 UTC (rev 37864)
@@ -150,7 +150,7 @@
{
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 @@
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 @@
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. */
+ /* approximate pre-first framenr marker with first marker */
+ if(framenr<track->markers[0].framenr)
+ return &track->markers[0];
- if(track->markersnr)
- return &track->markers[0];
-
- return NULL;
- }
-
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 @@
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 @@
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);
Modified: branches/soc-2011-tomato/source/blender/editors/space_clip/clip_buttons.c
===================================================================
--- branches/soc-2011-tomato/source/blender/editors/space_clip/clip_buttons.c 2011-06-27 14:20:48 UTC (rev 37863)
+++ branches/soc-2011-tomato/source/blender/editors/space_clip/clip_buttons.c 2011-06-27 14:24:23 UTC (rev 37864)
@@ -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 @@
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 @@
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 @@
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 @@
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,8 +162,9 @@
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;
marker->pos[1]= sc->marker_pos[1]/height;
@@ -212,6 +228,10 @@
BKE_tracking_clamp_track(track, CLAMP_SEARCH_DIM);
ok= 1;
+ } else if(event==B_MARKER_FLAG) {
+ marker->flag= sc->marker_flag;
+
+ ok= 1;
}
if(ok)
@@ -222,7 +242,6 @@
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 @@
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)
Modified: branches/soc-2011-tomato/source/blender/editors/space_clip/clip_draw.c
===================================================================
--- branches/soc-2011-tomato/source/blender/editors/space_clip/clip_draw.c 2011-06-27 14:20:48 UTC (rev 37863)
+++ branches/soc-2011-tomato/source/blender/editors/space_clip/clip_draw.c 2011-06-27 14:24:23 UTC (rev 37864)
@@ -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,25 +95,58 @@
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++;
+ }
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list