forked from bartvdbraak/blender
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:
parent
ff3cf93405
commit
18ecc8a78f
@ -182,6 +182,7 @@ static bool group_object_add_internal(Group *group, Object *ob)
|
|||||||
BLI_addtail(&group->gobject, go);
|
BLI_addtail(&group->gobject, go);
|
||||||
|
|
||||||
go->ob = ob;
|
go->ob = ob;
|
||||||
|
id_us_ensure_real(&go->ob->id);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -514,7 +514,7 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u
|
|||||||
Group *group = (Group *) id;
|
Group *group = (Group *) id;
|
||||||
GroupObject *gob;
|
GroupObject *gob;
|
||||||
for (gob = group->gobject.first; gob; gob = gob->next) {
|
for (gob = group->gobject.first; gob; gob = gob->next) {
|
||||||
CALLBACK_INVOKE(gob->ob, IDWALK_NOP);
|
CALLBACK_INVOKE(gob->ob, IDWALK_USER_ONE);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -7268,25 +7268,26 @@ static void lib_link_group(FileData *fd, Main *main)
|
|||||||
{
|
{
|
||||||
Group *group;
|
Group *group;
|
||||||
GroupObject *go;
|
GroupObject *go;
|
||||||
int add_us;
|
bool add_us;
|
||||||
|
|
||||||
for (group = main->group.first; group; group = group->id.next) {
|
for (group = main->group.first; group; group = group->id.next) {
|
||||||
if (group->id.flag & LIB_NEED_LINK) {
|
if (group->id.flag & LIB_NEED_LINK) {
|
||||||
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) {
|
for (go = group->gobject.first; go; go = go->next) {
|
||||||
go->ob= newlibadr(fd, group->id.lib, go->ob);
|
go->ob= newlibadr(fd, group->id.lib, go->ob);
|
||||||
if (go->ob) {
|
if (go->ob) {
|
||||||
go->ob->flag |= OB_FROMGROUP;
|
go->ob->flag |= OB_FROMGROUP;
|
||||||
/* if group has an object, it increments user... */
|
/* if group has an object, it increments user... */
|
||||||
add_us = 1;
|
add_us = true;
|
||||||
if (go->ob->id.us == 0)
|
id_us_ensure_real(&go->ob->id);
|
||||||
go->ob->id.us = 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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 */
|
BKE_group_object_unlink(group, NULL, NULL, NULL); /* removes NULL entries */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user