Merging r46725 through r46963 from trunk into soc-2011-tomato
[blender.git] / source / blender / blenloader / intern / readfile.c
index 63df006..edea4cc 100644 (file)
@@ -95,6 +95,7 @@
 #include "DNA_vfont_types.h"
 #include "DNA_world_types.h"
 #include "DNA_movieclip_types.h"
+#include "DNA_mask_types.h"
 
 #include "MEM_guardedalloc.h"
 
@@ -5361,9 +5362,10 @@ static void lib_link_screen(FileData *fd, Main *main)
                                        }
                                        else if (sl->spacetype == SPACE_CLIP) {
                                                SpaceClip *sclip = (SpaceClip *)sl;
-                                               
+
                                                sclip->clip = newlibadr_us(fd, sc->id.lib, sclip->clip);
-                                               
+                                               sclip->mask = newlibadr_us(fd, sc->id.lib, sclip->mask);
+
                                                sclip->scopes.track_preview = NULL;
                                                sclip->draw_context = NULL;
                                                sclip->scopes.ok = 0;
@@ -5624,9 +5626,10 @@ void lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *curscene)
                                }
                                else if (sl->spacetype == SPACE_CLIP) {
                                        SpaceClip *sclip = (SpaceClip *)sl;
-                                       
+
                                        sclip->clip = restore_pointer_by_name(newmain, (ID *)sclip->clip, 1);
-                                       
+                                       sclip->mask = restore_pointer_by_name(newmain, (ID *)sclip->mask, 1);
+
                                        sclip->scopes.ok = 0;
                                }
                        }
@@ -6117,14 +6120,15 @@ static void direct_link_movieReconstruction(FileData *fd, MovieTrackingReconstru
        reconstruction->cameras = newdataadr(fd, reconstruction->cameras);
 }
 
-static void direct_link_movieTracks(FileData *fd, ListBase *tracksbase)
+static void direct_link_movieTracks(FileData *fd, MovieClip *clip, ListBase *tracksbase)
 {
        MovieTrackingTrack *track;
        
        link_list(fd, tracksbase);
-       
+
        for (track = tracksbase->first; track; track = track->next) {
                track->markers = newdataadr(fd, track->markers);
+               track->gpd = newlibadr_us(fd, clip->id.lib, track->gpd);
        }
 }
 
@@ -6141,7 +6145,7 @@ static void direct_link_movieclip(FileData *fd, MovieClip *clip)
        if (fd->movieclipmap) clip->tracking.camera.intrinsics = newmclipadr(fd, clip->tracking.camera.intrinsics);
        else clip->tracking.camera.intrinsics = NULL;
 
-       direct_link_movieTracks(fd, &tracking->tracks);
+       direct_link_movieTracks(fd, clip, &tracking->tracks);
        direct_link_movieReconstruction(fd, &tracking->reconstruction);
 
        clip->tracking.act_track = newdataadr(fd, clip->tracking.act_track);
@@ -6160,7 +6164,7 @@ static void direct_link_movieclip(FileData *fd, MovieClip *clip)
        link_list(fd, &tracking->objects);
        
        for (object = tracking->objects.first; object; object = object->next) {
-               direct_link_movieTracks(fd, &object->tracks);
+               direct_link_movieTracks(fd, clip, &object->tracks);
                direct_link_movieReconstruction(fd, &object->reconstruction);
        }
 }
@@ -6181,6 +6185,84 @@ static void lib_link_movieclip(FileData *fd, Main *main)
        }
 }
 
+/* ***************** READ MOVIECLIP *************** */
+
+static void direct_link_mask(FileData *fd, Mask *mask)
+{
+       MaskObject *maskobj;
+
+       mask->adt = newdataadr(fd, mask->adt);
+
+       link_list(fd, &mask->maskobjs);
+
+       for (maskobj = mask->maskobjs.first; maskobj; maskobj = maskobj->next) {
+               MaskSpline *spline;
+
+               link_list(fd, &maskobj->splines);
+
+               spline = maskobj->splines.first;
+               while (spline) {
+                       int i;
+
+                       spline->points = newdataadr(fd, spline->points);
+
+                       for (i = 0; i < spline->tot_point; i++) {
+                               MaskSplinePoint *point = &spline->points[i];
+
+                               if (point->tot_uw)
+                                       point->uw = newdataadr(fd, point->uw);
+                       }
+
+                       spline = spline->next;
+               }
+
+               maskobj->act_spline = newdataadr(fd, maskobj->act_spline);
+               maskobj->act_point = newdataadr(fd, maskobj->act_point);
+       }
+}
+
+static void lib_link_mask_parent(FileData *fd, Mask *mask, MaskParent *parent)
+{
+       parent->id = newlibadr_us(fd, mask->id.lib, parent->id);
+}
+
+static void lib_link_mask(FileData *fd, Main *main)
+{
+       Mask *mask;
+
+       mask = main->mask.first;
+       while (mask) {
+               if(mask->id.flag & LIB_NEEDLINK) {
+                       MaskObject *maskobj;
+
+                       if (mask->adt)
+                               lib_link_animdata(fd, &mask->id, mask->adt);
+
+                       for (maskobj = mask->maskobjs.first; maskobj; maskobj = maskobj->next) {
+                               MaskSpline *spline;
+
+                               spline = maskobj->splines.first;
+                               while (spline) {
+                                       int i;
+
+                                       for (i = 0; i < spline->tot_point; i++) {
+                                               MaskSplinePoint *point = &spline->points[i];
+
+                                               lib_link_mask_parent(fd, mask, &point->parent);
+                                       }
+
+                                       lib_link_mask_parent(fd, mask, &spline->parent);
+
+                                       spline = spline->next;
+                               }
+                       }
+
+                       mask->id.flag -= LIB_NEEDLINK;
+               }
+               mask = mask->id.next;
+       }
+}
+
 /* ************** GENERAL & MAIN ******************** */
 
 
