Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--intern/cycles/blender/addon/__init__.py4
-rw-r--r--intern/cycles/blender/blender_python.cpp12
-rw-r--r--intern/cycles/blender/blender_session.cpp25
-rw-r--r--intern/cycles/blender/blender_session.h4
-rw-r--r--intern/cycles/blender/blender_sync.cpp3
-rw-r--r--intern/cycles/blender/blender_sync.h1
-rw-r--r--source/blender/blenkernel/intern/dynamicpaint.c8
-rw-r--r--source/blender/blenkernel/intern/scene.c5
-rw-r--r--source/blender/blenkernel/intern/sequencer.c18
-rw-r--r--source/blender/compositor/CMakeLists.txt1
-rw-r--r--source/blender/depsgraph/DEG_depsgraph.h6
-rw-r--r--source/blender/depsgraph/intern/depsgraph_eval.cc19
-rw-r--r--source/blender/draw/intern/DRW_render.h2
-rw-r--r--source/blender/draw/intern/draw_manager.c41
-rw-r--r--source/blender/editors/object/object_bake.c8
-rw-r--r--source/blender/editors/object/object_bake_api.c41
-rw-r--r--source/blender/editors/render/render_internal.c11
-rw-r--r--source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp1
-rw-r--r--source/blender/makesrna/intern/rna_render.c22
-rw-r--r--source/blender/render/extern/include/RE_engine.h6
-rw-r--r--source/blender/render/extern/include/RE_pipeline.h11
-rw-r--r--source/blender/render/extern/include/RE_render_ext.h3
-rw-r--r--source/blender/render/intern/include/pointdensity.h5
-rw-r--r--source/blender/render/intern/include/render_result.h23
-rw-r--r--source/blender/render/intern/include/render_types.h3
-rw-r--r--source/blender/render/intern/include/renderdatabase.h3
-rw-r--r--source/blender/render/intern/source/convertblender.c143
-rw-r--r--source/blender/render/intern/source/external_engine.c38
-rw-r--r--source/blender/render/intern/source/initrender.c5
-rw-r--r--source/blender/render/intern/source/pipeline.c128
-rw-r--r--source/blender/render/intern/source/pointdensity.c15
-rw-r--r--source/blender/render/intern/source/render_result.c23
-rw-r--r--source/blender/render/intern/source/render_texture.c4
-rw-r--r--source/blenderplayer/bad_level_call_stubs/CMakeLists.txt1
-rw-r--r--source/blenderplayer/bad_level_call_stubs/stubs.c4
-rw-r--r--source/creator/creator_args.c22
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, &params, 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);