Revision: 38267
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38267
Author:   nazgul
Date:     2011-07-09 17:51:59 +0000 (Sat, 09 Jul 2011)
Log Message:
-----------
Camera tracking integration
===========================

Improved marker size/position adjustment:
- Rollback selection model so selected parts of marker
  would be disabled only when "extension" click happens.
- Implemented left mouse sliding to adjust marker position
  (using small square in left top corner of search area) and
  size of pattern/search (using small triangle it right bottom
  corner of marker)

Modified Paths:
--------------
    branches/soc-2011-tomato/source/blender/editors/space_clip/clip_draw.c
    branches/soc-2011-tomato/source/blender/editors/space_clip/clip_intern.h
    branches/soc-2011-tomato/source/blender/editors/space_clip/space_clip.c
    branches/soc-2011-tomato/source/blender/editors/space_clip/tracking_ops.c

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-07-09 17:49:36 UTC (rev 38266)
+++ branches/soc-2011-tomato/source/blender/editors/space_clip/clip_draw.c      
2011-07-09 17:51:59 UTC (rev 38267)
@@ -328,15 +328,15 @@
                if(!tiny) glPointSize(1.0f);
        }
 
+       /* pattern */
+       glPushMatrix();
+       glTranslatef(marker->pos[0], marker->pos[1], 0);
+
        if(tiny) {
                glLineStipple(3, 0xaaaa);
                glEnable(GL_LINE_STIPPLE);
        }
 
-       /* pattern */
-       glPushMatrix();
-       glTranslatef(marker->pos[0], marker->pos[1], 0);
-
        if((track->pat_flag&SELECT)==sel && (marker->flag&MARKER_DISABLED)==0) {
                if(track->pat_flag&SELECT) UI_ThemeColor(color);
                else UI_ThemeColor(TH_MARKER);
@@ -371,12 +371,99 @@
                }
        }
 
-       glPopMatrix();
-
        if(tiny)
                glDisable(GL_LINE_STIPPLE);
+
+       glPopMatrix();
 }
 
