From 5fba4458e9a7a995343a3432abe230c9ea293813 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 4 Apr 2018 13:51:39 +0200 Subject: Fix Cycles motion blur and engine.frame_set() not working. --- intern/cycles/blender/blender_object.cpp | 2 - source/blender/render/extern/include/RE_engine.h | 10 +- .../blender/render/intern/source/external_engine.c | 110 ++++++++++++--------- 3 files changed, 74 insertions(+), 48 deletions(-) diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp index 86c42e88e24..d0df8e1800f 100644 --- a/intern/cycles/blender/blender_object.cpp +++ b/intern/cycles/blender/blender_object.cpp @@ -633,7 +633,6 @@ void BlenderSync::sync_motion(BL::RenderSettings& b_render, frame_center_delta = shuttertime * 0.5f; } - /* TODO: move frame on depsgraph. */ float time = frame_center + subframe_center + frame_center_delta; int frame = (int)floorf(time); float subframe = time - frame; @@ -666,7 +665,6 @@ void BlenderSync::sync_motion(BL::RenderSettings& b_render, int frame = (int)floorf(time); float subframe = time - frame; - /* TODO: move frame on depsgraph. */ /* change frame */ python_thread_state_restore(python_thread_state); b_engine.frame_set(frame, subframe); diff --git a/source/blender/render/extern/include/RE_engine.h b/source/blender/render/extern/include/RE_engine.h index ad0cb34d382..2a1d51158b3 100644 --- a/source/blender/render/extern/include/RE_engine.h +++ b/source/blender/render/extern/include/RE_engine.h @@ -39,7 +39,10 @@ struct bNode; struct bNodeTree; +struct BakePixel; +struct Depsgraph; struct Depsgraph; +struct EvaluationContext; struct IDProperty; struct Main; struct Object; @@ -51,7 +54,7 @@ struct RenderLayer; struct RenderResult; struct ReportList; struct Scene; -struct BakePixel; +struct ViewLayer; /* External Engine */ @@ -133,6 +136,11 @@ typedef struct RenderEngine { struct ReportList *reports; + /* Depsgraph */ + struct EvaluationContext *eval_ctx; + struct Depsgraph *depsgraph; + struct ViewLayer *view_layer; + /* for blender internal only */ int update_flag; int job_update_flag; diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c index 285cf8d660b..617e49c5d0f 100644 --- a/source/blender/render/intern/source/external_engine.c +++ b/source/blender/render/intern/source/external_engine.c @@ -527,6 +527,65 @@ RenderData *RE_engine_get_render_data(Render *re) return &re->r; } +/* Depsgraph */ +static void engine_depsgraph_init(RenderEngine *engine, ViewLayer *view_layer) +{ + engine->eval_ctx = DEG_evaluation_context_new(DAG_EVAL_RENDER); + engine->depsgraph = DEG_graph_new(); + engine->view_layer = view_layer; + + DEG_evaluation_context_init_from_view_layer_for_render( + engine->eval_ctx, + engine->depsgraph, + engine->re->scene, + view_layer); + + BKE_scene_graph_update_tagged( + engine->eval_ctx, + engine->depsgraph, + engine->re->main, + engine->re->scene, + view_layer); +} + +static void engine_depsgraph_free(RenderEngine *engine) +{ + DEG_graph_free(engine->depsgraph); + DEG_evaluation_context_free(engine->eval_ctx); + + engine->eval_ctx = NULL; + engine->depsgraph = NULL; + engine->view_layer = NULL; +} + +void RE_engine_frame_set(RenderEngine *engine, int frame, float subframe) +{ + if(!engine->depsgraph) { + return; + } + + Render *re = engine->re; + double cfra = (double)frame + (double)subframe; + + CLAMP(cfra, MINAFRAME, MAXFRAME); + BKE_scene_frame_set(re->scene, cfra); + BKE_scene_graph_update_for_newframe(engine->eval_ctx, + engine->depsgraph, + re->main, + re->scene, + engine->view_layer); + +#ifdef WITH_PYTHON + BPy_BEGIN_ALLOW_THREADS; +#endif + +#ifdef WITH_PYTHON + BPy_END_ALLOW_THREADS; +#endif + + BKE_scene_camera_switch_update(re->scene); +} + /* Bake */ void RE_bake_engine_set_engine_parameters(Render *re, Main *bmain, Scene *scene) { @@ -583,20 +642,11 @@ bool RE_bake_engine( type->update(engine, re->main, re->scene); if (type->bake) { - EvaluationContext *eval_ctx = DEG_evaluation_context_new(DAG_EVAL_RENDER); - Depsgraph *depsgraph = DEG_graph_new(); ViewLayer *view_layer = BLI_findlink(&re->scene->view_layers, re->scene->active_view_layer); - - DEG_evaluation_context_init_from_view_layer_for_render( - eval_ctx, - depsgraph, - re->scene, - view_layer); - - BKE_scene_graph_update_tagged(eval_ctx, depsgraph, re->main, re->scene, view_layer); + engine_depsgraph_init(engine, view_layer); type->bake(engine, - depsgraph, + engine->depsgraph, re->scene, object, pass_type, @@ -607,8 +657,7 @@ bool RE_bake_engine( depth, result); - DEG_graph_free(depsgraph); - DEG_evaluation_context_free(eval_ctx); + engine_depsgraph_free(engine); } engine->tile_x = 0; @@ -632,26 +681,6 @@ bool RE_bake_engine( return true; } -void RE_engine_frame_set(RenderEngine *engine, int frame, float subframe) -{ - Render *re = engine->re; - Scene *scene = re->scene; - double cfra = (double)frame + (double)subframe; - - CLAMP(cfra, MINAFRAME, MAXFRAME); - BKE_scene_frame_set(scene, cfra); - -#ifdef WITH_PYTHON - BPy_BEGIN_ALLOW_THREADS; -#endif - -#ifdef WITH_PYTHON - BPy_END_ALLOW_THREADS; -#endif - - BKE_scene_camera_switch_update(scene); -} - /* Render */ int RE_engine_render(Render *re, int do_all) @@ -755,21 +784,12 @@ int RE_engine_render(Render *re, int do_all) if (type->render_to_image) { FOREACH_VIEW_LAYER_TO_RENDER_BEGIN(re, view_layer_iter) { - EvaluationContext *eval_ctx = DEG_evaluation_context_new(DAG_EVAL_RENDER); - Depsgraph *depsgraph = DEG_graph_new(); ViewLayer *view_layer = BLI_findstring(&re->scene->view_layers, view_layer_iter->name, offsetof(ViewLayer, name)); + engine_depsgraph_init(engine, view_layer); - DEG_evaluation_context_init_from_view_layer_for_render( - eval_ctx, - depsgraph, - re->scene, - view_layer); - - BKE_scene_graph_update_tagged(eval_ctx, depsgraph, re->main, re->scene, view_layer); - type->render_to_image(engine, depsgraph); + type->render_to_image(engine, engine->depsgraph); - DEG_graph_free(depsgraph); - DEG_evaluation_context_free(eval_ctx); + engine_depsgraph_free(engine); } FOREACH_VIEW_LAYER_TO_RENDER_END; } -- cgit v1.2.3