[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