[Bf-blender-cvs] [a6443b5d1ed] master: Fix BKE_image_walk_all_users not including all image users.

Brecht Van Lommel noreply at git.blender.org
Mon Feb 18 16:53:09 CET 2019


Commit: a6443b5d1ed600c953ffffe91a62ded77631bbb7
Author: Brecht Van Lommel
Date:   Mon Feb 18 16:19:15 2019 +0100
Branches: master
https://developer.blender.org/rBa6443b5d1ed600c953ffffe91a62ded77631bbb7

Fix BKE_image_walk_all_users not including all image users.

===================================================================

M	source/blender/blenkernel/BKE_image.h
M	source/blender/blenkernel/intern/image.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h
index 84d8a294bcf..ed8dab7aa0d 100644
--- a/source/blender/blenkernel/BKE_image.h
+++ b/source/blender/blenkernel/BKE_image.h
@@ -27,6 +27,8 @@
 extern "C" {
 #endif
 
+struct Depsgraph;
+struct ID;
 struct ImBuf;
 struct Image;
 struct ImageFormatData;
@@ -193,6 +195,8 @@ struct Image *BKE_image_add_from_imbuf(struct Main *bmain, struct ImBuf *ibuf, c
 void BKE_image_init_imageuser(struct Image *ima, struct ImageUser *iuser);
 void BKE_image_signal(struct Main *bmain, struct Image *ima, struct ImageUser *iuser, int signal);
 
+void BKE_image_walk_id_all_users(struct ID *id, void *customdata,
+                                 void callback(struct Image *ima, struct ImageUser *iuser, void *customdata));
 void BKE_image_walk_all_users(const struct Main *mainp, void *customdata,
                               void callback(struct Image *ima, struct ImageUser *iuser, void *customdata));
 
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index 0d5bfc5ea01..eb4d7751a5c 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -2624,62 +2624,148 @@ void BKE_image_verify_viewer_views(const RenderData *rd, Image *ima, ImageUser *
 	BLI_thread_unlock(LOCK_DRAW_IMAGE);
 }
 
-void BKE_image_walk_all_users(const Main *mainp, void *customdata,
-                              void callback(Image *ima, ImageUser *iuser, void *customdata))
-{
-	wmWindowManager *wm;
-	wmWindow *win;
-	Tex *tex;
-
-	/* texture users */
-	for (tex = mainp->tex.first; tex; tex = tex->id.next) {
-		if (tex->type == TEX_IMAGE && tex->ima) {
-			callback(tex->ima, &tex->iuser, customdata);
-		}
-
-		if (tex->nodetree) {
-			bNode *node;
-			for (node = tex->nodetree->nodes.first; node; node = node->next) {
+static void image_walk_ntree_all_users(bNodeTree *ntree, void *customdata,
+                                       void callback(Image *ima, ImageUser *iuser, void *customdata))
+{
+	switch (ntree->type) {
+		case NTREE_SHADER:
+			for (bNode *node = ntree->nodes.first; node; node = node->next) {
+				if (node->id) {
+					if (node->type == SH_NODE_TEX_IMAGE) {
+						NodeTexImage *tex = node->storage;
+						Image *ima = (Image *)node->id;
+						callback(ima, &tex->iuser, customdata);
+					}
+					if (node->type == SH_NODE_TEX_ENVIRONMENT) {
+						NodeTexImage *tex = node->storage;
+						Image *ima = (Image *)node->id;
+						callback(ima, &tex->iuser, customdata);
+					}
+				}
+			}
+			break;
+		case NTREE_TEXTURE:
+			for (bNode *node = ntree->nodes.first; node; node = node->next) {
 				if (node->id && node->type == TEX_NODE_IMAGE) {
 					Image *ima = (Image *)node->id;
 					ImageUser *iuser = node->storage;
 					callback(ima, iuser, customdata);
 				}
 			}
-		}
+			break;
+		case NTREE_COMPOSIT:
+			for (bNode *node = ntree->nodes.first; node; node = node->next) {
+				if (node->id && node->type == CMP_NODE_IMAGE) {
+					Image *ima = (Image *)node->id;
+					ImageUser *iuser = node->storage;
+					callback(ima, iuser, customdata);
+				}
+			}
+			break;
 	}
+}
 
-	for (Camera *cam = mainp->camera.first; cam; cam = cam->id.next) {
-		for (CameraBGImage *bgpic = cam->bg_images.first; bgpic; bgpic = bgpic->next) {
-			callback(bgpic->ima, &bgpic->iuser, customdata);
+void BKE_image_walk_id_all_users(ID *id, void *customdata,
+                                 void callback(Image *ima, ImageUser *iuser, void *customdata))
+{
+	switch(GS(id->name)) {
+		case ID_OB:
+		{
+			Object *ob = (Object *)id;
+			if (ob->empty_drawtype == OB_EMPTY_IMAGE && ob->data) {
+				callback(ob->data, ob->iuser, customdata);
+			}
+			break;
 		}
-	}
-
-	/* image window, compo node users */
-	for (wm = mainp->wm.first; wm; wm = wm->id.next) { /* only 1 wm */
-		for (win = wm->windows.first; win; win = win->next) {
-			const bScreen *screen = BKE_workspace_active_screen_get(win->workspace_hook);
-
-			for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
-				if (sa->spacetype == SPACE_IMAGE) {
-					SpaceImage *sima = sa->spacedata.first;
-					callback(sima->image, &sima->iuser, customdata);
-				}
-				else if (sa->spacetype == SPACE_NODE) {
-					SpaceNode *snode = sa->spacedata.first;
-					if (snode->nodetree && snode->nodetree->type == NTREE_COMPOSIT) {
-						bNode *node;
-						for (node = snode->nodetree->nodes.first; node; node = node->next) {
-							if (node->id && node->type == CMP_NODE_IMAGE) {
-								Image *ima = (Image *)node->id;
-								ImageUser *iuser = node->storage;
-								callback(ima, iuser, customdata);
-							}
-						}
+		case ID_MA:
+		{
+			Material *ma = (Material *)id;
+			if (ma->nodetree && ma->use_nodes) {
+				image_walk_ntree_all_users(ma->nodetree, customdata, callback);
+			}
+			break;
+		}
+		case ID_TE:
+		{
+			Tex *tex = (Tex *)id;
+			if (tex->type == TEX_IMAGE && tex->ima) {
+				callback(tex->ima, &tex->iuser, customdata);
+			}
+			if (tex->nodetree && tex->use_nodes) {
+				image_walk_ntree_all_users(tex->nodetree, customdata, callback);
+			}
+			break;
+		}
+		case ID_NT:
+		{
+			bNodeTree *ntree = (bNodeTree *)id;
+			image_walk_ntree_all_users(ntree, customdata, callback);
+			break;
+		}
+		case ID_CA:
+		{
+			Camera *cam = (Camera *)id;
+			for (CameraBGImage *bgpic = cam->bg_images.first; bgpic; bgpic = bgpic->next) {
+				callback(bgpic->ima, &bgpic->iuser, customdata);
+			}
+			break;
+		}
+		case ID_WM:
+		{
+			wmWindowManager *wm = (wmWindowManager *)id;
+			for (wmWindow *win = wm->windows.first; win; win = win->next) {
+				const bScreen *screen = BKE_workspace_active_screen_get(win->workspace_hook);
+
+				for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
+					if (sa->spacetype == SPACE_IMAGE) {
+						SpaceImage *sima = sa->spacedata.first;
+						callback(sima->image, &sima->iuser, customdata);
 					}
 				}
 			}
+			break;
 		}
+		case ID_SCE:
+		{
+			Scene *scene = (Scene *)id;
+			if (scene->nodetree && scene->use_nodes) {
+				image_walk_ntree_all_users(scene->nodetree, customdata, callback);
+			}
+		}
+		default:
+			break;
+	}
+}
+
+void BKE_image_walk_all_users(const Main *mainp, void *customdata,
+                              void callback(Image *ima, ImageUser *iuser, void *customdata))
+{
+	for (Scene *scene = mainp->scene.first; scene; scene = scene->id.next) {
+		BKE_image_walk_id_all_users(&scene->id, customdata, callback);
+	}
+
+	for (Object *ob = mainp->object.first; ob; ob = ob->id.next) {
+		BKE_image_walk_id_all_users(&ob->id, customdata, callback);
+	}
+
+	for (bNodeTree *ntree = mainp->nodetree.first; ntree; ntree = ntree->id.next) {
+		BKE_image_walk_id_all_users(&ntree->id, customdata, callback);
+	}
+
+	for (Material *ma = mainp->mat.first; ma; ma = ma->id.next) {
+		BKE_image_walk_id_all_users(&ma->id, customdata, callback);
+	}
+
+	for (Tex *tex = mainp->tex.first; tex; tex = tex->id.next) {
+		BKE_image_walk_id_all_users(&tex->id, customdata, callback);
+	}
+
+	for (Camera *cam = mainp->camera.first; cam; cam = cam->id.next) {
+		BKE_image_walk_id_all_users(&cam->id, customdata, callback);
+	}
+
+	for (wmWindowManager *wm = mainp->wm.first; wm; wm = wm->id.next) { /* only 1 wm */
+		BKE_image_walk_id_all_users(&wm->id, customdata, callback);
 	}
 }



More information about the Bf-blender-cvs mailing list