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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to