diff options
36 files changed, 311 insertions, 358 deletions
diff --git a/intern/cycles/blender/addon/__init__.py b/intern/cycles/blender/addon/__init__.py index 1cb7835d14d..e5a0cbc316f 100644 --- a/intern/cycles/blender/addon/__init__.py +++ b/intern/cycles/blender/addon/__init__.py @@ -79,8 +79,8 @@ class CyclesRender(bpy.types.RenderEngine): else: engine.reset(self, data, scene) - def render_to_image(self, depsgraph): - engine.render(self, depsgraph) + def render_to_image(self, data, scene): + engine.render(self, data, scene) def bake(self, scene, obj, pass_type, pass_filter, object_id, pixel_array, num_pixels, depth, result): engine.bake(self, obj, pass_type, pass_filter, object_id, pixel_array, num_pixels, depth, result) diff --git a/intern/cycles/blender/blender_python.cpp b/intern/cycles/blender/blender_python.cpp index 9ade27d57d7..17bf8ceef36 100644 --- a/intern/cycles/blender/blender_python.cpp +++ b/intern/cycles/blender/blender_python.cpp @@ -203,10 +203,10 @@ static PyObject *exit_func(PyObject * /*self*/, PyObject * /*args*/) static PyObject *create_func(PyObject * /*self*/, PyObject *args) { - PyObject *pyengine, *pyuserpref, *pydata, *pygraph, *pyscene, *pyregion, *pyv3d, *pyrv3d; + PyObject *pyengine, *pyuserpref, *pydata, *pyscene, *pyregion, *pyv3d, *pyrv3d; int preview_osl; - if(!PyArg_ParseTuple(args, "OOOOOOOOi", &pyengine, &pyuserpref, &pydata, &pygraph, &pyscene, + if(!PyArg_ParseTuple(args, "OOOOOOOi", &pyengine, &pyuserpref, &pydata, &pyscene, &pyregion, &pyv3d, &pyrv3d, &preview_osl)) { return NULL; @@ -225,10 +225,6 @@ static PyObject *create_func(PyObject * /*self*/, PyObject *args) RNA_main_pointer_create((Main*)PyLong_AsVoidPtr(pydata), &dataptr); BL::BlendData data(dataptr); - PointerRNA graphptr; - RNA_id_pointer_create((ID*)PyLong_AsVoidPtr(pygraph), &graphptr); - BL::Depsgraph graph(graphptr); - PointerRNA sceneptr; RNA_id_pointer_create((ID*)PyLong_AsVoidPtr(pyscene), &sceneptr); BL::Scene scene(sceneptr); @@ -253,7 +249,7 @@ static PyObject *create_func(PyObject * /*self*/, PyObject *args) int width = region.width(); int height = region.height(); - session = new BlenderSession(engine, userpref, data, graph, scene, v3d, rv3d, width, height); + session = new BlenderSession(engine, userpref, data, scene, v3d, rv3d, width, height); } else { /* override some settings for preview */ @@ -265,7 +261,7 @@ static PyObject *create_func(PyObject * /*self*/, PyObject *args) } /* offline session or preview render */ - session = new BlenderSession(engine, userpref, data, graph, scene); + session = new BlenderSession(engine, userpref, data, scene); } python_thread_state_save(&session->python_thread_state); diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp index a40ba0706b4..952410c03f4 100644 --- a/intern/cycles/blender/blender_session.cpp +++ b/intern/cycles/blender/blender_session.cpp @@ -52,15 +52,12 @@ int BlenderSession::end_resumable_chunk = 0; BlenderSession::BlenderSession(BL::RenderEngine& b_engine, BL::UserPreferences& b_userpref, BL::BlendData& b_data, - BL::Depsgraph& b_depsgraph, BL::Scene& b_scene) : b_engine(b_engine), b_userpref(b_userpref), b_data(b_data), b_render(b_engine.render()), - b_depsgraph(b_depsgraph), b_scene(b_scene), - b_view_layer(b_engine.view_layer()), b_v3d(PointerRNA_NULL), b_rv3d(PointerRNA_NULL), python_thread_state(NULL) @@ -79,7 +76,6 @@ BlenderSession::BlenderSession(BL::RenderEngine& b_engine, BlenderSession::BlenderSession(BL::RenderEngine& b_engine, BL::UserPreferences& b_userpref, BL::BlendData& b_data, - BL::Depsgraph& b_depsgraph, BL::Scene& b_scene, BL::SpaceView3D& b_v3d, BL::RegionView3D& b_rv3d, @@ -88,9 +84,7 @@ BlenderSession::BlenderSession(BL::RenderEngine& b_engine, b_userpref(b_userpref), b_data(b_data), b_render(b_scene.render()), - b_depsgraph(b_depsgraph), b_scene(b_scene), - b_view_layer(b_engine.view_layer()), b_v3d(b_v3d), b_rv3d(b_rv3d), width(width), @@ -147,6 +141,13 @@ void BlenderSession::create_session() session->scene = scene; +#if 0 + /* There is no single depsgraph to use for the entire render. + * So we need to handle this differently. + * + * We could loop over the final render result render layers in pipeline and keep Cycles unaware of multiple layers, + * or perhaps move syncing further down in the pipeline. + */ /* create sync */ sync = new BlenderSync(b_engine, b_data, b_depsgraph, b_scene, scene, !background, session->progress); BL::Object b_camera_override(b_engine.camera_override()); @@ -169,6 +170,7 @@ void BlenderSession::create_session() sync->sync_integrator(); sync->sync_camera(b_render, b_camera_override, width, height, ""); } +#endif /* set buffer parameters */ BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_v3d, b_rv3d, scene->camera, width, height); @@ -216,6 +218,10 @@ void BlenderSession::reset_session(BL::BlendData& b_data_, BL::Scene& b_scene_) */ session->stats.mem_peak = session->stats.mem_used; +#if 0 + /* There is no single depsgraph to use for the entire render. + * See note on create_session(). + */ /* sync object should be re-created */ sync = new BlenderSync(b_engine, b_data, b_depsgraph, b_scene, scene, !background, session->progress); @@ -225,6 +231,7 @@ void BlenderSession::reset_session(BL::BlendData& b_data_, BL::Scene& b_scene_) sync->sync_view_layers(b_v3d, NULL); sync->sync_integrator(); sync->sync_camera(b_render, b_camera_override, width, height, ""); +#endif BL::SpaceView3D b_null_space_view3d(PointerRNA_NULL); BL::RegionView3D b_null_region_view3d(PointerRNA_NULL); @@ -1311,6 +1318,11 @@ bool BlenderSession::builtin_image_float_pixels(const string &builtin_name, fprintf(stderr, "Cycles error: unexpected smoke volume resolution, skipping\n"); } else { +#if 0 + /* We originally were passing view_layer here but in reality we need a whole EvaluationContext + * in the RE_point_density_minmax() function. + * Note: There is not a single EvaluationContext for the entire render. They are per RenderLayer now. + */ /* TODO(sergey): Check we're indeed in shader node tree. */ PointerRNA ptr; RNA_pointer_create(NULL, &RNA_Node, builtin_data, &ptr); @@ -1321,6 +1333,7 @@ bool BlenderSession::builtin_image_float_pixels(const string &builtin_name, int settings = background ? 1 : 0; /* 1 - render settings, 0 - vewport settings. */ b_point_density_node.calc_point_density(b_scene, b_view_layer, settings, &length, &pixels); } +#endif } return false; diff --git a/intern/cycles/blender/blender_session.h b/intern/cycles/blender/blender_session.h index 8694c9499b8..cbd2303d282 100644 --- a/intern/cycles/blender/blender_session.h +++ b/intern/cycles/blender/blender_session.h @@ -36,13 +36,11 @@ public: BlenderSession(BL::RenderEngine& b_engine, BL::UserPreferences& b_userpref, BL::BlendData& b_data, - BL::Depsgraph& b_depsgraph, BL::Scene& b_scene); BlenderSession(BL::RenderEngine& b_engine, BL::UserPreferences& b_userpref, BL::BlendData& b_data, - BL::Depsgraph& b_depsgraph, BL::Scene& b_scene, BL::SpaceView3D& b_v3d, BL::RegionView3D& b_rv3d, @@ -106,9 +104,7 @@ public: BL::UserPreferences b_userpref; BL::BlendData b_data; BL::RenderSettings b_render; - BL::Depsgraph b_depsgraph; BL::Scene b_scene; - BL::ViewLayer b_view_layer; BL::SpaceView3D b_v3d; BL::RegionView3D b_rv3d; string b_rlay_name; diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp index 08d76582f03..148db9fc3cf 100644 --- a/intern/cycles/blender/blender_sync.cpp +++ b/intern/cycles/blender/blender_sync.cpp @@ -46,6 +46,7 @@ BlenderSync::BlenderSync(BL::RenderEngine& b_engine, BL::BlendData& b_data, BL::Depsgraph& b_depsgraph, BL::Scene& b_scene, + BL::ViewLayer& b_view_layer, Scene *scene, bool preview, Progress &progress) @@ -53,7 +54,7 @@ BlenderSync::BlenderSync(BL::RenderEngine& b_engine, b_data(b_data), b_depsgraph(b_depsgraph), b_scene(b_scene), - b_view_layer(b_engine.view_layer()), + b_view_layer(b_view_layer), shader_map(&scene->shaders), object_map(&scene->objects), mesh_map(&scene->meshes), diff --git a/intern/cycles/blender/blender_sync.h b/intern/cycles/blender/blender_sync.h index c4dd17714be..ce9155ee7ef 100644 --- a/intern/cycles/blender/blender_sync.h +++ b/intern/cycles/blender/blender_sync.h @@ -54,6 +54,7 @@ public: BL::BlendData& b_data, BL::Depsgraph& b_graph, BL::Scene& b_scene, + BL::ViewLayer& b_view_layer, Scene *scene, bool preview, Progress &progress); diff --git a/source/blender/blenkernel/intern/dynamicpaint.c b/source/blender/blenkernel/intern/dynamicpaint.c index 349f995819c..22a1f9b4b18 100644 --- a/source/blender/blenkernel/intern/dynamicpaint.c +++ b/source/blender/blenkernel/intern/dynamicpaint.c @@ -3348,7 +3348,7 @@ typedef struct BrushMaterials { /* Initialize materials for brush object: * Calculates inverse matrices for linked objects, updates * volume caches etc. */ -static void dynamicPaint_updateBrushMaterials(Object *brushOb, Material *ui_mat, Scene *scene, BrushMaterials *bMats) +static void dynamicPaint_updateBrushMaterials(const EvaluationContext *eval_ctx, Object *brushOb, Material *ui_mat, Scene *scene, BrushMaterials *bMats) { /* Calculate inverse transformation matrix * for this object */ @@ -3363,13 +3363,13 @@ static void dynamicPaint_updateBrushMaterials(Object *brushOb, Material *ui_mat, if (tot) { bMats->ob_mats = MEM_callocN(sizeof(Material *) * (tot), "BrushMaterials"); for (i = 0; i < tot; i++) { - bMats->ob_mats[i] = RE_sample_material_init(give_current_material(brushOb, (i + 1)), scene); + bMats->ob_mats[i] = RE_sample_material_init(eval_ctx, give_current_material(brushOb, (i + 1)), scene); } } bMats->tot = tot; } else { - bMats->mat = RE_sample_material_init(ui_mat, scene); + bMats->mat = RE_sample_material_init(eval_ctx, ui_mat, scene); } } @@ -6087,7 +6087,7 @@ static int dynamicPaint_doStep(const struct EvaluationContext *eval_ctx, Scene * } /* Prepare materials if required */ if (brush_usesMaterial(brush, scene)) - dynamicPaint_updateBrushMaterials(brushObj, brush->mat, scene, &bMats); + dynamicPaint_updateBrushMaterials(eval_ctx, brushObj, brush->mat, scene, &bMats); /* Apply brush on the surface depending on it's collision type */ if (brush->psys && brush->psys->part && diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 7032541f90d..f263f23fb92 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -1455,11 +1455,6 @@ void BKE_scene_graph_update_for_newframe(EvaluationContext *eval_ctx, Scene *scene, ViewLayer *view_layer) { - /* TODO(sergey): Temporary solution for until pipeline.c is ported. */ - if (view_layer == NULL) { - view_layer = DEG_get_evaluated_view_layer(depsgraph); - BLI_assert(view_layer != NULL); - } /* TODO(sergey): Some functions here are changing global state, * for example, clearing update tags from bmain. */ diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c index 950f7ad9957..b11c1583236 100644 --- a/source/blender/blenkernel/intern/sequencer.c +++ b/source/blender/blenkernel/intern/sequencer.c @@ -3269,9 +3269,10 @@ static ImBuf *seq_render_scene_strip(const SeqRenderData *context, Sequence *seq // have_seq = (scene->r.scemode & R_DOSEQ) && scene->ed && scene->ed->seqbase.first); /* UNUSED */ have_comp = (scene->r.scemode & R_DOCOMP) && scene->use_nodes && scene->nodetree; - /* Get depsgraph and scene layer for the strip. */ + /* Get view layer for the strip. */ ViewLayer *view_layer = BKE_view_layer_from_scene_get(scene); - Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene, view_layer, true); + /* Depsgraph will be NULL when doing rendering. */ + Depsgraph *depsgraph = NULL; orig_data.scemode = scene->r.scemode; orig_data.cfra = scene->r.cfra; @@ -3329,6 +3330,7 @@ static ImBuf *seq_render_scene_strip(const SeqRenderData *context, Sequence *seq /* opengl offscreen render */ context->eval_ctx->engine_type = RE_engines_find(scene->view_render.engine_id); + depsgraph = BKE_scene_get_depsgraph(scene, view_layer, true); BKE_scene_graph_update_for_newframe(context->eval_ctx, depsgraph, context->bmain, scene, view_layer); ibuf = sequencer_view3d_cb( /* set for OpenGL render (NULL when scrubbing) */ @@ -3360,15 +3362,7 @@ static ImBuf *seq_render_scene_strip(const SeqRenderData *context, Sequence *seq if (re == NULL) re = RE_NewSceneRender(scene); - /* NOTE: Without this tag rendering from command line fails. - * TODO(sergey): Need some proper solution with ported - * BKE_scene_set_background() or DEG_on_visible_change() ? - */ - RE_SetDepsgraph(re, depsgraph); - DEG_graph_id_tag_update(context->bmain, depsgraph, &scene->id, 0); - - BKE_scene_graph_update_for_newframe(context->eval_ctx, depsgraph, context->bmain, scene, view_layer); - RE_BlenderFrame(re, context->bmain, scene, NULL, camera, scene->lay, frame, false); + RE_BlenderFrame(re, context->bmain, scene, view_layer, camera, scene->lay, frame, false); /* restore previous state after it was toggled on & off by RE_BlenderFrame */ G.is_rendering = is_rendering; @@ -3426,7 +3420,7 @@ finally: scene->r.cfra = orig_data.cfra; scene->r.subframe = orig_data.subframe; - if (is_frame_update) { + if (is_frame_update && (depsgraph != NULL)) { BKE_scene_graph_update_for_newframe(context->eval_ctx, depsgraph, context->bmain, scene, view_layer); } diff --git a/source/blender/compositor/CMakeLists.txt b/source/blender/compositor/CMakeLists.txt index 3e1dd83112a..a141495e5ae 100644 --- a/source/blender/compositor/CMakeLists.txt +++ b/source/blender/compositor/CMakeLists.txt @@ -31,6 +31,7 @@ set(INC ../blenkernel ../blenlib ../blentranslation + ../depsgraph ../imbuf ../makesdna ../makesrna diff --git a/source/blender/depsgraph/DEG_depsgraph.h b/source/blender/depsgraph/DEG_depsgraph.h index 8110899048d..e96ef847137 100644 --- a/source/blender/depsgraph/DEG_depsgraph.h +++ b/source/blender/depsgraph/DEG_depsgraph.h @@ -224,6 +224,12 @@ void DEG_evaluation_context_init_from_scene( const eObjectMode object_mode, eEvaluationMode mode); +void DEG_evaluation_context_init_from_view_layer_for_render( + struct EvaluationContext *eval_ctx, + struct Depsgraph *depsgraph, + struct Scene *scene, + struct ViewLayer *view_layer); + /* Free evaluation context. */ void DEG_evaluation_context_free(struct EvaluationContext *eval_ctx); diff --git a/source/blender/depsgraph/intern/depsgraph_eval.cc b/source/blender/depsgraph/intern/depsgraph_eval.cc index 4fb5a8ff580..ddb049a0043 100644 --- a/source/blender/depsgraph/intern/depsgraph_eval.cc +++ b/source/blender/depsgraph/intern/depsgraph_eval.cc @@ -32,6 +32,7 @@ #include "MEM_guardedalloc.h" +#include "BLI_listbase.h" #include "BLI_utildefines.h" #include "BLI_ghash.h" @@ -92,6 +93,24 @@ void DEG_evaluation_context_init_from_scene( eval_ctx->object_mode = object_mode; } +void DEG_evaluation_context_init_from_view_layer_for_render( + EvaluationContext *eval_ctx, + Depsgraph *depsgraph, + Scene *scene, + ViewLayer *view_layer) +{ + /* ViewLayer may come from a copy of scene.viewlayers, we need to find the original though. */ + ViewLayer *view_layer_original = (ViewLayer *)BLI_findstring(&scene->view_layers, view_layer->name, offsetof(ViewLayer, name)); + BLI_assert(view_layer_original != NULL); + + DEG_evaluation_context_init(eval_ctx, DAG_EVAL_RENDER); + eval_ctx->ctime = BKE_scene_frame_get(scene); + eval_ctx->object_mode = OB_MODE_OBJECT; + eval_ctx->depsgraph = depsgraph; + eval_ctx->view_layer = view_layer_original; + eval_ctx->engine_type = NULL; +} + /* Free evaluation context. */ void DEG_evaluation_context_free(EvaluationContext *eval_ctx) { diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h index 1a4950bbf97..203fb80c0a0 100644 --- a/source/blender/draw/intern/DRW_render.h +++ b/source/blender/draw/intern/DRW_render.h @@ -410,7 +410,7 @@ struct DefaultTextureList *DRW_viewport_texture_list_get(void); void DRW_viewport_request_redraw(void); -void DRW_render_to_image(struct RenderEngine *re, struct Depsgraph *depsgraph); +void DRW_render_to_image(struct RenderEngine *engine, struct Depsgraph *graph); void DRW_render_object_iter( void *vedata, struct RenderEngine *engine, struct Depsgraph *graph, void (*callback)(void *vedata, struct Object *ob, struct RenderEngine *engine, struct Depsgraph *graph)); diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index dafd16be270..baa76518270 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -3664,11 +3664,11 @@ void DRW_draw_render_loop_offscreen( void DRW_render_to_image(RenderEngine *engine, struct Depsgraph *depsgraph) { Scene *scene = DEG_get_evaluated_scene(depsgraph); + ViewLayer *view_layer = DEG_get_evaluated_view_layer(depsgraph); RenderEngineType *engine_type = engine->type; DrawEngineType *draw_engine_type = engine_type->draw_engine; RenderData *r = &scene->r; Render *render = engine->re; - const EvaluationContext *eval_ctx = RE_GetEvalCtx(render); /* Changing Context */ DRW_opengl_context_enable(); /* IMPORTANT: We dont support immediate mode in render mode! @@ -3682,7 +3682,7 @@ void DRW_render_to_image(RenderEngine *engine, struct Depsgraph *depsgraph) DST.options.draw_background = scene->r.alphamode == R_ADDSKY; DST.draw_ctx = (DRWContextState){ - NULL, NULL, NULL, scene, NULL, NULL, engine_type, depsgraph, eval_ctx->object_mode, NULL, + NULL, NULL, NULL, scene, view_layer, NULL, engine_type, depsgraph, OB_MODE_OBJECT, NULL, }; drw_context_state_init(); @@ -3699,9 +3699,7 @@ void DRW_render_to_image(RenderEngine *engine, struct Depsgraph *depsgraph) glDisable(GL_SCISSOR_TEST); glViewport(0, 0, size[0], size[1]); - /* Main rendering loop. */ - - const float *render_size = DRW_viewport_size_get(); + /* Main rendering. */ rctf view_rect; rcti render_rect; RE_GetViewPlane(render, &view_rect, &render_rect); @@ -3710,33 +3708,30 @@ void DRW_render_to_image(RenderEngine *engine, struct Depsgraph *depsgraph) } /* Init render result. */ - RenderResult *render_result = RE_engine_begin_result(engine, 0, 0, (int)render_size[0], (int)render_size[1], NULL, NULL); - + RenderResult *render_result = RE_engine_begin_result( + engine, + 0, + 0, + (int)size[0], + (int)size[1], + view_layer->name, + /* RR_ALL_VIEWS */ NULL); + + RenderLayer *render_layer = render_result->layers.first; for (RenderView *render_view = render_result->views.first; render_view != NULL; render_view = render_view->next) { RE_SetActiveRenderView(render, render_view->name); - for (RenderLayer *render_layer = render_result->layers.first; - render_layer != NULL; - render_layer = render_layer->next) - { - ViewLayer *view_layer = BLI_findstring(&scene->view_layers, render_layer->name, offsetof(ViewLayer, name)); - DST.draw_ctx.view_layer = view_layer; - - /* TODO(dfelinto/sergey) we should not get depsgraph from scene. - * For rendering depsgraph is to be owned by Render. */ - DST.draw_ctx.depsgraph = BKE_scene_get_depsgraph(scene, view_layer, true); - - engine_type->draw_engine->render_to_image(data, engine, render_layer, &render_rect); - DST.buffer_finish_called = false; - /* Force cache to reset. */ - drw_viewport_cache_resize(); - } + engine_type->draw_engine->render_to_image(data, engine, render_layer, &render_rect); + DST.buffer_finish_called = false; } RE_engine_end_result(engine, render_result, false, false, false); + /* Force cache to reset. */ + drw_viewport_cache_resize(); + /* TODO grease pencil */ GPU_viewport_free(DST.viewport); diff --git a/source/blender/editors/object/object_bake.c b/source/blender/editors/object/object_bake.c index a13df441c5f..e23329a7a68 100644 --- a/source/blender/editors/object/object_bake.c +++ b/source/blender/editors/object/object_bake.c @@ -581,6 +581,7 @@ typedef struct BakeRender { Render *re; Main *main; Scene *scene; + ViewLayer *view_layer; struct Object *actob; int result, ready; @@ -630,6 +631,7 @@ static void init_bake_internal(BakeRender *bkr, bContext *C) bkr->sa = sc ? BKE_screen_find_big_area(sc, SPACE_IMAGE, 10) : NULL; /* can be NULL */ bkr->main = CTX_data_main(C); bkr->scene = scene; + bkr->view_layer = view_layer; bkr->actob = (scene->r.bake_flag & R_BAKE_TO_ACTIVE) ? OBACT(view_layer) : NULL; bkr->re = RE_NewRender("_Bake View_"); @@ -735,7 +737,7 @@ static void bake_startjob(void *bkv, short *stop, short *do_update, float *progr RE_test_break_cb(bkr->re, NULL, thread_break); G.is_break = false; /* BKE_blender_test_break uses this global */ - RE_Database_Baking(bkr->re, bmain, scene, scene->lay, scene->r.bake_mode, bkr->actob); + RE_Database_Baking(bkr->re, bmain, scene, bkr->view_layer, scene->lay, scene->r.bake_mode, bkr->actob); /* baking itself is threaded, cannot use test_break in threads. we also update optional imagewindow */ bkr->result = RE_bake_shade_all_selected(bkr->re, scene->r.bake_mode, bkr->actob, bkr->do_update, bkr->progress); @@ -843,7 +845,6 @@ static int bake_image_exec(bContext *C, wmOperator *op) { Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); - ViewLayer *view_layer = CTX_data_view_layer(C); int result = OPERATOR_CANCELLED; if (is_multires_bake(scene)) { @@ -863,7 +864,8 @@ static int bake_image_exec(bContext *C, wmOperator *op) RE_test_break_cb(bkr.re, NULL, thread_break); G.is_break = false; /* BKE_blender_test_break uses this global */ - RE_Database_Baking(bkr.re, bmain, scene, scene->lay, scene->r.bake_mode, (scene->r.bake_flag & R_BAKE_TO_ACTIVE) ? OBACT(view_layer) : NULL); + RE_Database_Baking(bkr.re, bmain, scene, bkr.view_layer, scene->lay, scene->r.bake_mode, + (scene->r.bake_flag & R_BAKE_TO_ACTIVE) ? OBACT(bkr.view_layer) : NULL); /* baking itself is threaded, cannot use test_break in threads */ BLI_threadpool_init(&threads, do_bake_render, 1); diff --git a/source/blender/editors/object/object_bake_api.c b/source/blender/editors/object/object_bake_api.c index c8bcc9224e9..acf3f73c9c6 100644 --- a/source/blender/editors/object/object_bake_api.c +++ b/source/blender/editors/object/object_bake_api.c @@ -56,9 +56,11 @@ #include "BKE_report.h" #include "BKE_modifier.h" #include "BKE_mesh.h" +#include "BKE_scene.h" #include "BKE_screen.h" #include "DEG_depsgraph.h" +#include "DEG_depsgraph_build.h" #include "RE_engine.h" #include "RE_pipeline.h" @@ -84,8 +86,8 @@ static void bake_set_props(wmOperator *op, Scene *scene); typedef struct BakeAPIRender { Object *ob; Main *main; - Depsgraph *depsgraph; Scene *scene; + ViewLayer *view_layer; ReportList *reports; ListBase selected_objects; @@ -634,7 +636,8 @@ static Mesh *bake_mesh_new_from_object(EvaluationContext *eval_ctx, Main *bmain, } static int bake( - Render *re, Main *bmain, Depsgraph *graph, Scene *scene, Object *ob_low, ListBase *selected_objects, ReportList *reports, + Render *re, Main *bmain, Scene *scene, ViewLayer *view_layer, Object *ob_low, ListBase *selected_objects, + ReportList *reports, const eScenePassType pass_type, const int pass_filter, const int margin, const eBakeSaveMode save_mode, const bool is_clear, const bool is_split_materials, const bool is_automatic_name, const bool is_selected_to_active, const bool is_cage, @@ -642,6 +645,10 @@ static int bake( const char *custom_cage, const char *filepath, const int width, const int height, const char *identifier, ScrArea *sa, const char *uv_layer) { + EvaluationContext *eval_ctx = DEG_evaluation_context_new(DAG_EVAL_RENDER); + Depsgraph *depsgraph = DEG_graph_new(); + DEG_evaluation_context_init_from_view_layer_for_render(eval_ctx, depsgraph, scene, view_layer); + int op_result = OPERATOR_CANCELLED; bool ok = false; @@ -673,7 +680,7 @@ static int bake( size_t num_pixels; int tot_materials; - RE_bake_engine_set_engine_parameters(re, bmain, graph, scene); + RE_bake_engine_set_engine_parameters(re, bmain, scene); if (!RE_bake_has_engine(re)) { BKE_report(reports, RPT_ERROR, "Current render engine does not support baking"); @@ -783,8 +790,16 @@ static int bake( } } + /* Make sure depsgraph is up to date. */ + DEG_graph_build_from_view_layer(depsgraph, bmain, scene, view_layer); + BKE_scene_graph_update_tagged(eval_ctx, + depsgraph, + bmain, + scene, + view_layer); + /* get the mesh as it arrives in the renderer */ - me_low = bake_mesh_new_from_object(RE_GetEvalCtx(re), bmain, scene, ob_low); + me_low = bake_mesh_new_from_object(eval_ctx, bmain, scene, ob_low); /* populate the pixel array with the face data */ if ((is_selected_to_active && (ob_cage == NULL) && is_cage) == false) @@ -799,7 +814,7 @@ static int bake( /* prepare cage mesh */ if (ob_cage) { - me_cage = bake_mesh_new_from_object(RE_GetEvalCtx(re), bmain, scene, ob_cage); + me_cage = bake_mesh_new_from_object(eval_ctx, bmain, scene, ob_cage); if ((me_low->totpoly != me_cage->totpoly) || (me_low->totloop != me_cage->totloop)) { BKE_report(reports, RPT_ERROR, "Invalid cage object, the cage mesh must have the same number " @@ -831,7 +846,7 @@ static int bake( ob_low->modifiers = modifiers_tmp; /* get the cage mesh as it arrives in the renderer */ - me_cage = bake_mesh_new_from_object(RE_GetEvalCtx(re), bmain, scene, ob_low); + me_cage = bake_mesh_new_from_object(eval_ctx, bmain, scene, ob_low); RE_bake_pixels_populate(me_cage, pixel_array_low, num_pixels, &bake_images, uv_layer); } @@ -857,7 +872,7 @@ static int bake( tmd->quad_method = MOD_TRIANGULATE_QUAD_FIXED; tmd->ngon_method = MOD_TRIANGULATE_NGON_EARCLIP; - highpoly[i].me = bake_mesh_new_from_object(RE_GetEvalCtx(re), bmain, scene, highpoly[i].ob); + highpoly[i].me = bake_mesh_new_from_object(eval_ctx, bmain, scene, highpoly[i].ob); highpoly[i].ob->restrictflag &= ~OB_RESTRICT_RENDER; /* lowpoly to highpoly transformation matrix */ @@ -960,7 +975,7 @@ cage_cleanup: md->mode &= ~eModifierMode_Render; } - me_nores = bake_mesh_new_from_object(RE_GetEvalCtx(re), bmain, scene, ob_low); + me_nores = bake_mesh_new_from_object(eval_ctx, bmain, scene, ob_low); RE_bake_pixels_populate(me_nores, pixel_array_low, num_pixels, &bake_images, uv_layer); RE_bake_normal_world_to_tangent(pixel_array_low, num_pixels, depth, result, me_nores, normal_swizzle, ob_low->obmat); @@ -1121,7 +1136,7 @@ static void bake_init_api_data(wmOperator *op, bContext *C, BakeAPIRender *bkr) bkr->ob = CTX_data_active_object(C); bkr->main = CTX_data_main(C); - bkr->depsgraph = CTX_data_depsgraph(C); + bkr->view_layer = CTX_data_view_layer(C); bkr->scene = CTX_data_scene(C); bkr->sa = sc ? BKE_screen_find_big_area(sc, SPACE_IMAGE, 10) : NULL; @@ -1205,7 +1220,7 @@ static int bake_exec(bContext *C, wmOperator *op) if (bkr.is_selected_to_active) { result = bake( - bkr.render, bkr.main, bkr.depsgraph, bkr.scene, bkr.ob, &bkr.selected_objects, bkr.reports, + bkr.render, bkr.main, bkr.scene, bkr.view_layer, bkr.ob, &bkr.selected_objects, bkr.reports, bkr.pass_type, bkr.pass_filter, bkr.margin, bkr.save_mode, bkr.is_clear, bkr.is_split_materials, bkr.is_automatic_name, true, bkr.is_cage, bkr.cage_extrusion, bkr.normal_space, bkr.normal_swizzle, @@ -1218,7 +1233,7 @@ static int bake_exec(bContext *C, wmOperator *op) for (link = bkr.selected_objects.first; link; link = link->next) { Object *ob_iter = link->ptr.data; result = bake( - bkr.render, bkr.main, bkr.depsgraph, bkr.scene, ob_iter, NULL, bkr.reports, + bkr.render, bkr.main, bkr.scene, bkr.view_layer, ob_iter, NULL, bkr.reports, bkr.pass_type, bkr.pass_filter, bkr.margin, bkr.save_mode, is_clear, bkr.is_split_materials, bkr.is_automatic_name, false, bkr.is_cage, bkr.cage_extrusion, bkr.normal_space, bkr.normal_swizzle, @@ -1263,7 +1278,7 @@ static void bake_startjob(void *bkv, short *UNUSED(stop), short *do_update, floa if (bkr->is_selected_to_active) { bkr->result = bake( - bkr->render, bkr->main, bkr->depsgraph, bkr->scene, bkr->ob, &bkr->selected_objects, bkr->reports, + bkr->render, bkr->main, bkr->scene, bkr->view_layer, bkr->ob, &bkr->selected_objects, bkr->reports, bkr->pass_type, bkr->pass_filter, bkr->margin, bkr->save_mode, bkr->is_clear, bkr->is_split_materials, bkr->is_automatic_name, true, bkr->is_cage, bkr->cage_extrusion, bkr->normal_space, bkr->normal_swizzle, @@ -1276,7 +1291,7 @@ static void bake_startjob(void *bkv, short *UNUSED(stop), short *do_update, floa for (link = bkr->selected_objects.first; link; link = link->next) { Object *ob_iter = link->ptr.data; bkr->result = bake( - bkr->render, bkr->main, bkr->depsgraph, bkr->scene, ob_iter, NULL, bkr->reports, + bkr->render, bkr->main, bkr->scene, bkr->view_layer, ob_iter, NULL, bkr->reports, bkr->pass_type, bkr->pass_filter, bkr->margin, bkr->save_mode, is_clear, bkr->is_split_materials, bkr->is_automatic_name, false, bkr->is_cage, bkr->cage_extrusion, bkr->normal_space, bkr->normal_swizzle, diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c index 98d37eedb1b..aba4b7788f8 100644 --- a/source/blender/editors/render/render_internal.c +++ b/source/blender/editors/render/render_internal.c @@ -297,7 +297,6 @@ static int screen_render_exec(bContext *C, wmOperator *op) Scene *scene = CTX_data_scene(C); RenderEngineType *re_type = RE_engines_find(scene->view_render.engine_id); ViewLayer *view_layer = NULL; - Depsgraph *depsgraph = CTX_data_depsgraph(C); Render *re; Image *ima; View3D *v3d = CTX_wm_view3d(C); @@ -321,7 +320,6 @@ static int screen_render_exec(bContext *C, wmOperator *op) } re = RE_NewSceneRender(scene); - RE_SetDepsgraph(re, CTX_data_depsgraph(C)); lay_override = (v3d && v3d->lay != scene->lay) ? v3d->lay : 0; G.is_break = false; @@ -349,7 +347,7 @@ static int screen_render_exec(bContext *C, wmOperator *op) RE_SetReports(re, NULL); // no redraw needed, we leave state as we entered it - ED_update_for_newframe(mainp, scene, view_layer, depsgraph); + ED_update_for_newframe(mainp, scene, view_layer, CTX_data_depsgraph(C)); WM_event_add_notifier(C, NC_SCENE | ND_RENDER_RESULT, scene); @@ -1008,7 +1006,6 @@ static int screen_render_invoke(bContext *C, wmOperator *op, const wmEvent *even RE_current_scene_update_cb(re, rj, current_scene_update); RE_stats_draw_cb(re, rj, image_renderinfo_cb); RE_progress_cb(re, rj, render_progress_update); - RE_SetDepsgraph(re, CTX_data_depsgraph(C)); rj->re = re; G.is_break = false; @@ -1079,6 +1076,7 @@ typedef struct RenderPreview { wmJob *job; Scene *scene; + EvaluationContext *eval_ctx; Depsgraph *depsgraph; ScrArea *sa; ARegion *ar; @@ -1327,7 +1325,7 @@ static void render_view3d_startjob(void *customdata, short *stop, short *do_upda WM_job_main_thread_lock_release(rp->job); /* do preprocessing like building raytree, shadows, volumes, SSS */ - RE_Database_Preprocess(re); + RE_Database_Preprocess(rp->eval_ctx, re); /* conversion not completed, need to do it again */ if (!rstats->convertdone) { @@ -1393,6 +1391,7 @@ static void render_view3d_startjob(void *customdata, short *stop, short *do_upda static void render_view3d_free(void *customdata) { RenderPreview *rp = customdata; + DEG_evaluation_context_free(rp->eval_ctx); MEM_freeN(rp); } @@ -1508,6 +1507,8 @@ static void render_view3d_do(RenderEngine *engine, const bContext *C) /* customdata for preview thread */ rp->scene = scene; rp->depsgraph = depsgraph; + rp->eval_ctx = DEG_evaluation_context_new(DAG_EVAL_PREVIEW); + CTX_data_eval_ctx(C, rp->eval_ctx); rp->engine = engine; rp->sa = CTX_wm_area(C); rp->ar = CTX_wm_region(C); diff --git a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp index 977bca66731..77c780f496c 100644 --- a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp +++ b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp @@ -966,7 +966,6 @@ Render *BlenderStrokeRenderer::RenderScene(Render * /*re*/, bool render) Render *freestyle_render = RE_NewSceneRender(freestyle_scene); ViewLayer *view_layer = (ViewLayer *)freestyle_scene->view_layers.first; DEG_graph_relations_update(freestyle_depsgraph, freestyle_bmain, freestyle_scene, view_layer); - freestyle_render->depsgraph = freestyle_depsgraph; RE_RenderFreestyleStrokes(freestyle_render, freestyle_bmain, freestyle_scene, render && get_stroke_count() > 0); diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c index 15487082217..99567872103 100644 --- a/source/blender/makesrna/intern/rna_render.c +++ b/source/blender/makesrna/intern/rna_render.c @@ -147,7 +147,7 @@ static void engine_unbind_display_space_shader(RenderEngine *UNUSED(engine)) IMB_colormanagement_finish_glsl_draw(); } -static void engine_update(RenderEngine *engine, Main *bmain, Depsgraph *graph, Scene *scene) +static void engine_update(RenderEngine *engine, Main *bmain, Scene *scene) { extern FunctionRNA rna_RenderEngine_update_func; PointerRNA ptr; @@ -159,14 +159,13 @@ static void engine_update(RenderEngine *engine, Main *bmain, Depsgraph *graph, S RNA_parameter_list_create(&list, &ptr, func); RNA_parameter_set_lookup(&list, "data", &bmain); - RNA_parameter_set_lookup(&list, "depsgraph", &graph); RNA_parameter_set_lookup(&list, "scene", &scene); engine->type->ext.call(NULL, &ptr, func, &list); RNA_parameter_list_free(&list); } -static void engine_render_to_image(RenderEngine *engine, struct Depsgraph *depsgraph) +static void engine_render_to_image(RenderEngine *engine, Depsgraph *depsgraph) { extern FunctionRNA rna_RenderEngine_render_to_image_func; PointerRNA ptr; @@ -398,16 +397,6 @@ static PointerRNA rna_RenderEngine_render_get(PointerRNA *ptr) } } -static PointerRNA rna_RenderEngine_view_layer_get(PointerRNA *ptr) -{ - RenderEngine *engine = (RenderEngine *)ptr->data; - if (engine->re != NULL) { - ViewLayer *view_layer = RE_engine_get_view_layer(engine->re); - return rna_pointer_inherit_refine(ptr, &RNA_ViewLayer, view_layer); - } - return rna_pointer_inherit_refine(ptr, &RNA_ViewLayer, NULL); -} - static PointerRNA rna_RenderEngine_camera_override_get(PointerRNA *ptr) { RenderEngine *engine = (RenderEngine *)ptr->data; @@ -518,7 +507,7 @@ static void rna_def_render_engine(BlenderRNA *brna) func = RNA_def_function(srna, "render_to_image", NULL); RNA_def_function_ui_description(func, "Render scene into an image"); RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE); - RNA_def_pointer(func, "desgraph", "Depsgraph", "", ""); + RNA_def_pointer(func, "depsgraph", "Depsgraph", "", ""); func = RNA_def_function(srna, "bake", NULL); RNA_def_function_ui_description(func, "Bake passes"); @@ -769,11 +758,6 @@ static void rna_def_render_engine(BlenderRNA *brna) prop = RNA_def_enum(func, "type", render_pass_type_items, SOCK_FLOAT, "Type", ""); RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); - prop = RNA_def_property(srna, "view_layer", PROP_POINTER, PROP_NONE); - RNA_def_property_struct_type(prop, "ViewLayer"); - RNA_def_property_pointer_funcs(prop, "rna_RenderEngine_view_layer_get", NULL, NULL, NULL); - RNA_def_property_ui_text(prop, "Scene layer", ""); - /* registration */ prop = RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE); diff --git a/source/blender/render/extern/include/RE_engine.h b/source/blender/render/extern/include/RE_engine.h index f789ab702fe..b1e5ff9890b 100644 --- a/source/blender/render/extern/include/RE_engine.h +++ b/source/blender/render/extern/include/RE_engine.h @@ -92,7 +92,7 @@ typedef struct RenderEngineType { char name[64]; int flag; - void (*update)(struct RenderEngine *engine, struct Main *bmain, struct Depsgraph *depsgraph, struct Scene *scene); + void (*update)(struct RenderEngine *engine, struct Main *bmain, struct Scene *scene); void (*render_to_image)(struct RenderEngine *engine, struct Depsgraph *depsgraph); void (*bake)(struct RenderEngine *engine, struct Scene *scene, struct Object *object, const int pass_type, const int pass_filter, const int object_id, const struct BakePixel *pixel_array, const int num_pixels, @@ -190,9 +190,7 @@ RenderEngineType *RE_engines_find(const char *idname); rcti* RE_engine_get_current_tiles(struct Render *re, int *r_total_tiles, bool *r_needs_free); struct RenderData *RE_engine_get_render_data(struct Render *re); void RE_bake_engine_set_engine_parameters( - struct Render *re, struct Main *bmain, struct Depsgraph *graph, struct Scene *scene); - -struct ViewLayer *RE_engine_get_view_layer(struct Render *re); + struct Render *re, struct Main *bmain, struct Scene *scene); #endif /* __RE_ENGINE_H__ */ diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h index 0557efccc2f..822993a2372 100644 --- a/source/blender/render/extern/include/RE_pipeline.h +++ b/source/blender/render/extern/include/RE_pipeline.h @@ -34,6 +34,7 @@ #include "DNA_listBase.h" #include "DNA_vec_types.h" +#include "DEG_depsgraph.h" struct bMovieHandle; struct bNodeTree; @@ -121,7 +122,9 @@ typedef struct RenderLayer { /* optional saved endresult on disk */ void *exrhandle; - + + struct EvaluationContext eval_ctx; + ListBase passes; } RenderLayer; @@ -250,7 +253,6 @@ void RE_ChangeModeFlag(struct Render *re, int flag, bool clear); struct Object *RE_GetCamera(struct Render *re); /* return camera override if set */ void RE_SetOverrideCamera(struct Render *re, struct Object *camera); void RE_SetCamera(struct Render *re, struct Object *camera); -void RE_SetDepsgraph(struct Render *re, struct Depsgraph *graph); void RE_SetEnvmapCamera(struct Render *re, struct Object *cam_ob, float viewscale, float clipsta, float clipend); void RE_SetWindow(struct Render *re, const rctf *viewplane, float clipsta, float clipend); void RE_SetOrtho(struct Render *re, const rctf *viewplane, float clipsta, float clipend); @@ -267,7 +269,7 @@ void RE_GetViewPlane(struct Render *re, rctf *r_viewplane, rcti *r_disprect); void RE_Database_FromScene( struct Render *re, struct Main *bmain, struct Scene *scene, unsigned int lay, int use_camera_view); -void RE_Database_Preprocess(struct Render *re); +void RE_Database_Preprocess(struct EvaluationContext *eavl_ctx, struct Render *re); void RE_Database_Free(struct Render *re); /* project dbase again, when viewplane/perspective changed */ @@ -368,14 +370,13 @@ struct RenderPass *RE_pass_find_by_type(volatile struct RenderLayer *rl, int pas #define RE_BAKE_VERTEX_COLORS 14 void RE_Database_Baking( - struct Render *re, struct Main *bmain, struct Scene *scene, + struct Render *re, struct Main *bmain, struct Scene *scene, struct ViewLayer *view_layer, unsigned int lay, const int type, struct Object *actob); void RE_DataBase_GetView(struct Render *re, float mat[4][4]); void RE_GetCameraWindow(struct Render *re, struct Object *camera, int frame, float mat[4][4]); void RE_GetCameraModelMatrix(struct Render *re, struct Object *camera, float r_mat[4][4]); struct Scene *RE_GetScene(struct Render *re); -struct EvaluationContext *RE_GetEvalCtx(struct Render *re); bool RE_force_single_renderlayer(struct Scene *scene); bool RE_is_rendering_allowed(struct Scene *scene, struct Object *camera_override, struct ReportList *reports); diff --git a/source/blender/render/extern/include/RE_render_ext.h b/source/blender/render/extern/include/RE_render_ext.h index 17b321fd3b4..4e3430c2892 100644 --- a/source/blender/render/extern/include/RE_render_ext.h +++ b/source/blender/render/extern/include/RE_render_ext.h @@ -38,6 +38,7 @@ /* called by meshtools */ struct DerivedMesh; +struct EvaluationContext; struct ImagePool; struct MTex; struct Scene; @@ -55,7 +56,7 @@ float texture_value_blend(float tex, float out, float fact, float facg, int blen void RE_texture_rng_init(void); void RE_texture_rng_exit(void); -struct Material *RE_sample_material_init(struct Material *orig_mat, struct Scene *scene); +struct Material *RE_sample_material_init(const struct EvaluationContext *eval_ctx, struct Material *orig_mat, struct Scene *scene); void RE_sample_material_free(struct Material *mat); void RE_sample_material_color( struct Material *mat, float color[3], float *alpha, const float volume_co[3], const float surface_co[3], diff --git a/source/blender/render/intern/include/pointdensity.h b/source/blender/render/intern/include/pointdensity.h index 1d1e808e8d3..f122b3dc4c1 100644 --- a/source/blender/render/intern/include/pointdensity.h +++ b/source/blender/render/intern/include/pointdensity.h @@ -37,13 +37,14 @@ * Make point density kd-trees for all point density textures in the scene */ +struct EvaluationContext; struct PointDensity; struct Render; struct TexResult; void free_pointdensity(struct PointDensity *pd); -void cache_pointdensity(struct Render *re, struct PointDensity *pd); -void make_pointdensities(struct Render *re); +void cache_pointdensity(const struct EvaluationContext *eval_ctx, struct Render *re, struct PointDensity *pd); +void make_pointdensities(const struct EvaluationContext *eval_ctx, struct Render *re); void free_pointdensities(struct Render *re); int pointdensitytex(struct Tex *tex, const float texvec[3], struct TexResult *texres); diff --git a/source/blender/render/intern/include/render_result.h b/source/blender/render/intern/include/render_result.h index 8d293c938c7..b2c5758f506 100644 --- a/source/blender/render/intern/include/render_result.h +++ b/source/blender/render/intern/include/render_result.h @@ -117,5 +117,28 @@ void render_result_views_shallowcopy(struct RenderResult *dst, struct RenderResu void render_result_views_shallowdelete(struct RenderResult *rr); bool render_result_has_views(struct RenderResult *rr); +#define FOREACH_VIEW_LAYER_TO_RENDER(re_, iter_) \ +{ \ + int nr; \ + ViewLayer *iter_; \ + for (nr = 0, iter_ = (re_)->view_layers.first; \ + iter_ != NULL; \ + iter_ = iter_->next, nr++) \ + { \ + if ((re_)->r.scemode & R_SINGLE_LAYER) { \ + if (nr != re->active_view_layer) { \ + continue; \ + } \ + } \ + else { \ + if ((iter_->flag & VIEW_LAYER_RENDER) == 0) { \ + continue; \ + } \ + } + +#define FOREACH_VIEW_LAYER_TO_RENDER_END \ + } \ +} + #endif /* __RENDER_RESULT_H__ */ diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h index d24aae6ac97..2c46138c7ea 100644 --- a/source/blender/render/intern/include/render_types.h +++ b/source/blender/render/intern/include/render_types.h @@ -185,8 +185,6 @@ struct Render { /* shadow counter, detect shadow-reuse for shaders */ int shadowsamplenr[BLENDER_MAX_THREADS]; - - struct Depsgraph *depsgraph; /* main, scene, and its full copy of renderdata and world */ struct Main *main; @@ -280,7 +278,6 @@ struct Render { struct ReportList *reports; struct ImagePool *pool; - struct EvaluationContext *eval_ctx; void **movie_ctx_arr; char viewname[MAX_NAME]; diff --git a/source/blender/render/intern/include/renderdatabase.h b/source/blender/render/intern/include/renderdatabase.h index b576d69d806..1d1af7092c8 100644 --- a/source/blender/render/intern/include/renderdatabase.h +++ b/source/blender/render/intern/include/renderdatabase.h @@ -40,6 +40,7 @@ extern "C" { struct Object; struct VlakRen; struct VertRen; +struct EvaluationContext; struct HaloRen; struct Main; struct Material; @@ -164,7 +165,7 @@ void area_lamp_vectors(struct LampRen *lar); /* convertblender.c */ void init_render_world(Render *re); -void RE_Database_FromScene_Vectors(Render *re, struct Main *bmain, struct Scene *sce, unsigned int lay); +void RE_Database_FromScene_Vectors(struct EvaluationContext *eval_ctx, Render *re, struct Main *bmain, struct Scene *sce, unsigned int lay); #ifdef __cplusplus } diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index 503748236f6..6727844d0a8 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -84,6 +84,7 @@ #include "BKE_scene.h" #include "DEG_depsgraph.h" +#include "DEG_depsgraph_build.h" #include "PIL_time.h" @@ -1291,9 +1292,9 @@ static void get_particle_uvco_mcol(short from, DerivedMesh *dm, float *fuv, int } } } -static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem *psys, int timeoffset) +static int render_new_particle_system(const EvaluationContext *eval_ctx, Render *re, + ObjectRen *obr, ParticleSystem *psys, int timeoffset) { - const EvaluationContext *eval_ctx = RE_GetEvalCtx(re); Object *ob= obr->ob; // Object *tob=0; Material *ma = NULL; @@ -1353,7 +1354,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem if (!(psmd->modifier.mode & eModifierMode_Render)) return 0; - sim.eval_ctx = re->eval_ctx; + sim.eval_ctx = eval_ctx; sim.scene = re->scene; sim.ob = ob; sim.psys = psys; @@ -2178,7 +2179,7 @@ static void displace(Render *re, ObjectRen *obr) /* Metaball */ /* ------------------------------------------------------------------------- */ -static void init_render_mball(Render *re, ObjectRen *obr) +static void init_render_mball(const EvaluationContext *eval_ctx, Render *re, ObjectRen *obr) { Object *ob= obr->ob; DispList *dl; @@ -2204,7 +2205,7 @@ static void init_render_mball(Render *re, ObjectRen *obr) need_orco= 1; } - BKE_displist_make_mball_forRender(re->eval_ctx, re->scene, ob, &dispbase); + BKE_displist_make_mball_forRender(eval_ctx, re->scene, ob, &dispbase); dl= dispbase.first; if (dl == NULL) return; @@ -2571,7 +2572,7 @@ static void init_render_dm(DerivedMesh *dm, Render *re, ObjectRen *obr, } -static void init_render_surf(Render *re, ObjectRen *obr, int timeoffset) +static void init_render_surf(const EvaluationContext *eval_ctx, Render *re, ObjectRen *obr, int timeoffset) { Object *ob= obr->ob; Nurb *nu = NULL; @@ -2604,13 +2605,13 @@ static void init_render_surf(Render *re, ObjectRen *obr, int timeoffset) if (ob->parent && (ob->parent->type==OB_LATTICE)) need_orco= 1; - BKE_displist_make_surf(re->eval_ctx, re->scene, ob, &displist, &dm, 1, 0, 1); + BKE_displist_make_surf(eval_ctx, re->scene, ob, &displist, &dm, 1, 0, 1); if (dm) { if (need_orco) { orco = get_object_orco(re, ob); if (!orco) { - orco= BKE_displist_make_orco(re->eval_ctx, re->scene, ob, dm, true, true); + orco= BKE_displist_make_orco(eval_ctx, re->scene, ob, dm, true, true); if (orco) { set_object_orco(re, ob, orco); } @@ -2642,7 +2643,7 @@ static void init_render_surf(Render *re, ObjectRen *obr, int timeoffset) MEM_freeN(matar); } -static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset) +static void init_render_curve(const EvaluationContext *eval_ctx, Render *re, ObjectRen *obr, int timeoffset) { Object *ob= obr->ob; Curve *cu; @@ -2662,7 +2663,7 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset) if (ob->type==OB_FONT && cu->str==NULL) return; else if (ob->type==OB_CURVE && cu->nurb.first==NULL) return; - BKE_displist_make_curveTypes_forRender(re->eval_ctx, re->scene, ob, &disp, &dm, false, true); + BKE_displist_make_curveTypes_forRender(eval_ctx, re->scene, ob, &disp, &dm, false, true); dl= disp.first; if (dl==NULL) return; @@ -2689,7 +2690,7 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset) if (need_orco) { orco = get_object_orco(re, ob); if (!orco) { - orco = BKE_displist_make_orco(re->eval_ctx, re->scene, ob, dm, true, true); + orco = BKE_displist_make_orco(eval_ctx, re->scene, ob, dm, true, true); if (orco) { set_object_orco(re, ob, orco); } @@ -2703,7 +2704,7 @@ static void init_render_curve(Render *re, ObjectRen *obr, int timeoffset) if (need_orco) { orco = get_object_orco(re, ob); if (!orco) { - orco = BKE_curve_make_orco(re->eval_ctx, re->scene, ob, NULL); + orco = BKE_curve_make_orco(eval_ctx, re->scene, ob, NULL); set_object_orco(re, ob, orco); } } @@ -3114,7 +3115,7 @@ static bool has_freestyle_edge_mark(EdgeHash *edge_hash, int v1, int v2) } #endif -static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset) +static void init_render_mesh(const EvaluationContext *eval_ctx, Render *re, ObjectRen *obr, int timeoffset) { Object *ob= obr->ob; Mesh *me; @@ -3203,9 +3204,9 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset) #endif if (re->r.scemode & R_VIEWPORT_PREVIEW) - dm= mesh_create_derived_view(re->eval_ctx, re->scene, ob, mask); + dm= mesh_create_derived_view(eval_ctx, re->scene, ob, mask); else - dm= mesh_create_derived_render(re->eval_ctx, re->scene, ob, mask); + dm= mesh_create_derived_render(eval_ctx, re->scene, ob, mask); if (dm==NULL) return; /* in case duplicated object fails? */ mvert= dm->getVertArray(dm); @@ -4608,7 +4609,7 @@ static void set_dupli_tex_mat(Render *re, ObjectInstanceRen *obi, DupliObject *d copy_v2_v2(obi->dupliuv, dob->uv); } -static void init_render_object_data(Render *re, ObjectRen *obr, int timeoffset) +static void init_render_object_data(const EvaluationContext *eval_ctx, Render *re, ObjectRen *obr, int timeoffset) { Object *ob= obr->ob; ParticleSystem *psys; @@ -4622,26 +4623,26 @@ static void init_render_object_data(Render *re, ObjectRen *obr, int timeoffset) const CustomDataMask mask = CD_MASK_RENDER_INTERNAL; if (re->r.scemode & R_VIEWPORT_PREVIEW) - dm = mesh_create_derived_view(re->eval_ctx, re->scene, ob, mask); + dm = mesh_create_derived_view(eval_ctx, re->scene, ob, mask); else - dm = mesh_create_derived_render(re->eval_ctx, re->scene, ob, mask); + dm = mesh_create_derived_render(eval_ctx, re->scene, ob, mask); dm->release(dm); } for (psys=ob->particlesystem.first, i=0; i<obr->psysindex-1; i++) psys= psys->next; - render_new_particle_system(re, obr, psys, timeoffset); + render_new_particle_system(eval_ctx, re, obr, psys, timeoffset); } else { if (ELEM(ob->type, OB_FONT, OB_CURVE)) - init_render_curve(re, obr, timeoffset); + init_render_curve(eval_ctx, re, obr, timeoffset); else if (ob->type==OB_SURF) - init_render_surf(re, obr, timeoffset); + init_render_surf(eval_ctx, re, obr, timeoffset); else if (ob->type==OB_MESH) - init_render_mesh(re, obr, timeoffset); + init_render_mesh(eval_ctx, re, obr, timeoffset); else if (ob->type==OB_MBALL) - init_render_mball(re, obr); + init_render_mball(eval_ctx, re, obr); } finalize_render_object(re, obr, timeoffset); @@ -4652,7 +4653,8 @@ static void init_render_object_data(Render *re, ObjectRen *obr, int timeoffset) re->totstrand += obr->totstrand; } -static void add_render_object(Render *re, Object *ob, Object *par, DupliObject *dob, float omat[4][4], int timeoffset) +static void add_render_object(const EvaluationContext *eval_ctx, Render *re, Object *ob, Object *par, DupliObject *dob, + float omat[4][4], int timeoffset) { ObjectRen *obr; ObjectInstanceRen *obi; @@ -4690,7 +4692,7 @@ static void add_render_object(Render *re, Object *ob, Object *par, DupliObject * obr->flag |= R_INSTANCEABLE; copy_m4_m4(obr->obmat, ob->obmat); } - init_render_object_data(re, obr, timeoffset); + init_render_object_data(eval_ctx, re, obr, timeoffset); /* only add instance for objects that have not been used for dupli */ if (!(ob->transflag & OB_RENDER_DUPLI)) { @@ -4721,7 +4723,7 @@ static void add_render_object(Render *re, Object *ob, Object *par, DupliObject * } if (dob) psys->flag |= PSYS_USE_IMAT; - init_render_object_data(re, obr, timeoffset); + init_render_object_data(eval_ctx, re, obr, timeoffset); if (!(re->r.scemode & R_VIEWPORT_PREVIEW) && !psys_has_renderdata) { psys_render_restore(ob, psys); } @@ -4740,7 +4742,8 @@ static void add_render_object(Render *re, Object *ob, Object *par, DupliObject * /* par = pointer to duplicator parent, needed for object lookup table */ /* index = when duplicater copies same object (particle), the counter */ -static void init_render_object(Render *re, Object *ob, Object *par, DupliObject *dob, float omat[4][4], int timeoffset) +static void init_render_object(const EvaluationContext *eval_ctx, Render *re, Object *ob, Object *par, DupliObject *dob, + float omat[4][4], int timeoffset) { static double lasttime= 0.0; double time; @@ -4749,7 +4752,7 @@ static void init_render_object(Render *re, Object *ob, Object *par, DupliObject if (ob->type==OB_LAMP) add_render_lamp(re, ob); else if (render_object_type(ob->type)) - add_render_object(re, ob, par, dob, omat, timeoffset); + add_render_object(eval_ctx, re, ob, par, dob, omat, timeoffset); else { mul_m4_m4m4(mat, re->viewmat, ob->obmat); invert_m4_m4(ob->imat, mat); @@ -4905,7 +4908,8 @@ static int allow_render_dupli_instance(Render *UNUSED(re), DupliObject *dob, Obj (!(dob->type == OB_DUPLIGROUP) || !dob->animated)); } -static void dupli_render_particle_set(Render *re, Object *ob, int timeoffset, int level, int enable) +static void dupli_render_particle_set(const EvaluationContext *eval_ctx, Render *re, Object *ob, + int timeoffset, int level, int enable) { /* ugly function, but we need to set particle systems to their render * settings before calling object_duplilist, to get render level duplis */ @@ -4932,7 +4936,7 @@ static void dupli_render_particle_set(Render *re, Object *ob, int timeoffset, in /* this is to make sure we get render level duplis in groups: * the derivedmesh must be created before init_render_mesh, * since object_duplilist does dupliparticles before that */ - dm = mesh_create_derived_render(re->eval_ctx, re->scene, ob, CD_MASK_RENDER_INTERNAL); + dm = mesh_create_derived_render(eval_ctx, re->scene, ob, CD_MASK_RENDER_INTERNAL); dm->release(dm); for (psys=ob->particlesystem.first; psys; psys=psys->next) @@ -4944,7 +4948,7 @@ static void dupli_render_particle_set(Render *re, Object *ob, int timeoffset, in FOREACH_GROUP_OBJECT(ob->dup_group, object) { - dupli_render_particle_set(re, object, timeoffset, level+1, enable); + dupli_render_particle_set(eval_ctx, re, object, timeoffset, level+1, enable); } FOREACH_GROUP_OBJECT_END } @@ -4954,7 +4958,8 @@ static int get_vector_viewlayers(Scene *UNUSED(sce)) return 0; } -static void add_group_render_dupli_obs(Render *re, Group *group, int nolamps, int onlyselected, Object *actob, int timeoffset, int level) +static void add_group_render_dupli_obs(const EvaluationContext *eval_ctx, Render *re, Group *group, int nolamps, + int onlyselected, Object *actob, int timeoffset, int level) { /* Simple preventing of too deep nested groups. */ if (level > MAX_DUPLI_RECUR) return; @@ -4966,11 +4971,11 @@ static void add_group_render_dupli_obs(Render *re, Group *group, int nolamps, in if (ob->flag & OB_DONE) { if (ob->transflag & OB_RENDER_DUPLI) { if (allow_render_object(re, ob, nolamps, onlyselected, actob)) { - init_render_object(re, ob, NULL, NULL, NULL, timeoffset); + init_render_object(eval_ctx, re, ob, NULL, NULL, NULL, timeoffset); ob->transflag &= ~OB_RENDER_DUPLI; if (ob->dup_group) { - add_group_render_dupli_obs(re, ob->dup_group, nolamps, onlyselected, actob, timeoffset, level+1); + add_group_render_dupli_obs(eval_ctx, re, ob->dup_group, nolamps, onlyselected, actob, timeoffset, level+1); } } } @@ -4979,7 +4984,8 @@ static void add_group_render_dupli_obs(Render *re, Group *group, int nolamps, in FOREACH_GROUP_OBJECT_END } -static void database_init_objects(Render *re, unsigned int UNUSED(renderlay), int nolamps, int onlyselected, Object *actob, int timeoffset) +static void database_init_objects(const EvaluationContext *eval_ctx, Render *re, unsigned int UNUSED(renderlay), + int nolamps, int onlyselected, Object *actob, int timeoffset) { Base *base; Object *ob; @@ -5032,7 +5038,7 @@ static void database_init_objects(Render *re, unsigned int UNUSED(renderlay), in * it still needs to create the ObjectRen containing the data */ if (ob->transflag & OB_RENDER_DUPLI) { if (allow_render_object(re, ob, nolamps, onlyselected, actob)) { - init_render_object(re, ob, NULL, NULL, NULL, timeoffset); + init_render_object(eval_ctx, re, ob, NULL, NULL, NULL, timeoffset); ob->transflag &= ~OB_RENDER_DUPLI; } } @@ -5046,9 +5052,9 @@ static void database_init_objects(Render *re, unsigned int UNUSED(renderlay), in /* create list of duplis generated by this object, particle * system need to have render settings set for dupli particles */ - dupli_render_particle_set(re, ob, timeoffset, 0, 1); - duplilist = object_duplilist(re->eval_ctx, re->scene, ob); - duplilist_apply_data = duplilist_apply(re->eval_ctx, ob, NULL, duplilist); + dupli_render_particle_set(eval_ctx, re, ob, timeoffset, 0, 1); + duplilist = object_duplilist(eval_ctx, re->scene, ob); + duplilist_apply_data = duplilist_apply(eval_ctx, ob, NULL, duplilist); /* postpone 'dupli_render_particle_set', since RE_addRenderInstance reads * index values from 'dob->persistent_id[0]', referencing 'psys->child' which * may be smaller once the particle system is restored, see: T45563. */ @@ -5131,7 +5137,7 @@ static void database_init_objects(Render *re, unsigned int UNUSED(renderlay), in if (obi==NULL) /* can't instance, just create the object */ - init_render_object(re, obd, ob, dob, dob_extra->obmat, timeoffset); + init_render_object(eval_ctx, re, obd, ob, dob, dob_extra->obmat, timeoffset); if (dob->type != OB_DUPLIGROUP) { obd->flag |= OB_DONE; @@ -5139,13 +5145,13 @@ static void database_init_objects(Render *re, unsigned int UNUSED(renderlay), in } } else - init_render_object(re, obd, ob, dob, dob_extra->obmat, timeoffset); + init_render_object(eval_ctx, re, obd, ob, dob, dob_extra->obmat, timeoffset); if (re->test_break(re->tbh)) break; } /* restore particle system */ - dupli_render_particle_set(re, ob, timeoffset, 0, false); + dupli_render_particle_set(eval_ctx, re, ob, timeoffset, 0, false); if (duplilist_apply_data) { duplilist_restore(duplilist, duplilist_apply_data); @@ -5154,10 +5160,10 @@ static void database_init_objects(Render *re, unsigned int UNUSED(renderlay), in free_object_duplilist(duplilist); if (allow_render_object(re, ob, nolamps, onlyselected, actob)) - init_render_object(re, ob, NULL, NULL, NULL, timeoffset); + init_render_object(eval_ctx, re, ob, NULL, NULL, NULL, timeoffset); } else if (allow_render_object(re, ob, nolamps, onlyselected, actob)) - init_render_object(re, ob, NULL, NULL, NULL, timeoffset); + init_render_object(eval_ctx, re, ob, NULL, NULL, NULL, timeoffset); } if (re->test_break(re->tbh)) break; @@ -5166,7 +5172,7 @@ static void database_init_objects(Render *re, unsigned int UNUSED(renderlay), in /* objects in groups with OB_RENDER_DUPLI set still need to be created, * since they may not be part of the scene */ for (group= re->main->group.first; group; group=group->id.next) - add_group_render_dupli_obs(re, group, nolamps, onlyselected, actob, timeoffset, 0); + add_group_render_dupli_obs(eval_ctx, re, group, nolamps, onlyselected, actob, timeoffset, 0); if (!re->test_break(re->tbh)) RE_makeRenderInstances(re); @@ -5210,7 +5216,6 @@ void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int l /* applies changes fully */ if ((re->r.scemode & (R_NO_FRAME_UPDATE|R_BUTS_PREVIEW|R_VIEWPORT_PREVIEW))==0) { - BKE_scene_graph_update_for_newframe(re->eval_ctx, re->depsgraph, re->main, re->scene, NULL); render_update_anim_renderdata(re, &re->scene->r, &re->scene->view_layers); } @@ -5247,7 +5252,12 @@ void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int l set_node_shader_lamp_loop(shade_material_loop); /* MAKE RENDER DATA */ - database_init_objects(re, lay, 0, 0, NULL, 0); + EvaluationContext *eval_ctx = NULL; + BLI_assert(eval_ctx); + /* This will break things, and it should because honestly this function is deprecated and no one uses it. + * maybe freestyle? But even so, this need to change. Even freestyle need to get data from depsgraph + * so we can't create the database only once. */ + database_init_objects(eval_ctx, re, lay, 0, 0, NULL, 0); if (!re->test_break(re->tbh)) { set_material_lightgroups(re); @@ -5262,7 +5272,7 @@ void RE_Database_FromScene(Render *re, Main *bmain, Scene *scene, unsigned int l } } -void RE_Database_Preprocess(Render *re) +void RE_Database_Preprocess(EvaluationContext *eval_ctx, Render *re) { if (!re->test_break(re->tbh)) { int tothalo; @@ -5292,7 +5302,7 @@ void RE_Database_Preprocess(Render *re) /* point density texture */ if (!re->test_break(re->tbh)) - make_pointdensities(re); + make_pointdensities(eval_ctx, re); /* voxel data texture */ if (!re->test_break(re->tbh)) make_voxeldata(re); @@ -5363,7 +5373,11 @@ void RE_DataBase_GetView(Render *re, float mat[4][4]) /* Speed Vectors */ /* ------------------------------------------------------------------------- */ -static void database_fromscene_vectors(Render *re, Scene *scene, unsigned int lay, int timeoffset) +static void database_fromscene_vectors(EvaluationContext *eval_ctx, + Render *re, + Scene *scene, + unsigned int lay, + int timeoffset) { Object *camera= RE_GetCamera(re); float mat[4][4]; @@ -5380,7 +5394,7 @@ static void database_fromscene_vectors(Render *re, Scene *scene, unsigned int la /* applies changes fully */ scene->r.cfra += timeoffset; - BKE_scene_graph_update_for_newframe(re->eval_ctx, re->depsgraph, re->main, re->scene, NULL); + BKE_scene_graph_update_for_newframe(eval_ctx, eval_ctx->depsgraph, re->main, re->scene, NULL); /* if no camera, viewmat should have been set! */ if (camera) { @@ -5391,7 +5405,7 @@ static void database_fromscene_vectors(Render *re, Scene *scene, unsigned int la } /* MAKE RENDER DATA */ - database_init_objects(re, lay, 0, 0, NULL, timeoffset); + database_init_objects(eval_ctx, re, lay, 0, 0, NULL, timeoffset); if (!re->test_break(re->tbh)) project_renderdata(re, projectverto, (re->r.mode & R_PANORAMA) != 0, 0, 1); @@ -5748,7 +5762,7 @@ static void free_dbase_object_vectors(ListBase *lb) BLI_freelistN(lb); } -void RE_Database_FromScene_Vectors(Render *re, Main *bmain, Scene *sce, unsigned int lay) +void RE_Database_FromScene_Vectors(EvaluationContext *eval_ctx, Render *re, Main *bmain, Scene *sce, unsigned int lay) { ObjectInstanceRen *obi, *oldobi; StrandSurface *mesh; @@ -5763,7 +5777,7 @@ void RE_Database_FromScene_Vectors(Render *re, Main *bmain, Scene *sce, unsigned speedvector_project(re, NULL, NULL, NULL); /* initializes projection code */ /* creates entire dbase */ - database_fromscene_vectors(re, sce, lay, -1); + database_fromscene_vectors(eval_ctx, re, sce, lay, -1); /* copy away vertex info */ copy_dbase_object_vectors(re, &oldtable); @@ -5779,7 +5793,7 @@ void RE_Database_FromScene_Vectors(Render *re, Main *bmain, Scene *sce, unsigned /* creates entire dbase */ re->i.infostr = IFACE_("Calculating next frame vectors"); - database_fromscene_vectors(re, sce, lay, +1); + database_fromscene_vectors(eval_ctx, re, sce, lay, +1); } /* copy away vertex info */ copy_dbase_object_vectors(re, &newtable); @@ -5793,7 +5807,7 @@ void RE_Database_FromScene_Vectors(Render *re, Main *bmain, Scene *sce, unsigned if (!re->test_break(re->tbh)) { RE_Database_FromScene(re, bmain, sce, lay, 1); - RE_Database_Preprocess(re); + RE_Database_Preprocess(eval_ctx, re); } if (!re->test_break(re->tbh)) { @@ -5887,7 +5901,8 @@ void RE_Database_FromScene_Vectors(Render *re, Main *bmain, Scene *sce, unsigned * RE_BAKE_DERIVATIVE:for baking, no lamps, only selected objects * RE_BAKE_SHADOW: for baking, only shadows, but all objects */ -void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay, const int type, Object *actob) +void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, ViewLayer *view_layer, + unsigned int lay, const int type, Object *actob) { Object *camera; float mat[4][4]; @@ -5904,6 +5919,16 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay, render_copy_viewrender(&re->view_render, &scene->view_render); RE_init_threadcount(re); + + EvaluationContext *eval_ctx = DEG_evaluation_context_new(DAG_EVAL_RENDER); + Depsgraph *depsgraph = DEG_graph_new(); + DEG_evaluation_context_init_from_view_layer_for_render(eval_ctx, depsgraph, scene, view_layer); + DEG_graph_build_from_view_layer(depsgraph, bmain, scene, view_layer); + BKE_scene_graph_update_tagged(eval_ctx, + depsgraph, + bmain, + scene, + view_layer); re->flag |= R_BAKING; re->excludeob= actob; @@ -5975,7 +6000,7 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay, set_node_shader_lamp_loop(shade_material_loop); /* MAKE RENDER DATA */ - database_init_objects(re, lay, nolamps, onlyselected, actob, 0); + database_init_objects(eval_ctx, re, lay, nolamps, onlyselected, actob, 0); set_material_lightgroups(re); @@ -5991,7 +6016,7 @@ void RE_Database_Baking(Render *re, Main *bmain, Scene *scene, unsigned int lay, /* point density texture */ if (!re->test_break(re->tbh)) - make_pointdensities(re); + make_pointdensities(eval_ctx, re); /* voxel data texture */ if (!re->test_break(re->tbh)) diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c index ddf128c0fbc..61ed19a1c9a 100644 --- a/source/blender/render/intern/source/external_engine.c +++ b/source/blender/render/intern/source/external_engine.c @@ -42,6 +42,8 @@ #include "BLI_string.h" #include "BLI_utildefines.h" +#include "DNA_object_types.h" + #include "BKE_camera.h" #include "BKE_global.h" #include "BKE_colortools.h" @@ -50,6 +52,7 @@ #include "BKE_scene.h" #include "DEG_depsgraph.h" +#include "DEG_depsgraph_query.h" #include "RNA_access.h" @@ -526,9 +529,8 @@ RenderData *RE_engine_get_render_data(Render *re) } /* Bake */ -void RE_bake_engine_set_engine_parameters(Render *re, Main *bmain, Depsgraph *graph, Scene *scene) +void RE_bake_engine_set_engine_parameters(Render *re, Main *bmain, Scene *scene) { - re->depsgraph = graph; re->scene = scene; re->main = bmain; render_copy_renderdata(&re->r, &scene->r); @@ -579,7 +581,7 @@ bool RE_bake_engine( /* update is only called so we create the engine.session */ if (type->update) - type->update(engine, re->main, re->depsgraph, re->scene); + type->update(engine, re->main, re->scene); if (type->bake) { type->bake( @@ -629,8 +631,6 @@ void RE_engine_frame_set(RenderEngine *engine, int frame, float subframe) BPy_BEGIN_ALLOW_THREADS; #endif - BKE_scene_graph_update_for_newframe(re->eval_ctx, re->depsgraph, re->main, scene, NULL); - #ifdef WITH_PYTHON BPy_END_ALLOW_THREADS; #endif @@ -664,7 +664,6 @@ int RE_engine_render(Render *re, int do_all) /* update animation here so any render layer animation is applied before * creating the render result */ if ((re->r.scemode & (R_NO_FRAME_UPDATE | R_BUTS_PREVIEW)) == 0) { - BKE_scene_graph_update_for_newframe(re->eval_ctx, re->depsgraph, re->main, re->scene, NULL); render_update_anim_renderdata(re, &re->scene->r, &re->scene->view_layers); } @@ -731,7 +730,7 @@ int RE_engine_render(Render *re, int do_all) render_result_exr_file_begin(re); if (type->update) { - type->update(engine, re->main, re->depsgraph, re->scene); + type->update(engine, re->main, re->scene); } /* Clear UI drawing locks. */ @@ -740,7 +739,25 @@ int RE_engine_render(Render *re, int do_all) } if (type->render_to_image) { - type->render_to_image(engine, re->depsgraph); + FOREACH_VIEW_LAYER_TO_RENDER(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)); + + 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); + + DEG_graph_free(depsgraph); + DEG_evaluation_context_free(eval_ctx); + } + FOREACH_VIEW_LAYER_TO_RENDER_END } engine->tile_x = 0; @@ -803,8 +820,3 @@ void RE_engine_register_pass(struct RenderEngine *engine, struct Scene *scene, s } } } - -ViewLayer *RE_engine_get_view_layer(Render *re) -{ - return re->eval_ctx->view_layer; -} diff --git a/source/blender/render/intern/source/initrender.c b/source/blender/render/intern/source/initrender.c index 9182d545089..13c95dac05d 100644 --- a/source/blender/render/intern/source/initrender.c +++ b/source/blender/render/intern/source/initrender.c @@ -501,11 +501,6 @@ void RE_SetCamera(Render *re, Object *cam_ob) re_camera_params_get(re, ¶ms, cam_ob); } -void RE_SetDepsgraph(Render *re, Depsgraph *graph) -{ - re->depsgraph = graph; -} - void RE_SetPixelSize(Render *re, float pixsize) { re->viewdx = pixsize; diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index e5426384c6f..b2a03cc884f 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -81,6 +81,8 @@ #include "BKE_object.h" #include "DEG_depsgraph.h" +#include "DEG_depsgraph_build.h" +#include "DEG_depsgraph_query.h" #include "PIL_time.h" #include "IMB_colormanagement.h" @@ -274,7 +276,7 @@ RenderLayer *render_get_active_layer(Render *re, RenderResult *rr) return rr->layers.first; } -static int render_scene_needs_vector(Render *re) +static int UNUSED_FUNCTION(render_scene_needs_vector)(Render *re) { ViewLayer *view_layer; for (view_layer = re->view_layers.first; view_layer; view_layer = view_layer->next) @@ -355,15 +357,6 @@ Scene *RE_GetScene(Render *re) return NULL; } -EvaluationContext *RE_GetEvalCtx(Render *re) -{ - if (re) { - return re->eval_ctx; - } - - return NULL; -} - /** * Same as #RE_AcquireResultImage but creating the necessary views to store the result * fill provided result struct with a copy of thew views of what is done so far the @@ -515,7 +508,6 @@ Render *RE_NewRender(const char *name) BLI_strncpy(re->name, name, RE_MAXNAME); BLI_rw_mutex_init(&re->resultmutex); BLI_rw_mutex_init(&re->partsmutex); - re->eval_ctx = DEG_evaluation_context_new(DAG_EVAL_RENDER); } RE_InitRenderCB(re); @@ -592,7 +584,6 @@ void RE_FreeRender(Render *re) /* main dbase can already be invalid now, some database-free code checks it */ re->main = NULL; re->scene = NULL; - re->depsgraph = NULL; RE_Database_Free(re); /* view render can still have full database */ free_sample_tables(re); @@ -601,7 +592,6 @@ void RE_FreeRender(Render *re) render_result_free(re->pushedresult); BLI_remlink(&RenderGlobal.renderlist, re); - MEM_freeN(re->eval_ctx); MEM_freeN(re); } @@ -862,12 +852,11 @@ void RE_InitState(Render *re, Render *source, RenderData *rd, re->result->recty = re->recty; render_result_view_new(re->result, ""); } - - if (re->r.scemode & R_VIEWPORT_PREVIEW) - re->eval_ctx->mode = DAG_EVAL_PREVIEW; - else - re->eval_ctx->mode = DAG_EVAL_RENDER; - + + eEvaluationMode mode = (re->r.scemode & R_VIEWPORT_PREVIEW) ? DAG_EVAL_PREVIEW : DAG_EVAL_RENDER; + /* If we had a consistent EvaluationContext now would be the time to update it. */ + (void)mode; + /* ensure renderdatabase can use part settings correct */ RE_parts_clamp(re); @@ -1353,7 +1342,7 @@ static void *do_render_thread(void *thread_v) return NULL; } -static void main_render_result_end(Render *re) +static void UNUSED_FUNCTION(main_render_result_end)(Render *re) { if (re->result->do_exr_tile) { BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE); @@ -1559,81 +1548,10 @@ void RE_TileProcessor(Render *re) static void do_render_3d(Render *re) { - RenderView *rv; - re->current_scene_update(re->suh, re->scene); - /* try external */ - if (RE_engine_render(re, 0)) - return; - - /* internal */ - RE_parts_clamp(re); - - /* add motion blur and fields offset to frames */ - const int cfra_backup = re->scene->r.cfra; - const float subframe_backup = re->scene->r.subframe; - - BKE_scene_frame_set( - re->scene, (double)re->scene->r.cfra + (double)re->scene->r.subframe + - (double)re->mblur_offs + (double)re->field_offs); - - /* init main render result */ - main_render_result_new(re); - if (re->result == NULL) { - BKE_report(re->reports, RPT_ERROR, "Failed allocate render result, out of memory"); - G.is_break = true; - return; - } - -#ifdef WITH_FREESTYLE - if (re->r.mode & R_EDGE_FRS) { - init_freestyle(re); - } -#endif - - /* we need a new database for each view */ - for (rv = re->result->views.first; rv; rv = rv->next) { - RE_SetActiveRenderView(re, rv->name); - - /* lock drawing in UI during data phase */ - if (re->draw_lock) - re->draw_lock(re->dlh, 1); - - /* make render verts/faces/halos/lamps */ - if (render_scene_needs_vector(re)) - RE_Database_FromScene_Vectors(re, re->main, re->scene, re->lay); - else { - RE_Database_FromScene(re, re->main, re->scene, re->lay, 1); - RE_Database_Preprocess(re); - } - - /* clear UI drawing locks */ - if (re->draw_lock) - re->draw_lock(re->dlh, 0); - - threaded_tile_processor(re); - -#ifdef WITH_FREESTYLE - /* Freestyle */ - if (re->r.mode & R_EDGE_FRS) - if (!re->test_break(re->tbh)) - add_freestyle(re, 1); -#endif - - /* do left-over 3d post effects (flares) */ - if (re->flag & R_HALO) - if (!re->test_break(re->tbh)) - add_halo_flare(re); - - /* free all render verts etc */ - RE_Database_Free(re); - } - - main_render_result_end(re); - - re->scene->r.cfra = cfra_backup; - re->scene->r.subframe = subframe_backup; + /* All the rendering pipeline goes through "external" render engines. */ + RE_engine_render(re, 0); } /* called by blur loop, accumulate RGBA key alpha */ @@ -1748,11 +1666,6 @@ static void do_render_blur_3d(Render *re) re->mblur_offs = 0.0f; re->i.curblur = 0; /* stats */ - /* make sure motion blur changes get reset to current frame */ - if ((re->r.scemode & (R_NO_FRAME_UPDATE|R_BUTS_PREVIEW|R_VIEWPORT_PREVIEW))==0) { - BKE_scene_graph_update_for_newframe(re->eval_ctx, re->depsgraph, re->main, re->scene, NULL); - } - /* weak... the display callback wants an active renderlayer pointer... */ re->result->renlay = render_get_active_layer(re, re->result); re->display_update(re->duh, re->result, NULL); @@ -1986,7 +1899,6 @@ static void render_scene(Render *re, Scene *sce, int cfra) /* still unsure entity this... */ resc->main = re->main; - resc->depsgraph = re->depsgraph; resc->scene = sce; resc->lay = sce->lay; resc->scene_color_manage = BKE_scene_check_color_management_enabled(sce); @@ -2696,8 +2608,9 @@ static void do_render_composite_fields_blur_3d(Render *re) R.i.starttime = re->i.starttime; R.i.cfra = re->i.cfra; - if (update_newframe) - BKE_scene_graph_update_for_newframe(re->eval_ctx, re->depsgraph, re->main, re->scene, NULL); + if (update_newframe) { + /* If we have consistent depsgraph now would be a time to update them. */ + } if (re->r.scemode & R_FULL_SAMPLE) do_merge_fullsample(re, ntree); @@ -2807,9 +2720,10 @@ static void do_render_seq(Render *re) tot_views = BKE_scene_multiview_num_views_get(&re->r); ibuf_arr = MEM_mallocN(sizeof(ImBuf *) * tot_views, "Sequencer Views ImBufs"); + EvaluationContext *eval_ctx = DEG_evaluation_context_new(DAG_EVAL_RENDER); BKE_sequencer_new_render_data( - re->eval_ctx, re->main, re->scene, + eval_ctx, re->main, re->scene, re_x, re_y, 100, &context); @@ -2831,6 +2745,8 @@ static void do_render_seq(Render *re) } } + DEG_evaluation_context_free(eval_ctx); + rr = re->result; BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE); @@ -3399,7 +3315,7 @@ void RE_RenderFreestyleExternal(Render *re) for (rv = re->result->views.first; rv; rv = rv->next) { RE_SetActiveRenderView(re, rv->name); RE_Database_FromScene(re, re->main, re->scene, re->lay, 1); - RE_Database_Preprocess(re); + RE_Database_Preprocess(NULL, re); add_freestyle(re, 1); RE_Database_Free(re); } @@ -3772,8 +3688,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri NULL, camera_override, lay_override, 1, 0); if (nfra != scene->r.cfra) { - /* Skip this frame, but update for physics and particles system. */ - BKE_scene_graph_update_for_newframe(re->eval_ctx, re->depsgraph, bmain, scene, NULL); + /* Skip this frame, but could update for physics and particles system. */ continue; } else @@ -3922,7 +3837,6 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri void RE_PreviewRender(Render *re, Main *bmain, Scene *sce, ViewRender *view_render) { Object *camera; - ViewLayer *view_layer = BKE_view_layer_from_scene_get(sce); int winx, winy; winx = (sce->r.size * sce->r.xsch) / 100; @@ -3936,8 +3850,6 @@ void RE_PreviewRender(Render *re, Main *bmain, Scene *sce, ViewRender *view_rend re->scene = sce; re->scene_color_manage = BKE_scene_check_color_management_enabled(sce); re->lay = sce->lay; - re->depsgraph = BKE_scene_get_depsgraph(sce, view_layer, false); - re->eval_ctx->view_layer = view_layer; camera = RE_GetCamera(re); RE_SetCamera(re, camera); diff --git a/source/blender/render/intern/source/pointdensity.c b/source/blender/render/intern/source/pointdensity.c index 4f300b7286c..71145cfa4b7 100644 --- a/source/blender/render/intern/source/pointdensity.c +++ b/source/blender/render/intern/source/pointdensity.c @@ -169,7 +169,7 @@ static void alloc_point_data(PointDensity *pd) } } -static void pointdensity_cache_psys(EvaluationContext *eval_ctx, Scene *scene, +static void pointdensity_cache_psys(const EvaluationContext *eval_ctx, Scene *scene, PointDensity *pd, Object *ob, ParticleSystem *psys, @@ -403,7 +403,7 @@ static void pointdensity_cache_vertex_normal(PointDensity *pd, Object *UNUSED(ob } } -static void pointdensity_cache_object(EvaluationContext *eval_ctx, Scene *scene, +static void pointdensity_cache_object(const EvaluationContext *eval_ctx, Scene *scene, PointDensity *pd, Object *ob, const bool use_render_params) @@ -478,7 +478,8 @@ static void pointdensity_cache_object(EvaluationContext *eval_ctx, Scene *scene, } -static void cache_pointdensity_ex(EvaluationContext *eval_ctx, Scene *scene, +static void cache_pointdensity_ex(const EvaluationContext *eval_ctx, + Scene *scene, PointDensity *pd, float viewmat[4][4], float winmat[4][4], @@ -523,9 +524,9 @@ static void cache_pointdensity_ex(EvaluationContext *eval_ctx, Scene *scene, } } -void cache_pointdensity(Render *re, PointDensity *pd) +void cache_pointdensity(const EvaluationContext *eval_ctx, Render *re, PointDensity *pd) { - cache_pointdensity_ex(re->eval_ctx, + cache_pointdensity_ex(eval_ctx, re->scene, pd, re->viewmat, re->winmat, @@ -551,7 +552,7 @@ void free_pointdensity(PointDensity *pd) pd->totpoints = 0; } -void make_pointdensities(Render *re) +void make_pointdensities(const EvaluationContext *eval_ctx, Render *re) { Tex *tex; @@ -564,7 +565,7 @@ void make_pointdensities(Render *re) for (tex = re->main->tex.first; tex != NULL; tex = tex->id.next) { if (tex->id.us && tex->type == TEX_POINTDENSITY) { - cache_pointdensity(re, tex->pd); + cache_pointdensity(eval_ctx, re, tex->pd); } } diff --git a/source/blender/render/intern/source/render_result.c b/source/blender/render/intern/source/render_result.c index f97c8fb0b06..126d675a491 100644 --- a/source/blender/render/intern/source/render_result.c +++ b/source/blender/render/intern/source/render_result.c @@ -266,9 +266,7 @@ RenderResult *render_result_new(Render *re, rcti *partrct, int crop, int savebuf RenderResult *rr; RenderLayer *rl; RenderView *rv; - ViewLayer *view_layer; int rectx, recty; - int nr; rectx = BLI_rcti_size_x(partrct); recty = BLI_rcti_size_y(partrct); @@ -296,23 +294,14 @@ RenderResult *render_result_new(Render *re, rcti *partrct, int crop, int savebuf render_result_views_new(rr, &re->r); /* check renderdata for amount of layers */ - for (nr = 0, view_layer = re->view_layers.first; view_layer; view_layer = view_layer->next, nr++) { - - if (layername && layername[0]) - if (!STREQ(view_layer->name, layername)) - continue; - - if (re->r.scemode & R_SINGLE_LAYER) { - if (nr != re->active_view_layer) { - continue; - } - } - else { - if ((view_layer->flag & VIEW_LAYER_RENDER) == 0) { + FOREACH_VIEW_LAYER_TO_RENDER(re, view_layer) + { + if (layername && layername[0]) { + if (!STREQ(view_layer->name, layername)) { continue; } } - + rl = MEM_callocN(sizeof(RenderLayer), "new render layer"); BLI_addtail(&rr->layers, rl); @@ -417,6 +406,8 @@ RenderResult *render_result_new(Render *re, rcti *partrct, int crop, int savebuf #undef RENDER_LAYER_ADD_PASS_SAFE } } + FOREACH_VIEW_LAYER_TO_RENDER_END + /* sss, previewrender and envmap don't do layers, so we make a default one */ if (BLI_listbase_is_empty(&rr->layers) && !(layername && layername[0])) { rl = MEM_callocN(sizeof(RenderLayer), "new render layer"); diff --git a/source/blender/render/intern/source/render_texture.c b/source/blender/render/intern/source/render_texture.c index e66dd86a75a..cefa739a796 100644 --- a/source/blender/render/intern/source/render_texture.c +++ b/source/blender/render/intern/source/render_texture.c @@ -3745,7 +3745,7 @@ static void textured_face_generate_uv( } /* Generate an updated copy of material to use for color sampling. */ -Material *RE_sample_material_init(Material *orig_mat, Scene *scene) +Material *RE_sample_material_init(const EvaluationContext *eval_ctx, Material *orig_mat, Scene *scene) { Tex *tex = NULL; Material *mat; @@ -3821,7 +3821,7 @@ Material *RE_sample_material_init(Material *orig_mat, Scene *scene) unit_m4(dummy_re.viewmat); unit_m4(dummy_re.winmat); dummy_re.winx = dummy_re.winy = 128; - cache_pointdensity(&dummy_re, tex->pd); + cache_pointdensity(eval_ctx, &dummy_re, tex->pd); } /* update image sequences and movies */ diff --git a/source/blenderplayer/bad_level_call_stubs/CMakeLists.txt b/source/blenderplayer/bad_level_call_stubs/CMakeLists.txt index d2c2129532a..0a50c0876fb 100644 --- a/source/blenderplayer/bad_level_call_stubs/CMakeLists.txt +++ b/source/blenderplayer/bad_level_call_stubs/CMakeLists.txt @@ -33,6 +33,7 @@ set(INC ../../blender/blenlib ../../blender/blenkernel ../../blender/blenloader + ../../blender/depsgraph ../../blender/makesdna ../../blender/makesrna ../../../intern/glew-mx diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c index 3098bb88cf8..894bad1ab8a 100644 --- a/source/blenderplayer/bad_level_call_stubs/stubs.c +++ b/source/blenderplayer/bad_level_call_stubs/stubs.c @@ -280,7 +280,7 @@ int multitex_ext(struct Tex *tex, float texvec[3], float dxt[3], float dyt[3], i int multitex_ext_safe(struct Tex *tex, float texvec[3], struct TexResult *texres, struct ImagePool *pool, bool scene_color_manage, const bool skip_load_image) RET_ZERO int multitex_nodes(struct Tex *tex, float texvec[3], float dxt[3], float dyt[3], int osatex, struct TexResult *texres, const short thread, short which_output, struct ShadeInput *shi, struct MTex *mtex, struct ImagePool *pool) RET_ZERO -struct Material *RE_sample_material_init(struct Material *orig_mat, struct Scene *scene) RET_NULL +struct Material *RE_sample_material_init(const struct EvaluationContext *eval_ctx, struct Material *orig_mat, struct Scene *scene) RET_NULL void RE_sample_material_free(struct Material *mat) RET_NONE void RE_sample_material_color( struct Material *mat, float color[3], float *alpha, const float volume_co[3], const float surface_co[3], @@ -774,8 +774,6 @@ void RE_instance_get_particle_info(struct ObjectInstanceRen *obi, float *index, void RE_FreeAllPersistentData(void) RET_NONE float RE_fresnel_dielectric(float incoming[3], float normal[3], float eta) RET_ZERO void RE_engine_register_pass(struct RenderEngine *engine, struct Scene *scene, struct ViewLayer *view_layer, const char *name, int channels, const char *chanid, int type) RET_NONE -struct ViewLayer *RE_engine_get_view_layer(struct Render *re) RET_NULL -void RE_SetDepsgraph(struct Render *re, struct Depsgraph *graph) RET_NONE /* Draw */ void OBJECT_collection_settings_create(struct IDProperty *properties) RET_NONE diff --git a/source/creator/creator_args.c b/source/creator/creator_args.c index 8517d870b8b..2dd21c3886f 100644 --- a/source/creator/creator_args.c +++ b/source/creator/creator_args.c @@ -428,26 +428,6 @@ static void arg_py_context_restore( /** \} */ -static void render_set_depgraph(bContext *C, Render *re) -{ - /* TODO(sergey): For until we make depsgraph to be created and - * handled by render pipeline. - */ - Main *bmain = CTX_data_main(C); - Scene *scene = CTX_data_scene(C); - /* NOTE: This is STUPID to use first layer, but is ok for now - * (at least for until depsgraph becomes per-layer). - * Apparently, CTX_data_layer is crashing here (context's layer - * is NULL for old files, and there is no workspace). - */ - ViewLayer *view_layer = scene->view_layers.first; - Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene, view_layer, true); - DEG_graph_relations_update(depsgraph, bmain, scene, view_layer); - DEG_graph_on_visible_update(bmain, depsgraph); - - RE_SetDepsgraph(re, depsgraph); -} - /* -------------------------------------------------------------------- */ /** \name Handle Argument Callbacks @@ -1385,7 +1365,6 @@ static int arg_handle_render_frame(int argc, const char **argv, void *data) BLI_threaded_malloc_begin(); BKE_reports_init(&reports, RPT_STORE); RE_SetReports(re, &reports); - render_set_depgraph(C, re); for (int i = 0; i < frames_range_len; i++) { /* We could pass in frame ranges, * but prefer having exact behavior as passing in multiple frames */ @@ -1428,7 +1407,6 @@ static int arg_handle_render_animation(int UNUSED(argc), const char **UNUSED(arg BLI_threaded_malloc_begin(); BKE_reports_init(&reports, RPT_STORE); RE_SetReports(re, &reports); - render_set_depgraph(C, re); RE_BlenderAnim(re, bmain, scene, NULL, scene->lay, scene->r.sfra, scene->r.efra, scene->r.frame_step); RE_SetReports(re, NULL); BKE_reports_clear(&reports); |