[Bf-blender-cvs] [01bb9bb] soc-2016-multiview: finish link two correspondence together

Tianwei Shen noreply at git.blender.org
Mon May 30 12:55:03 CEST 2016


Commit: 01bb9bb8060ea4a439a2c5d1f5e247219d55e4b4
Author: Tianwei Shen
Date:   Thu May 26 00:19:22 2016 +0800
Branches: soc-2016-multiview
https://developer.blender.org/rB01bb9bb8060ea4a439a2c5d1f5e247219d55e4b4

finish link two correspondence together

===================================================================

M	source/blender/editors/space_clip/tracking_ops_correspondence.c

===================================================================

diff --git a/source/blender/editors/space_clip/tracking_ops_correspondence.c b/source/blender/editors/space_clip/tracking_ops_correspondence.c
index 26d25f5..beb58e2 100644
--- a/source/blender/editors/space_clip/tracking_ops_correspondence.c
+++ b/source/blender/editors/space_clip/tracking_ops_correspondence.c
@@ -62,84 +62,54 @@
 
 /********************** add correspondence operator *********************/
 
-static bool add_correspondence(const bContext *C, float x, float y)
+static int add_correspondence_exec(bContext *C, wmOperator *op)
 {
 	SpaceClip *sc = CTX_wm_space_clip(C);
 	MovieClip *clip = ED_space_clip_get_clip(sc);
 	MovieTracking *tracking = &clip->tracking;
 	ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking);
-	ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking);
-	MovieTrackingTrack *track;
-	int width, height;
-	int framenr = ED_space_clip_get_clip_frame_number(sc);
 
-	ED_space_clip_get_size(sc, &width, &height);
+	// get one track from each clip and link them
+	MovieTrackingTrack *primary_track = NULL, *witness_track = NULL;
+	MovieTrackingTrack *track;
+	int num_primary_selected = 0, num_witness_selected = 0;
 
-	if (width == 0 || height == 0) {
-		return false;
+	// get number of selected tracks in the primary camera
+	for (track = tracksbase->first; track; track = track->next) {
+		if (TRACK_VIEW_SELECTED(sc, track)) {
+			primary_track = track;
+			num_primary_selected++;
+		}
 	}
 
-	track = BKE_tracking_track_add(tracking, tracksbase, x, y, framenr, width, height);
-
-	BKE_tracking_track_select(tracksbase, track, TRACK_AREA_ALL, 0);
-	BKE_tracking_plane_tracks_deselect_all(plane_tracks_base);
-
-	clip->tracking.act_track = track;
-	clip->tracking.act_plane_track = NULL;
-
-	return true;
-}
-
-static int add_correspondence_invoke(bContext *C,
-                                     wmOperator *op,
-                                     const wmEvent *UNUSED(event))
-{
-	ED_area_headerprint(
-	        CTX_wm_area(C),
-	        IFACE_("Use RMB click to define tracker correspondence in primary and witness camera"));
-
-	/* Add modal handler for ESC. */
-	WM_event_add_modal_handler(C, op);
-
-	return OPERATOR_RUNNING_MODAL;
-}
-
-static int add_correspondence_modal(bContext *C,
-                                    wmOperator *UNUSED(op),
-                                    const wmEvent *event)
-{
-	switch (event->type) {
-		case MOUSEMOVE:
-			return OPERATOR_RUNNING_MODAL;
-
-		case LEFTMOUSE:
-		{
-			SpaceClip *sc = CTX_wm_space_clip(C);
-			MovieClip *clip = ED_space_clip_get_clip(sc);
-			ARegion *ar = CTX_wm_region(C);
-			float pos[2];
-
-			ED_area_headerprint(CTX_wm_area(C), NULL);
-
-			ED_clip_point_stable_pos(sc, ar,
-			                         event->x - ar->winrct.xmin,
-			                         event->y - ar->winrct.ymin,
-			                         &pos[0], &pos[1]);
-
-			if (!add_correspondence(C, pos[0], pos[1])) {
-				return OPERATOR_CANCELLED;
+	// get number of selected tracks in the witness camera
+	// TODO(tianwei): there might be multiple witness cameras, now just work with one witness camera
+	wmWindow *window = CTX_wm_window(C);
+	for (ScrArea *sa = window->screen->areabase.first; sa != NULL; sa = sa->next) {
+		if (sa->spacetype == SPACE_CLIP) {
+			SpaceClip *second_sc = sa->spacedata.first;
+			if(second_sc != sc) {
+				MovieClip *second_clip = ED_space_clip_get_clip(second_sc);
+				MovieTracking *second_tracking = &second_clip->tracking;
+				ListBase *second_tracksbase = BKE_tracking_get_active_tracks(second_tracking);
+				for (track = second_tracksbase->first; track; track = track->next) {
+					if (TRACK_VIEW_SELECTED(second_sc, track)) {
+						witness_track = track;
+						num_witness_selected++;
+					}
+				}
 			}
-
-			WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip);
-			return OPERATOR_FINISHED;
 		}
+	}
 
-		case ESCKEY:
-			ED_area_headerprint(CTX_wm_area(C), NULL);
-			return OPERATOR_CANCELLED;
+	if(!primary_track || !witness_track || num_primary_selected != 1 || num_witness_selected != 1) {
+		BKE_report(op->reports, RPT_ERROR, "Select exactly one track in each clip");
+		return OPERATOR_CANCELLED;
 	}
 
-	return OPERATOR_PASS_THROUGH;
+	// link two tracks
+
+	return OPERATOR_FINISHED;
 }
 
 void CLIP_OT_add_correspondence(wmOperatorType *ot)
@@ -150,12 +120,11 @@ void CLIP_OT_add_correspondence(wmOperatorType *ot)
 	ot->description = "Add correspondence between primary camera and witness camera";
 
 	/* api callbacks */
-	ot->invoke = add_correspondence_invoke;
+	ot->exec = add_correspondence_exec;
 	ot->poll = ED_space_clip_tracking_poll;
-	ot->modal = add_correspondence_modal;
 
 	/* flags */
-	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING;
+	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 }
 
 /********************** delete correspondence operator *********************/




More information about the Bf-blender-cvs mailing list