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:
Diffstat (limited to 'source/blender/blenkernel/intern/image.c')
-rw-r--r--source/blender/blenkernel/intern/image.c49
1 files changed, 20 insertions, 29 deletions
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);
}
}
}