[Bf-blender-cvs] [75b69c7] soc-2016-multiview: prepare solve_multiview button, copy from solve_camera button and revise

Tianwei Shen noreply at git.blender.org
Wed Jun 1 18:05:36 CEST 2016


Commit: 75b69c72f27ff9269008f1218b8f50fcbac9a4f4
Author: Tianwei Shen
Date:   Wed Jun 1 00:22:17 2016 +0800
Branches: soc-2016-multiview
https://developer.blender.org/rB75b69c72f27ff9269008f1218b8f50fcbac9a4f4

prepare solve_multiview button, copy from solve_camera button and revise

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

M	release/scripts/startup/bl_ui/space_clip.py
M	source/blender/editors/space_clip/clip_intern.h
M	source/blender/editors/space_clip/space_clip.c
M	source/blender/editors/space_clip/tracking_ops_correspondence.c

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

diff --git a/release/scripts/startup/bl_ui/space_clip.py b/release/scripts/startup/bl_ui/space_clip.py
index 03c677c..a8233ed 100644
--- a/release/scripts/startup/bl_ui/space_clip.py
+++ b/release/scripts/startup/bl_ui/space_clip.py
@@ -411,7 +411,11 @@ class CLIP_PT_tools_correspondence(CLIP_PT_tracking_panel, Panel):
         row = col.row(align=True)
         row.operator("clip.add_correspondence", text="Link")
         row.operator("clip.delete_correspondence", text="Unlink")
-        #col.operator("clip.detect_features")
+        
+        col = layout.column(align=True)
+        col.scale_y = 2.0
+
+        col.operator("clip.solve_multiview", text="Solve Multiview Camera")
 
 
 class CLIP_PT_tools_plane_tracking(CLIP_PT_tracking_panel, Panel):
diff --git a/source/blender/editors/space_clip/clip_intern.h b/source/blender/editors/space_clip/clip_intern.h
index 8c14c4e..76383cb 100644
--- a/source/blender/editors/space_clip/clip_intern.h
+++ b/source/blender/editors/space_clip/clip_intern.h
@@ -201,8 +201,10 @@ void CLIP_OT_slide_plane_marker(struct wmOperatorType *ot);
 void CLIP_OT_keyframe_insert(struct wmOperatorType *ot);
 void CLIP_OT_keyframe_delete(struct wmOperatorType *ot);
 
+/* tracking_ops_correspondence */
 void CLIP_OT_add_correspondence(wmOperatorType *ot);
 void CLIP_OT_delete_correspondence(wmOperatorType *ot);
+void CLIP_OT_solve_multiview(wmOperatorType *ot);
 
 /* tracking_select.c */
 void CLIP_OT_select(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_clip/space_clip.c b/source/blender/editors/space_clip/space_clip.c
index 9690382..199b272 100644
--- a/source/blender/editors/space_clip/space_clip.c
+++ b/source/blender/editors/space_clip/space_clip.c
@@ -531,6 +531,7 @@ static void clip_operatortypes(void)
 	/* Correspondence */
 	WM_operatortype_append(CLIP_OT_add_correspondence);
 	WM_operatortype_append(CLIP_OT_delete_correspondence);
+	WM_operatortype_append(CLIP_OT_solve_multiview);
 
 	/* ** clip_graph_ops.c  ** */
 
diff --git a/source/blender/editors/space_clip/tracking_ops_correspondence.c b/source/blender/editors/space_clip/tracking_ops_correspondence.c
index efc68a3..9506f54 100644
--- a/source/blender/editors/space_clip/tracking_ops_correspondence.c
+++ b/source/blender/editors/space_clip/tracking_ops_correspondence.c
@@ -33,18 +33,22 @@
 
 #include "DNA_screen_types.h"
 #include "DNA_space_types.h"
+#include "DNA_camera_types.h"
+#include "DNA_object_types.h"
 
 #include "BLI_utildefines.h"
 #include "BLI_ghash.h"
 #include "BLI_math.h"
 #include "BLI_blenlib.h"
+#include "BLI_string.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 "BKE_global.h"
+#include "BKE_library.h"
 
 #include "WM_api.h"
 #include "WM_types.h"
@@ -225,3 +229,248 @@ void CLIP_OT_delete_correspondence(wmOperatorType *ot)
 	/* flags */
 	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 }
