[Bf-blender-cvs] [96e9caba6ef] master: Fix T63867: image sequence not updating in Eevee animation render

Brecht Van Lommel noreply at git.blender.org
Mon Jun 17 12:22:30 CEST 2019


Commit: 96e9caba6ef190b9f24f212d444ea60ec6defc4a
Author: Brecht Van Lommel
Date:   Mon Jun 17 11:39:52 2019 +0200
Branches: master
https://developer.blender.org/rB96e9caba6ef190b9f24f212d444ea60ec6defc4a

Fix T63867: image sequence not updating in Eevee animation render

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

M	intern/cycles/blender/blender_util.h
M	source/blender/blenkernel/BKE_image.h
M	source/blender/blenkernel/intern/image.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/compositor/nodes/COM_ImageNode.cpp
M	source/blender/editors/space_image/image_buttons.c
M	source/blender/editors/space_image/image_ops.c
M	source/blender/editors/space_image/space_image.c
M	source/blender/editors/space_view3d/view3d_draw_legacy.c
M	source/blender/makesdna/DNA_image_types.h
M	source/blender/makesrna/intern/rna_image.c
M	source/blender/modifiers/intern/MOD_util.c

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

diff --git a/intern/cycles/blender/blender_util.h b/intern/cycles/blender/blender_util.h
index 69e55d67532..c9d1dc67e54 100644
--- a/intern/cycles/blender/blender_util.h
+++ b/intern/cycles/blender/blender_util.h
@@ -32,7 +32,7 @@
  * todo: clean this up ... */
 
 extern "C" {
-void BKE_image_user_frame_calc(void *iuser, int cfra);
+void BKE_image_user_frame_calc(void *ima, void *iuser, int cfra);
 void BKE_image_user_file_path(void *iuser, void *ima, char *path);
 unsigned char *BKE_image_get_pixels_for_frame(void *image, int frame);
 float *BKE_image_get_float_pixels_for_frame(void *image, int frame);
@@ -233,14 +233,14 @@ static inline int render_resolution_y(BL::RenderSettings &b_render)
 static inline string image_user_file_path(BL::ImageUser &iuser, BL::Image &ima, int cfra)
 {
   char filepath[1024];
-  BKE_image_user_frame_calc(iuser.ptr.data, cfra);
+  BKE_image_user_frame_calc(NULL, iuser.ptr.data, cfra);
   BKE_image_user_file_path(iuser.ptr.data, ima.ptr.data, filepath);
   return string(filepath);
 }
 
 static inline int image_user_frame_number(BL::ImageUser &iuser, int cfra)
 {
-  BKE_image_user_frame_calc(iuser.ptr.data, cfra);
+  BKE_image_user_frame_calc(NULL, iuser.ptr.data, cfra);
   return iuser.frame_current();
 }
 
diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h
index b9f2123b2bd..00fd291d7cb 100644
--- a/source/blender/blenkernel/BKE_image.h
+++ b/source/blender/blenkernel/BKE_image.h
@@ -228,7 +228,7 @@ void BKE_image_verify_viewer_views(const struct RenderData *rd,
                                    struct ImageUser *iuser);
 
 /* called on frame change or before render */
-void BKE_image_user_frame_calc(struct ImageUser *iuser, int cfra);
+void BKE_image_user_frame_calc(struct Image *ima, struct ImageUser *iuser, int cfra);
 int BKE_image_user_frame_get(const struct ImageUser *iuser, int cfra, bool *r_is_in_range);
 void BKE_image_user_file_path(struct ImageUser *iuser, struct Image *ima, char *path);
 void BKE_image_editors_update_frame(const struct Main *bmain, int cfra);
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index d94ede0e69e..34e57f61a72 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -316,6 +316,8 @@ static void image_init(Image *ima, short source, short type)
 
   BKE_color_managed_colorspace_settings_init(&ima->colorspace_settings);
   ima->stereo3d_format = MEM_callocN(sizeof(Stereo3dFormat), "Image Stereo Format");
+
+  ima->gpuframenr = INT_MAX;
 }
 
 void BKE_image_init(struct Image *image)
