Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTon Roosendaal <ton@blender.org>2006-11-25 16:07:28 +0300
committerTon Roosendaal <ton@blender.org>2006-11-25 16:07:28 +0300
commit604b4230325aa012efb063e0a3fd2ac23809e393 (patch)
tree10d0b42f972550484bde3d9d47a72bbbd68a956e /source/blender/blenloader/intern
parentb78b3a4761849bd7e2b368884e05c40ef58d12d0 (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.c24
-rw-r--r--source/blender/blenloader/intern/readfile.c59
-rw-r--r--source/blender/blenloader/intern/readfile.h5
-rw-r--r--source/blender/blenloader/intern/writefile.c34
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!!!