[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [47397] trunk/blender/source/blender: Fix #31352: Image sequence texture - can' t load image after changing image source

Sergey Sharybin sergey.vfx at gmail.com
Mon Jun 4 12:41:35 CEST 2012


Revision: 47397
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=47397
Author:   nazgul
Date:     2012-06-04 10:41:18 +0000 (Mon, 04 Jun 2012)
Log Message:
-----------
Fix #31352: Image sequence texture - can't load image after changing image source

Added new flag to Imageuser which indicates whether user frame calculation is needed.
This flag is getting set in BKE_image_signal and handled in actual image usage areas
where both image user and current frame is known.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_image.h
    trunk/blender/source/blender/blenkernel/intern/image.c
    trunk/blender/source/blender/editors/space_image/image_buttons.c
    trunk/blender/source/blender/editors/space_image/image_ops.c
    trunk/blender/source/blender/editors/space_image/space_image.c
    trunk/blender/source/blender/makesdna/DNA_image_types.h
    trunk/blender/source/blender/render/intern/source/render_texture.c

Modified: trunk/blender/source/blender/blenkernel/BKE_image.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_image.h	2012-06-04 08:01:59 UTC (rev 47396)
+++ trunk/blender/source/blender/blenkernel/BKE_image.h	2012-06-04 10:41:18 UTC (rev 47397)
@@ -44,6 +44,7 @@
 struct Scene;
 struct Object;
 struct ImageFormatData;
+struct Main;
 
 /* call from library */
 void    BKE_image_free(struct Image *me);
@@ -143,6 +144,9 @@
 /* for reload, refresh, pack */
 void BKE_image_signal(struct Image *ima, struct ImageUser *iuser, int signal);
 
+void BKE_image_walk_all_users(const struct Main *mainp, void *customdata,
+                              void callback(struct Image *ima, struct ImageUser *iuser, void *customdata));
+
 /* ensures an Image exists for viewing nodes or render */
 struct Image *BKE_image_verify_viewer(int type, const char *name);
 
@@ -151,6 +155,7 @@
 
 /* called on frame change or before render */
 void BKE_image_user_frame_calc(struct ImageUser *iuser, int cfra, int fieldnr);
+void BKE_image_user_check_frame_calc(struct ImageUser *iuser, int cfra, int fieldnr);
 int  BKE_image_user_frame_get(const struct ImageUser *iuser, int cfra, int fieldnr);
 
 /* sets index offset for multilayer files */

Modified: trunk/blender/source/blender/blenkernel/intern/image.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/image.c	2012-06-04 08:01:59 UTC (rev 47396)
+++ trunk/blender/source/blender/blenkernel/intern/image.c	2012-06-04 10:41:18 UTC (rev 47397)
@@ -91,6 +91,14 @@
 
 #include "BLO_sys_types.h" // for intptr_t support
 
+/* for image user iteration */
+#include "DNA_node_types.h"
+#include "DNA_space_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_view3d_types.h"
+
+#include "WM_api.h"
+
 /* max int, to indicate we don't store sequences in ibuf */
 #define IMA_NO_INDEX    0x7FEFEFEF
 
@@ -1814,6 +1822,65 @@
 	image_assign_ibuf(ima, ibuf, IMA_NO_INDEX, 0);
 }
 
+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) {
+			if (ELEM(tex->ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) {
+				callback(tex->ima, &tex->iuser, customdata);
+			}
+		}
+	}
+
+	/* 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) {
+			ScrArea *sa;
+			for (sa = win->screen->areabase.first; sa; sa = sa->next) {
+				if (sa->spacetype == SPACE_VIEW3D) {
+					View3D *v3d = sa->spacedata.first;
+					BGpic *bgpic;
+					for (bgpic = v3d->bgpicbase.first; bgpic; bgpic = bgpic->next) {
+						callback(bgpic->ima, &bgpic->iuser, customdata);
+					}
+				}
+				else 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->treetype == NTREE_COMPOSIT) && (snode->nodetree)) {
+						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);
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+}
+
+static void image_tag_frame_recalc(Image *ima, ImageUser *iuser, void *customdata)
+{
+	Image *changed_image = customdata;
+
+	if (ima == changed_image) {
+		iuser->flag |= IMA_NEED_FRAME_RECALC;
+	}
+}
+
 void BKE_image_signal(Image *ima, ImageUser *iuser, int signal)
 {
 	if (ima == NULL)
@@ -1847,6 +1914,9 @@
 			ima->ok = 1;
 			if (iuser)
 				iuser->ok = 1;
+
+			BKE_image_walk_all_users(G.main, ima, image_tag_frame_recalc);
+
 			break;
 
 		case IMA_SIGNAL_RELOAD:
@@ -2669,6 +2739,15 @@
 	if (iuser->ok == 0) iuser->ok = 1;
 }
 
+void BKE_image_user_check_frame_calc(ImageUser *iuser, int cfra, int fieldnr)
+{
+	if ((iuser->flag & IMA_ANIM_ALWAYS) || (iuser->flag & IMA_NEED_FRAME_RECALC)) {
+		BKE_image_user_frame_calc(iuser, cfra, fieldnr);
+
+		iuser->flag &= ~IMA_NEED_FRAME_RECALC;
+	}
+}
+
 int BKE_image_has_alpha(struct Image *image)
 {
 	ImBuf *ibuf;
@@ -2684,4 +2763,3 @@
 	else
 		return 0;
 }
-

Modified: trunk/blender/source/blender/editors/space_image/image_buttons.c
===================================================================
--- trunk/blender/source/blender/editors/space_image/image_buttons.c	2012-06-04 08:01:59 UTC (rev 47396)
+++ trunk/blender/source/blender/editors/space_image/image_buttons.c	2012-06-04 10:41:18 UTC (rev 47397)
@@ -637,6 +637,8 @@
 	ima = imaptr.data;
 	iuser = userptr->data;
 
+	BKE_image_user_check_frame_calc(iuser, (int)scene->r.cfra, 0);
+
 	cb = MEM_callocN(sizeof(RNAUpdateCb), "RNAUpdateCb");
 	cb->ptr = *ptr;
 	cb->prop = prop;

Modified: trunk/blender/source/blender/editors/space_image/image_ops.c
===================================================================
--- trunk/blender/source/blender/editors/space_image/image_ops.c	2012-06-04 08:01:59 UTC (rev 47396)
+++ trunk/blender/source/blender/editors/space_image/image_ops.c	2012-06-04 10:41:18 UTC (rev 47397)
@@ -2443,56 +2443,15 @@
 
 /* goes over all ImageUsers, and sets frame numbers if auto-refresh is set */
 
