Fix T63867: image sequence not updating in Eevee animation render
This commit is contained in:
@@ -32,7 +32,7 @@
|
||||
* todo: clean this up ... */
|
||||
|
||||
extern "C" {
|
||||
void BKE_image_user_frame_calc(void *iuser, int cfra);
|
||||
void BKE_image_user_frame_calc(void *ima, void *iuser, int cfra);
|
||||
void BKE_image_user_file_path(void *iuser, void *ima, char *path);
|
||||
unsigned char *BKE_image_get_pixels_for_frame(void *image, int frame);
|
||||
float *BKE_image_get_float_pixels_for_frame(void *image, int frame);
|
||||
@@ -233,14 +233,14 @@ static inline int render_resolution_y(BL::RenderSettings &b_render)
|
||||
static inline string image_user_file_path(BL::ImageUser &iuser, BL::Image &ima, int cfra)
|
||||
{
|
||||
char filepath[1024];
|
||||
BKE_image_user_frame_calc(iuser.ptr.data, cfra);
|
||||
BKE_image_user_frame_calc(NULL, iuser.ptr.data, cfra);
|
||||
BKE_image_user_file_path(iuser.ptr.data, ima.ptr.data, filepath);
|
||||
return string(filepath);
|
||||
}
|
||||
|
||||
static inline int image_user_frame_number(BL::ImageUser &iuser, int cfra)
|
||||
{
|
||||
BKE_image_user_frame_calc(iuser.ptr.data, cfra);
|
||||
BKE_image_user_frame_calc(NULL, iuser.ptr.data, cfra);
|
||||
return iuser.frame_current();
|
||||
}
|
||||
|
||||
|
||||
@@ -228,7 +228,7 @@ void BKE_image_verify_viewer_views(const struct RenderData *rd,
|
||||
struct ImageUser *iuser);
|
||||
|
||||
/* called on frame change or before render */
|
||||
void BKE_image_user_frame_calc(struct ImageUser *iuser, int cfra);
|
||||
void BKE_image_user_frame_calc(struct Image *ima, 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_editors_update_frame(const struct Main *bmain, int cfra);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1952,6 +1952,7 @@ void blo_end_image_pointer_map(FileData *fd, Main *oldmain)
|
||||
ima->cache = newimaadr(fd, ima->cache);
|
||||
if (ima->cache == NULL) {
|
||||
ima->gpuflag = 0;
|
||||
ima->gpuframenr = INT_MAX;
|
||||
for (i = 0; i < TEXTARGET_COUNT; i++) {
|
||||
ima->gputexture[i] = NULL;
|
||||
}
|
||||
@@ -4226,6 +4227,7 @@ static void direct_link_image(FileData *fd, Image *ima)
|
||||
/* if not restored, we keep the binded opengl index */
|
||||
if (!ima->cache) {
|
||||
ima->gpuflag = 0;
|
||||
ima->gpuframenr = INT_MAX;
|
||||
for (int i = 0; i < TEXTARGET_COUNT; i++) {
|
||||
ima->gputexture[i] = NULL;
|
||||
}
|
||||
|
||||
@@ -80,7 +80,7 @@ void ImageNode::convertToOperations(NodeConverter &converter,
|
||||
int framenumber = context.getFramenumber();
|
||||
int numberOfOutputs = this->getNumberOfOutputSockets();
|
||||
bool outputStraightAlpha = (editorNode->custom1 & CMP_NODE_IMAGE_USE_STRAIGHT_OUTPUT) != 0;
|
||||
BKE_image_user_frame_calc(imageuser, context.getFramenumber());
|
||||
BKE_image_user_frame_calc(image, imageuser, context.getFramenumber());
|
||||
/* force a load, we assume iuser index will be set OK anyway */
|
||||
if (image && image->type == IMA_TYPE_MULTILAYER) {
|
||||
bool is_multilayer_ok = false;
|
||||
|
||||
@@ -798,7 +798,7 @@ void uiTemplateImage(uiLayout *layout,
|
||||
ImageUser *iuser = userptr->data;
|
||||
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
BKE_image_user_frame_calc(iuser, (int)scene->r.cfra);
|
||||
BKE_image_user_frame_calc(ima, iuser, (int)scene->r.cfra);
|
||||
|
||||
uiLayoutSetContextPointer(layout, "edit_image", &imaptr);
|
||||
uiLayoutSetContextPointer(layout, "edit_image_user", userptr);
|
||||
|
||||
@@ -1559,7 +1559,7 @@ static int image_match_len_exec(bContext *C, wmOperator *UNUSED(op))
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
iuser->frames = IMB_anim_get_duration(anim, IMB_TC_RECORD_RUN);
|
||||
BKE_image_user_frame_calc(iuser, scene->r.cfra);
|
||||
BKE_image_user_frame_calc(ima, iuser, scene->r.cfra);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
@@ -292,8 +292,7 @@ static void image_refresh(const bContext *C, ScrArea *sa)
|
||||
Image *ima;
|
||||
|
||||
ima = ED_space_image(sima);
|
||||
|
||||
BKE_image_user_frame_calc(&sima->iuser, scene->r.cfra);
|
||||
BKE_image_user_frame_calc(ima, &sima->iuser, scene->r.cfra);
|
||||
|
||||
/* check if we have to set the image from the editmesh */
|
||||
if (ima && (ima->source == IMA_SRC_VIEWER && sima->mode == SI_MODE_MASK)) {
|
||||
|
||||
@@ -366,7 +366,7 @@ static void view3d_draw_bgpic(Scene *scene,
|
||||
|
||||
ImageUser iuser = bgpic->iuser;
|
||||
iuser.scene = scene; /* Needed for render results. */
|
||||
BKE_image_user_frame_calc(&iuser, (int)DEG_get_ctime(depsgraph));
|
||||
BKE_image_user_frame_calc(ima, &iuser, (int)DEG_get_ctime(depsgraph));
|
||||
if (ima->source == IMA_SRC_SEQUENCE && !(iuser.flag & IMA_USER_FRAME_IN_RANGE)) {
|
||||
ibuf = NULL; /* frame is out of range, dont show */
|
||||
}
|
||||
|
||||
@@ -125,7 +125,8 @@ typedef struct Image {
|
||||
|
||||
/* GPU texture flag. */
|
||||
short gpuflag;
|
||||
char _pad2[6];
|
||||
char _pad2[2];
|
||||
int gpuframenr;
|
||||
|
||||
/** Deprecated. */
|
||||
struct PackedFile *packedfile DNA_DEPRECATED;
|
||||
|
||||
@@ -150,7 +150,7 @@ static void rna_ImageUser_update(Main *bmain, Scene *scene, PointerRNA *ptr)
|
||||
ImageUser *iuser = ptr->data;
|
||||
ID *id = ptr->id.data;
|
||||
|
||||
BKE_image_user_frame_calc(iuser, scene->r.cfra);
|
||||
BKE_image_user_frame_calc(NULL, iuser, scene->r.cfra);
|
||||
|
||||
if (id) {
|
||||
if (GS(id->name) == ID_NT) {
|
||||
|
||||
@@ -65,7 +65,7 @@ void MOD_init_texture(MappingInfoModifierData *dmd, const ModifierEvalContext *c
|
||||
}
|
||||
|
||||
if (tex->ima && BKE_image_is_animated(tex->ima)) {
|
||||
BKE_image_user_frame_calc(&tex->iuser, DEG_get_ctime(ctx->depsgraph));
|
||||
BKE_image_user_frame_calc(tex->ima, &tex->iuser, DEG_get_ctime(ctx->depsgraph));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user