Camera tracking integration
authorSergey Sharybin <sergey.vfx@gmail.com>
Wed, 10 Aug 2011 13:59:03 +0000 (13:59 +0000)
committerSergey Sharybin <sergey.vfx@gmail.com>
Wed, 10 Aug 2011 13:59:03 +0000 (13:59 +0000)
===========================

- Fix for reading grease pencil data for movie clips.
- Request from Francois: undistort grease pencil to allow
  manual calibration.

Only strokes made in "Cursor" space are getting undistorted,
strokes made in view space are kept unchanged.

This allows to make such workflow of manual calibration:
- Outline straight line in footage with GP.
- [Optional] mute footage.
- Enable Display->Manual Calibration.
- Tweak distortion coefficients until you'll like result.
- [Optional] Use strokes made in viewspace to help checking
  of straightness of outlined features.

Not ideal but could be nice addition for grid-only calibration
until proper tools are getting ported to libmv/blender.

release/scripts/startup/bl_ui/space_clip.py
source/blender/blenloader/intern/readfile.c
source/blender/editors/space_clip/clip_draw.c
source/blender/makesdna/DNA_space_types.h
source/blender/makesrna/intern/rna_space.c
source/blender/makesrna/intern/rna_tracking.c

index 982134a37ad3163ae63d1f95fbf03b30d1884ad0..d808574886f0396255a404ec2fec7cb1d191c2ef 100644 (file)
@@ -355,6 +355,7 @@ class CLIP_PT_display(bpy.types.Panel):
 
         layout.prop(sc, "lock_selection")
         layout.prop(sc, "use_mute_footage")
+        layout.prop(sc, "use_manual_calibration")
 
         clip = sc.clip
         if clip:
index f52f42d05133946995899b621839f1ba39c3141a..8cd2bdeb0b94a93fad022e87b1ad4530d39e2c42 100644 (file)
@@ -5708,8 +5708,6 @@ static void direct_link_movieclip(FileData *fd, MovieClip *clip)
        if(fd->movieclipmap) clip->cache= newmclipadr(fd, clip->cache);
        else clip->cache= NULL;
 
-       clip->gpd= newlibadr_us(fd, clip->id.lib, clip->gpd);
-
        tracking->reconstruction.cameras= newdataadr(fd, tracking->reconstruction.cameras);
 
        link_list(fd, &tracking->tracks);
@@ -5732,13 +5730,15 @@ static void direct_link_movieclip(FileData *fd, MovieClip *clip)
        clip->tracking.stabilization.scaleibuf= NULL;
 }
 
