[Bf-blender-cvs] [650efcf] id-remap: Update foreach ID (add a few missing IDs, and add new flag, REFCOUNTED, to indicate when a given ID pointer affects id->us count).
Bastien Montagne
noreply at git.blender.org
Mon Oct 5 15:06:41 CEST 2015
Commit: 650efcf2d97fcb18570f3e5f7f602d3cac99a553
Author: Bastien Montagne
Date: Mon Oct 5 15:04:39 2015 +0200
Branches: id-remap
https://developer.blender.org/rB650efcf2d97fcb18570f3e5f7f602d3cac99a553
Update foreach ID (add a few missing IDs, and add new flag, REFCOUNTED, to indicate when a given ID pointer affects id->us count).
Still missing: at least modifiers (have to change all modifiers callbacks, yuck).
AFAIK constraints never refcount thier IDs so we can keep current code here.
===================================================================
M source/blender/blenkernel/BKE_library_query.h
M source/blender/blenkernel/intern/library_query.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_library_query.h b/source/blender/blenkernel/BKE_library_query.h
index 50958f8..2318022 100644
--- a/source/blender/blenkernel/BKE_library_query.h
+++ b/source/blender/blenkernel/BKE_library_query.h
@@ -38,6 +38,7 @@ enum {
IDWALK_NOP = 0,
IDWALK_NEVER_NULL = (1 << 0),
IDWALK_NEVER_SELF = (1 << 1),
+ IDWALK_REFCOUNTED = (1 << 2), /* Means that ID pointers affects id->us count. */
};
/* Call a callback for each ID link which the given ID uses.
diff --git a/source/blender/blenkernel/intern/library_query.c b/source/blender/blenkernel/intern/library_query.c
index 6d2e2f1..39a8af6 100644
--- a/source/blender/blenkernel/intern/library_query.c
+++ b/source/blender/blenkernel/intern/library_query.c
@@ -135,7 +135,7 @@ static void library_foreach_animationData(LibraryForeachIDData *data, AnimData *
static void library_foreach_mtex(LibraryForeachIDData *data, MTex *mtex)
{
FOREACH_CALLBACK_INVOKE(data->self_id, mtex->object, data->flag, data->callback, data->user_data, IDWALK_NOP);
- FOREACH_CALLBACK_INVOKE(data->self_id, mtex->tex, data->flag, data->callback, data->user_data, IDWALK_NOP);
+ FOREACH_CALLBACK_INVOKE(data->self_id, mtex->tex, data->flag, data->callback, data->user_data, IDWALK_REFCOUNTED);
}
@@ -174,8 +174,9 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u
Base *base;
CALLBACK_INVOKE(scene->camera, IDWALK_NOP);
- CALLBACK_INVOKE(scene->world, IDWALK_NOP);
+ CALLBACK_INVOKE(scene->world, IDWALK_REFCOUNTED);
CALLBACK_INVOKE(scene->set, IDWALK_NOP);
+ CALLBACK_INVOKE(scene->clip, IDWALK_NOP);
if (scene->basact) {
CALLBACK_INVOKE(scene->basact->object, IDWALK_NOP);
}
@@ -186,7 +187,7 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u
FreestyleLineSet *fls;
if (srl->mat_override) {
- CALLBACK_INVOKE(srl->mat_override, IDWALK_NOP);
+ CALLBACK_INVOKE(srl->mat_override, IDWALK_REFCOUNTED);
}
if (srl->light_override) {
CALLBACK_INVOKE(srl->light_override, IDWALK_NOP);
@@ -218,10 +219,10 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u
SEQ_END
}
- CALLBACK_INVOKE(scene->gpd, IDWALK_NOP);
+ CALLBACK_INVOKE(scene->gpd, IDWALK_REFCOUNTED); /* XXX Warning, see BKE_scene_free(). */
for (base = scene->base.first; base; base = base->next) {
- CALLBACK_INVOKE(base->object, IDWALK_NOP);
+ CALLBACK_INVOKE(base->object, IDWALK_REFCOUNTED);
}
break;
}
@@ -229,16 +230,19 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u
case ID_OB:
{
Object *object = (Object *) id;
+ ID *obdata = object->data;
+ CALLBACK_INVOKE_ID(obdata, IDWALK_REFCOUNTED);
+ object->data = obdata;
CALLBACK_INVOKE(object->parent, IDWALK_NOP);
CALLBACK_INVOKE(object->track, IDWALK_NOP);
CALLBACK_INVOKE(object->proxy, IDWALK_NOP);
CALLBACK_INVOKE(object->proxy_group, IDWALK_NOP);
CALLBACK_INVOKE(object->proxy_from, IDWALK_NOP);
- CALLBACK_INVOKE(object->poselib, IDWALK_NOP);
+ CALLBACK_INVOKE(object->poselib, IDWALK_REFCOUNTED);
for (i = 0; i < object->totcol; i++) {
- CALLBACK_INVOKE(object->mat[i], IDWALK_NOP);
+ CALLBACK_INVOKE(object->mat[i], IDWALK_REFCOUNTED);
}
- CALLBACK_INVOKE(object->gpd, IDWALK_NOP);
+ CALLBACK_INVOKE(object->gpd, IDWALK_REFCOUNTED);
CALLBACK_INVOKE(object->dup_group, IDWALK_NOP);
if (object->particlesystem.first) {
ParticleSystem *particle_system;
@@ -277,9 +281,9 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u
{
Mesh *mesh = (Mesh *) id;
CALLBACK_INVOKE(mesh->texcomesh, IDWALK_NOP);
- CALLBACK_INVOKE(mesh->key, IDWALK_NOP);
+ CALLBACK_INVOKE(mesh->key, IDWALK_REFCOUNTED);
for (i = 0; i < mesh->totcol; i++) {
- CALLBACK_INVOKE(mesh->mat[i], IDWALK_NOP);
+ CALLBACK_INVOKE(mesh->mat[i], IDWALK_REFCOUNTED);
}
break;
}
@@ -290,14 +294,14 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u
CALLBACK_INVOKE(curve->bevobj, IDWALK_NOP);
CALLBACK_INVOKE(curve->taperobj, IDWALK_NOP);
CALLBACK_INVOKE(curve->textoncurve, IDWALK_NOP);
- CALLBACK_INVOKE(curve->key, IDWALK_NOP);
+ CALLBACK_INVOKE(curve->key, IDWALK_REFCOUNTED);
for (i = 0; i < curve->totcol; i++) {
- CALLBACK_INVOKE(curve->mat[i], IDWALK_NOP);
+ CALLBACK_INVOKE(curve->mat[i], IDWALK_REFCOUNTED);
}
- CALLBACK_INVOKE(curve->vfont, IDWALK_NOP);
- CALLBACK_INVOKE(curve->vfontb, IDWALK_NOP);
- CALLBACK_INVOKE(curve->vfonti, IDWALK_NOP);
- CALLBACK_INVOKE(curve->vfontbi, IDWALK_NOP);
+ CALLBACK_INVOKE(curve->vfont, IDWALK_REFCOUNTED);
+ CALLBACK_INVOKE(curve->vfontb, IDWALK_REFCOUNTED);
+ CALLBACK_INVOKE(curve->vfonti, IDWALK_REFCOUNTED);
+ CALLBACK_INVOKE(curve->vfontbi, IDWALK_REFCOUNTED);
break;
}
@@ -305,7 +309,7 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u
{
MetaBall *metaball = (MetaBall *) id;
for (i = 0; i < metaball->totcol; i++) {
- CALLBACK_INVOKE(metaball->mat[i], IDWALK_NOP);
+ CALLBACK_INVOKE(metaball->mat[i], IDWALK_REFCOUNTED);
}
break;
}
@@ -327,14 +331,14 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u
{
Tex *texture = (Tex *) id;
CALLBACK_INVOKE(texture->nodetree, IDWALK_NOP);
- CALLBACK_INVOKE(texture->ima, IDWALK_NOP);
+ CALLBACK_INVOKE(texture->ima, IDWALK_REFCOUNTED);
break;
}
case ID_LT:
{
Lattice *lattice = (Lattice *) id;
- CALLBACK_INVOKE(lattice->key, IDWALK_NOP);
+ CALLBACK_INVOKE(lattice->key, IDWALK_REFCOUNTED);
break;
}
@@ -386,7 +390,7 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u
case ID_SPK:
{
Speaker *speaker = (Speaker *) id;
- CALLBACK_INVOKE(speaker->sound, IDWALK_NOP);
+ CALLBACK_INVOKE(speaker->sound, IDWALK_REFCOUNTED);
break;
}
@@ -407,8 +411,9 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u
{
bNodeTree *ntree = (bNodeTree *) id;
bNode *node;
+ CALLBACK_INVOKE(ntree->gpd, IDWALK_REFCOUNTED);
for (node = ntree->nodes.first; node; node = node->next) {
- CALLBACK_INVOKE_ID(node->id, IDWALK_NOP);
+ CALLBACK_INVOKE_ID(node->id, IDWALK_REFCOUNTED); /* XXX Warning see ntreeFreeTree() comment. */
}
break;
}
@@ -417,6 +422,8 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u
{
Brush *brush = (Brush *) id;
CALLBACK_INVOKE(brush->toggle_brush, IDWALK_NOP);
+ CALLBACK_INVOKE(brush->clone.image, IDWALK_NOP);
+ CALLBACK_INVOKE(brush->paint_curve, IDWALK_REFCOUNTED);
library_foreach_mtex(&data, &brush->mtex);
library_foreach_mtex(&data, &brush->mask_mtex);
break;
@@ -428,6 +435,11 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u
CALLBACK_INVOKE(particle_settings->dup_group, IDWALK_NOP);
CALLBACK_INVOKE(particle_settings->dup_ob, IDWALK_NOP);
CALLBACK_INVOKE(particle_settings->bb_ob, IDWALK_NOP);
+ for (i = 0; i < MAX_MTEX; i++) {
+ if (particle_settings->mtex[i]) {
+ library_foreach_mtex(&data, particle_settings->mtex[i]);
+ }
+ }
if (particle_settings->effector_weights) {
CALLBACK_INVOKE(particle_settings->effector_weights->group, IDWALK_NOP);
}
@@ -439,7 +451,7 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u
MovieClip *clip = (MovieClip *) id;
MovieTracking *tracking = &clip->tracking;
MovieTrackingObject *object;
- CALLBACK_INVOKE(clip->gpd, IDWALK_NOP);
+ CALLBACK_INVOKE(clip->gpd, IDWALK_REFCOUNTED);
for (object = tracking->objects.first;
object;
object = object->next)
@@ -450,7 +462,7 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u
track;
track = track->next)
{
- CALLBACK_INVOKE(track->gpd, IDWALK_NOP);
+ CALLBACK_INVOKE(track->gpd, IDWALK_REFCOUNTED);
}
}
break;
More information about the Bf-blender-cvs
mailing list