diff options
author | Brecht Van Lommel <brecht@blender.org> | 2020-07-16 15:54:45 +0300 |
---|---|---|
committer | Jeroen Bakker <jeroen@blender.org> | 2020-08-12 09:58:51 +0300 |
commit | a71490c4b2fc08d677c3c20403c847753aa52bf4 (patch) | |
tree | 58856932851a3588102d2988f372994e6942d830 | |
parent | f47f9a04b1bf8b6497981b302c22c7ae6333fdd2 (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
-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 9ce0bf90984..2eaafdf1356 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -5180,24 +5180,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) { |