+static void image_update_frame(struct Image *UNUSED(ima), struct ImageUser *iuser, void *customdata)
+{
+	int cfra = *(int*)customdata;
+
+	BKE_image_user_check_frame_calc(iuser, cfra, 0);
+}
+
 void ED_image_update_frame(const Main *mainp, int cfra)
 {
-	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) {
-			if (ELEM(tex->ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) {
-				if (tex->iuser.flag & IMA_ANIM_ALWAYS)
-					BKE_image_user_frame_calc(&tex->iuser, cfra, 0);
-			}
-		}
-	}
-	
-	/* 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) {
-			ScrArea *sa;
-			for (sa = win->screen->areabase.first; sa; sa = sa->next) {
-				if (sa->spacetype == SPACE_VIEW3D) {
-					View3D *v3d = sa->spacedata.first;
-					BGpic *bgpic;
-					for (bgpic = v3d->bgpicbase.first; bgpic; bgpic = bgpic->next)
-						if (bgpic->iuser.flag & IMA_ANIM_ALWAYS)
-							BKE_image_user_frame_calc(&bgpic->iuser, cfra, 0);
-				}
-				else if (sa->spacetype == SPACE_IMAGE) {
-					SpaceImage *sima = sa->spacedata.first;
-					if (sima->iuser.flag & IMA_ANIM_ALWAYS)
-						BKE_image_user_frame_calc(&sima->iuser, cfra, 0);
-				}
-				else if (sa->spacetype == SPACE_NODE) {
-					SpaceNode *snode = sa->spacedata.first;
-					if ((snode->treetype == NTREE_COMPOSIT) && (snode->nodetree)) {
-						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;
-								if (ELEM(ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE))
-									if (iuser->flag & IMA_ANIM_ALWAYS)
-										BKE_image_user_frame_calc(iuser, cfra, 0);
-							}
-						}
-					}
-				}
-			}
-		}
-	}
+	BKE_image_walk_all_users(mainp, &cfra, image_update_frame);
 }
 

Modified: trunk/blender/source/blender/editors/space_image/space_image.c
===================================================================
--- trunk/blender/source/blender/editors/space_image/space_image.c	2012-06-04 08:01:59 UTC (rev 47396)
+++ trunk/blender/source/blender/editors/space_image/space_image.c	2012-06-04 10:41:18 UTC (rev 47397)
@@ -590,8 +590,7 @@
 
 	ima = ED_space_image(sima);
 
-	if (sima->iuser.flag & IMA_ANIM_ALWAYS)
-		BKE_image_user_frame_calc(&sima->iuser, scene->r.cfra, 0);
+	BKE_image_user_check_frame_calc(&sima->iuser, scene->r.cfra, 0);
 	
 	/* check if we have to set the image from the editmesh */
 	if (ima && (ima->source == IMA_SRC_VIEWER || sima->pin)) ;

Modified: trunk/blender/source/blender/makesdna/DNA_image_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_image_types.h	2012-06-04 08:01:59 UTC (rev 47396)
+++ trunk/blender/source/blender/makesdna/DNA_image_types.h	2012-06-04 10:41:18 UTC (rev 47397)
@@ -65,6 +65,7 @@
 #define	IMA_ANIM_ALWAYS		1
 #define IMA_ANIM_REFRESHED	2
 /* #define IMA_DO_PREMUL	4 */
+#define IMA_NEED_FRAME_RECALC	8
 
 typedef struct Image {
 	ID id;

Modified: trunk/blender/source/blender/render/intern/source/render_texture.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/render_texture.c	2012-06-04 08:01:59 UTC (rev 47396)
+++ trunk/blender/source/blender/render/intern/source/render_texture.c	2012-06-04 10:41:18 UTC (rev 47397)
@@ -3534,8 +3534,7 @@
 
 			/* update image sequences and movies */
 			if (tex->ima && ELEM(tex->ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) {
-				if (tex->iuser.flag & IMA_ANIM_ALWAYS)
-					BKE_image_user_frame_calc(&tex->iuser, (int)scene->r.cfra, 0);
+				BKE_image_user_check_frame_calc(&tex->iuser, (int)scene->r.cfra, 0);
 			}
 		}
 	}




More information about the Bf-blender-cvs mailing list