+
+/********************** solve multiview operator *********************/
+typedef struct {
+	Scene *scene;
+	MovieClip *clip;
+	MovieClipUser user;
+
+	ReportList *reports;
+
+	char stats_message[256];
+
+	struct MovieReconstructContext *context;
+} SolveMultiviewJob;
+
+static bool solve_multiview_initjob(bContext *C,
+                                 SolveMultiviewJob *scj,
+                                 wmOperator *op,
+                                 char *error_msg,
+                                 int max_error)
+{
+	SpaceClip *sc = CTX_wm_space_clip(C);
+	MovieClip *clip = ED_space_clip_get_clip(sc);
+	Scene *scene = CTX_data_scene(C);
+	MovieTracking *tracking = &clip->tracking;
+	MovieTrackingObject *object = BKE_tracking_object_get_active(tracking);
+	int width, height;
+
+	if (!BKE_tracking_reconstruction_check(tracking,
+	                                       object,
+	                                       error_msg,
+	                                       max_error))
+	{
+		return false;
+	}
+
+	/* Could fail if footage uses images with different sizes. */
+	BKE_movieclip_get_size(clip, &sc->user, &width, &height);
+
+	scj->clip = clip;
+	scj->scene = scene;
+	scj->reports = op->reports;
+	scj->user = sc->user;
+
+	scj->context = BKE_tracking_reconstruction_context_new(clip,
+	                                                       object,
+	                                                       object->keyframe1,
+	                                                       object->keyframe2,
+	                                                       width,
+	                                                       height);
+
+	tracking->stats = MEM_callocN(sizeof(MovieTrackingStats), "solve multiview stats");
+
+	return true;
+}
+
+static void solve_multiview_updatejob(void *scv)
+{
+	SolveMultiviewJob *scj = (SolveMultiviewJob *)scv;
+	MovieTracking *tracking = &scj->clip->tracking;
+
+	BLI_strncpy(tracking->stats->message,
+	            scj->stats_message,
+	            sizeof(tracking->stats->message));
+}
+
+static void solve_multiview_startjob(void *scv, short *stop, short *do_update, float *progress)
+{
+	SolveMultiviewJob *scj = (SolveMultiviewJob *)scv;
+	BKE_tracking_reconstruction_solve(scj->context,
+	                                  stop,
+	                                  do_update,
+	                                  progress,
+	                                  scj->stats_message,
+	                                  sizeof(scj->stats_message));
+}
+
+static void solve_multiview_freejob(void *scv)
+{
+	SolveMultiviewJob *scj = (SolveMultiviewJob *)scv;
+	MovieTracking *tracking = &scj->clip->tracking;
+	Scene *scene = scj->scene;
+	MovieClip *clip = scj->clip;
+	int solved;
+
+	if (!scj->context) {
+		/* job weren't fully initialized due to some error */
+		MEM_freeN(scj);
+		return;
+	}
+
+	solved = BKE_tracking_reconstruction_finish(scj->context, tracking);
+	if (!solved) {
+		BKE_report(scj->reports,
+		           RPT_WARNING,
+		           "Some data failed to reconstruct (see console for details)");
+	}
+	else {
+		BKE_reportf(scj->reports,
+		            RPT_INFO,
+		            "Average re-projection error: %.3f",
+		            tracking->reconstruction.error);
+	}
+
+	/* Set currently solved clip as active for scene. */
+	if (scene->clip != NULL) {
+		id_us_min(&clip->id);
+	}
+	scene->clip = clip;
+	id_us_plus(&clip->id);
+
+	/* Set blender camera focal length so result would look fine there. */
+	if (scene->camera != NULL &&
+	    scene->camera->data &&
+	    GS(((ID *) scene->camera->data)->name) == ID_CA)
+	{
+		Camera *camera = (Camera *)scene->camera->data;
+		int width, height;
+		BKE_movieclip_get_size(clip, &scj->user, &width, &height);
+		BKE_tracking_camera_to_blender(tracking, scene, camera, width, height);
+		WM_main_add_notifier(NC_OBJECT, camera);
+	}
+
+	MEM_freeN(tracking->stats);
+	tracking->stats = NULL;
+
+	DAG_id_tag_update(&clip->id, 0);
+
+	WM_main_add_notifier(NC_MOVIECLIP | NA_EVALUATED, clip);
+	WM_main_add_notifier(NC_OBJECT | ND_TRANSFORM, NULL);
+
+	/* Update active clip displayed in scene buttons. */
+	WM_main_add_notifier(NC_SCENE, scene);
+
+	BKE_tracking_reconstruction_context_free(scj->context);
+	MEM_freeN(scj);
+}
+
+static int solve_multiview_exec(bContext *C, wmOperator *op)
+{
+	SolveMultiviewJob *scj;
+	char error_msg[256] = "\0";
+	scj = MEM_callocN(sizeof(SolveMultiviewJob), "SolveMultiviewJob data");
+	if (!solve_multiview_initjob(C, scj, op, error_msg, sizeof(error_msg))) {
+		if (error_msg[0]) {
+			BKE_report(op->reports, RPT_ERROR, error_msg);
+		}
+		solve_multiview_freejob(scj);
+		return OPERATOR_CANCELLED;
+	}
+	solve_multiview_startjob(scj, NULL, NULL, NULL);
+	solve_multiview_freejob(scj);
+	return OPERATOR_FINISHED;
+}
+
+static int solve_multiview_invoke(bContext *C,
+                                  wmOperator *op,
+                                  const wmEvent *UNUSED(event))
+{
+	SolveMultiviewJob *scj;
+	ScrArea *sa = CTX_wm_area(C);
+	SpaceClip *sc = CTX_wm_space_clip(C);
+	MovieClip *clip = ED_space_clip_get_clip(sc);
+	MovieTracking *tracking = &clip->tracking;
+	MovieTrackingReconstruction *reconstruction =
+	        BKE_tracking_get_active_reconstruction(tracking);
+	wmJob *wm_job;
+	char error_msg[256] = "\0";
+
+	if (WM_jobs_test(CTX_wm_manager(C), sa, WM_JOB_TYPE_ANY)) {
+		/* only one solve is allowed at a time */
+		return OPERATOR_CANCELLED;
+	}
+
+	scj = MEM_callocN(sizeof(SolveMultiviewJob), "SolveCameraJob data");
+	if (!solve_multiview_initjob(C, scj, op, error_msg, sizeof(error_msg))) {
+		if (error_msg[0]) {
+			BKE_report(op->reports, RPT_ERROR, error_msg);
+		}
+		solve_multiview_freejob(scj);
+		return OPERATOR_CANCELLED;
+	}
+
+	BLI_strncpy(tracking->stats->message,
+	            "Solving multiview| Preparing solve",
+	            sizeof(tracking->stats->message));
+
+	/* Hide reconstruction statistics from previous solve. */
+	reconstruction->flag &= ~TRACKING_RECONSTRUCTED;
+	WM_event_add_notifier(C, NC_MOVIECLIP | NA_EVALUATED, clip);
+
+	/* Setup job. */
+	wm_job = WM_jobs_get(CTX_wm_manager(C), CTX_wm_window(C), sa, "Solve Camera",
+	                     WM_JOB_PROGRESS, WM_JOB_TYPE_CLIP_SOLVE_CAMERA);
+	WM_jobs_customdata_set(wm_job, scj, solve_multiview_freejob);
+	WM_jobs_timer(wm_job, 0.1, NC_MOVIECLIP | NA_EVALUATED, 0);
+	WM_jobs_callbacks(wm_job,
+	                  solve_multiview_startjob,
+	                  NULL,
+	                  solve_multiview_updatejob,
+	                  NULL);
+
+	G.is_break = false;
+
+	WM_jobs_start(CTX_wm_manager(C), wm_job);
+	WM_cursor_wait(0);
+
+	/* add modal handler for ESC */
+	WM_event_add_modal_handler(C, op);
+
+	return OPERATOR_RUNNING_MODAL;
+}
+
+static int solve_multiview_modal(bContext *C,
+                                 wmOperator *UNUSED(op),
+                                 const wmEvent *event)
+{
+	/* No running solver, remove handler and pass through. */
+	if (0 == WM_jobs_test(CTX_wm_manager(C), CTX_wm_area(C), WM_JOB_TYPE_ANY))
+		return OPERATOR_FINISHED | OPERATOR_PASS_THROUGH;
+
+	/* Running solver. */
+	switch (event->type) {
+		case ESCKEY:
+			return OPERATOR_RUNNING_MODAL;
+	}
+
+	return OPERATOR_PASS_THROUGH;
+}
+
+voi

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list