svn merge -r 16454:16593 https://svn.blender.org/svnroot/bf-blender/trunk/blender
[blender.git] / source / blender / blenloader / intern / readfile.c
index e403a28141c4789448434ee232a2245a8e45e0c5..928def7705926a5dbac520bf8bdc590b788be543 100644 (file)
@@ -973,9 +973,11 @@ FileData *blo_openblenderfile(char *name, BlendReadError *error_r)
        } else {
                FileData *fd = filedata_new();
                fd->gzfiledes = gzfile;
-               BLI_strncpy(fd->filename, name, sizeof(fd->filename));  // now only in use by library append
                fd->read = fd_read_gzip_from_file;
 
+               /* needed for library_append and read_libraries */
+               BLI_strncpy(fd->filename, name, sizeof(fd->filename));
+
                return blo_decode_and_check(fd, error_r);
        }
 }
@@ -2597,19 +2599,33 @@ static void direct_link_particlesettings(FileData *fd, ParticleSettings *part)
        part->pd2= newdataadr(fd, part->pd2);
 }
 
-static void lib_link_particlesystems(FileData *fd, ID *id, ListBase *particles)
+static void lib_link_particlesystems(FileData *fd, Object *ob, ID *id, ListBase *particles)
 {
-       ParticleSystem *psys;
+       ParticleSystem *psys, *psysnext;
        int a;
 
-       for(psys=particles->first; psys; psys=psys->next){
+       for(psys=particles->first; psys; psys=psysnext){
                ParticleData *pa;
+               
+               psysnext= psys->next;
+               
                psys->part = newlibadr_us(fd, id->lib, psys->part);
-               psys->target_ob = newlibadr(fd, id->lib, psys->target_ob);
-               psys->keyed_ob = newlibadr(fd, id->lib, psys->keyed_ob);
+               if(psys->part) {
+                       psys->target_ob = newlibadr(fd, id->lib, psys->target_ob);
+                       psys->keyed_ob = newlibadr(fd, id->lib, psys->keyed_ob);
+
+                       for(a=0,pa=psys->particles; a<psys->totpart; a++,pa++){
+                               pa->stick_ob=newlibadr(fd, id->lib, pa->stick_ob);
+                       }
+               }
+               else {
+                       /* particle modifier must be removed before particle system */
+                       ParticleSystemModifierData *psmd= psys_get_modifier(ob,psys);
+                       BLI_remlink(&ob->modifiers, psmd);
+                       modifier_free((ModifierData *)psmd);
 
-               for(a=0,pa=psys->particles; a<psys->totpart; a++,pa++){
-                       pa->stick_ob=newlibadr(fd, id->lib, pa->stick_ob);
+                       BLI_remlink(particles, psys);
+                       MEM_freeN(psys);
                }
        }
 }
@@ -3064,7 +3080,7 @@ static void lib_link_object(FileData *fd, Main *main)
                                        ob->pd->tex=newlibadr_us(fd, ob->id.lib, ob->pd->tex);
 
                        lib_link_scriptlink(fd, &ob->id, &ob->scriptlink);
-                       lib_link_particlesystems(fd, &ob->id, &ob->particlesystem);
+                       lib_link_particlesystems(fd, ob, &ob->id, &ob->particlesystem);
                        lib_link_modifiers(fd, ob);
                }
                ob= ob->id.next;
@@ -7791,14 +7807,14 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
        }
        
 
-       if(main->versionfile <= 246 && main->subversionfile < 1){
+       if(main->versionfile < 246 || (main->versionfile == 246 && main->subversionfile < 1)) {
                Mesh *me;
 
                for(me=main->mesh.first; me; me= me->id.next)
                        alphasort_version_246(fd, lib, me);
        }
        
-       if(main->versionfile <= 246 && main->subversionfile < 1){
+       if(main->versionfile < 246 || (main->versionfile == 246 && main->subversionfile < 1)){
                Object *ob;
                for(ob = main->object.first; ob; ob= ob->id.next) {
                        if(ob->pd && (ob->pd->forcefield == PFIELD_WIND))
@@ -7806,6 +7822,14 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
                }
        }
 
+       if (main->versionfile < 247 || (main->versionfile == 247 && main->subversionfile < 2)){
+               Object *ob;
+               for(ob = main->object.first; ob; ob= ob->id.next) {
+                       ob->gameflag |= OB_COLLISION;
+                       ob->margin = 0.06;
+               }
+       }
+
        /* WATCH IT!!!: pointers from libdata have not been converted yet here! */
        /* WATCH IT 2!: Userdef struct init has to be in src/usiblender.c! */
 
@@ -9156,7 +9180,7 @@ static void read_libraries(FileData *basefd, ListBase *mainlist)
 
 /* reading runtime */
 
-BlendFileData *blo_read_blendafterruntime(int file, int actualsize, BlendReadError *error_r) 
+BlendFileData *blo_read_blendafterruntime(int file, char *name, int actualsize, BlendReadError *error_r) 
 {
        BlendFileData *bfd = NULL;
        FileData *fd = filedata_new();
@@ -9164,6 +9188,9 @@ BlendFileData *blo_read_blendafterruntime(int file, int actualsize, BlendReadErr
        fd->buffersize = actualsize;
        fd->read = fd_read_from_file;
 
+       /* needed for library_append and read_libraries */
+       BLI_strncpy(fd->filename, name, sizeof(fd->filename));
+
        fd = blo_decode_and_check(fd, error_r);
        if (!fd)
                return NULL;