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:
Diffstat (limited to 'source/blender/blenloader')
-rw-r--r--source/blender/blenloader/intern/readfile.c75
1 files changed, 41 insertions, 34 deletions
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index c14b34af0fe..61df5468057 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5796,16 +5796,23 @@ static void lib_link_screen(FileData *fd, Main *main)
}
}
-static bool restore_pointer(ID *id, ID *newid, int user)
+/* how to handle user count on pointer restore */
+typedef enum ePointerUserMode {
+ USER_IGNORE, /* ignore user count */
+ USER_ONE, /* ensure at least one user (fake also counts) */
+ USER_REAL /* ensure at least one real user (fake user ignored) */
+} ePointerUserMode;
+
+static bool restore_pointer(ID *id, ID *newid, ePointerUserMode user)
{
if (strcmp(newid->name + 2, id->name + 2) == 0) {
if (newid->lib == id->lib) {
- if (user == 1) {
+ if (user == USER_ONE) {
if (newid->us == 0) {
newid->us++;
}
}
- else if (user == 2) {
+ else if (user == USER_REAL) {
id_us_ensure_real(newid);
}
return true;
@@ -5822,7 +5829,7 @@ static bool restore_pointer(ID *id, ID *newid, int user)
* - 1: ensure a user
* - 2: ensure a real user (even if a fake one is set)
*/
-static void *restore_pointer_by_name(Main *mainp, ID *id, int user)
+static void *restore_pointer_by_name(Main *mainp, ID *id, ePointerUserMode user)
{
if (id) {
ListBase *lb = which_libbase(mainp, GS(id->name));
@@ -5845,7 +5852,7 @@ static void lib_link_seq_clipboard_pt_restore(ID *id, Main *newmain)
if (id) {
/* clipboard must ensure this */
BLI_assert(id->newid != NULL);
- id->newid = restore_pointer_by_name(newmain, (ID *)id->newid, 1);
+ id->newid = restore_pointer_by_name(newmain, (ID *)id->newid, USER_ONE);
}
}
static int lib_link_seq_clipboard_cb(Sequence *seq, void *arg_pt)
@@ -5879,7 +5886,7 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc
/* first windowmanager */
for (wm = newmain->wm.first; wm; wm = wm->id.next) {
for (win= wm->windows.first; win; win= win->next) {
- win->screen = restore_pointer_by_name(newmain, (ID *)win->screen, 1);
+ win->screen = restore_pointer_by_name(newmain, (ID *)win->screen, USER_ONE);
if (win->screen == NULL)
win->screen = curscreen;
@@ -5892,7 +5899,7 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc
for (sc = newmain->screen.first; sc; sc = sc->id.next) {
Scene *oldscene = sc->scene;
- sc->scene= restore_pointer_by_name(newmain, (ID *)sc->scene, 1);
+ sc->scene= restore_pointer_by_name(newmain, (ID *)sc->scene, USER_ONE);
if (sc->scene == NULL)
sc->scene = curscene;
@@ -5911,14 +5918,14 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc
if (v3d->scenelock)
v3d->camera = NULL; /* always get from scene */
else
- v3d->camera = restore_pointer_by_name(newmain, (ID *)v3d->camera, 1);
+ v3d->camera = restore_pointer_by_name(newmain, (ID *)v3d->camera, USER_ONE);
if (v3d->camera == NULL)
v3d->camera = sc->scene->camera;
- v3d->ob_centre = restore_pointer_by_name(newmain, (ID *)v3d->ob_centre, 1);
+ v3d->ob_centre = restore_pointer_by_name(newmain, (ID *)v3d->ob_centre, USER_ONE);
for (bgpic= v3d->bgpicbase.first; bgpic; bgpic= bgpic->next) {
- bgpic->ima = restore_pointer_by_name(newmain, (ID *)bgpic->ima, 1);
- bgpic->clip = restore_pointer_by_name(newmain, (ID *)bgpic->clip, 1);
+ bgpic->ima = restore_pointer_by_name(newmain, (ID *)bgpic->ima, USER_ONE);
+ bgpic->clip = restore_pointer_by_name(newmain, (ID *)bgpic->clip, USER_ONE);
}
if (v3d->localvd) {
/*Base *base;*/
@@ -5960,10 +5967,10 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc
bDopeSheet *ads = sipo->ads;
if (ads) {
- ads->source = restore_pointer_by_name(newmain, (ID *)ads->source, 1);
+ ads->source = restore_pointer_by_name(newmain, (ID *)ads->source, USER_ONE);
if (ads->filter_grp)
- ads->filter_grp = restore_pointer_by_name(newmain, (ID *)ads->filter_grp, 0);
+ ads->filter_grp = restore_pointer_by_name(newmain, (ID *)ads->filter_grp, USER_IGNORE);
}
/* force recalc of list of channels (i.e. includes calculating F-Curve colors)
@@ -5973,7 +5980,7 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc
}
else if (sl->spacetype == SPACE_BUTS) {
SpaceButs *sbuts = (SpaceButs *)sl;
- sbuts->pinid = restore_pointer_by_name(newmain, sbuts->pinid, 0);
+ sbuts->pinid = restore_pointer_by_name(newmain, sbuts->pinid, USER_IGNORE);
//XXX if (sbuts->ri) sbuts->ri->curtile = 0;
}
else if (sl->spacetype == SPACE_FILE) {
@@ -5983,11 +5990,11 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc
else if (sl->spacetype == SPACE_ACTION) {
SpaceAction *saction = (SpaceAction *)sl;
- saction->action = restore_pointer_by_name(newmain, (ID *)saction->action, 1);
- saction->ads.source = restore_pointer_by_name(newmain, (ID *)saction->ads.source, 1);
+ saction->action = restore_pointer_by_name(newmain, (ID *)saction->action, USER_ONE);
+ saction->ads.source = restore_pointer_by_name(newmain, (ID *)saction->ads.source, USER_ONE);
if (saction->ads.filter_grp)
- saction->ads.filter_grp = restore_pointer_by_name(newmain, (ID *)saction->ads.filter_grp, 0);
+ saction->ads.filter_grp = restore_pointer_by_name(newmain, (ID *)saction->ads.filter_grp, USER_IGNORE);
/* force recalc of list of channels, potentially updating the active action
@@ -5998,7 +6005,7 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc
else if (sl->spacetype == SPACE_IMAGE) {
SpaceImage *sima = (SpaceImage *)sl;
- sima->image = restore_pointer_by_name(newmain, (ID *)sima->image, 2);
+ sima->image = restore_pointer_by_name(newmain, (ID *)sima->image, USER_REAL);
/* this will be freed, not worth attempting to find same scene,
* since it gets initialized later */
@@ -6013,8 +6020,8 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc
/* NOTE: pre-2.5, this was local data not lib data, but now we need this as lib data
* so assume that here we're doing for undo only...
*/
- sima->gpd = restore_pointer_by_name(newmain, (ID *)sima->gpd, 1);
- sima->mask_info.mask = restore_pointer_by_name(newmain, (ID *)sima->mask_info.mask, 2);
+ sima->gpd = restore_pointer_by_name(newmain, (ID *)sima->gpd, USER_ONE);
+ sima->mask_info.mask = restore_pointer_by_name(newmain, (ID *)sima->mask_info.mask, USER_REAL);
}
else if (sl->spacetype == SPACE_SEQ) {
SpaceSeq *sseq = (SpaceSeq *)sl;
@@ -6022,29 +6029,29 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc
/* NOTE: pre-2.5, this was local data not lib data, but now we need this as lib data
* so assume that here we're doing for undo only...
*/
- sseq->gpd = restore_pointer_by_name(newmain, (ID *)sseq->gpd, 1);
+ sseq->gpd = restore_pointer_by_name(newmain, (ID *)sseq->gpd, USER_ONE);
}
else if (sl->spacetype == SPACE_NLA) {
SpaceNla *snla = (SpaceNla *)sl;
bDopeSheet *ads = snla->ads;
if (ads) {
- ads->source = restore_pointer_by_name(newmain, (ID *)ads->source, 1);
+ ads->source = restore_pointer_by_name(newmain, (ID *)ads->source, USER_ONE);
if (ads->filter_grp)
- ads->filter_grp = restore_pointer_by_name(newmain, (ID *)ads->filter_grp, 0);
+ ads->filter_grp = restore_pointer_by_name(newmain, (ID *)ads->filter_grp, USER_IGNORE);
}
}
else if (sl->spacetype == SPACE_TEXT) {
SpaceText *st = (SpaceText *)sl;
- st->text = restore_pointer_by_name(newmain, (ID *)st->text, 1);
+ st->text = restore_pointer_by_name(newmain, (ID *)st->text, USER_ONE);
if (st->text == NULL) st->text = newmain->text.first;
}
else if (sl->spacetype == SPACE_SCRIPT) {
SpaceScript *scpt = (SpaceScript *)sl;
- scpt->script = restore_pointer_by_name(newmain, (ID *)scpt->script, 1);
+ scpt->script = restore_pointer_by_name(newmain, (ID *)scpt->script, USER_ONE);
/*sc->script = NULL; - 2.45 set to null, better re-run the script */
if (scpt->script) {
@@ -6054,7 +6061,7 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc
else if (sl->spacetype == SPACE_OUTLINER) {
SpaceOops *so= (SpaceOops *)sl;
- so->search_tse.id = restore_pointer_by_name(newmain, so->search_tse.id, 0);
+ so->search_tse.id = restore_pointer_by_name(newmain, so->search_tse.id, USER_IGNORE);
if (so->treestore) {
TreeStoreElem *tselem;
@@ -6062,7 +6069,7 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc
BLI_mempool_iternew(so->treestore, &iter);
while ((tselem = BLI_mempool_iterstep(&iter))) {
- tselem->id = restore_pointer_by_name(newmain, tselem->id, 0);
+ tselem->id = restore_pointer_by_name(newmain, tselem->id, USER_IGNORE);
}
if (so->treehash) {
/* rebuild hash table, because it depends on ids too */
@@ -6076,14 +6083,14 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc
bNodeTree *ntree;
/* node tree can be stored locally in id too, link this first */
- snode->id = restore_pointer_by_name(newmain, snode->id, 1);
- snode->from = restore_pointer_by_name(newmain, snode->from, 0);
+ snode->id = restore_pointer_by_name(newmain, snode->id, USER_ONE);
+ snode->from = restore_pointer_by_name(newmain, snode->from, USER_IGNORE);
ntree = nodetree_from_id(snode->id);
if (ntree)
snode->nodetree = ntree;
else
- snode->nodetree = restore_pointer_by_name(newmain, (ID*)snode->nodetree, 2);
+ snode->nodetree = restore_pointer_by_name(newmain, (ID*)snode->nodetree, USER_REAL);
for (path = snode->treepath.first; path; path = path->next) {
if (path == snode->treepath.first) {
@@ -6091,7 +6098,7 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc
path->nodetree = snode->nodetree;
}
else
- path->nodetree= restore_pointer_by_name(newmain, (ID*)path->nodetree, 2);
+ path->nodetree= restore_pointer_by_name(newmain, (ID*)path->nodetree, USER_REAL);
if (!path->nodetree)
break;
@@ -6117,15 +6124,15 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc
else if (sl->spacetype == SPACE_CLIP) {
SpaceClip *sclip = (SpaceClip *)sl;
- sclip->clip = restore_pointer_by_name(newmain, (ID *)sclip->clip, 2);
- sclip->mask_info.mask = restore_pointer_by_name(newmain, (ID *)sclip->mask_info.mask, 2);
+ sclip->clip = restore_pointer_by_name(newmain, (ID *)sclip->clip, USER_REAL);
+ sclip->mask_info.mask = restore_pointer_by_name(newmain, (ID *)sclip->mask_info.mask, USER_REAL);
sclip->scopes.ok = 0;
}
else if (sl->spacetype == SPACE_LOGIC) {
SpaceLogic *slogic = (SpaceLogic *)sl;
- slogic->gpd = restore_pointer_by_name(newmain, (ID *)slogic->gpd, 1);
+ slogic->gpd = restore_pointer_by_name(newmain, (ID *)slogic->gpd, USER_ONE);
}
}
}