From 96e9caba6ef190b9f24f212d444ea60ec6defc4a Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 17 Jun 2019 11:39:52 +0200 Subject: Fix T63867: image sequence not updating in Eevee animation render --- source/blender/blenkernel/BKE_image.h | 2 +- source/blender/blenkernel/intern/image.c | 49 +++++++++------------- source/blender/blenloader/intern/readfile.c | 2 + source/blender/compositor/nodes/COM_ImageNode.cpp | 2 +- source/blender/editors/space_image/image_buttons.c | 2 +- source/blender/editors/space_image/image_ops.c | 2 +- source/blender/editors/space_image/space_image.c | 3 +- .../editors/space_view3d/view3d_draw_legacy.c | 2 +- source/blender/makesdna/DNA_image_types.h | 3 +- source/blender/makesrna/intern/rna_image.c | 2 +- source/blender/modifiers/intern/MOD_util.c | 2 +- 11 files changed, 32 insertions(+), 39 deletions(-) (limited to 'source') 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 = scene; /* Needed for render results. */ - BKE_image_user_frame_calc(&iuser, (int)DEG_get_ctime(depsgraph)); + BKE_image_user_frame_calc(ima, &iuser, (int)DEG_get_ctime(depsgraph)); if (ima->source == IMA_SRC_SEQUENCE && !(iuser.flag & IMA_USER_FRAME_IN_RANGE)) { ibuf = NULL; /* frame is out of range, dont show */ } diff --git a/source/blender/makesdna/DNA_image_types.h b/source/blender/makesdna/DNA_image_types.h index 6141472125f..5e4ed16d28e 100644 --- a/source/blender/makesdna/DNA_image_types.h +++ b/source/blender/makesdna/DNA_image_types.h @@ -125,7 +125,8 @@ typedef struct Image { /* GPU texture flag. */ short gpuflag; - char _pad2[6]; + char _pad2[2]; + int gpuframenr; /** Deprecated. */ struct PackedFile *packedfile DNA_DEPRECATED; diff --git a/source/blender/makesrna/intern/rna_image.c b/source/blender/makesrna/intern/rna_image.c index b6e737583fc..d6f4d82c298 100644 --- a/source/blender/makesrna/intern/rna_image.c +++ b/source/blender/makesrna/intern/rna_image.c @@ -150,7 +150,7 @@ static void rna_ImageUser_update(Main *bmain, Scene *scene, PointerRNA *ptr) ImageUser *iuser = ptr->data; ID *id = ptr->id.data; - BKE_image_user_frame_calc(iuser, scene->r.cfra); + BKE_image_user_frame_calc(NULL, iuser, scene->r.cfra); if (id) { if (GS(id->name) == ID_NT) { diff --git a/source/blender/modifiers/intern/MOD_util.c b/source/blender/modifiers/intern/MOD_util.c index 1efc1aefae4..998a2b1cd65 100644 --- a/source/blender/modifiers/intern/MOD_util.c +++ b/source/blender/modifiers/intern/MOD_util.c @@ -65,7 +65,7 @@ void MOD_init_texture(MappingInfoModifierData *dmd, const ModifierEvalContext *c } if (tex->ima && BKE_image_is_animated(tex->ima)) { - BKE_image_user_frame_calc(&tex->iuser, DEG_get_ctime(ctx->depsgraph)); + BKE_image_user_frame_calc(tex->ima, &tex->iuser, DEG_get_ctime(ctx->depsgraph)); } } -- cgit v1.2.3