[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