Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/blenkernel/BKE_image.h5
-rw-r--r--source/blender/blenkernel/intern/image.c80
-rw-r--r--source/blender/editors/space_image/image_buttons.c2
-rw-r--r--source/blender/editors/space_image/image_ops.c57
-rw-r--r--source/blender/editors/space_image/space_image.c3
-rw-r--r--source/blender/makesdna/DNA_image_types.h1
-rw-r--r--source/blender/render/intern/source/render_texture.c3
7 files changed, 97 insertions, 54 deletions
diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h
index 91e3e9edbf0..ac3daef77f7 100644
--- a/source/blender/blenkernel/BKE_image.h
+++ b/source/blender/blenkernel/BKE_image.h
@@ -44,6 +44,7 @@ struct anim;
struct Scene;
struct Object;
struct ImageFormatData;
+struct Main;
/* call from library */
void BKE_image_free(struct Image *me);
@@ -143,6 +144,9 @@ struct Image *BKE_image_add_from_imbuf(struct ImBuf *ibuf);
/* 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 @@ void BKE_image_assign_ibuf(struct Image *ima, struct ImBuf *ibuf);
/* 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 */
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index a2b1fb10500..3748a474ddd 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -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 @@ void BKE_image_assign_ibuf(Image *ima, ImBuf *ibuf)
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 @@ void BKE_image_signal(Image *ima, ImageUser *iuser, int signal)
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 @@ void BKE_image_user_frame_calc(ImageUser *iuser, int cfra, int fieldnr)
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 @@ int BKE_image_has_alpha(struct Image *image)
else
return 0;
}
-
diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c
index 6e52056ff2b..332a2ecada4 100644
--- a/source/blender/editors/space_image/image_buttons.c
+++ b/source/blender/editors/space_image/image_buttons.c
@@ -637,6 +637,8 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, const char
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;
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index 2cb36841082..02b95f8e7c8 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -2443,56 +2443,15 @@ void IMAGE_OT_cycle_render_slot(wmOperatorType *ot)
/* 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);
}
diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c
index a8d83500cc1..a2a16fd84a8 100644
--- a/source/blender/editors/space_image/space_image.c
+++ b/source/blender/editors/space_image/space_image.c
@@ -590,8 +590,7 @@ static void image_refresh(const bContext *C, ScrArea *UNUSED(sa))
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)) ;
diff --git a/source/blender/makesdna/DNA_image_types.h b/source/blender/makesdna/DNA_image_types.h
index dfc70e5bd66..f6c4822bb55 100644
--- a/source/blender/makesdna/DNA_image_types.h
+++ b/source/blender/makesdna/DNA_image_types.h
@@ -65,6 +65,7 @@ typedef struct ImageUser {
#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;
diff --git a/source/blender/render/intern/source/render_texture.c b/source/blender/render/intern/source/render_texture.c
index 5c45be3f03a..f6fe8e8974d 100644
--- a/source/blender/render/intern/source/render_texture.c
+++ b/source/blender/render/intern/source/render_texture.c
@@ -3534,8 +3534,7 @@ Material *RE_init_sample_material(Material *orig_mat, Scene *scene)
/* 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);
}
}
}