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:
authorBastien Montagne <b.mont29@gmail.com>2020-02-19 14:50:04 +0300
committerBastien Montagne <b.mont29@gmail.com>2020-02-19 14:56:02 +0300
commit367ecff15d74ed99a305cbfcd46599e59a75db02 (patch)
tree934a582bc6adff2bf4843c3ad6487cf320ebe925
parentbde215a60c16ce77a60ecb38eaf7802965d73c7f (diff)
readfile: Move ID refcounting to libquery.
Having that extra ID users handling at readfile level, besides generic one ensured by libquery, has been something bothering me for a long time (had to fix my share of bugs due to mismatches between those two areas). Further more, work on undo speedup will require even more complex ID refcount management if we want to keep it in readfile.c area. So idea is instead to generalize what we did for linked data already when undoing: recompute properly usercount numbers after liblink step, for all IDs. Note that extra time required here is neglectable in a whole .blend file reading (few extra milliseconds when loading a full production scene e.g.). Notes: * Some deprecated data (IPOs) are not refcounted at all anymore, this should not be an issue in pratice since the are supposed to get deleted after doversion anyway. * Refcounting happens after `do_versions_after_linking`, i.e those functions won't get valid ID usercounts currently. Again, this is not a problem in current code, if needed we could recompute refcount before, and then ensure `do_versions_after_linoiing()` actually handles properly usercount, which it does not currently. Differential Revision: https://developer.blender.org/D6881
-rw-r--r--source/blender/blenkernel/intern/blendfile.c2
-rw-r--r--source/blender/blenloader/intern/readfile.c243
-rw-r--r--source/blender/blenloader/intern/versioning_legacy.c3
3 files changed, 119 insertions, 129 deletions
diff --git a/source/blender/blenkernel/intern/blendfile.c b/source/blender/blenkernel/intern/blendfile.c
index d1188bdb220..efab2039dc3 100644
--- a/source/blender/blenkernel/intern/blendfile.c
+++ b/source/blender/blenkernel/intern/blendfile.c
@@ -372,7 +372,7 @@ static void setup_app_data(bContext *C,
* lib_link on local IDs using linked ones.
* There is no real way to predict amount of changes here, so we have to fully redo
* refcounting . */
- BKE_main_id_refcount_recompute(bmain, true);
+ BKE_main_id_refcount_recompute(bmain, false);
}
}
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 51e8f080b15..2d87d9f12ff 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -1791,31 +1791,6 @@ void *blo_do_versions_newlibadr(FileData *fd, const void *lib, const void *adr)
}
/* increases user number */
-static void *newlibadr_us(FileData *fd, const void *lib, const void *adr)
-{
- ID *id = newlibadr(fd, lib, adr);
-
- id_us_plus_no_lib(id);
-
- return id;
-}
-
-/* increases user number */
-void *blo_do_versions_newlibadr_us(FileData *fd, const void *lib, const void *adr)
-{
- return newlibadr_us(fd, lib, adr);
-}
-
-/* ensures real user */
-static void *newlibadr_real_us(FileData *fd, const void *lib, const void *adr)
-{
- ID *id = newlibadr(fd, lib, adr);
-
- id_us_ensure_real(id);
-
- return id;
-}
-
static void change_link_placeholder_to_real_ID_pointer_fd(FileData *fd, const void *old, void *new)
{
for (int i = 0; i < fd->libmap->nentries; i++) {
@@ -2558,7 +2533,7 @@ static void IDP_LibLinkProperty(IDProperty *prop, FileData *fd)
switch (prop->type) {
case IDP_ID: /* PointerProperty */
{
- void *newaddr = newlibadr_us(fd, NULL, IDP_Id(prop));
+ void *newaddr = newlibadr(fd, NULL, IDP_Id(prop));
if (IDP_Id(prop) && !newaddr && G.debug) {
printf("Error while loading \"%s\". Data not found in file!\n", prop->name);
}
@@ -2650,8 +2625,8 @@ static void lib_link_id(FileData *fd, Main *bmain, ID *id)
}
if (id->override_library) {
- id->override_library->reference = newlibadr_us(fd, id->lib, id->override_library->reference);
- id->override_library->storage = newlibadr_us(fd, id->lib, id->override_library->storage);
+ id->override_library->reference = newlibadr(fd, id->lib, id->override_library->reference);
+ id->override_library->storage = newlibadr(fd, id->lib, id->override_library->storage);
}
lib_link_id_private_id(fd, bmain, id);
@@ -2785,16 +2760,16 @@ static void direct_link_curveprofile(FileData *fd, CurveProfile *profile)
static void lib_link_brush(FileData *fd, Main *UNUSED(bmain), Brush *brush)
{
/* brush->(mask_)mtex.obj is ignored on purpose? */
- brush->mtex.tex = newlibadr_us(fd, brush->id.lib, brush->mtex.tex);
- brush->mask_mtex.tex = newlibadr_us(fd, brush->id.lib, brush->mask_mtex.tex);
+ brush->mtex.tex = newlibadr(fd, brush->id.lib, brush->mtex.tex);
+ brush->mask_mtex.tex = newlibadr(fd, brush->id.lib, brush->mask_mtex.tex);
brush->clone.image = newlibadr(fd, brush->id.lib, brush->clone.image);
brush->toggle_brush = newlibadr(fd, brush->id.lib, brush->toggle_brush);
- brush->paint_curve = newlibadr_us(fd, brush->id.lib, brush->paint_curve);
+ brush->paint_curve = newlibadr(fd, brush->id.lib, brush->paint_curve);
/* link default grease pencil palette */
if (brush->gpencil_settings != NULL) {
if (brush->gpencil_settings->flag & GP_BRUSH_MATERIAL_PINNED) {
- brush->gpencil_settings->material = newlibadr_us(
+ brush->gpencil_settings->material = newlibadr(
fd, brush->id.lib, brush->gpencil_settings->material);
if (!brush->gpencil_settings->material) {
@@ -2936,7 +2911,7 @@ static void lib_link_nlastrips(FileData *fd, ID *id, ListBase *striplist)
for (strip = striplist->first; strip; strip = strip->next) {
strip->object = newlibadr(fd, id->lib, strip->object);
- strip->act = newlibadr_us(fd, id->lib, strip->act);
+ strip->act = newlibadr(fd, id->lib, strip->act);
strip->ipo = newlibadr(fd, id->lib, strip->ipo);
for (amod = strip->modifiers.first; amod; amod = amod->next) {
amod->ob = newlibadr(fd, id->lib, amod->ob);
@@ -2962,7 +2937,7 @@ static void lib_link_constraint_channels(FileData *fd, ID *id, ListBase *chanbas
bConstraintChannel *chan;
for (chan = chanbase->first; chan; chan = chan->next) {
- chan->ipo = newlibadr_us(fd, id->lib, chan->ipo);
+ chan->ipo = newlibadr(fd, id->lib, chan->ipo);
}
}
@@ -3129,7 +3104,7 @@ static void lib_link_action(FileData *fd, Main *UNUSED(bmain), bAction *act)
{
// XXX deprecated - old animation system <<<
for (bActionChannel *chan = act->chanbase.first; chan; chan = chan->next) {
- chan->ipo = newlibadr_us(fd, act->id.lib, chan->ipo);
+ chan->ipo = newlibadr(fd, act->id.lib, chan->ipo);
lib_link_constraint_channels(fd, &act->id, &chan->constraintChannels);
}
// >>> XXX deprecated - old animation system
@@ -3181,7 +3156,7 @@ static void lib_link_nladata_strips(FileData *fd, ID *id, ListBase *list)
lib_link_fcurves(fd, id, &strip->fcurves);
/* reassign the counted-reference to action */
- strip->act = newlibadr_us(fd, id->lib, strip->act);
+ strip->act = newlibadr(fd, id->lib, strip->act);
/* fix action id-root (i.e. if it comes from a pre 2.57 .blend file) */
if ((strip->act) && (strip->act->idroot == 0)) {
@@ -3278,8 +3253,8 @@ static void lib_link_animdata(FileData *fd, ID *id, AnimData *adt)
}
/* link action data */
- adt->action = newlibadr_us(fd, id->lib, adt->action);
- adt->tmpact = newlibadr_us(fd, id->lib, adt->tmpact);
+ adt->action = newlibadr(fd, id->lib, adt->action);
+ adt->tmpact = newlibadr(fd, id->lib, adt->tmpact);
/* fix action id-roots (i.e. if they come from a pre 2.57 .blend file) */
if ((adt->action) && (adt->action->idroot == 0)) {
@@ -3365,7 +3340,7 @@ static void lib_link_workspaces(FileData *fd, Main *bmain, WorkSpace *workspace)
id_us_ensure_real(id);
for (WorkSpaceLayout *layout = layouts->first, *layout_next; layout; layout = layout_next) {
- layout->screen = newlibadr_us(fd, id->lib, layout->screen);
+ layout->screen = newlibadr(fd, id->lib, layout->screen);
layout_next = layout->next;
if (layout->screen) {
@@ -3439,14 +3414,14 @@ static void lib_link_ntree(FileData *fd, Library *lib, bNodeTree *ntree)
{
ntree->id.lib = lib;
- ntree->gpd = newlibadr_us(fd, lib, ntree->gpd);
+ ntree->gpd = newlibadr(fd, lib, ntree->gpd);
for (bNode *node = ntree->nodes.first; node; node = node->next) {
/* Link ID Properties -- and copy this comment EXACTLY for easy finding
* of library blocks that implement this.*/
IDP_LibLinkProperty(node->prop, fd);
- node->id = newlibadr_us(fd, lib, node->id);
+ node->id = newlibadr(fd, lib, node->id);
for (bNodeSocket *sock = node->inputs.first; sock; sock = sock->next) {
IDP_LibLinkProperty(sock->prop, fd);
@@ -3681,7 +3656,7 @@ static void lib_link_constraint_cb(bConstraint *UNUSED(con),
/* for reference types, we need to increment the usercounts on load... */
if (is_reference) {
/* reference type - with usercount */
- *idpoin = newlibadr_us(cld->fd, cld->id->lib, *idpoin);
+ *idpoin = newlibadr(cld->fd, cld->id->lib, *idpoin);
}
else {
/* target type - no usercount needed */
@@ -3702,7 +3677,7 @@ static void lib_link_constraints(FileData *fd, ID *id, ListBase *conlist)
con->type = CONSTRAINT_TYPE_NULL;
}
/* own ipo, all constraints have it */
- con->ipo = newlibadr_us(fd, id->lib, con->ipo); // XXX deprecated - old animation system
+ con->ipo = newlibadr(fd, id->lib, con->ipo); // XXX deprecated - old animation system
/* If linking from a library, clear 'local' library override flag. */
if (id->lib != NULL) {
@@ -3813,7 +3788,7 @@ static void lib_link_pose(FileData *fd, Main *bmain, Object *ob, bPose *pose)
IDP_LibLinkProperty(pchan->prop, fd);
- pchan->custom = newlibadr_us(fd, arm->id.lib, pchan->custom);
+ pchan->custom = newlibadr(fd, arm->id.lib, pchan->custom);
if (UNLIKELY(pchan->bone == NULL)) {
rebuild = true;
}
@@ -3898,14 +3873,14 @@ static void direct_link_armature(FileData *fd, bArmature *arm)
static void lib_link_camera(FileData *fd, Main *UNUSED(bmain), Camera *ca)
{
- ca->ipo = newlibadr_us(fd, ca->id.lib, ca->ipo); /* deprecated, for versioning */
+ ca->ipo = newlibadr(fd, ca->id.lib, ca->ipo); /* deprecated, for versioning */
ca->dof_ob = newlibadr(fd, ca->id.lib, ca->dof_ob); /* deprecated, for versioning */
ca->dof.focus_object = newlibadr(fd, ca->id.lib, ca->dof.focus_object);
for (CameraBGImage *bgpic = ca->bg_images.first; bgpic; bgpic = bgpic->next) {
- bgpic->ima = newlibadr_us(fd, ca->id.lib, bgpic->ima);
- bgpic->clip = newlibadr_us(fd, ca->id.lib, bgpic->clip);
+ bgpic->ima = newlibadr(fd, ca->id.lib, bgpic->ima);
+ bgpic->clip = newlibadr(fd, ca->id.lib, bgpic->clip);
}
}
@@ -3930,7 +3905,7 @@ static void direct_link_camera(FileData *fd, Camera *ca)
static void lib_link_light(FileData *fd, Main *UNUSED(bmain), Light *la)
{
- la->ipo = newlibadr_us(fd, la->id.lib, la->ipo); // XXX deprecated - old animation system
+ la->ipo = newlibadr(fd, la->id.lib, la->ipo); // XXX deprecated - old animation system
}
static void direct_link_light(FileData *fd, Light *la)
@@ -3966,7 +3941,7 @@ static void lib_link_key(FileData *fd, Main *UNUSED(bmain), Key *key)
{
BLI_assert((key->id.tag & LIB_TAG_EXTERN) == 0);
- key->ipo = newlibadr_us(fd, key->id.lib, key->ipo); // XXX deprecated - old animation system
+ key->ipo = newlibadr(fd, key->id.lib, key->ipo); // XXX deprecated - old animation system
key->from = newlibadr(fd, key->id.lib, key->from);
}
@@ -4028,10 +4003,10 @@ static void direct_link_key(FileData *fd, Key *key)
static void lib_link_mball(FileData *fd, Main *UNUSED(bmain), MetaBall *mb)
{
for (int a = 0; a < mb->totcol; a++) {
- mb->mat[a] = newlibadr_us(fd, mb->id.lib, mb->mat[a]);
+ mb->mat[a] = newlibadr(fd, mb->id.lib, mb->mat[a]);
}
- mb->ipo = newlibadr_us(fd, mb->id.lib, mb->ipo); // XXX deprecated - old animation system
+ mb->ipo = newlibadr(fd, mb->id.lib, mb->ipo); // XXX deprecated - old animation system
}
static void direct_link_mball(FileData *fd, MetaBall *mb)
@@ -4061,7 +4036,7 @@ static void direct_link_mball(FileData *fd, MetaBall *mb)
static void lib_link_world(FileData *fd, Main *UNUSED(bmain), World *wrld)
{
- wrld->ipo = newlibadr_us(fd, wrld->id.lib, wrld->ipo); // XXX deprecated - old animation system
+ wrld->ipo = newlibadr(fd, wrld->id.lib, wrld->ipo); // XXX deprecated - old animation system
}
static void direct_link_world(FileData *fd, World *wrld)
@@ -4219,19 +4194,19 @@ static void direct_link_image(FileData *fd, Image *ima)
static void lib_link_curve(FileData *fd, Main *UNUSED(bmain), Curve *cu)
{
for (int a = 0; a < cu->totcol; a++) {
- cu->mat[a] = newlibadr_us(fd, cu->id.lib, cu->mat[a]);
+ cu->mat[a] = newlibadr(fd, cu->id.lib, cu->mat[a]);
}
cu->bevobj = newlibadr(fd, cu->id.lib, cu->bevobj);
cu->taperobj = newlibadr(fd, cu->id.lib, cu->taperobj);
cu->textoncurve = newlibadr(fd, cu->id.lib, cu->textoncurve);
- cu->vfont = newlibadr_us(fd, cu->id.lib, cu->vfont);
- cu->vfontb = newlibadr_us(fd, cu->id.lib, cu->vfontb);
- cu->vfonti = newlibadr_us(fd, cu->id.lib, cu->vfonti);
- cu->vfontbi = newlibadr_us(fd, cu->id.lib, cu->vfontbi);
+ cu->vfont = newlibadr(fd, cu->id.lib, cu->vfont);
+ cu->vfontb = newlibadr(fd, cu->id.lib, cu->vfontb);
+ cu->vfonti = newlibadr(fd, cu->id.lib, cu->vfonti);
+ cu->vfontbi = newlibadr(fd, cu->id.lib, cu->vfontbi);
- cu->ipo = newlibadr_us(fd, cu->id.lib, cu->ipo); // XXX deprecated - old animation system
- cu->key = newlibadr_us(fd, cu->id.lib, cu->key);
+ cu->ipo = newlibadr(fd, cu->id.lib, cu->ipo); // XXX deprecated - old animation system
+ cu->key = newlibadr(fd, cu->id.lib, cu->key);
}
static void switch_endian_knots(Nurb *nu)
@@ -4312,8 +4287,8 @@ static void direct_link_curve(FileData *fd, Curve *cu)
static void lib_link_texture(FileData *fd, Main *UNUSED(bmain), Tex *tex)
{
- tex->ima = newlibadr_us(fd, tex->id.lib, tex->ima);
- tex->ipo = newlibadr_us(fd, tex->id.lib, tex->ipo); // XXX deprecated - old animation system
+ tex->ima = newlibadr(fd, tex->id.lib, tex->ima);
+ tex->ipo = newlibadr(fd, tex->id.lib, tex->ipo); // XXX deprecated - old animation system
}
static void direct_link_texture(FileData *fd, Tex *tex)
@@ -4337,16 +4312,16 @@ static void direct_link_texture(FileData *fd, Tex *tex)
static void lib_link_material(FileData *fd, Main *UNUSED(bmain), Material *ma)
{
- ma->ipo = newlibadr_us(fd, ma->id.lib, ma->ipo); // XXX deprecated - old animation system
+ ma->ipo = newlibadr(fd, ma->id.lib, ma->ipo); // XXX deprecated - old animation system
/* relink grease pencil settings */
if (ma->gp_style != NULL) {
MaterialGPencilStyle *gp_style = ma->gp_style;
if (gp_style->sima != NULL) {
- gp_style->sima = newlibadr_us(fd, ma->id.lib, gp_style->sima);
+ gp_style->sima = newlibadr(fd, ma->id.lib, gp_style->sima);
}
if (gp_style->ima != NULL) {
- gp_style->ima = newlibadr_us(fd, ma->id.lib, gp_style->ima);
+ gp_style->ima = newlibadr(fd, ma->id.lib, gp_style->ima);
}
}
}
@@ -4459,7 +4434,7 @@ static void direct_link_pointcache_list(FileData *fd,
static void lib_link_partdeflect(FileData *fd, ID *id, PartDeflect *pd)
{
if (pd && pd->tex) {
- pd->tex = newlibadr_us(fd, id->lib, pd->tex);
+ pd->tex = newlibadr(fd, id->lib, pd->tex);
}
if (pd && pd->f_source) {
pd->f_source = newlibadr(fd, id->lib, pd->f_source);
@@ -4468,10 +4443,10 @@ static void lib_link_partdeflect(FileData *fd, ID *id, PartDeflect *pd)
static void lib_link_particlesettings(FileData *fd, Main *UNUSED(bmain), ParticleSettings *part)
{
- part->ipo = newlibadr_us(fd, part->id.lib, part->ipo); // XXX deprecated - old animation system
+ part->ipo = newlibadr(fd, part->id.lib, part->ipo); // XXX deprecated - old animation system
part->instance_object = newlibadr(fd, part->id.lib, part->instance_object);
- part->instance_collection = newlibadr_us(fd, part->id.lib, part->instance_collection);
+ part->instance_collection = newlibadr(fd, part->id.lib, part->instance_collection);
part->force_group = newlibadr(fd, part->id.lib, part->force_group);
part->bb_ob = newlibadr(fd, part->id.lib, part->bb_ob);
part->collision_group = newlibadr(fd, part->id.lib, part->collision_group);
@@ -4521,7 +4496,7 @@ static void lib_link_particlesettings(FileData *fd, Main *UNUSED(bmain), Particl
for (int a = 0; a < MAX_MTEX; a++) {
MTex *mtex = part->mtex[a];
if (mtex) {
- mtex->tex = newlibadr_us(fd, part->id.lib, mtex->tex);
+ mtex->tex = newlibadr(fd, part->id.lib, mtex->tex);
mtex->object = newlibadr(fd, part->id.lib, mtex->object);
}
}
@@ -4594,7 +4569,7 @@ static void lib_link_particlesystems(FileData *fd, Object *ob, ID *id, ListBase
for (psys = particles->first; psys; psys = psysnext) {
psysnext = psys->next;
- psys->part = newlibadr_us(fd, id->lib, psys->part);
+ psys->part = newlibadr(fd, id->lib, psys->part);
if (psys->part) {
ParticleTarget *pt = psys->targets.first;
@@ -4726,16 +4701,16 @@ static void lib_link_mesh(FileData *fd, Main *UNUSED(bmain), Mesh *me)
/* this check added for python created meshes */
if (me->mat) {
for (int i = 0; i < me->totcol; i++) {
- me->mat[i] = newlibadr_us(fd, me->id.lib, me->mat[i]);
+ me->mat[i] = newlibadr(fd, me->id.lib, me->mat[i]);
}
}
else {
me->totcol = 0;
}
- me->ipo = newlibadr_us(fd, me->id.lib, me->ipo); // XXX: deprecated: old anim sys
- me->key = newlibadr_us(fd, me->id.lib, me->key);
- me->texcomesh = newlibadr_us(fd, me->id.lib, me->texcomesh);
+ me->ipo = newlibadr(fd, me->id.lib, me->ipo); // XXX: deprecated: old anim sys
+ me->key = newlibadr(fd, me->id.lib, me->key);
+ me->texcomesh = newlibadr(fd, me->id.lib, me->texcomesh);
}
static void direct_link_dverts(FileData *fd, int count, MDeformVert *mdverts)
@@ -4951,8 +4926,8 @@ static void direct_link_mesh(FileData *fd, Mesh *mesh)
static void lib_link_latt(FileData *fd, Main *UNUSED(bmain), Lattice *lt)
{
- lt->ipo = newlibadr_us(fd, lt->id.lib, lt->ipo); // XXX deprecated - old animation system
- lt->key = newlibadr_us(fd, lt->id.lib, lt->key);
+ lt->ipo = newlibadr(fd, lt->id.lib, lt->ipo); // XXX deprecated - old animation system
+ lt->key = newlibadr(fd, lt->id.lib, lt->key);
}
static void direct_link_latt(FileData *fd, Lattice *lt)
@@ -5028,17 +5003,17 @@ static void lib_link_object(FileData *fd, Main *bmain, Object *ob)
int a;
// XXX deprecated - old animation system <<<
- ob->ipo = newlibadr_us(fd, ob->id.lib, ob->ipo);
- ob->action = newlibadr_us(fd, ob->id.lib, ob->action);
+ ob->ipo = newlibadr(fd, ob->id.lib, ob->ipo);
+ ob->action = newlibadr(fd, ob->id.lib, ob->action);
// >>> XXX deprecated - old animation system
ob->parent = newlibadr(fd, ob->id.lib, ob->parent);
ob->track = newlibadr(fd, ob->id.lib, ob->track);
- ob->poselib = newlibadr_us(fd, ob->id.lib, ob->poselib);
+ ob->poselib = newlibadr(fd, ob->id.lib, ob->poselib);
/* 2.8x drops support for non-empty dupli instances. */
if (ob->type == OB_EMPTY) {
- ob->instance_collection = newlibadr_us(fd, ob->id.lib, ob->instance_collection);
+ ob->instance_collection = newlibadr(fd, ob->id.lib, ob->instance_collection);
}
else {
if (ob->instance_collection != NULL) {
@@ -5054,7 +5029,7 @@ static void lib_link_object(FileData *fd, Main *bmain, Object *ob)
ob->transflag &= ~OB_DUPLICOLLECTION;
}
- ob->proxy = newlibadr_us(fd, ob->id.lib, ob->proxy);
+ ob->proxy = newlibadr(fd, ob->id.lib, ob->proxy);
if (ob->proxy) {
/* paranoia check, actually a proxy_from pointer should never be written... */
if (ob->proxy->id.lib == NULL) {
@@ -5076,7 +5051,7 @@ static void lib_link_object(FileData *fd, Main *bmain, Object *ob)
ob->proxy_group = newlibadr(fd, ob->id.lib, ob->proxy_group);
void *poin = ob->data;
- ob->data = newlibadr_us(fd, ob->id.lib, ob->data);
+ ob->data = newlibadr(fd, ob->id.lib, ob->data);
if (ob->data == NULL && poin != NULL) {
if (ob->id.lib) {
@@ -5105,7 +5080,7 @@ static void lib_link_object(FileData *fd, Main *bmain, Object *ob)
}
}
for (a = 0; a < ob->totcol; a++) {
- ob->mat[a] = newlibadr_us(fd, ob->id.lib, ob->mat[a]);
+ ob->mat[a] = newlibadr(fd, ob->id.lib, ob->mat[a]);
}
/* When the object is local and the data is library its possible
@@ -5119,7 +5094,7 @@ static void lib_link_object(FileData *fd, Main *bmain, Object *ob)
}
}
- ob->gpd = newlibadr_us(fd, ob->id.lib, ob->gpd);
+ ob->gpd = newlibadr(fd, ob->id.lib, ob->gpd);
/* if id.us==0 a new base will be created later on */
@@ -5134,7 +5109,7 @@ static void lib_link_object(FileData *fd, Main *bmain, Object *ob)
for (PartEff *paf = ob->effect.first; paf; paf = paf->next) {
if (paf->type == EFF_PARTICLE) {
- paf->group = newlibadr_us(fd, ob->id.lib, paf->group);
+ paf->group = newlibadr(fd, ob->id.lib, paf->group);
}
}
@@ -5143,7 +5118,7 @@ static void lib_link_object(FileData *fd, Main *bmain, Object *ob)
ob, eModifierType_Fluidsim);
if (fluidmd && fluidmd->fss) {
- fluidmd->fss->ipo = newlibadr_us(
+ fluidmd->fss->ipo = newlibadr(
fd, ob->id.lib, fluidmd->fss->ipo); // XXX deprecated - old animation system
}
}
@@ -6093,8 +6068,8 @@ static void lib_link_view_layer(FileData *fd, Library *lib, ViewLayer *view_laye
}
for (FreestyleLineSet *fls = view_layer->freestyle_config.linesets.first; fls; fls = fls->next) {
- fls->linestyle = newlibadr_us(fd, lib, fls->linestyle);
- fls->group = newlibadr_us(fd, lib, fls->group);
+ fls->linestyle = newlibadr(fd, lib, fls->linestyle);
+ fls->group = newlibadr(fd, lib, fls->group);
}
for (Base *base = view_layer->object_bases.first, *base_next = NULL; base; base = base_next) {
@@ -6118,7 +6093,7 @@ static void lib_link_view_layer(FileData *fd, Library *lib, ViewLayer *view_laye
lib_link_layer_collection(fd, lib, layer_collection, true);
}
- view_layer->mat_override = newlibadr_us(fd, lib, view_layer->mat_override);
+ view_layer->mat_override = newlibadr(fd, lib, view_layer->mat_override);
IDP_LibLinkProperty(view_layer->id_properties, fd);
}
@@ -6143,7 +6118,7 @@ static void direct_link_scene_collection(FileData *fd, SceneCollection *sc)
static void lib_link_scene_collection(FileData *fd, Library *lib, SceneCollection *sc)
{
for (LinkData *link = sc->objects.first; link; link = link->next) {
- link->data = newlibadr_us(fd, lib, link->data);
+ link->data = newlibadr(fd, lib, link->data);
BLI_assert(link->data);
}
@@ -6183,7 +6158,7 @@ static void lib_link_collection_data(FileData *fd, Library *lib, Collection *col
{
for (CollectionObject *cob = collection->gobject.first, *cob_next = NULL; cob; cob = cob_next) {
cob_next = cob->next;
- cob->ob = newlibadr_us(fd, lib, cob->ob);
+ cob->ob = newlibadr(fd, lib, cob->ob);
if (cob->ob == NULL) {
BLI_freelinkN(&collection->gobject, cob);
@@ -6191,7 +6166,7 @@ static void lib_link_collection_data(FileData *fd, Library *lib, Collection *col
}
for (CollectionChild *child = collection->children.first; child != NULL; child = child->next) {
- child->collection = newlibadr_us(fd, lib, child->collection);
+ child->collection = newlibadr(fd, lib, child->collection);
}
BKE_collection_parent_relations_rebuild(collection);
@@ -6233,13 +6208,13 @@ static void composite_patch(bNodeTree *ntree, Scene *scene)
static void link_paint(FileData *fd, Scene *sce, Paint *p)
{
if (p) {
- p->brush = newlibadr_us(fd, sce->id.lib, p->brush);
+ p->brush = newlibadr(fd, sce->id.lib, p->brush);
for (int i = 0; i < p->tool_slots_len; i++) {
if (p->tool_slots[i].brush != NULL) {
- p->tool_slots[i].brush = newlibadr_us(fd, sce->id.lib, p->tool_slots[i].brush);
+ p->tool_slots[i].brush = newlibadr(fd, sce->id.lib, p->tool_slots[i].brush);
}
}
- p->palette = newlibadr_us(fd, sce->id.lib, p->palette);
+ p->palette = newlibadr(fd, sce->id.lib, p->palette);
p->paint_cursor = NULL;
BKE_paint_runtime_init(sce->toolsettings, p);
@@ -6252,7 +6227,7 @@ static void lib_link_sequence_modifiers(FileData *fd, Scene *scene, ListBase *lb
for (smd = lb->first; smd; smd = smd->next) {
if (smd->mask_id) {
- smd->mask_id = newlibadr_us(fd, scene->id.lib, smd->mask_id);
+ smd->mask_id = newlibadr(fd, scene->id.lib, smd->mask_id);
}
}
}
@@ -6338,9 +6313,9 @@ static void lib_link_scene(FileData *fd, Main *UNUSED(bmain), Scene *sce)
lib_link_keyingsets(fd, &sce->id, &sce->keyingsets);
sce->camera = newlibadr(fd, sce->id.lib, sce->camera);
- sce->world = newlibadr_us(fd, sce->id.lib, sce->world);
+ sce->world = newlibadr(fd, sce->id.lib, sce->world);
sce->set = newlibadr(fd, sce->id.lib, sce->set);
- sce->gpd = newlibadr_us(fd, sce->id.lib, sce->gpd);
+ sce->gpd = newlibadr(fd, sce->id.lib, sce->gpd);
link_paint(fd, sce, &sce->toolsettings->imapaint.paint);
if (sce->toolsettings->sculpt) {
@@ -6365,17 +6340,17 @@ static void lib_link_scene(FileData *fd, Main *UNUSED(bmain), Scene *sce)
}
if (sce->toolsettings->imapaint.stencil) {
- sce->toolsettings->imapaint.stencil = newlibadr_us(
+ sce->toolsettings->imapaint.stencil = newlibadr(
fd, sce->id.lib, sce->toolsettings->imapaint.stencil);
}
if (sce->toolsettings->imapaint.clone) {
- sce->toolsettings->imapaint.clone = newlibadr_us(
+ sce->toolsettings->imapaint.clone = newlibadr(
fd, sce->id.lib, sce->toolsettings->imapaint.clone);
}
if (sce->toolsettings->imapaint.canvas) {
- sce->toolsettings->imapaint.canvas = newlibadr_us(
+ sce->toolsettings->imapaint.canvas = newlibadr(
fd, sce->id.lib, sce->toolsettings->imapaint.canvas);
}
@@ -6389,7 +6364,7 @@ static void lib_link_scene(FileData *fd, Main *UNUSED(bmain), Scene *sce)
base_legacy = base_legacy_next) {
base_legacy_next = base_legacy->next;
- base_legacy->object = newlibadr_us(fd, sce->id.lib, base_legacy->object);
+ base_legacy->object = newlibadr(fd, sce->id.lib, base_legacy->object);
if (base_legacy->object == NULL) {
blo_reportf_wrap(
@@ -6407,7 +6382,7 @@ static void lib_link_scene(FileData *fd, Main *UNUSED(bmain), Scene *sce)
IDP_LibLinkProperty(seq->prop, fd);
if (seq->ipo) {
- seq->ipo = newlibadr_us(fd, sce->id.lib, seq->ipo); // XXX deprecated - old animation system
+ seq->ipo = newlibadr(fd, sce->id.lib, seq->ipo); // XXX deprecated - old animation system
}
seq->scene_sound = NULL;
if (seq->scene) {
@@ -6415,10 +6390,10 @@ static void lib_link_scene(FileData *fd, Main *UNUSED(bmain), Scene *sce)
seq->scene_sound = NULL;
}
if (seq->clip) {
- seq->clip = newlibadr_us(fd, sce->id.lib, seq->clip);
+ seq->clip = newlibadr(fd, sce->id.lib, seq->clip);
}
if (seq->mask) {
- seq->mask = newlibadr_us(fd, sce->id.lib, seq->mask);
+ seq->mask = newlibadr(fd, sce->id.lib, seq->mask);
}
if (seq->scene_camera) {
seq->scene_camera = newlibadr(fd, sce->id.lib, seq->scene_camera);
@@ -6438,7 +6413,7 @@ static void lib_link_scene(FileData *fd, Main *UNUSED(bmain), Scene *sce)
}
if (seq->type == SEQ_TYPE_TEXT) {
TextVars *t = seq->effectdata;
- t->text_font = newlibadr_us(fd, sce->id.lib, t->text_font);
+ t->text_font = newlibadr(fd, sce->id.lib, t->text_font);
}
BLI_listbase_clear(&seq->anims);
@@ -6471,17 +6446,17 @@ static void lib_link_scene(FileData *fd, Main *UNUSED(bmain), Scene *sce)
}
for (SceneRenderLayer *srl = sce->r.layers.first; srl; srl = srl->next) {
- srl->mat_override = newlibadr_us(fd, sce->id.lib, srl->mat_override);
+ srl->mat_override = newlibadr(fd, sce->id.lib, srl->mat_override);
for (FreestyleModuleConfig *fmc = srl->freestyleConfig.modules.first; fmc; fmc = fmc->next) {
fmc->script = newlibadr(fd, sce->id.lib, fmc->script);
}
for (FreestyleLineSet *fls = srl->freestyleConfig.linesets.first; fls; fls = fls->next) {
- fls->linestyle = newlibadr_us(fd, sce->id.lib, fls->linestyle);
- fls->group = newlibadr_us(fd, sce->id.lib, fls->group);
+ fls->linestyle = newlibadr(fd, sce->id.lib, fls->linestyle);
+ fls->group = newlibadr(fd, sce->id.lib, fls->group);
}
}
/* Motion Tracking */
- sce->clip = newlibadr_us(fd, sce->id.lib, sce->clip);
+ sce->clip = newlibadr(fd, sce->id.lib, sce->clip);
#ifdef USE_COLLECTION_COMPAT_28
if (sce->collection) {
@@ -6920,7 +6895,7 @@ static void lib_link_gpencil(FileData *fd, Main *UNUSED(bmain), bGPdata *gpd)
/* materials */
for (int a = 0; a < gpd->totcol; a++) {
- gpd->mat[a] = newlibadr_us(fd, gpd->id.lib, gpd->mat[a]);
+ gpd->mat[a] = newlibadr(fd, gpd->id.lib, gpd->mat[a]);
}
}
@@ -7381,13 +7356,13 @@ static void lib_link_area(FileData *fd, ID *parent_id, ScrArea *area)
case SPACE_IMAGE: {
SpaceImage *sima = (SpaceImage *)sl;
- sima->image = newlibadr_real_us(fd, parent_id->lib, sima->image);
- sima->mask_info.mask = newlibadr_real_us(fd, parent_id->lib, sima->mask_info.mask);
+ sima->image = newlibadr(fd, parent_id->lib, sima->image);
+ sima->mask_info.mask = newlibadr(fd, parent_id->lib, sima->mask_info.mask);
/* NOTE: pre-2.5, this was local data not lib data, but now we need this as lib data
* so fingers crossed this works fine!
*/
- sima->gpd = newlibadr_us(fd, parent_id->lib, sima->gpd);
+ sima->gpd = newlibadr(fd, parent_id->lib, sima->gpd);
break;
}
case SPACE_SEQ: {
@@ -7396,7 +7371,7 @@ static void lib_link_area(FileData *fd, ID *parent_id, ScrArea *area)
/* NOTE: pre-2.5, this was local data not lib data, but now we need this as lib data
* so fingers crossed this works fine!
*/
- sseq->gpd = newlibadr_us(fd, parent_id->lib, sseq->gpd);
+ sseq->gpd = newlibadr(fd, parent_id->lib, sseq->gpd);
break;
}
case SPACE_NLA: {
@@ -7455,7 +7430,7 @@ static void lib_link_area(FileData *fd, ID *parent_id, ScrArea *area)
snode->from = newlibadr(fd, parent_id->lib, snode->from);
ntree = snode->id ? ntreeFromID(snode->id) : NULL;
- snode->nodetree = ntree ? ntree : newlibadr_us(fd, parent_id->lib, snode->nodetree);
+ snode->nodetree = ntree ? ntree : newlibadr(fd, parent_id->lib, snode->nodetree);
for (path = snode->treepath.first; path; path = path->next) {
if (path == snode->treepath.first) {
@@ -7463,7 +7438,7 @@ static void lib_link_area(FileData *fd, ID *parent_id, ScrArea *area)
path->nodetree = snode->nodetree;
}
else {
- path->nodetree = newlibadr_us(fd, parent_id->lib, path->nodetree);
+ path->nodetree = newlibadr(fd, parent_id->lib, path->nodetree);
}
if (!path->nodetree) {
@@ -7492,8 +7467,8 @@ static void lib_link_area(FileData *fd, ID *parent_id, ScrArea *area)
}
case SPACE_CLIP: {
SpaceClip *sclip = (SpaceClip *)sl;
- sclip->clip = newlibadr_real_us(fd, parent_id->lib, sclip->clip);
- sclip->mask_info.mask = newlibadr_real_us(fd, parent_id->lib, sclip->mask_info.mask);
+ sclip->clip = newlibadr(fd, parent_id->lib, sclip->clip);
+ sclip->mask_info.mask = newlibadr(fd, parent_id->lib, sclip->mask_info.mask);
break;
}
default:
@@ -8290,7 +8265,7 @@ static void direct_link_lightprobe(FileData *fd, LightProbe *prb)
static void lib_link_speaker(FileData *fd, Main *UNUSED(bmain), Speaker *spk)
{
- spk->sound = newlibadr_us(fd, spk->id.lib, spk->sound);
+ spk->sound = newlibadr(fd, spk->id.lib, spk->sound);
}
static void direct_link_speaker(FileData *fd, Speaker *spk)
@@ -8342,8 +8317,7 @@ static void direct_link_sound(FileData *fd, bSound *sound)
static void lib_link_sound(FileData *fd, Main *UNUSED(bmain), bSound *sound)
{
- sound->ipo = newlibadr_us(
- fd, sound->id.lib, sound->ipo); // XXX deprecated - old animation system
+ sound->ipo = newlibadr(fd, sound->id.lib, sound->ipo); // XXX deprecated - old animation system
}
/** \} */
@@ -8441,7 +8415,7 @@ static void lib_link_movieTracks(FileData *fd, MovieClip *clip, ListBase *tracks
MovieTrackingTrack *track;
for (track = tracksbase->first; track; track = track->next) {
- track->gpd = newlibadr_us(fd, clip->id.lib, track->gpd);
+ track->gpd = newlibadr(fd, clip->id.lib, track->gpd);
}
}
@@ -8450,7 +8424,7 @@ static void lib_link_moviePlaneTracks(FileData *fd, MovieClip *clip, ListBase *t
MovieTrackingPlaneTrack *plane_track;
for (plane_track = tracksbase->first; plane_track; plane_track = plane_track->next) {
- plane_track->image = newlibadr_us(fd, clip->id.lib, plane_track->image);
+ plane_track->image = newlibadr(fd, clip->id.lib, plane_track->image);
}
}
@@ -8458,7 +8432,7 @@ static void lib_link_movieclip(FileData *fd, Main *UNUSED(bmain), MovieClip *cli
{
MovieTracking *tracking = &clip->tracking;
- clip->gpd = newlibadr_us(fd, clip->id.lib, clip->gpd);
+ clip->gpd = newlibadr(fd, clip->id.lib, clip->gpd);
lib_link_movieTracks(fd, clip, &tracking->tracks);
lib_link_moviePlaneTracks(fd, clip, &tracking->plane_tracks);
@@ -8535,7 +8509,7 @@ static void direct_link_mask(FileData *fd, Mask *mask)
static void lib_link_mask_parent(FileData *fd, Mask *mask, MaskParent *parent)
{
- parent->id = newlibadr_us(fd, mask->id.lib, parent->id);
+ parent->id = newlibadr(fd, mask->id.lib, parent->id);
}
static void lib_link_mask(FileData *fd, Main *UNUSED(bmain), Mask *mask)
@@ -8603,7 +8577,7 @@ static void lib_link_linestyle(FileData *fd, Main *UNUSED(bmain), FreestyleLineS
for (int a = 0; a < MAX_MTEX; a++) {
MTex *mtex = linestyle->mtex[a];
if (mtex) {
- mtex->tex = newlibadr_us(fd, linestyle->id.lib, mtex->tex);
+ mtex->tex = newlibadr(fd, linestyle->id.lib, mtex->tex);
mtex->object = newlibadr(fd, linestyle->id.lib, mtex->object);
}
}
@@ -9774,6 +9748,13 @@ BlendFileData *blo_read_file_internal(FileData *fd, const char *filepath)
}
blo_join_main(&mainlist);
+ /* Note that we cannot recompute usercounts at this point in undo case, we play too much with
+ * IDs from different memory realms, and Main database is not in a fully valid state yet.
+ */
+ /* Also, this does not take into account old, deprecated data, so we have to do it after
+ * `do_versions_after_linking()`. */
+ BKE_main_id_refcount_recompute(bfd->main, false);
+
/* After all data has been read and versioned, uses LIB_TAG_NEW. */
ntreeUpdateAllNew(bfd->main);
}
@@ -11482,11 +11463,16 @@ static void library_link_end(Main *mainl,
add_main_to_main(mainvar, main_newid);
}
+
BKE_main_free(main_newid);
blo_join_main((*fd)->mainlist);
mainvar = (*fd)->mainlist->first;
MEM_freeN((*fd)->mainlist);
+ /* This does not take into account old, deprecated data, so we have to do it after
+ * `do_versions_after_linking()`. */
+ BKE_main_id_refcount_recompute(mainvar, false);
+
/* After all data has been read and versioned, uses LIB_TAG_NEW. */
ntreeUpdateAllNew(mainvar);
@@ -11848,6 +11834,11 @@ static void read_libraries(FileData *basefd, ListBase *mainlist)
lib_link_all(mainptr->curlib->filedata, mainptr);
}
+ /* Note: No need to call `do_versions_after_linking()` or `BKE_main_id_refcount_recompute()`
+ * here, as this function is only called for library 'subset' data handling, as part of either
+ * full blendfile reading (`blo_read_file_internal()`), or libdata linking
+ * (`library_link_end()`). */
+
/* Free file data we no longer need. */
if (mainptr->curlib->filedata) {
blo_filedata_free(mainptr->curlib->filedata);
diff --git a/source/blender/blenloader/intern/versioning_legacy.c b/source/blender/blenloader/intern/versioning_legacy.c
index 73cdd40c02c..f2a2ec0b21f 100644
--- a/source/blender/blenloader/intern/versioning_legacy.c
+++ b/source/blender/blenloader/intern/versioning_legacy.c
@@ -2489,8 +2489,7 @@ void blo_do_versions_pre250(FileData *fd, Library *lib, Main *bmain)
MEM_freeN(fluidmd->fss);
fluidmd->fss = MEM_dupallocN(ob->fluidsimSettings);
- fluidmd->fss->ipo = blo_do_versions_newlibadr_us(
- fd, ob->id.lib, ob->fluidsimSettings->ipo);
+ fluidmd->fss->ipo = blo_do_versions_newlibadr(fd, ob->id.lib, ob->fluidsimSettings->ipo);
MEM_freeN(ob->fluidsimSettings);
fluidmd->fss->lastgoodframe = INT_MAX;