+static void draw_marker_slide_zones(SpaceClip *sc, MovieTrackingTrack *track, 
MovieTrackingMarker *marker, int outline, int act, int width, int height)
+{
+       int color= act?TH_ACT_MARKER:TH_SEL_MARKER;
+       float x, y, dx, dy, tdx, tdy;
+       int tiny= sc->flag&SC_SHOW_TINY_MARKER;
+
+       if(!TRACK_SELECTED(track) || (tiny && outline))
+               return;
+
+       if(outline) {
+               glLineWidth(3.0f);
+               UI_ThemeColor(TH_MARKER_OUTLINE);
+       } else {
+               if(track->search_flag&SELECT) UI_ThemeColor(color);
+               else UI_ThemeColor(TH_MARKER);
+       }
+
+       glPushMatrix();
+       glTranslatef(marker->pos[0], marker->pos[1], 0);
+
+       x= track->search_min[0];
+       y= track->search_max[1];
+
+       dx= 15.0f/width/sc->zoom;
+       dy= 15.0f/height/sc->zoom;
+
+       if(sc->flag&SC_SHOW_MARKER_SEARCH) {
+               tdx=MIN2(dx, (track->search_max[0]-track->search_min[0])/5);
+               tdy=MIN2(dy, (track->search_max[1]-track->search_min[1])/5);
+
+               if(outline) {
+                       tdx+= 1.0f/sc->zoom/width;
+                       tdy+= 1.0f/sc->zoom/height;
+               }
+
+               glBegin(GL_QUADS);
+                       glVertex3f(x, y, 0);
+                       glVertex3f(x+tdx, y, 0);
+                       glVertex3f(x+tdx, y-tdy, 0);
+                       glVertex3f(x, y-tdy, 0);
+               glEnd();
+
+               x= track->search_max[0];
+               y= track->search_min[1];
+
+               if(outline) {
+                       tdx+= 1.0f/sc->zoom/width;
+                       tdy+= 1.0f/sc->zoom/height;
+               }
+
+               glBegin(GL_TRIANGLES);
+                       glVertex3f(x, y, 0);
+                       glVertex3f(x-tdx, y, 0);
+                       glVertex3f(x, y+tdy, 0);
+               glEnd();
+       }
+
+       if(sc->flag&SC_SHOW_MARKER_PATTERN) {
+               if(!outline) {
+                       if(track->pat_flag&SELECT) UI_ThemeColor(color);
+                       else UI_ThemeColor(TH_MARKER);
+               }
+
+               x= track->pat_max[0];
+               y= track->pat_min[1];
+
+               tdx=MIN2(dx, track->pat_max[0]-track->pat_min[0]);
+               tdy=MIN2(dy, track->pat_max[1]-track->pat_min[1]);
+
+               if(outline) {
+                       tdx+= 2.0f/sc->zoom/width;
+                       tdy+= 2.0f/sc->zoom/height;
+               }
+
+               glBegin(GL_TRIANGLES);
+                       glVertex3f(x, y, 0);
+                       glVertex3f(x-tdx, y, 0);
+                       glVertex3f(x, y+tdy, 0);
+               glEnd();
+       }
+
+       glPopMatrix();
+
+       if(outline)
+               glLineWidth(1.0f);
+}
+
 static void view2d_to_region_float(View2D *v2d, float x, float y, float 
*regionx, float *regiony)
 {
        /* express given coordinates as proportional values */
@@ -431,6 +518,7 @@
                marker= BKE_tracking_get_marker(track, sc->user.framenr);
 
                draw_marker_outline(sc, track, marker);
+               draw_marker_slide_zones(sc, track, marker, 1, 0, width, height);
                draw_marker_areas(sc, track, marker, 0, 0);
 
                track= track->next;
@@ -445,6 +533,7 @@
                if(!act) {
                        marker= BKE_tracking_get_marker(track, 
sc->user.framenr);
                        draw_marker_areas(sc, track, marker, 0, 1);
+                       draw_marker_slide_zones(sc, track, marker, 0, 0, width, 
height);
                }
 
                track= track->next;
@@ -454,6 +543,7 @@
        if(sel_type==MCLIP_SEL_TRACK) {
                marker= BKE_tracking_get_marker(sel, sc->user.framenr);
                draw_marker_areas(sc, sel, marker, 1, 1);
+               draw_marker_slide_zones(sc, sel, marker, 0, 1, width, height);
        }
 
        glPopMatrix();

Modified: 
branches/soc-2011-tomato/source/blender/editors/space_clip/clip_intern.h
===================================================================
--- branches/soc-2011-tomato/source/blender/editors/space_clip/clip_intern.h    
2011-07-09 17:49:36 UTC (rev 38266)
+++ branches/soc-2011-tomato/source/blender/editors/space_clip/clip_intern.h    
2011-07-09 17:51:59 UTC (rev 38267)
@@ -77,6 +77,8 @@
 
 void CLIP_OT_set_origin(struct wmOperatorType *ot);
 
+void CLIP_OT_slide_marker(struct wmOperatorType *ot);
+
 void CLIP_OT_track_to_fcurves(struct wmOperatorType *ot);
 
 /* clip_draw.c */

Modified: 
branches/soc-2011-tomato/source/blender/editors/space_clip/space_clip.c
===================================================================
--- branches/soc-2011-tomato/source/blender/editors/space_clip/space_clip.c     
2011-07-09 17:49:36 UTC (rev 38266)
+++ branches/soc-2011-tomato/source/blender/editors/space_clip/space_clip.c     
2011-07-09 17:51:59 UTC (rev 38267)
@@ -217,6 +217,8 @@
 
        WM_operatortype_append(CLIP_OT_clear_track_path);
 
+       WM_operatortype_append(CLIP_OT_slide_marker);
+
        WM_operatortype_append(CLIP_OT_track_to_fcurves);
 }
 
