diff options
author | Brecht Van Lommel <brecht@blender.org> | 2020-07-16 15:54:45 +0300 |
---|---|---|
committer | Brecht Van Lommel <brecht@blender.org> | 2020-07-16 16:50:43 +0300 |
commit | c7aa0f9d743ee9cafe91b4a51d9f1ecc5e437d71 (patch) | |
tree | 01fc830b9a6027b524083dac89ac399bc4bd022e /source/blender/blenkernel | |
parent | 279cc34343d55f78d2356de94e7dfccacfeaaa00 (diff) |
Fix T78537: too much memory usage rendering animation with persistent images
For still images, always return 0 for the current frame number. This ensures
Cycles can detects that the image did not change.
Based on patch by Vincent Blankfield.
Differential Revision: https://developer.blender.org/D8242
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/intern/image.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index 647349108e1..a246265c3f2 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -5213,24 +5213,32 @@ int BKE_image_user_frame_get(const ImageUser *iuser, int cfra, bool *r_is_in_ran void BKE_image_user_frame_calc(Image *ima, ImageUser *iuser, int cfra) { if (iuser) { - bool is_in_range; - const int framenr = BKE_image_user_frame_get(iuser, cfra, &is_in_range); + if (ima && BKE_image_is_animated(ima)) { + /* Compute current frame for animated image. */ + bool is_in_range; + const int framenr = BKE_image_user_frame_get(iuser, cfra, &is_in_range); - if (is_in_range) { - iuser->flag |= IMA_USER_FRAME_IN_RANGE; + if (is_in_range) { + iuser->flag |= IMA_USER_FRAME_IN_RANGE; + } + else { + iuser->flag &= ~IMA_USER_FRAME_IN_RANGE; + } + + iuser->framenr = framenr; } else { - iuser->flag &= ~IMA_USER_FRAME_IN_RANGE; + /* Set fixed frame number for still image. */ + iuser->framenr = 0; + iuser->flag |= IMA_USER_FRAME_IN_RANGE; } - iuser->framenr = framenr; - - if (ima && BKE_image_is_animated(ima) && ima->gpuframenr != framenr) { + if (ima && ima->gpuframenr != iuser->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; + ima->gpuframenr = iuser->framenr; } if (iuser->ok == 0) { |