Fix T69060: File Output Node does not work with Time Remapping
Problem is that the RenderEngines will change the RenderData cfra when rendering (when time remapping is used -- at least workbench/eevee/ gpencil do a combination of BKE_scene_frame_get() plus RE_GetCameraWindow() which alters the RenderData cfra). Later on in the pipeline, the Compositor will use this RenderData cfra to determine the output file name for the FileOutput node. (In contrast to this, the 'regular' Output will use the Scene's RenderData -- not the Render's -- cfra [which hasnt been altered]) It is not entirely clear why RE_GetCameraWindow was setting the cfra on the Render, but it appears to be legacy OGL rendering related and is not needed anymore. Removing this will keep the cfra as needed for the Compositor FileOutput node.
This commit is contained in:
parent
d0b0a0a894
commit
ff62481f65
@ -135,9 +135,8 @@ bool EEVEE_render_init(EEVEE_Data *ved, RenderEngine *engine, struct Depsgraph *
|
||||
float winmat[4][4], viewmat[4][4], viewinv[4][4];
|
||||
/* TODO(sergey): Shall render hold pointer to an evaluated camera instead? */
|
||||
struct Object *ob_camera_eval = DEG_get_evaluated_object(depsgraph, RE_GetCamera(engine->re));
|
||||
float frame = BKE_scene_frame_get(scene);
|
||||
|
||||
RE_GetCameraWindow(engine->re, ob_camera_eval, frame, winmat);
|
||||
RE_GetCameraWindow(engine->re, ob_camera_eval, winmat);
|
||||
RE_GetCameraWindowWithOverscan(engine->re, winmat, g_data->overscan);
|
||||
RE_GetCameraModelMatrix(engine->re, ob_camera_eval, viewinv);
|
||||
|
||||
|
@ -51,8 +51,7 @@ void GPENCIL_render_init(GPENCIL_Data *vedata,
|
||||
float winmat[4][4], viewmat[4][4], viewinv[4][4];
|
||||
|
||||
struct Object *camera = DEG_get_evaluated_object(depsgraph, RE_GetCamera(engine->re));
|
||||
float frame = BKE_scene_frame_get(scene);
|
||||
RE_GetCameraWindow(engine->re, camera, frame, winmat);
|
||||
RE_GetCameraWindow(engine->re, camera, winmat);
|
||||
RE_GetCameraModelMatrix(engine->re, camera, viewinv);
|
||||
|
||||
invert_m4_m4(viewmat, viewinv);
|
||||
|
@ -52,14 +52,12 @@ static void workbench_render_cache(void *vedata,
|
||||
static void workbench_render_matrices_init(RenderEngine *engine, Depsgraph *depsgraph)
|
||||
{
|
||||
/* TODO(sergey): Shall render hold pointer to an evaluated camera instead? */
|
||||
Scene *scene = DEG_get_evaluated_scene(depsgraph);
|
||||
struct Object *ob_camera_eval = DEG_get_evaluated_object(depsgraph, RE_GetCamera(engine->re));
|
||||
float frame = BKE_scene_frame_get(scene);
|
||||
|
||||
/* Set the persective, view and window matrix. */
|
||||
float winmat[4][4], viewmat[4][4], viewinv[4][4];
|
||||
|
||||
RE_GetCameraWindow(engine->re, ob_camera_eval, frame, winmat);
|
||||
RE_GetCameraWindow(engine->re, ob_camera_eval, winmat);
|
||||
RE_GetCameraModelMatrix(engine->re, ob_camera_eval, viewinv);
|
||||
|
||||
invert_m4_m4(viewmat, viewinv);
|
||||
|
@ -363,7 +363,7 @@ struct RenderPass *RE_pass_find_by_type(volatile struct RenderLayer *rl,
|
||||
#define RE_BAKE_DISPLACEMENT 1
|
||||
#define RE_BAKE_AO 2
|
||||
|
||||
void RE_GetCameraWindow(struct Render *re, struct Object *camera, int frame, float mat[4][4]);
|
||||
void RE_GetCameraWindow(struct Render *re, struct Object *camera, float mat[4][4]);
|
||||
void RE_GetCameraWindowWithOverscan(struct Render *re, float mat[4][4], float overscan);
|
||||
void RE_GetCameraModelMatrix(struct Render *re, struct Object *camera, float r_mat[4][4]);
|
||||
struct Scene *RE_GetScene(struct Render *re);
|
||||
|
@ -211,9 +211,8 @@ void RE_SetCamera(Render *re, Object *cam_ob)
|
||||
re_camera_params_get(re, ¶ms);
|
||||
}
|
||||
|
||||
void RE_GetCameraWindow(struct Render *re, struct Object *camera, int frame, float mat[4][4])
|
||||
void RE_GetCameraWindow(struct Render *re, struct Object *camera, float mat[4][4])
|
||||
{
|
||||
re->r.cfra = frame;
|
||||
RE_SetCamera(re, camera);
|
||||
copy_m4_m4(mat, re->winmat);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user