@@ -292,6 +294,8 @@
 
        WM_keymap_add_menu(keymap, "CLIP_MT_tracking_specials", WKEY, KM_PRESS, 
0, 0);
 
+       WM_keymap_add_item(keymap, "CLIP_OT_slide_marker", LEFTMOUSE, KM_PRESS, 
0, 0);
+
        transform_keymap_for_space(keyconf, keymap, SPACE_CLIP);
 }
 

Modified: 
branches/soc-2011-tomato/source/blender/editors/space_clip/tracking_ops.c
===================================================================
--- branches/soc-2011-tomato/source/blender/editors/space_clip/tracking_ops.c   
2011-07-09 17:49:36 UTC (rev 38266)
+++ branches/soc-2011-tomato/source/blender/editors/space_clip/tracking_ops.c   
2011-07-09 17:51:59 UTC (rev 38267)
@@ -431,10 +431,7 @@
        if(track) {
                int area= track_mouse_area(sc, co, track);
 
-               if(area==TRACK_AREA_NONE)
-                       return OPERATOR_FINISHED;
-
-               if(!TRACK_SELECTED(track))
+               if(!extend || !TRACK_SELECTED(track))
                        area= TRACK_AREA_ALL;
 
                if(extend && TRACK_AREA_SELECTED(track, area)) {
@@ -1235,6 +1232,189 @@
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
 }
 
+/********************** slide marker opertaotr *********************/
+
+typedef struct {
+       int area;
+       MovieTrackingTrack *track;
+
+       int mval[2];
+       int width, height;
+       float *min, *max, *pos;
+       float smin[2], smax[2], spos[2];
+} SlideMarkerData;
+
+static SlideMarkerData *create_slide_marker_data(MovieTrackingTrack *track, 
MovieTrackingMarker *marker, wmEvent *event, int area, int width, int height)
+{
+       SlideMarkerData *data= MEM_callocN(sizeof(SlideMarkerData), "slide 
marker data");
+
+       data->area= area;
+       data->track= track;
+
+       if(area==TRACK_AREA_POINT) {
+               data->pos= marker->pos;
+               copy_v2_v2(data->spos, marker->pos);
+       } else if(area==TRACK_AREA_PAT) {
+               data->min= track->pat_min;
+               data->max= track->pat_max;
+       } else if(area==TRACK_AREA_SEARCH) {
+               data->min= track->search_min;
+               data->max= track->search_max;
+       }
+
+       if(ELEM(area, TRACK_AREA_PAT, TRACK_AREA_SEARCH)) {
+               copy_v2_v2(data->smin, data->min);
+               copy_v2_v2(data->smax, data->max);
+       }
+
+       data->mval[0]= event->mval[0];
+       data->mval[1]= event->mval[1];
+
+       data->width= width;
+       data->height= height;
+
+       return data;
+}
+
+/* corner = 0: right-bottom corner,
+   corner = 1: left-top corner */
+static int mouse_on_corner(SpaceClip *sc, MovieTrackingTrack *track, float 
co[2], int corner,
+                       float *pos, float *min, float *max, int width, int 
height)
+{
+       int crn[2], inside= 0;
+       float dx, dy;
+
+       dx= 15.0f/sc->zoom;
+       dy= 15.0f/sc->zoom;
+
+       dx=MIN2(dx, (track->search_max[0]-track->search_min[0])*width/5);
+       dy=MIN2(dy, (track->search_max[1]-track->search_min[1])*height/5);
+
+       if(corner==0) {
+               crn[0]= (pos[0]+max[0])*width;
+               crn[1]= (pos[1]+min[1])*height;
+
+               inside= co[0]>=crn[0]-dx && co[0]<=crn[0] && co[1]>=crn[1] && 
co[1]<=crn[1]+dy;
+       } else {
+               crn[0]= (pos[0]+min[0])*width;
+               crn[1]= (pos[1]+max[1])*height;
+
+               inside= co[0]>=crn[0] && co[0]<=crn[0]+dx && co[1]>=crn[1]-dy 
&& co[1]<=crn[1];
+       }
+
+       return inside;
+}
+
+static int slide_marker_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+       SpaceClip *sc= CTX_wm_space_clip(C);
+       MovieClip *clip= ED_space_clip(sc);
+       MovieTrackingTrack *track;
+       int width, height;
+       float co[2];
+
+       ED_space_clip_size(sc, &width, &height);
+
+       if(width==0 || height==0)
+               return OPERATOR_PASS_THROUGH;
+
+       mouse_pos(C, event, co);
+
+       track= clip->tracking.tracks.first;
+       while(track) {
+               if(TRACK_SELECTED(track)) {
+                       MovieTrackingMarker *marker= 
BKE_tracking_get_marker(track, sc->user.framenr);
+
+                       if(marker && (marker->flag&MARKER_DISABLED)==0) {
+                               if(sc->flag&SC_SHOW_MARKER_SEARCH) {
+                                       if(mouse_on_corner(sc, track, co, 1, 
marker->pos, track->search_min, track->search_max, width, height))
+                                               op->customdata= 
create_slide_marker_data(track, marker, event, TRACK_AREA_POINT, width, height);
+
+                                       if(mouse_on_corner(sc, track, co, 0, 
marker->pos, track->search_min, track->search_max, width, height))
+                                               op->customdata= 
create_slide_marker_data(track, marker, event, TRACK_AREA_SEARCH, width, 
height);
+                               }
+
+                               if(sc->flag&SC_SHOW_MARKER_PATTERN)
+                                       if(mouse_on_corner(sc, track, co, 0, 
marker->pos, track->pat_min, track->pat_max, width, height))
+                                               op->customdata= 
create_slide_marker_data(track, marker, event, TRACK_AREA_PAT, width, height);
+
+                               if(op->customdata) {
+                                       WM_event_add_modal_handler(C, op);
+
+                                       return OPERATOR_RUNNING_MODAL;
+                               }
+                       }
+               }
+
+               track= track->next;
+       }
+
+       return OPERATOR_CANCELLED;
+}
+
+static int slide_marker_modal(bContext *C, wmOperator *op, wmEvent *event)
+{
+       SpaceClip *sc= CTX_wm_space_clip(C);
+       SlideMarkerData *data= (SlideMarkerData *)op->customdata;
+       float dx, dy;
+
+       switch(event->type) {
+               case MOUSEMOVE:
+                       dx= 
((float)(event->mval[0]-data->mval[0]))/data->width/sc->zoom;
+                       dy= 
((float)(event->mval[1]-data->mval[1]))/data->height/sc->zoom;
+
+                       if(data->area == TRACK_AREA_POINT) {
+                               data->pos[0]= data->spos[0]+dx;
+                               data->pos[1]= data->spos[1]+dy;
+                       } else {
+                               data->min[0]= data->smin[0]-dx;
+                               data->max[0]= data->smax[0]+dx;
+
+                               data->min[1]= data->smin[1]+dy;
+                               data->max[1]= data->smax[1]-dy;
+
+                               if(data->area==TRACK_AREA_SEARCH) 
BKE_tracking_clamp_track(data->track, CLAMP_SEARCH_DIM);
+                               else BKE_tracking_clamp_track(data->track, 
CLAMP_PAT_DIM);
+                       }
+
+                       WM_event_add_notifier(C, NC_MOVIECLIP|NA_EDITED, NULL);
+
+                       break;
+
+               case LEFTMOUSE:
+                       if(event->val==KM_RELEASE) {
+                               MEM_freeN(op->customdata);
+
+                               return OPERATOR_FINISHED;
+                       }
+
+                       break;
+       }
+
+       return OPERATOR_PASS_THROUGH;
+}
+
+void CLIP_OT_slide_marker(wmOperatorType *ot)
+{
+       /* identifiers */

@@ 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