diff options
author | Ton Roosendaal <ton@blender.org> | 2006-11-25 16:07:28 +0300 |
---|---|---|
committer | Ton Roosendaal <ton@blender.org> | 2006-11-25 16:07:28 +0300 |
commit | 604b4230325aa012efb063e0a3fd2ac23809e393 (patch) | |
tree | 10d0b42f972550484bde3d9d47a72bbbd68a956e /source/blender/blenloader/intern | |
parent | b78b3a4761849bd7e2b368884e05c40ef58d12d0 (diff) |
- Library linking feature: global undo/redo now doesn't read the linked
library .blend files anymore, making it a load faster to use.
- Fixed ancient annoyance; samples were not properly freed, giving a lot
"Error Totblock" when using sound.
This fix also involves removing an ancient NaN hack, which treated the
samples as fake Library data in the Main database.
But still, the Blender Sound and Sample code is horrible... :/
Diffstat (limited to 'source/blender/blenloader/intern')
-rw-r--r-- | source/blender/blenloader/intern/readblenentry.c | 24 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 59 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.h | 5 | ||||
-rw-r--r-- | source/blender/blenloader/intern/writefile.c | 34 |
4 files changed, 70 insertions, 52 deletions
diff --git a/source/blender/blenloader/intern/readblenentry.c b/source/blender/blenloader/intern/readblenentry.c index 17549485025..1e602285fc0 100644 --- a/source/blender/blenloader/intern/readblenentry.c +++ b/source/blender/blenloader/intern/readblenentry.c @@ -54,6 +54,7 @@ #include "BKE_utildefines.h" // for ENDB #include "BKE_main.h" +#include "BKE_global.h" #include "BKE_library.h" // for free_main #include "BLO_readfile.h" @@ -98,7 +99,6 @@ static IDType idtypes[]= { { ID_ME, "Mesh", IDTYPE_FLAGS_ISLINKABLE}, { ID_NT, "NodeTree", IDTYPE_FLAGS_ISLINKABLE}, { ID_OB, "Object", IDTYPE_FLAGS_ISLINKABLE}, - { ID_SAMPLE, "Sample", 0}, { ID_SCE, "Scene", IDTYPE_FLAGS_ISLINKABLE}, { ID_SCR, "Screen", 0}, { ID_SEQ, "Sequence", 0}, @@ -289,16 +289,21 @@ BlendFileData *BLO_read_from_memory(void *mem, int memsize, BlendReadError *erro return bfd; } - BlendFileData *BLO_read_from_memfile(const char *filename, MemFile *memfile, BlendReadError *error_r) { BlendFileData *bfd = NULL; FileData *fd; - + ListBase mainlist; + fd = blo_openblendermemfile(memfile, error_r); if (fd) { strcpy(fd->filename, filename); + /* separate libraries from G.main */ + blo_split_main(&mainlist, G.main); + /* add the library pointers in oldmap lookup */ + blo_add_library_pointer_map(&mainlist, fd); + /* makes lookup of existing images in G.main */ blo_make_image_pointer_map(fd); @@ -311,6 +316,19 @@ BlendFileData *BLO_read_from_memfile(const char *filename, MemFile *memfile, Ble /* ensures relinked images are not freed */ blo_end_image_pointer_map(fd); + /* move libraries from G.main to new main */ + if(bfd && mainlist.first!=mainlist.last) { + + /* Library structs themselves */ + bfd->main->library= G.main->library; + G.main->library.first= G.main->library.last= NULL; + + /* add the Library mainlist to the new main */ + BLI_remlink(&mainlist, G.main); + BLI_addhead(&mainlist, bfd->main); + } + blo_join_main(&mainlist); + blo_freefiledata(fd); } diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 547b5f016e7..79ea9cc5d81 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -320,7 +320,7 @@ static void *oldnewmap_lookup_and_inc(OldNewMap *onm, void *addr) return NULL; } -/* for libdate, nr has ID code, no increment */ +/* for libdata, nr has ID code, no increment */ static void *oldnewmap_liblookup(OldNewMap *onm, void *addr, void *lib) { int i; @@ -438,22 +438,27 @@ static void split_libdata(ListBase *lb, Main *first) } } -void blo_split_main(ListBase *mainlist) +void blo_split_main(ListBase *mainlist, Main *main) { - Main *mainl= mainlist->first; ListBase *lbarray[MAX_LIBARRAY]; Library *lib; int i; - for (lib= mainl->library.first; lib; lib= lib->id.next) { + mainlist->first= mainlist->last= main; + main->next= NULL; + + if(main->library.first==NULL) + return; + + for (lib= main->library.first; lib; lib= lib->id.next) { Main *libmain= MEM_callocN(sizeof(Main), "libmain"); libmain->curlib= lib; BLI_addtail(mainlist, libmain); } - i= set_listbasepointers(mainl, lbarray); + i= set_listbasepointers(main, lbarray); while(i--) - split_libdata(lbarray[i], mainl->next); + split_libdata(lbarray[i], main->next); } /* removes things like /blah/blah/../../blah/ etc, then writes in *name the full path */ @@ -1031,9 +1036,8 @@ static void *newlibadr_us(FileData *fd, void *lib, void *adr) /* increases user { ID *id= newlibadr(fd, lib, adr); - if(id) { + if(id) id->us++; - } return id; } @@ -1122,6 +1126,23 @@ void blo_end_image_pointer_map(FileData *fd) } } +/* undo file support: add all library pointers in lookup */ +void blo_add_library_pointer_map(ListBase *mainlist, FileData *fd) +{ + Main *main= mainlist->first; + ListBase *lbarray[MAX_LIBARRAY]; + + for(main= main->next; main; main= main->next) { + int i= set_listbasepointers(main, lbarray); + while(i--) { + ID *id; + for(id= lbarray[i]->first; id; id= id->next) + oldnewmap_insert(fd->libmap, id, id, GS(id->name)); + } + } +} + + /* ********** END OLD POINTERS ****************** */ /* ********** READ FILE ****************** */ @@ -3804,7 +3825,6 @@ static char *dataname(short id_code) case ID_VF: return "Data from VF"; case ID_TXT : return "Data from TXT"; case ID_SO: return "Data from SO"; - case ID_SAMPLE: return "Data from SAMPLE"; case ID_NT: return "Data from NT"; case ID_BR: return "Data from BR"; } @@ -4915,8 +4935,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) Mesh *me; bScreen *sc; - for (sound=main->sound.first; sound; sound=sound->id.next) - { + for (sound=main->sound.first; sound; sound=sound->id.next) { if (sound->packedfile) { if (sound->newpackedfile == NULL) { sound->newpackedfile = sound->packedfile; @@ -6179,17 +6198,15 @@ BlendFileData *blo_read_file_internal(FileData *fd, BlendReadError *error_r) */ bhead = read_libblock(fd, fd->mainlist.last, bhead, LIB_READ+LIB_EXTERN, NULL); break; -// case ID_GR: -// bhead = blo_nextbhead(fd, bhead); -// break; default: bhead = read_libblock(fd, bfd->main, bhead, LIB_LOCAL, NULL); } } - /* before read_libraries */ - do_versions(fd, NULL, bfd->main); + /* do before read_libraries, but skip undo case */ +// if(fd->memfile==NULL) (the mesh shuffle hacks don't work yet? ton) + do_versions(fd, NULL, bfd->main); read_libraries(fd, &fd->mainlist); blo_join_main(&fd->mainlist); @@ -6966,11 +6983,8 @@ void BLO_script_library_append(BlendHandle *bh, char *dir, char *name, int idcod Main *mainl; FileData *fd = (FileData *)bh; - mainlist.first= mainlist.last= G.main; - G.main->next= NULL; - /* make mains */ - blo_split_main(&mainlist); + blo_split_main(&mainlist, G.main); /* which one do we need? */ mainl = blo_find_main(&mainlist, dir, G.sce); @@ -7030,11 +7044,8 @@ void BLO_library_append(SpaceFile *sfile, char *dir, int idcode) if(sfile->flag & FILE_AUTOSELECT) scene_deselect_all(G.scene); - fd->mainlist.first= fd->mainlist.last= G.main; - G.main->next= NULL; - /* make mains */ - blo_split_main(&fd->mainlist); + blo_split_main(&fd->mainlist, G.main); /* which one do we need? */ mainl = blo_find_main(&fd->mainlist, dir, G.sce); diff --git a/source/blender/blenloader/intern/readfile.h b/source/blender/blenloader/intern/readfile.h index a0f42769762..fd7e5c0ee00 100644 --- a/source/blender/blenloader/intern/readfile.h +++ b/source/blender/blenloader/intern/readfile.h @@ -99,9 +99,9 @@ typedef struct BHeadN { #define SIZEOFBLENDERHEADER 12 /***/ - +struct Main; void blo_join_main(ListBase *mainlist); -void blo_split_main(ListBase *mainlist); +void blo_split_main(ListBase *mainlist, struct Main *main); BlendFileData *blo_read_file_internal( FileData *fd, BlendReadError *error_r); @@ -111,6 +111,7 @@ FileData *blo_openblendermemfile(struct MemFile *memfile, BlendReadError *error_ void blo_make_image_pointer_map(FileData *fd); void blo_end_image_pointer_map(FileData *fd); +void blo_add_library_pointer_map(ListBase *mainlist, FileData *fd); void blo_freefiledata( FileData *fd); diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 56adb3b732d..00c8fc86081 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -1603,20 +1603,18 @@ static void write_libraries(WriteData *wd, Main *main) ID *id; int a, tot, foundone; - while(main) { + for(; main; main= main->next) { a=tot= set_listbasepointers(main, lbarray); /* test: is lib being used */ foundone= 0; while(tot--) { - id= lbarray[tot]->first; - while(id) { + for(id= lbarray[tot]->first; id; id= id->next) { if(id->us>0 && (id->flag & LIB_EXTERN)) { foundone= 1; break; } - id= id->next; } if(foundone) break; } @@ -1625,20 +1623,13 @@ static void write_libraries(WriteData *wd, Main *main) writestruct(wd, ID_LI, "Library", 1, main->curlib); while(a--) { - id= lbarray[a]->first; - while(id) { - if(G.rt==127 && GS(id->name)!=ID_GR) break; - + for(id= lbarray[a]->first; id; id= id->next) { if(id->us>0 && (id->flag & LIB_EXTERN)) { - writestruct(wd, ID_ID, "ID", 1, id); } - id= id->next; } } } - - main= main->next; } } @@ -1856,19 +1847,15 @@ static void write_global(WriteData *wd) writestruct(wd, GLOB, "FileGlobal", 1, &fg); } -/* if *mem there's filesave to memory */ +/* if MemFile * there's filesave to memory */ static int write_file_handle(int handle, MemFile *compare, MemFile *current, int write_user_block, int write_flags) { BHead bhead; ListBase mainlist; char buf[13]; WriteData *wd; -/* int data; */ /*unused*/ - - mainlist.first= mainlist.last= G.main; - G.main->next= NULL; - blo_split_main(&mainlist); + blo_split_main(&mainlist, G.main); wd= bgnwrite(handle, compare, current, write_flags); @@ -1878,7 +1865,7 @@ static int write_file_handle(int handle, MemFile *compare, MemFile *current, int write_renderinfo(wd); if(current==NULL) - write_screens (wd, &G.main->screen); // no UI save + write_screens (wd, &G.main->screen); /* no UI save in undo */ write_scenes (wd, &G.main->scene); write_curves (wd, &G.main->curve); write_mballs (wd, &G.main->mball); @@ -1901,7 +1888,8 @@ static int write_file_handle(int handle, MemFile *compare, MemFile *current, int write_meshs (wd, &G.main->mesh); write_nodetrees(wd, &G.main->nodetree); write_brushes (wd, &G.main->brush); - write_libraries(wd, G.main->next); + if(current==NULL) + write_libraries(wd, G.main->next); /* no library save in undo */ write_global(wd); if (write_user_block) { @@ -1927,7 +1915,7 @@ int BLO_write_file(char *dir, int write_flags, char **error_r) { char userfilename[FILE_MAXDIR+FILE_MAXFILE]; char tempname[FILE_MAXDIR+FILE_MAXFILE]; - int file, fout, write_user_block; + int file, err, write_user_block; sprintf(tempname, "%s@", dir); @@ -1941,10 +1929,10 @@ int BLO_write_file(char *dir, int write_flags, char **error_r) write_user_block= BLI_streq(dir, userfilename); - fout= write_file_handle(file, NULL,NULL, write_user_block, write_flags); + err= write_file_handle(file, NULL,NULL, write_user_block, write_flags); close(file); - if(!fout) { + if(!err) { if(write_flags & G_FILE_COMPRESS) { // compressed files have the same ending as regular files... only from 2.4!!! |