[Bf-blender-cvs] [3652e9c] soc-2016-multiview: add two correspondence operators

Tianwei Shen noreply at git.blender.org
Mon May 23 19:06:30 CEST 2016


Commit: 3652e9ce8006bd186fd0cc704b10c1dadd2b1073
Author: Tianwei Shen
Date:   Mon May 23 17:39:52 2016 +0800
Branches: soc-2016-multiview
https://developer.blender.org/rB3652e9ce8006bd186fd0cc704b10c1dadd2b1073

add two correspondence operators

users can specify correspondence in tracking mode
placeholder for now, unfinished

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

A	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
new file mode 100644
index 0000000..26d25f5
--- /dev/null
+++ b/source/blender/editors/space_clip/tracking_ops_correspondence.c
@@ -0,0 +1,225 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2016 Blender Foundation.
+ * All rights reserved.
+ *
+ *
+ * Contributor(s): Blender Foundation,
+ *                 Tianwei Shen
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/editors/space_clip/tracking_ops_correspondence.c
+ *  \ingroup spclip
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_screen_types.h"
+#include "DNA_space_types.h"
+
+#include "BLI_utildefines.h"
+#include "BLI_ghash.h"
+#include "BLI_math.h"
+#include "BLI_blenlib.h"
+
+#include "BKE_context.h"
+#include "BKE_movieclip.h"
+#include "BKE_tracking.h"
+#include "BKE_depsgraph.h"
+#include "BKE_report.h"
+#include "BKE_sound.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "ED_screen.h"
+#include "ED_clip.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+#include "BLT_translation.h"
+
+#include "clip_intern.h"
+#include "tracking_ops_intern.h"
+
+/********************** add correspondence operator *********************/
+
+static bool add_correspondence(const bContext *C, float x, float y)
+{
+	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);
+
+	if (width == 0 || height == 0) {
+		return false;
+	}
+
+	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;
+			}
+
+			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;
+	}
+
+	return OPERATOR_PASS_THROUGH;
+}
+
+void CLIP_OT_add_correspondence(wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name = "Add Correspondence";
+	ot->idname = "CLIP_OT_add_correspondence";
+	ot->description = "Add correspondence between primary camera and witness camera";
+
+	/* api callbacks */
+	ot->invoke = add_correspondence_invoke;
+	ot->poll = ED_space_clip_tracking_poll;
+	ot->modal = add_correspondence_modal;
+
+	/* flags */
+	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING;
+}
+
+/********************** delete correspondence operator *********************/
+
+static int delete_correspondence_exec(bContext *C, wmOperator *UNUSED(op))
+{
+	SpaceClip *sc = CTX_wm_space_clip(C);
+	MovieClip *clip = ED_space_clip_get_clip(sc);
+	MovieTracking *tracking = &clip->tracking;
+	bool changed = false;
+
+	/* Delete selected plane tracks. */
+	ListBase *plane_tracks_base = BKE_tracking_get_active_plane_tracks(tracking);
+	for (MovieTrackingPlaneTrack *plane_track = plane_tracks_base->first,
+	                             *next_plane_track;
+	     plane_track != NULL;
+	     plane_track = next_plane_track)
+	{
+		next_plane_track = plane_track->next;
+
+		if (PLANE_TRACK_VIEW_SELECTED(plane_track)) {
+			BKE_tracking_plane_track_free(plane_track);
+			BLI_freelinkN(plane_tracks_base, plane_track);
+			changed = true;
+		}
+	}
+
+	/* Remove selected point tracks (they'll also be removed from planes which
+	 * uses them).
+	 */
+	ListBase *tracksbase = BKE_tracking_get_active_tracks(tracking);
+	for (MovieTrackingTrack *track = tracksbase->first, *next_track;
+	     track != NULL;
+	     track = next_track)
+	{
+		next_track = track->next;
+		if (TRACK_VIEW_SELECTED(sc, track)) {
+			clip_delete_track(C, clip, track);
+			changed = true;
+		}
+	}
+
+	/* Nothing selected now, unlock view so it can be scrolled nice again. */
+	sc->flag &= ~SC_LOCK_SELECTION;
+
+	if (changed) {
+		WM_event_add_notifier(C, NC_MOVIECLIP | NA_EDITED, clip);
+	}
+
+	return OPERATOR_FINISHED;
+}
+
+void CLIP_OT_delete_correspondence(wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name = "Delete Correspondence";
+	ot->idname = "CLIP_OT_delete_correspondence";
+	ot->description = "Delete selected tracker correspondene between primary and witness camera";
+
+	/* api callbacks */
+	ot->invoke = WM_operator_confirm;
+	ot->exec = delete_correspondence_exec;
+	ot->poll = ED_space_clip_tracking_poll;
+
+	/* flags */
+	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+}




More information about the Bf-blender-cvs mailing list