diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2019-06-17 12:39:52 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2019-06-17 13:12:48 +0300 |
commit | 96e9caba6ef190b9f24f212d444ea60ec6defc4a (patch) | |
tree | 37fd174e34e1da18df4fbf14b5342568435aff34 /source/blender/blenkernel | |
parent | 4285729d4b23ef7b7f6d1917b7530e1cbbf530b1 (diff) |
Fix T63867: image sequence not updating in Eevee animation render
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_image.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/image.c | 49 |
2 files changed, 21 insertions, 30 deletions
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); } } } |