[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60974] trunk/blender/source/blender/ editors/space_clip/tracking_ops.c: Make it possible to track specified clip

Sergey Sharybin sergey.vfx at gmail.com
Mon Oct 28 22:49:50 CET 2013


Revision: 60974
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60974
Author:   nazgul
Date:     2013-10-28 21:49:49 +0000 (Mon, 28 Oct 2013)
Log Message:
-----------
Make it possible to track specified clip

Added a property to track_marker operator to be
able to render clip which name was passed to the
operator instead of clip from current clip editor
context.

Very much useful for automatic tests.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/space_clip/tracking_ops.c

Modified: trunk/blender/source/blender/editors/space_clip/tracking_ops.c
===================================================================
--- trunk/blender/source/blender/editors/space_clip/tracking_ops.c	2013-10-28 21:22:41 UTC (rev 60973)
+++ trunk/blender/source/blender/editors/space_clip/tracking_ops.c	2013-10-28 21:49:49 UTC (rev 60974)
@@ -1097,16 +1097,16 @@
 	return G.is_break;
 }
 
-static int track_count_markers(SpaceClip *sc, MovieClip *clip)
+static int track_count_markers(SpaceClip *sc, MovieClip *clip, int framenr)
 {
 	int tot = 0;
 	ListBase *tracksbase = BKE_tracking_get_active_tracks(&clip->tracking);
 	MovieTrackingTrack *track;
-	int framenr = ED_space_clip_get_clip_frame_number(sc);
 
 	track = tracksbase->first;
 	while (track) {
-		if (TRACK_VIEW_SELECTED(sc, track) && (track->flag & TRACK_LOCKED) == 0) {
+		bool selected = sc ? TRACK_VIEW_SELECTED(sc, track) : TRACK_SELECTED(track);
+		if (selected && (track->flag & TRACK_LOCKED) == 0) {
 			MovieTrackingMarker *marker = BKE_tracking_marker_get(track, framenr);
 
 			if (!marker || (marker->flag & MARKER_DISABLED) == 0)
@@ -1142,18 +1142,20 @@
 	}
 }
 
-static void track_init_markers(SpaceClip *sc, MovieClip *clip, int *frames_limit_r)
+static void track_init_markers(SpaceClip *sc, MovieClip *clip, int framenr, int *frames_limit_r)
 {
 	ListBase *tracksbase = BKE_tracking_get_active_tracks(&clip->tracking);
 	MovieTrackingTrack *track;
-	int framenr = ED_space_clip_get_clip_frame_number(sc);
 	int frames_limit = 0;
 
-	clear_invisible_track_selection(sc, clip);
+	if (sc != NULL) {
+		clear_invisible_track_selection(sc, clip);
+	}
 
 	track = tracksbase->first;
 	while (track) {
-		if (TRACK_VIEW_SELECTED(sc, track)) {
+		bool selected = sc ? TRACK_VIEW_SELECTED(sc, track) : TRACK_SELECTED(track);
+		if (selected) {
 			if ((track->flag & TRACK_HIDDEN) == 0 && (track->flag & TRACK_LOCKED) == 0) {
 				BKE_tracking_marker_ensure(track, framenr);
 
@@ -1193,8 +1195,9 @@
 	Scene *scene = CTX_data_scene(C);
 	MovieTrackingSettings *settings = &clip->tracking.settings;
 	int frames_limit;
+	int framenr = ED_space_clip_get_clip_frame_number(sc);
 
-	track_init_markers(sc, clip, &frames_limit);
+	track_init_markers(sc, clip, framenr, &frames_limit);
 
 	tmj->sfra = ED_space_clip_get_clip_frame_number(sc);
 	tmj->clip = clip;
@@ -1317,20 +1320,49 @@
 
 static int track_markers_exec(bContext *C, wmOperator *op)
 {
-	SpaceClip *sc = CTX_wm_space_clip(C);
-	MovieClip *clip = ED_space_clip_get_clip(sc);
+	SpaceClip *sc;
+	MovieClip *clip;
 	Scene *scene = CTX_data_scene(C);
 	struct MovieTrackingContext *context;
-	int framenr = ED_space_clip_get_clip_frame_number(sc);
-	int sfra = framenr, efra;
+	MovieClipUser *user, fake_user = {0};
+	int framenr, sfra, efra;
 	int backwards = RNA_boolean_get(op->ptr, "backwards");
 	int sequence = RNA_boolean_get(op->ptr, "sequence");
 	int frames_limit;
 
-	if (track_count_markers(sc, clip) == 0)
+	if (RNA_struct_property_is_set(op->ptr, "clip")) {
+		Main *bmain = CTX_data_main(C);
+		char clip_name[MAX_ID_NAME - 2];
+
+		RNA_string_get(op->ptr, "clip", clip_name);
+		clip = (MovieClip *)BLI_findstring(&bmain->movieclip, clip_name, offsetof(ID, name) + 2);
+		sc = NULL;
+
+		if (clip == NULL) {
+			return OPERATOR_CANCELLED;
+		}
+        framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, CFRA);
+		fake_user.framenr = framenr;
+		user = &fake_user;
+	}
+	else {
+		sc = CTX_wm_space_clip(C);
+
+		if (sc == NULL) {
+			return OPERATOR_CANCELLED;
+		}
+
+		clip = ED_space_clip_get_clip(sc);
+		framenr = ED_space_clip_get_clip_frame_number(sc);
+		user = &sc->user;
+	}
+
+	sfra = framenr;
+
+	if (track_count_markers(sc, clip, framenr) == 0)
 		return OPERATOR_CANCELLED;
 
-	track_init_markers(sc, clip, &frames_limit);
+	track_init_markers(sc, clip, framenr, &frames_limit);
 
 	if (backwards)
 		efra = SFRA;
@@ -1351,7 +1383,7 @@
 		return OPERATOR_CANCELLED;
 
 	/* do not disable tracks due to threshold when tracking frame-by-frame */
-	context = BKE_tracking_context_new(clip, &sc->user, backwards, sequence);
+	context = BKE_tracking_context_new(clip, user, backwards, sequence);
 
 	while (framenr != efra) {
 		if (!BKE_tracking_context_step(context))
@@ -1382,11 +1414,22 @@
 	TrackMarkersJob *tmj;
 	ScrArea *sa = CTX_wm_area(C);
 	SpaceClip *sc = CTX_wm_space_clip(C);
-	MovieClip *clip = ED_space_clip_get_clip(sc);
+	MovieClip *clip;
 	wmJob *wm_job;
-	int backwards = RNA_boolean_get(op->ptr, "backwards");
-	int sequence = RNA_boolean_get(op->ptr, "sequence");
+	bool backwards = RNA_boolean_get(op->ptr, "backwards");
+	bool sequence = RNA_boolean_get(op->ptr, "sequence");
+	int framenr;
 
+	if (sc == NULL) {
+		/* TODO(sergey): Support clip for invokaction as well. */
+		BKE_report(op->reports, RPT_ERROR,
+		           "Invoking this operator only supported from Clip Editor space.");
+		return OPERATOR_CANCELLED;
+	}
+
+	clip = ED_space_clip_get_clip(sc);
+	framenr = ED_space_clip_get_clip_frame_number(sc);
+
 	if (WM_jobs_test(CTX_wm_manager(C), CTX_wm_area(C), WM_JOB_TYPE_ANY)) {
 		/* only one tracking is allowed at a time */
 		return OPERATOR_CANCELLED;
@@ -1395,7 +1438,7 @@
 	if (clip->tracking_context)
 		return OPERATOR_CANCELLED;
 
-	if (track_count_markers(sc, clip) == 0)
+	if (track_count_markers(sc, clip, framenr) == 0)
 		return OPERATOR_CANCELLED;
 
 	if (!sequence)
@@ -1453,6 +1496,8 @@
 
 void CLIP_OT_track_markers(wmOperatorType *ot)
 {
+	PropertyRNA *prop;
+
 	/* identifiers */
 	ot->name = "Track Markers";
 	ot->description = "Track selected markers";
@@ -1461,7 +1506,6 @@
 	/* api callbacks */
 	ot->exec = track_markers_exec;
 	ot->invoke = track_markers_invoke;
-	ot->poll = ED_space_clip_tracking_poll;
 	ot->modal = track_markers_modal;
 
 	/* flags */
@@ -1470,6 +1514,8 @@
 	/* properties */
 	RNA_def_boolean(ot->srna, "backwards", 0, "Backwards", "Do backwards tracking");
 	RNA_def_boolean(ot->srna, "sequence", 0, "Track Sequence", "Track marker during image sequence rather than single image");
+	prop = RNA_def_string(ot->srna, "clip", "", MAX_NAME, "Movie Clip", "Movie Clip to be tracked");
+	RNA_def_property_flag(prop, PROP_SKIP_SAVE);
 }
 
 /********************** refine track position operator *********************/




More information about the Bf-blender-cvs mailing list