-static void lib_link_movieclip(FileData *UNUSED(fd), Main *main)
+static void lib_link_movieclip(FileData *fd, Main *main)
 {
        MovieClip *clip;
 
        clip= main->movieclip.first;
        while(clip) {
                if(clip->id.flag & LIB_NEEDLINK) {
+                       clip->gpd= newlibadr_us(fd, clip->id.lib, clip->gpd);
+
                        clip->id.flag -= LIB_NEEDLINK;
                }
                clip= clip->id.next;
index 693bbdc40d0f9cd2eda532fab661dcbf04055f42..8172bad6c14cc1031d67846a415786c345dd054b 100644 (file)
@@ -31,6 +31,7 @@
  *  \ingroup spclip
  */
 
+#include "DNA_gpencil_types.h"
 #include "DNA_movieclip_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_object_types.h"  /* SELECT */
@@ -776,51 +777,6 @@ static void view2d_to_region_float(View2D *v2d, float x, float y, float *regionx
        *regiony= v2d->mask.ymin + y*(v2d->mask.ymax-v2d->mask.ymin);
 }
 
-static void draw_distorion_grid(MovieTracking *tracking, int width, int height)
-{
-       const int n= 9;
-       int x, y;
-       float pos[2], grid[10][10][2];
-       float dx= (float)width/n, dy= (float)height/n;
-
-       if(!tracking->camera.focal)
-               return;
-
-       zero_v2(pos);
-
-       for(y= 0; y<=n; y++) {
-               for(x= 0; x<=n; x++) {
-                       BKE_tracking_invert_intrinsics(tracking, pos, grid[y][x]);
-
-                       grid[y][x][0]/= width;
-                       grid[y][x][1]/= height;
-
-                       pos[0]+= dx;
-               }
-
-               pos[0]= 0.f;
-               pos[1]+= dy;
-       }
-
-       glColor3f(1.f, 0.f, 0.f);
-
-       for(y= 0; y<=n; y++) {
-               glBegin(GL_LINE_STRIP);
-                       for(x= 0; x<=n; x++) {
-                               glVertex2fv(grid[y][x]);
-                       }
-               glEnd();
-       }
-
-       for(x= 0; x<=n; x++) {
-               glBegin(GL_LINE_STRIP);
-                       for(y= 0; y<=n; y++) {
-                               glVertex2fv(grid[y][x]);
-                       }
-               glEnd();
-       }
-}
-
 static void draw_tracking_tracks(SpaceClip *sc, ARegion *ar, MovieClip *clip,
                        int width, int height, float zoomx, float zoomy)
 {
@@ -954,9 +910,6 @@ static void draw_tracking_tracks(SpaceClip *sc, ARegion *ar, MovieClip *clip,
                glDisable(GL_POINT_SMOOTH);
        }
 
-       if(sc->flag&SC_SHOW_GRID)
-               draw_distorion_grid(tracking, width, height);
-
        glPopMatrix();
 
        if(sc->flag&SC_SHOW_NAMES) {
@@ -980,10 +933,102 @@ static void draw_tracking_tracks(SpaceClip *sc, ARegion *ar, MovieClip *clip,
        glPopMatrix();
 }
 
-static void draw_tracking(SpaceClip *sc, ARegion *ar, MovieClip *clip,
-                       int width, int height, float zoomx, float zoomy)
+static void draw_distortion(SpaceClip *sc, ARegion *ar, MovieClip *clip, int width, int height, float zoomx, float zoomy)
 {
-       draw_tracking_tracks(sc, ar, clip, width, height, zoomx, zoomy);
+       float x, y;
+       const int n= 9;
+       int i, j;
+       float pos[2], grid[10][10][2];
+       float dx= (float)width/n, dy= (float)height/n;
+       MovieTracking *tracking= &clip->tracking;
+
+       if(!tracking->camera.focal)
+               return;
+
+       if((sc->flag&SC_SHOW_GRID)==0 && (sc->flag&SC_MANUAL_CALIBRATION)==0)
+               return;
+
+       view2d_to_region_float(&ar->v2d, 0.0f, 0.0f, &x, &y);
+
+       glPushMatrix();
+       glTranslatef(x, y, 0);
+       glScalef(zoomx, zoomy, 0);
+       glMultMatrixf(sc->stabmat);
+       glScalef(width, height, 0);
+
+       /* grid */
+       if(sc->flag&SC_SHOW_GRID) {
+               zero_v2(pos);
+
+               for(i= 0; i<=n; i++) {
+                       for(j= 0; j<=n; j++) {
+                               BKE_tracking_invert_intrinsics(tracking, pos, grid[i][j]);
+
+                               grid[i][j][0]/= width;
+                               grid[i][j][1]/= height;
+
+                               pos[0]+= dx;
+                       }
+
+                       pos[0]= 0.f;
+                       pos[1]+= dy;
+               }
+
+               glColor3f(1.f, 0.f, 0.f);
+
+               for(i= 0; i<=n; i++) {
+                       glBegin(GL_LINE_STRIP);
+                               for(j= 0; j<=n; j++) {
+                                       glVertex2fv(grid[i][j]);
+                               }
+                       glEnd();
+               }
+
+               for(j= 0; j<=n; j++) {
+                       glBegin(GL_LINE_STRIP);
+                               for(i= 0; i<=n; i++) {
+                                       glVertex2fv(grid[i][j]);
+                               }
+                       glEnd();
+               }
+       }
+
+       if(sc->flag&SC_MANUAL_CALIBRATION && clip->gpd) {
+               bGPDlayer *layer= clip->gpd->layers.first;
+
+               glColor4fv(layer->color);
+               glLineWidth(layer->thickness);
+               while(layer) {
+                       bGPDframe *frame= layer->frames.first;
+                       while(frame) {
+                               bGPDstroke *stroke= frame->strokes.first;
+
+                               while(stroke) {
+                                       if(stroke->flag&GP_STROKE_2DSPACE && stroke->totpoints>1) {
+                                               glBegin(GL_LINE_STRIP);
+                                                       for(i= 0; i<stroke->totpoints-1; i++) {
+                                                               pos[0]= stroke->points[i].x*width;
+                                                               pos[1]= stroke->points[i].y*height;
+
+                                                               BKE_tracking_apply_intrinsics(tracking, pos, pos);
+                                                               glVertex2f(pos[0]/width, pos[1]/height);
+                                                       }
+                                               glEnd();
+                                       }
+
+                                       stroke= stroke->next;
+                               }
+
+                               frame= frame->next;
+                       }
+
+                       layer= layer->next;
+               }
+
+               glLineWidth(1.f);
+       }
+
+       glPopMatrix();
 }
 
 void draw_clip_main(SpaceClip *sc, ARegion *ar, Scene *scene)
@@ -1015,7 +1060,8 @@ void draw_clip_main(SpaceClip *sc, ARegion *ar, Scene *scene)
                draw_movieclip_buffer(sc, ar, ibuf, width, height, zoomx, zoomy);
                IMB_freeImBuf(ibuf);
 
-               draw_tracking(sc, ar, clip, width, height, zoomx, zoomy);
+               draw_tracking_tracks(sc, ar, clip, width, height, zoomx, zoomy);
+               draw_distortion(sc, ar, clip, width, height, zoomx, zoomy);
        }
 
        draw_movieclip_cache(sc, ar, clip, scene);
@@ -1032,12 +1078,16 @@ void draw_clip_grease_pencil(bContext *C, int onlyv2d)
                return;
 
        if(onlyv2d) {
-               ibuf= ED_space_clip_acquire_buffer(sc);
+               /* if manual calibration is used then grase pencil data is already
+                   drawed in draw_distortion */
+               if((sc->flag&SC_MANUAL_CALIBRATION)==0) {
+                       ibuf= ED_space_clip_acquire_buffer(sc);
 
-               if(ibuf) {
-                               draw_gpencil_2dimage(C, ibuf);
+                       if(ibuf) {
+                                       draw_gpencil_2dimage(C, ibuf);
 
-                       IMB_freeImBuf(ibuf);
+                               IMB_freeImBuf(ibuf);
+                       }
                }
        } else {
                draw_gpencil_view2d(C, 0);
index c549206ea53c89f0494bfd91bd08e5ca632c3093..be49cd88196738147910f39101fa9abdacbc4a94 100644 (file)
@@ -980,6 +980,7 @@ enum {
 #define SC_SHOW_NAMES                  (1<<8)
 #define SC_SHOW_GRID                   (1<<9)
 #define SC_SHOW_STABLE                 (1<<10)
+#define SC_MANUAL_CALIBRATION  (1<<11)
 
 
 /* space types, moved from DNA_screen_types.h */
index 56a8bbd2740488b1668b0c539d06422a58d58f02..a1b0fca1499cc310801b5ceeb102c8d8a3a9876b 100644 (file)
@@ -2739,6 +2739,12 @@ static void rna_def_space_clip(BlenderRNA *brna)
        RNA_def_property_boolean_sdna(prop, NULL, "flag", SC_SHOW_STABLE);
        RNA_def_property_ui_text(prop, "Show Stable", "Show stable footage in editor (if stabilization is enabled)");
        RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CLIP, NULL);
+
+       /* manual calibration */
+       prop= RNA_def_property(srna, "use_manual_calibration", PROP_BOOLEAN, PROP_NONE);
+       RNA_def_property_boolean_sdna(prop, NULL, "flag", SC_MANUAL_CALIBRATION);
+       RNA_def_property_ui_text(prop, "Manual Calibration", "Use manual calibration helpers");
+       RNA_def_property_update(prop, NC_SPACE|ND_SPACE_CLIP, NULL);
 }
 
 
index f53fb4ff7388cbcd0a6a5935f0e69afc30cbc419..ff910cb99e41cdf4375c6077be982e21d4ea6c61 100644 (file)
@@ -300,19 +300,19 @@ static void rna_def_trackingCamera(BlenderRNA *brna)
        /* Radial distortion parameters */
        prop= RNA_def_property(srna, "k1", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "k1");
-       RNA_def_property_ui_range(prop, 0, 10, .1, 3);
+       RNA_def_property_ui_range(prop, -10, 10, .1, 3);
        RNA_def_property_ui_text(prop, "K1", "");
        RNA_def_property_update(prop, NC_MOVIECLIP|NA_EDITED, NULL);
 
        prop= RNA_def_property(srna, "k2", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "k2");
-       RNA_def_property_ui_range(prop, 0, 10, .1, 3);
+       RNA_def_property_ui_range(prop, -10, 10, .1, 3);
        RNA_def_property_ui_text(prop, "K2", "");
        RNA_def_property_update(prop, NC_MOVIECLIP|NA_EDITED, NULL);
 
        prop= RNA_def_property(srna, "k3", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "k3");
-       RNA_def_property_ui_range(prop, 0, 10, .1, 3);
+       RNA_def_property_ui_range(prop, -10, 10, .1, 3);
        RNA_def_property_ui_text(prop, "K3", "");
        RNA_def_property_update(prop, NC_MOVIECLIP|NA_EDITED, NULL);