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. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to