diff options
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_image.h | 7 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/image.c | 73 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/object_update.c | 8 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/scene.c | 2 |
4 files changed, 65 insertions, 25 deletions
diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h index ed8dab7aa0d..a6a709c204b 100644 --- a/source/blender/blenkernel/BKE_image.h +++ b/source/blender/blenkernel/BKE_image.h @@ -207,10 +207,13 @@ void BKE_image_verify_viewer_views(const struct RenderData *rd, struct Image *im /* called on frame change or before render */ void BKE_image_user_frame_calc(struct ImageUser *iuser, int cfra); -void BKE_image_user_check_frame_calc(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_update_frame(const struct Main *bmain, int cfra); +void BKE_image_editors_update_frame(const struct Main *bmain, int cfra); + +/* dependency graph update for image user users */ +bool BKE_image_user_id_has_animation(struct ID *id); +void BKE_image_user_id_eval_animation(struct Depsgraph *depsgrah, struct ID *id); /* sets index offset for multilayer files */ struct RenderPass *BKE_image_multilayer_index(struct RenderResult *rr, struct ImageUser *iuser); diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index 948d22f5146..072aaaf2310 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -88,6 +88,9 @@ #include "BLI_sys_types.h" // for intptr_t support +#include "DEG_depsgraph.h" +#include "DEG_depsgraph_query.h" + /* for image user iteration */ #include "DNA_node_types.h" #include "DNA_space_types.h" @@ -4418,26 +4421,72 @@ void BKE_image_user_frame_calc(ImageUser *iuser, int cfra) } } -void BKE_image_user_check_frame_calc(ImageUser *iuser, int cfra) +/* goes over all ImageUsers, and sets frame numbers if auto-refresh is set */ +static void image_editors_update_frame(struct Image *UNUSED(ima), struct ImageUser *iuser, void *customdata) { - if ((iuser->flag & IMA_ANIM_ALWAYS) || (iuser->flag & IMA_NEED_FRAME_RECALC)) { - BKE_image_user_frame_calc(iuser, cfra); + int cfra = *(int *)customdata; + if ((iuser->flag & IMA_ANIM_ALWAYS) || + (iuser->flag & IMA_NEED_FRAME_RECALC)) + { + BKE_image_user_frame_calc(iuser, cfra); iuser->flag &= ~IMA_NEED_FRAME_RECALC; } } -/* 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) +void BKE_image_editors_update_frame(const Main *bmain, int cfra) { - int cfra = *(int *)customdata; + /* This only updates images used by the user interface. For others the + * dependency graph will call BKE_image_user_id_eval_animation. */ + wmWindowManager *wm = bmain->wm.first; + BKE_image_walk_id_all_users(&wm->id, &cfra, image_editors_update_frame); +} + +static void image_user_id_has_animation(struct Image *ima, struct ImageUser *UNUSED(iuser), void *customdata) +{ + if (ima && BKE_image_is_animated(ima)) { + *(bool *)customdata = true; + } +} + +bool BKE_image_user_id_has_animation(ID *id) +{ + bool has_animation = false; + BKE_image_walk_id_all_users(id, &has_animation, image_user_id_has_animation); + return has_animation; +} + +static void image_user_id_eval_animation(struct Image *ima, struct 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; - BKE_image_user_check_frame_calc(iuser, cfra); + 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; + } + } + } } -void BKE_image_update_frame(const Main *bmain, int cfra) +void BKE_image_user_id_eval_animation(Depsgraph *depsgraph, ID *id) { - BKE_image_walk_all_users(bmain, &cfra, image_update_frame); + /* This is called from the dependency graph to update the image + * users in datablocks. It computes the current frame number + * and tags the image to be refreshed. */ + BKE_image_walk_id_all_users(id, depsgraph, image_user_id_eval_animation); } void BKE_image_user_file_path(ImageUser *iuser, Image *ima, char *filepath) @@ -4605,11 +4654,7 @@ bool BKE_image_has_packedfile(Image *ima) return (BLI_listbase_is_empty(&ima->packedfiles) == false); } -/** - * Checks the image buffer changes (not keyframed values) - * - * to see if we need to call #BKE_image_user_check_frame_calc - */ +/* Checks the image buffer changes with time (not keyframed values). */ bool BKE_image_is_animated(Image *image) { return ELEM(image->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE); diff --git a/source/blender/blenkernel/intern/object_update.c b/source/blender/blenkernel/intern/object_update.c index b82ff00c656..9ab25f01f7b 100644 --- a/source/blender/blenkernel/intern/object_update.c +++ b/source/blender/blenkernel/intern/object_update.c @@ -152,8 +152,6 @@ void BKE_object_handle_data_update( Scene *scene, Object *ob) { - float ctime = BKE_scene_frame_get(scene); - DEG_debug_print_eval(depsgraph, __func__, ob->id.name, ob); /* includes all keys and modifiers */ @@ -209,12 +207,6 @@ void BKE_object_handle_data_update( case OB_LATTICE: BKE_lattice_modifiers_calc(depsgraph, scene, ob); break; - - case OB_EMPTY: - if (ob->empty_drawtype == OB_EMPTY_IMAGE && ob->data) - if (BKE_image_is_animated(ob->data)) - BKE_image_user_check_frame_calc(ob->iuser, (int)ctime); - break; } /* particles */ diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 9f665fee8b6..b055c3695bc 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -1524,7 +1524,7 @@ void BKE_scene_graph_update_for_newframe(Depsgraph *depsgraph, /* Update animated image textures for particles, modifiers, gpu, etc, * call this at the start so modifiers with textures don't lag 1 frame. */ - BKE_image_update_frame(bmain, scene->r.cfra); + BKE_image_editors_update_frame(bmain, scene->r.cfra); BKE_sound_set_cfra(scene->r.cfra); DEG_graph_relations_update(depsgraph, bmain, scene, view_layer); /* Update animated cache files for modifiers. |