[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38267] branches/soc-2011-tomato/source/ blender/editors/space_clip: Camera tracking integration
Sergey Sharybin
g.ulairi at gmail.com
Sat Jul 9 19:51:59 CEST 2011
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. @@
More information about the Bf-blender-cvs
mailing list