[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