Refactor depsgraph/render logic to serve evaluated depsgraph to engines

User notes
----------
Compositing, rendering of multi-layers in Eevee should be fully working now.

Development notes
-----------------
Up until now we were still using the same depsgraph for rendering and viewport
evaluation. And we had to go out of our ways to be sure the depsgraphs were
updated.

Now we iterate over the (to be rendered) view layers and create a depsgraph to
each one, fully evaluated and call the render engines (Cycles, Eevee, ...) with
this viewlayer/depsgraph/evaluation context.

At this time we are not handling data persistency, Depsgraph is created from
scratch prior to rendering each frame.  So I got rid of most of the partial
update calls we had during the render pipeline.

Cycles: Brecht Van Lommel did a patch to tackle some of the required Cycles
changes but this commit mark these changes as TODOs. Basically Cycles needs to
render one layer at a time.

Reviewers: sergey, brecht

Differential Revision: https://developer.blender.org/D3073
This commit is contained in:
Dalai Felinto 2018-02-20 12:55:02 -03:00
parent bd119ab017
commit 06420c5fe8
36 changed files with 310 additions and 357 deletions

View File

@ -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)

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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),

View File

@ -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);

View File

@ -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 &&

View File

@ -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.
*/

View File

@ -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);
}

View File

@ -31,6 +31,7 @@ set(INC
../blenkernel
../blenlib
../blentranslation
../depsgraph
../imbuf
../makesdna
../makesrna

View File

@ -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);

View File

@ -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)
{

View File

@ -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));

View File

@ -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);

View File

@ -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);

View File

@ -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,

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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__ */

View File

@ -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);

View File

@ -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],

View File

@ -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);

View File

@ -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__ */

View File

@ -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];

View File

@ -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
}

View File

@ -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))

View File

@ -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;
}

View File

@ -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;

View File

@ -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);

View File

@ -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);
}
}

View File

@ -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) {
FOREACH_VIEW_LAYER_TO_RENDER(re, view_layer)
{
if (layername && layername[0]) {
if (!STREQ(view_layer->name, layername)) {
continue;
}
}
else {
if ((view_layer->flag & VIEW_LAYER_RENDER) == 0) {
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");

View File

@ -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 */

View File

@ -33,6 +33,7 @@ set(INC
../../blender/blenlib
../../blender/blenkernel
../../blender/blenloader
../../blender/depsgraph
../../blender/makesdna
../../blender/makesrna
../../../intern/glew-mx

View File

@ -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

View File

@ -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);