@@ -3953,7 +3955,7 @@ static ImBuf *load_image_single(Image *ima,
     flag |= imbuf_alpha_flags_for_image(ima);
 
     /* get the correct filepath */
-    BKE_image_user_frame_calc(iuser, cfra);
+    BKE_image_user_frame_calc(ima, iuser, cfra);
 
     if (iuser) {
       iuser_t = *iuser;
@@ -4813,7 +4815,7 @@ int BKE_image_user_frame_get(const ImageUser *iuser, int cfra, bool *r_is_in_ran
   }
 }
 
-void BKE_image_user_frame_calc(ImageUser *iuser, int cfra)
+void BKE_image_user_frame_calc(Image *ima, ImageUser *iuser, int cfra)
 {
   if (iuser) {
     bool is_in_range;
@@ -4827,28 +4829,30 @@ void BKE_image_user_frame_calc(ImageUser *iuser, int cfra)
     }
 
     iuser->framenr = framenr;
+
+    if (ima && ima->gpuframenr != framenr) {
+      /* Note: a single texture and refresh doesn't really work when
+       * multiple image users may use different frames, this is to
+       * be improved with perhaps a GPU texture cache. */
+      ima->gpuflag |= IMA_GPU_REFRESH;
+      ima->gpuframenr = framenr;
+    }
+
     if (iuser->ok == 0) {
       iuser->ok = 1;
     }
+
+    iuser->flag &= ~IMA_NEED_FRAME_RECALC;
   }
 }
 
 /* goes over all ImageUsers, and sets frame numbers if auto-refresh is set */
-static void image_editors_update_frame(struct Image *ima,
-                                       struct ImageUser *iuser,
-                                       void *customdata)
+static void image_editors_update_frame(Image *ima, ImageUser *iuser, void *customdata)
 {
   int cfra = *(int *)customdata;
 
   if ((iuser->flag & IMA_ANIM_ALWAYS) || (iuser->flag & IMA_NEED_FRAME_RECALC)) {
-    int framenr = iuser->framenr;
-
-    BKE_image_user_frame_calc(iuser, cfra);
-    iuser->flag &= ~IMA_NEED_FRAME_RECALC;
-
-    if (ima && iuser->framenr != framenr) {
-      ima->gpuflag |= IMA_GPU_REFRESH;
-    }
+    BKE_image_user_frame_calc(ima, iuser, cfra);
   }
 }
 
@@ -4860,9 +4864,7 @@ void BKE_image_editors_update_frame(const Main *bmain, int cfra)
   image_walk_id_all_users(&wm->id, false, &cfra, image_editors_update_frame);
 }
 
