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;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to