@@ -6386,6 +6468,9 @@ static BHead *read_libblock(FileData *fd, Main *main, BHead *bhead, int flag, ID
                case ID_MC:
                        direct_link_movieclip(fd, (MovieClip *)id);
                        break;
+               case ID_MSK:
+                       direct_link_mask(fd, (Mask *)id);
+                       break;
        }
        
        /*link direct data of ID properties*/
@@ -6962,12 +7047,9 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
                                        
                                track = clip->tracking.tracks.first;
                                while (track) {
-                                       if (track->pyramid_levels == 0)
-                                               track->pyramid_levels = 2;
-                                       
                                        if (track->minimum_correlation == 0.0f)
                                                track->minimum_correlation = 0.75f;
-                                       
+
                                        track = track->next;
                                }
                        }
@@ -6985,10 +7067,9 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
                
                for (clip= main->movieclip.first; clip; clip= clip->id.next) {
                        MovieTrackingSettings *settings= &clip->tracking.settings;
-                       
-                       if (settings->default_pyramid_levels == 0) {
-                               settings->default_tracker= TRACKER_KLT;
-                               settings->default_pyramid_levels = 2;
+
+                       if (settings->default_pattern_size == 0.0f) {
+                               settings->default_motion_model = TRACK_MOTION_MODEL_TRANSLATION;
                                settings->default_minimum_correlation = 0.75;
                                settings->default_pattern_size = 11;
                                settings->default_search_size = 51;
@@ -7498,7 +7579,66 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
                for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next)
                        do_versions_nodetree_frame_2_64_6(ntree);
        }
-       
+
+       {
+               MovieClip *clip;
+               bScreen *sc;
+
+               for (clip = main->movieclip.first; clip; clip = clip->id.next) {
+                       MovieTrackingTrack *track;
+
+                       track = clip->tracking.tracks.first;
+                       while (track) {
+                               int i;
+
+                               for (i = 0; i < track->markersnr; i++) {
+                                       MovieTrackingMarker *marker = &track->markers[i];
+
+                                       if (is_zero_v2(marker->pattern_corners[0]) && is_zero_v2(marker->pattern_corners[1]) &&
+                                           is_zero_v2(marker->pattern_corners[3]) && is_zero_v2(marker->pattern_corners[3]))
+                                       {
+                                               marker->pattern_corners[0][0] = track->pat_min[0];
+                                               marker->pattern_corners[0][1] = track->pat_min[1];
+
+                                               marker->pattern_corners[1][0] = track->pat_max[0];
+                                               marker->pattern_corners[1][1] = track->pat_min[1];
+
+                                               marker->pattern_corners[2][0] = track->pat_max[0];
+                                               marker->pattern_corners[2][1] = track->pat_max[1];
+
+                                               marker->pattern_corners[3][0] = track->pat_min[0];
+                                               marker->pattern_corners[3][1] = track->pat_max[1];
+                                       }
+
+                                       if (is_zero_v2(marker->search_min) && is_zero_v2(marker->search_max)) {
+                                               copy_v2_v2(marker->search_min, track->search_min);
+                                               copy_v2_v2(marker->search_max, track->search_max);
+                                       }
+                               }
+
+                               track = track->next;
+                       }
+               }
+
+               for (sc = main->screen.first; sc; sc = sc->id.next) {
+                       ScrArea *sa;
+
+                       for (sa = sc->areabase.first; sa; sa = sa->next) {
+                               SpaceLink *sl;
+
+                               for (sl = sa->spacedata.first; sl; sl = sl->next) {
+                                       if (sl->spacetype == SPACE_CLIP) {
+                                               SpaceClip *sclip = (SpaceClip *)sl;
+
+                                               if (sclip->around == 0) {
+                                                       sclip->around = V3D_CENTROID;
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
        /* WATCH IT!!!: pointers from libdata have not been converted yet here! */
        /* WATCH IT 2!: Userdef struct init has to be in editors/interface/resources.c! */
        {
@@ -7555,7 +7695,8 @@ static void lib_link_all(FileData *fd, Main *main)
        lib_link_brush(fd, main);
        lib_link_particlesettings(fd, main);
        lib_link_movieclip(fd, main);
-       
+       lib_link_mask(fd, main);
+
        lib_link_mesh(fd, main);                /* as last: tpage images with users at zero */
        
        lib_link_library(fd, main);             /* only init users */