Fix for #2657
authorTon Roosendaal <ton@blender.org>
Thu, 2 Jun 2005 17:38:42 +0000 (17:38 +0000)
committerTon Roosendaal <ton@blender.org>
Thu, 2 Jun 2005 17:38:42 +0000 (17:38 +0000)
Appending from files also set the string for "last loaded file". That's
a real bad one... so you can save over accidentally libraries.

Another fix: appending from files that have dynamic other files linked
with relative paths didn't work. (Yah, now it should all work!)

renderconverter change is just a more clear comment.

source/blender/blenloader/intern/readfile.c
source/blender/blenloader/intern/readfile.h
source/blender/renderconverter/intern/convertBlenderScene.c
source/blender/src/filesel.c

index 8602092405fb82700912474d62645294d859963a..5f0d684695d3debb62b9d144d9e216f7f35356bf 100644 (file)
@@ -871,6 +871,7 @@ FileData *blo_openblenderfile(char *name)
        } else {
                FileData *fd = filedata_new();
                fd->filedes = file;
        } else {
                FileData *fd = filedata_new();
                fd->filedes = file;
+               BLI_strncpy(fd->filename, name, sizeof(fd->filename));  // now only in use by library append
                fd->buffersize = BLI_filesize(file);
                fd->read = fd_read_from_file;
 
                fd->buffersize = BLI_filesize(file);
                fd->read = fd_read_from_file;
 
@@ -5506,10 +5507,11 @@ void BLO_library_append(SpaceFile *sfile, char *dir, int idcode)
 {
        FileData *fd= (FileData*) sfile->libfiledata;
        Main *mainl;
 {
        FileData *fd= (FileData*) sfile->libfiledata;
        Main *mainl;
-       int a, totsel=0,count=0;
-       float *curs,centerloc[3],vec[3],min[3],max[3];
        Base *centerbase;
        Object *ob;
        Base *centerbase;
        Object *ob;
+       float *curs,centerloc[3],vec[3],min[3],max[3];
+       int a, totsel=0,count=0;
+       char filename[FILE_MAXDIR+FILE_MAXFILE];
        
        INIT_MINMAX(min, max);
 
        
        INIT_MINMAX(min, max);
 
@@ -5538,6 +5540,11 @@ void BLO_library_append(SpaceFile *sfile, char *dir, int idcode)
        }
        /* now we have or selected, or an indicated file */
        
        }
        /* now we have or selected, or an indicated file */
        
+       /* make copy of the 'last loaded filename', we need to restore it */
+       BLI_strncpy(filename, G.sce, sizeof(filename));
+       BLI_strncpy(G.sce, fd->filename, sizeof(filename));             // already opened file, to reconstruct relative paths
+       
+       
        if(sfile->flag & FILE_AUTOSELECT) scene_deselect_all(G.scene);
 
        fd->mainlist.first= fd->mainlist.last= G.main;
        if(sfile->flag & FILE_AUTOSELECT) scene_deselect_all(G.scene);
 
        fd->mainlist.first= fd->mainlist.last= G.main;
@@ -5614,8 +5621,11 @@ void BLO_library_append(SpaceFile *sfile, char *dir, int idcode)
                                centerbase= centerbase->next;
                        }
                }
                                centerbase= centerbase->next;
                        }
                }
-               
        }
        }
+       
+       /* restore the 'last loaded filename' */
+       BLI_strncpy(G.sce, filename, sizeof(filename));
+
 }
 
 /* ************* READ LIBRARY ************** */
 }
 
 /* ************* READ LIBRARY ************** */
index e198752f130f06ebf8ccb94b012d6d50659885ff..19534095f98e52ca7efeb0f22a1d2926b00615a6 100644 (file)
@@ -52,7 +52,9 @@ typedef struct FileData {
 
        // variables needed for reading from file
        int filedes;
 
        // variables needed for reading from file
        int filedes;
-
+       // now only in use for library appending
+       char filename[FILE_MAXDIR+FILE_MAXFILE];
+       
        // variables needed for reading from stream
        char headerdone;
        int inbuffer;
        // variables needed for reading from stream
        char headerdone;
        int inbuffer;
index 32ea28d2b9cc6f968ae70cb0d03a31d7b2dffa7d..e9d0b5b90708651ca088ebe06cf5977c77c8238d 100644 (file)
@@ -3013,7 +3013,7 @@ void RE_rotateBlenderScene(void)
                ob= ob->id.next;
        }
 
                ob= ob->id.next;
        }
 
-       init_render_world();    /* do first, because of ambient */
+       init_render_world();    /* do first, because of ambient. also requires R.osa set correct */
        init_render_textures();
        init_render_materials();
 
        init_render_textures();
        init_render_materials();
 
index d089e51bfcd5d5850bcd1974c2074c41ec194a77..5e8d2e17b6fd925065258f52b7465ac9bf1cb458 100644 (file)
@@ -2236,9 +2236,10 @@ static void do_library_append(SpaceFile *sfile)
 
 static void library_to_filelist(SpaceFile *sfile)
 {
 
 static void library_to_filelist(SpaceFile *sfile)
 {
-       char dir[FILE_MAXDIR], group[24];
-       int ok, i, nnames, idcode;
        LinkNode *l, *names;
        LinkNode *l, *names;
+       int ok, i, nnames, idcode;
+       char filename[FILE_MAXDIR+FILE_MAXFILE];
+       char dir[FILE_MAXDIR], group[24];
        
        /* name test */
        ok= is_a_library(sfile, dir, group);
        
        /* name test */
        ok= is_a_library(sfile, dir, group);
@@ -2249,10 +2250,13 @@ static void library_to_filelist(SpaceFile *sfile)
                return;
        }
        
                return;
        }
        
+       BLI_strncpy(filename, G.sce, sizeof(filename)); // G.sce = last file loaded, for UI
+       
        /* there we go */
        /* for the time being only read filedata when libfiledata==0 */
        if (sfile->libfiledata==0) {
        /* there we go */
        /* for the time being only read filedata when libfiledata==0 */
        if (sfile->libfiledata==0) {
-               sfile->libfiledata= BLO_blendhandle_from_file(dir);
+               sfile->libfiledata= BLO_blendhandle_from_file(dir);     // this sets G.sce, we dont want it
+               
                if(sfile->libfiledata==0) return;
        }
        
                if(sfile->libfiledata==0) return;
        }
        
@@ -2295,6 +2299,9 @@ static void library_to_filelist(SpaceFile *sfile)
                if (len > sfile->maxnamelen)
                        sfile->maxnamelen = len;
        }
                if (len > sfile->maxnamelen)
                        sfile->maxnamelen = len;
        }
+       
+       BLI_strncpy(G.sce, filename, sizeof(filename)); // prevent G.sce to change
+
 }
 
 /* ******************* DATA SELECT ********************* */
 }
 
 /* ******************* DATA SELECT ********************* */