Fix broken groupobject usercount handling.

As we can see in (original) read code, ob pointer in groupobject is actually a 'USER_ONE' case.
This was not done in 'add object to group' code, probably because we can assume objects always
have at least one user in that case? Made it explicit now. Also fixed foreach_ID_link looper.

In general we have waaayyyyyy too much 'own handling' of ID->us count in code currently,
will clean up that...
This commit is contained in:
Bastien Montagne 2015-11-09 14:44:53 +01:00
parent ff3cf93405
commit 18ecc8a78f
3 changed files with 9 additions and 7 deletions

View File

@ -182,6 +182,7 @@ static bool group_object_add_internal(Group *group, Object *ob)
BLI_addtail(&group->gobject, go);
go->ob = ob;
id_us_ensure_real(&go->ob->id);
return true;
}

View File

@ -514,7 +514,7 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u
Group *group = (Group *) id;
GroupObject *gob;
for (gob = group->gobject.first; gob; gob = gob->next) {
CALLBACK_INVOKE(gob->ob, IDWALK_NOP);
CALLBACK_INVOKE(gob->ob, IDWALK_USER_ONE);
}
break;
}

View File

@ -7268,25 +7268,26 @@ static void lib_link_group(FileData *fd, Main *main)
{
Group *group;
GroupObject *go;
int add_us;
bool add_us;
for (group = main->group.first; group; group = group->id.next) {
if (group->id.flag & LIB_NEED_LINK) {
group->id.flag -= LIB_NEED_LINK;
add_us = 0;
add_us = false;
for (go = group->gobject.first; go; go = go->next) {
go->ob= newlibadr(fd, group->id.lib, go->ob);
if (go->ob) {
go->ob->flag |= OB_FROMGROUP;
/* if group has an object, it increments user... */
add_us = 1;
if (go->ob->id.us == 0)
go->ob->id.us = 1;
add_us = true;
id_us_ensure_real(&go->ob->id);
}
}
if (add_us) group->id.us++;
if (add_us) {
id_us_ensure_real(&group->id);
}
BKE_group_object_unlink(group, NULL, NULL, NULL); /* removes NULL entries */
}
}