diff options
Diffstat (limited to 'source/blender/blenloader')
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 36 | ||||
-rw-r--r-- | source/blender/blenloader/intern/writefile.c | 6 |
2 files changed, 38 insertions, 4 deletions
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 25147dff5e9..938b1d600d7 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -2624,13 +2624,24 @@ static void lib_link_screen(FileData *fd, Main *main) else if(sl->spacetype==SPACE_OOPS) { SpaceOops *so= (SpaceOops *)sl; Oops *oops; + TreeStoreElem *tselem; + int a; oops= so->oops.first; while(oops) { - oops->id= newlibadr(fd, 0, oops->id); + oops->id= newlibadr(fd, NULL, oops->id); oops= oops->next; } - so->lockpoin= 0; + so->lockpoin= NULL; + so->tree.first= so->tree.last= NULL; + + if(so->treestore) { + tselem= so->treestore->data; + for(a=0; a<so->treestore->usedelem; a++, tselem++) { + tselem->id= newlibadr(fd, NULL, tselem->id); + } + } + } else if(sl->spacetype==SPACE_SOUND) { SpaceSound *ssound= (SpaceSound *)sl; @@ -2746,14 +2757,22 @@ void lib_link_screen_restore(Main *newmain, char mode, Scene *curscene) else if(sl->spacetype==SPACE_OOPS) { SpaceOops *so= (SpaceOops *)sl; Oops *oops; - + + int a; oops= so->oops.first; while(oops) { oops->id= restore_pointer_by_name(newmain, (ID *)oops->id); oops= oops->next; } - so->lockpoin= NULL; + + if(so->treestore) { + TreeStore *ts= so->treestore; + TreeStoreElem *tselem=ts->data; + for(a=0; a<ts->usedelem; a++, tselem++) { + tselem->id= restore_pointer_by_name(newmain, tselem->id); + } + } } else if(sl->spacetype==SPACE_SOUND) { SpaceSound *ssound= (SpaceSound *)sl; @@ -2821,12 +2840,21 @@ static void direct_link_screen(FileData *fd, bScreen *sc) } else if (sl->spacetype==SPACE_OOPS) { SpaceOops *soops= (SpaceOops*) sl; + link_list(fd, &(soops->oops)); oops= soops->oops.first; while(oops) { oops->link.first= oops->link.last= 0; oops= oops->next; } + + soops->treestore= newdataadr(fd, soops->treestore); + if(soops->treestore) { + soops->treestore->data= newdataadr(fd, soops->treestore->data); + /* we only saved what was used */ + soops->treestore->totelem= soops->treestore->usedelem; + soops->storeflag |= SO_TREESTORE_CLEANUP; // at first draw + } } } diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index 558caea7ba7..5b8e1c542c8 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -1220,6 +1220,12 @@ static void write_screens(WriteData *wd, ListBase *scrbase) writestruct(wd, DATA, "Oops", 1, oops); oops= oops->next; } + /* outliner */ + if(so->treestore) { + writestruct(wd, DATA, "TreeStore", 1, so->treestore); + if(so->treestore->data) + writestruct(wd, DATA, "TreeStoreElem", so->treestore->usedelem, so->treestore->data); + } } else if(sl->spacetype==SPACE_IMAGE) { writestruct(wd, DATA, "SpaceImage", 1, sl); |