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:
authorBrecht Van Lommel <brecht@blender.org>2020-07-16 15:54:45 +0300
committerBrecht Van Lommel <brecht@blender.org>2020-07-16 16:50:43 +0300
commitc7aa0f9d743ee9cafe91b4a51d9f1ecc5e437d71 (patch)
tree01fc830b9a6027b524083dac89ac399bc4bd022e
parent279cc34343d55f78d2356de94e7dfccacfeaaa00 (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.c26
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) {