-static void image_user_id_has_animation(struct Image *ima,
-                                        struct ImageUser *UNUSED(iuser),
-                                        void *customdata)
+static void image_user_id_has_animation(Image *ima, ImageUser *UNUSED(iuser), void *customdata)
 {
   if (ima && BKE_image_is_animated(ima)) {
     *(bool *)customdata = true;
@@ -4879,27 +4881,16 @@ bool BKE_image_user_id_has_animation(ID *id)
   return has_animation;
 }
 
-static void image_user_id_eval_animation(struct Image *ima,
-                                         struct ImageUser *iuser,
-                                         void *customdata)
+static void image_user_id_eval_animation(Image *ima, ImageUser *iuser, void *customdata)
 {
   if (ima && BKE_image_is_animated(ima)) {
     Depsgraph *depsgraph = (Depsgraph *)customdata;
 
     if ((iuser->flag & IMA_ANIM_ALWAYS) || (iuser->flag & IMA_NEED_FRAME_RECALC) ||
         (DEG_get_mode(depsgraph) == DAG_EVAL_RENDER)) {
-      int framenr = iuser->framenr;
       float cfra = DEG_get_ctime(depsgraph);
 
-      BKE_image_user_frame_calc(iuser, cfra);
-      iuser->flag &= ~IMA_NEED_FRAME_RECALC;
-
-      if (iuser->framenr != framenr) {
-        /* Note: a single texture and refresh doesn't really work when
-         * multiple image users may use different frames, this is to
-         * be improved with perhaps a GPU texture cache. */
-        ima->gpuflag |= IMA_GPU_REFRESH;
-      }
+      BKE_image_user_frame_calc(ima, iuser, cfra);
     }
   }
 }
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 16893d92634..444d3c6a3d4 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -1952,6 +1952,7 @@ void blo_end_image_pointer_map(FileData *fd, Main *oldmain)
     ima->cache = newimaadr(fd, ima->cache);
     if (ima->cache == NULL) {
       ima->gpuflag = 0;
+      ima->gpuframenr = INT_MAX;
       for (i = 0; i < TEXTARGET_COUNT; i++) {
         ima->gputexture[i] = NULL;
       }
@@ -4226,6 +4227,7 @@ static void direct_link_image(FileData *fd, Image *ima)
   /* if not restored, we keep the binded opengl index */
   if (!ima->cache) {
     ima->gpuflag = 0;
+    ima->gpuframenr = INT_MAX;
     for (int i = 0; i < TEXTARGET_COUNT; i++) {
       ima->gputexture[i] = NULL;
     }
diff --git a/source/blender/compositor/nodes/COM_ImageNode.cpp b/source/blender/compositor/nodes/COM_ImageNode.cpp
index 31de6c6867e..dc3f65deb1f 100644
--- a/source/blender/compositor/nodes/COM_ImageNode.cpp
+++ b/source/blender/compositor/nodes/COM_ImageNode.cpp
@@ -80,7 +80,7 @@ void ImageNode::convertToOperations(NodeConverter &converter,
   int framenumber = context.getFramenumber();
   int numberOfOutputs = this->getNumberOfOutputSockets();
   bool outputStraightAlpha = (editorNode->custom1 & CMP_NODE_IMAGE_USE_STRAIGHT_OUTPUT) != 0;
-  BKE_image_user_frame_calc(imageuser, context.getFramenumber());
+  BKE_image_user_frame_calc(image, imageuser, context.getFramenumber());
   /* force a load, we assume iuser index will be set OK anyway */
   if (image && image->type == IMA_TYPE_MULTILAYER) {
     bool is_multilayer_ok = false;
diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c
index fb4369f5113..f1a29a1542d 100644
--- a/source/blender/editors/space_image/image_buttons.c
+++ b/source/blender/editors/space_image/image_buttons.c
@@ -798,7 +798,7 @@ void uiTemplateImage(uiLayout *layout,
   ImageUser *iuser = userptr->data;
 
   Scene *scene = CTX_data_scene(C);
-  BKE_image_user_frame_calc(iuser, (int)scene->r.cfra);
+  BKE_image_user_frame_calc(ima, iuser, (int)scene->r.cfra);
 
   uiLayoutSetContextPointer(layout, "edit_image", &imaptr);
   uiLayoutSetContextPointer(layout, "edit_image_user", userptr);
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index 3789b6d7a6d..bdc6c394609 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -1559,7 +1559,7 @@ static int image_match_len_exec(bContext *C, wmOperator *UNUSED(op))
     return OPERATOR_CANCELLED;
   }
   iuser->frames = IMB_anim_get_duration(anim, IMB_TC_RECORD_RUN);
-  BKE_image_user_frame_calc(iuser, scene->r.cfra);
+  BKE_image_user_frame_calc(ima, iuser, scene->r.cfra);
 
   return OPERATOR_FINISHED;
 }
diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c
index 66a56399883..341a162c840 100644
--- a/source/blender/editors/space_image/space_image.c
+++ b/source/blender/editors/space_image/space_image.c
@@ -292,8 +292,7 @@ static void image_refresh(const bContext *C, ScrArea *sa)
   Image *ima;
 
   ima = ED_space_image(sima);
-
-  BKE_image_user_frame_calc(&sima->iuser, scene->r.cfra);
+  BKE_image_user_frame_calc(ima, &sima->iuser, scene->r.cfra);
 
   /* check if we have to set the image from the editmesh */
   if (ima && (ima->source == IMA_SRC_VIEWER && sima->mode == SI_MODE_MASK)) {
diff --git a/source/blender/editors/space_view3d/view3d_draw_legacy.c b/source/blender/editors/space_view3d/view3d_draw_legacy.c
index dd97a023825..08ac0d91d42 100644
--- a/source/blender/editors/space_view3d/view3d_draw_legacy.c
+++ b/source/blender/editors/space_view3d/view3d_draw_legacy.c
@@ -366,7 +366,7 @@ static void view3d_draw_bgpic(Scene *scene,
 
         ImageUser iuser = bgpic->iuser;
         iuser.scene 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list