diff options
42 files changed, 186 insertions, 115 deletions
diff --git a/source/blender/alembic/intern/abc_exporter.cc b/source/blender/alembic/intern/abc_exporter.cc index 51e2e7040f9..af6cf655652 100644 --- a/source/blender/alembic/intern/abc_exporter.cc +++ b/source/blender/alembic/intern/abc_exporter.cc @@ -168,7 +168,8 @@ static bool export_object(const ExportSettings * const settings, const Base * co /* ************************************************************************** */ -AbcExporter::AbcExporter(Main *bmain, EvaluationContext *eval_ctx, Scene *scene, Depsgraph *depsgraph, +AbcExporter::AbcExporter(Main *bmain, EvaluationContext *eval_ctx, Scene *scene, SceneLayer *scene_layer, + Depsgraph *depsgraph, const char *filename, ExportSettings &settings) : m_bmain(bmain) , m_settings(settings) @@ -177,6 +178,7 @@ AbcExporter::AbcExporter(Main *bmain, EvaluationContext *eval_ctx, Scene *scene, , m_shape_sampling_index(0) , m_eval_ctx(eval_ctx) , m_scene(scene) + , m_scene_layer(scene_layer) , m_depsgraph(depsgraph) , m_writer(NULL) {} @@ -655,5 +657,5 @@ void AbcExporter::setCurrentFrame(Main *bmain, double t) { m_scene->r.cfra = static_cast<int>(t); m_scene->r.subframe = static_cast<float>(t) - m_scene->r.cfra; - BKE_scene_graph_update_for_newframe(bmain->eval_ctx, m_depsgraph, bmain, m_scene); + BKE_scene_graph_update_for_newframe(bmain->eval_ctx, m_depsgraph, bmain, m_scene, m_scene_layer); } diff --git a/source/blender/alembic/intern/abc_exporter.h b/source/blender/alembic/intern/abc_exporter.h index d0f3964abd5..816e2db725b 100644 --- a/source/blender/alembic/intern/abc_exporter.h +++ b/source/blender/alembic/intern/abc_exporter.h @@ -95,6 +95,7 @@ class AbcExporter { EvaluationContext *m_eval_ctx; Scene *m_scene; + SceneLayer *m_scene_layer; Depsgraph *m_depsgraph; ArchiveWriter *m_writer; @@ -106,7 +107,8 @@ class AbcExporter { std::vector<AbcObjectWriter *> m_shapes; public: - AbcExporter(Main *bmain, EvaluationContext *eval_ctx, Scene *scene, Depsgraph *depsgraph, + AbcExporter(Main *bmain, EvaluationContext *eval_ctx, Scene *scene, SceneLayer *scene_layer, + Depsgraph *depsgraph, const char *filename, ExportSettings &settings); ~AbcExporter(); diff --git a/source/blender/alembic/intern/alembic_capi.cc b/source/blender/alembic/intern/alembic_capi.cc index d17182a0d65..e4d6357a1be 100644 --- a/source/blender/alembic/intern/alembic_capi.cc +++ b/source/blender/alembic/intern/alembic_capi.cc @@ -232,6 +232,7 @@ static void find_iobject(const IObject &object, IObject &ret, struct ExportJobData { EvaluationContext eval_ctx; Scene *scene; + SceneLayer *scene_layer; Depsgraph *depsgraph; Main *bmain; @@ -264,7 +265,8 @@ static void export_startjob(void *customdata, short *stop, short *do_update, flo try { Scene *scene = data->scene; - AbcExporter exporter(data->bmain, &data->eval_ctx, scene, data->depsgraph, data->filename, data->settings); + SceneLayer *scene_layer = data->scene_layer; + AbcExporter exporter(data->bmain, &data->eval_ctx, scene, scene_layer, data->depsgraph, data->filename, data->settings); const int orig_frame = CFRA; @@ -274,7 +276,7 @@ static void export_startjob(void *customdata, short *stop, short *do_update, flo if (CFRA != orig_frame) { CFRA = orig_frame; - BKE_scene_graph_update_for_newframe(data->bmain->eval_ctx, data->depsgraph, data->bmain, scene); + BKE_scene_graph_update_for_newframe(data->bmain->eval_ctx, data->depsgraph, data->bmain, scene, data->scene_layer); } data->export_ok = !data->was_canceled; @@ -316,6 +318,7 @@ bool ABC_export( CTX_data_eval_ctx(C, &job->eval_ctx); job->scene = scene; + job->scene_layer = CTX_data_scene_layer(C); job->depsgraph = CTX_data_depsgraph(C); job->bmain = CTX_data_main(C); job->export_ok = false; diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h index 04761b3fa9e..fac11edea75 100644 --- a/source/blender/blenkernel/BKE_scene.h +++ b/source/blender/blenkernel/BKE_scene.h @@ -144,12 +144,14 @@ void BKE_scene_frame_set(struct Scene *scene, double cfra); void BKE_scene_graph_update_tagged(struct EvaluationContext *eval_ctx, struct Depsgraph *depsgraph, struct Main *bmain, - struct Scene *scene); + struct Scene *scene, + struct SceneLayer *scene_layer); void BKE_scene_graph_update_for_newframe(struct EvaluationContext *eval_ctx, struct Depsgraph *depsgraph, struct Main *bmain, - struct Scene *sce); + struct Scene *scene, + struct SceneLayer *scene_layer); struct SceneRenderLayer *BKE_scene_add_render_layer(struct Scene *sce, const char *name); bool BKE_scene_remove_render_layer(struct Main *main, struct Scene *scene, struct SceneRenderLayer *srl); diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c index 23fbcf583ad..eb63ea5250d 100644 --- a/source/blender/blenkernel/intern/anim.c +++ b/source/blender/blenkernel/intern/anim.c @@ -276,7 +276,10 @@ void animviz_get_object_motionpaths(Object *ob, ListBase *targets) /* ........ */ /* update scene for current frame */ -static void motionpaths_calc_update_scene(Main *bmain, Scene *scene, struct Depsgraph *depsgraph) +static void motionpaths_calc_update_scene(Main *bmain, + Scene *scene, + SceneLayer *scene_layer, + struct Depsgraph *depsgraph) { /* Do all updates * - if this is too slow, resort to using a more efficient way @@ -288,7 +291,7 @@ static void motionpaths_calc_update_scene(Main *bmain, Scene *scene, struct Deps * * TODO(sergey): Use evaluation context dedicated to motion paths. */ - BKE_scene_graph_update_for_newframe(bmain->eval_ctx, depsgraph, bmain, scene); + BKE_scene_graph_update_for_newframe(bmain->eval_ctx, depsgraph, bmain, scene, scene_layer); } /* ........ */ @@ -344,6 +347,8 @@ void animviz_calc_motionpaths(bContext *C, Scene *scene, ListBase *targets) int sfra, efra; int cfra; Main *bmain = CTX_data_main(C); + /* TODO(sergey): Should we mabe pass scene layer explicitly? */ + SceneLayer *scene_layer = CTX_data_scene_layer(C); struct Depsgraph *depsgraph = CTX_data_depsgraph(C); /* sanity check */ @@ -367,7 +372,7 @@ void animviz_calc_motionpaths(bContext *C, Scene *scene, ListBase *targets) /* calculate path over requested range */ for (CFRA = sfra; CFRA <= efra; CFRA++) { /* update relevant data for new frame */ - motionpaths_calc_update_scene(bmain, scene, depsgraph); + motionpaths_calc_update_scene(bmain, scene, scene_layer, depsgraph); /* perform baking for targets */ motionpaths_calc_bake_targets(scene, targets); @@ -375,7 +380,7 @@ void animviz_calc_motionpaths(bContext *C, Scene *scene, ListBase *targets) /* reset original environment */ CFRA = cfra; - motionpaths_calc_update_scene(bmain, scene, depsgraph); + motionpaths_calc_update_scene(bmain, scene, scene_layer, depsgraph); /* clear recalc flags from targets */ for (mpt = targets->first; mpt; mpt = mpt->next) { diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c index 4d1c2d8454b..abe8c8f8981 100644 --- a/source/blender/blenkernel/intern/pointcache.c +++ b/source/blender/blenkernel/intern/pointcache.c @@ -3662,7 +3662,7 @@ void BKE_ptcache_bake(PTCacheBaker *baker) stime = ptime = PIL_check_seconds_timer(); for (int fr = CFRA; fr <= endframe; fr += baker->quick_step, CFRA = fr) { - BKE_scene_graph_update_for_newframe(G.main->eval_ctx, depsgraph, bmain, scene); + BKE_scene_graph_update_for_newframe(G.main->eval_ctx, depsgraph, bmain, scene, scene_layer); if (baker->update_progress) { float progress = ((float)(CFRA - startframe)/(float)(endframe - startframe)); @@ -3748,7 +3748,7 @@ void BKE_ptcache_bake(PTCacheBaker *baker) CFRA = cfrao; if (bake) { /* already on cfra unless baking */ - BKE_scene_graph_update_for_newframe(bmain->eval_ctx, depsgraph, bmain, scene); + BKE_scene_graph_update_for_newframe(bmain->eval_ctx, depsgraph, bmain, scene, scene_layer); } /* TODO: call redraw all windows somehow */ diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 95f10cc9846..ccdd785986d 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -1537,13 +1537,19 @@ static void prepare_mesh_for_viewport_render(Main *bmain, Scene *scene) void BKE_scene_graph_update_tagged(EvaluationContext *eval_ctx, Depsgraph *depsgraph, Main *bmain, - Scene *scene) + Scene *scene, + SceneLayer *scene_layer) { + /* TODO(sergey): Temporary solution for until pipeline.c is ported. */ + if (scene_layer == NULL) { + scene_layer = DEG_get_evaluated_scene_layer(depsgraph); + BLI_assert(scene_layer != NULL); + } /* TODO(sergey): Some functions here are changing global state, * for example, clearing update tags from bmain. */ /* (Re-)build dependency graph if needed. */ - DEG_graph_relations_update(depsgraph, bmain, scene); + DEG_graph_relations_update(depsgraph, bmain, scene, scene_layer); /* Uncomment this to check if graph was properly tagged for update. */ // DEG_debug_graph_relations_validate(depsgraph, bmain, scene); /* Flush editing data if needed. */ @@ -1566,8 +1572,14 @@ void BKE_scene_graph_update_tagged(EvaluationContext *eval_ctx, void BKE_scene_graph_update_for_newframe(EvaluationContext *eval_ctx, Depsgraph *depsgraph, Main *bmain, - Scene *scene) + Scene *scene, + SceneLayer *scene_layer) { + /* TODO(sergey): Temporary solution for until pipeline.c is ported. */ + if (scene_layer == NULL) { + scene_layer = DEG_get_evaluated_scene_layer(depsgraph); + BLI_assert(scene_layer != NULL); + } /* TODO(sergey): Some functions here are changing global state, * for example, clearing update tags from bmain. */ @@ -1583,7 +1595,7 @@ void BKE_scene_graph_update_for_newframe(EvaluationContext *eval_ctx, */ BKE_image_update_frame(bmain, scene->r.cfra); BKE_sound_set_cfra(scene->r.cfra); - DEG_graph_relations_update(depsgraph, bmain, scene); + DEG_graph_relations_update(depsgraph, bmain, scene, scene_layer); /* Update animated cache files for modifiers. * * TODO(sergey): Make this a depsgraph node? diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c index 11c3a5658e8..3e1ebc2a057 100644 --- a/source/blender/blenkernel/intern/sequencer.c +++ b/source/blender/blenkernel/intern/sequencer.c @@ -3315,7 +3315,7 @@ static ImBuf *seq_render_scene_strip(const SeqRenderData *context, Sequence *seq /* opengl offscreen render */ context->eval_ctx->engine = RE_engines_find(scene->view_render.engine_id); - BKE_scene_graph_update_for_newframe(context->eval_ctx, depsgraph, context->bmain, scene); + BKE_scene_graph_update_for_newframe(context->eval_ctx, depsgraph, context->bmain, scene, scene_layer); ibuf = sequencer_view3d_cb( /* set for OpenGL render (NULL when scrubbing) */ context->eval_ctx, scene, scene_layer, camera, width, height, IB_rect, @@ -3355,7 +3355,7 @@ static ImBuf *seq_render_scene_strip(const SeqRenderData *context, Sequence *seq 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); + BKE_scene_graph_update_for_newframe(context->eval_ctx, depsgraph, context->bmain, scene, scene_layer); RE_BlenderFrame(re, context->bmain, scene, NULL, camera, scene->lay, frame, false); /* restore previous state after it was toggled on & off by RE_BlenderFrame */ @@ -3415,7 +3415,7 @@ finally: scene->r.subframe = orig_data.subframe; if (is_frame_update) { - BKE_scene_graph_update_for_newframe(context->eval_ctx, depsgraph, context->bmain, scene); + BKE_scene_graph_update_for_newframe(context->eval_ctx, depsgraph, context->bmain, scene, scene_layer); } #ifdef DURIAN_CAMERA_SWITCH diff --git a/source/blender/blenkernel/intern/workspace.c b/source/blender/blenkernel/intern/workspace.c index 79e1af810a5..fec9d736e09 100644 --- a/source/blender/blenkernel/intern/workspace.c +++ b/source/blender/blenkernel/intern/workspace.c @@ -481,5 +481,5 @@ void BKE_workspace_update_tagged(struct EvaluationContext *eval_ctx, struct Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene, scene_layer, true); - BKE_scene_graph_update_tagged(eval_ctx, depsgraph, bmain, scene); + BKE_scene_graph_update_tagged(eval_ctx, depsgraph, bmain, scene, scene_layer); } diff --git a/source/blender/depsgraph/CMakeLists.txt b/source/blender/depsgraph/CMakeLists.txt index eae3e402850..64fa5ddfb3d 100644 --- a/source/blender/depsgraph/CMakeLists.txt +++ b/source/blender/depsgraph/CMakeLists.txt @@ -45,13 +45,13 @@ set(SRC intern/builder/deg_builder_nodes.cc intern/builder/deg_builder_nodes_layer.cc intern/builder/deg_builder_nodes_rig.cc - intern/builder/deg_builder_nodes_scene.cc + intern/builder/deg_builder_nodes_scene_layer.cc intern/builder/deg_builder_pchanmap.cc intern/builder/deg_builder_relations.cc intern/builder/deg_builder_relations_keys.cc intern/builder/deg_builder_relations_layer.cc intern/builder/deg_builder_relations_rig.cc - intern/builder/deg_builder_relations_scene.cc + intern/builder/deg_builder_relations_scene_layer.cc intern/builder/deg_builder_transitive.cc intern/debug/deg_debug_graphviz.cc intern/eval/deg_eval.cc diff --git a/source/blender/depsgraph/DEG_depsgraph_build.h b/source/blender/depsgraph/DEG_depsgraph_build.h index 06202b6196e..e328d3d9e8c 100644 --- a/source/blender/depsgraph/DEG_depsgraph_build.h +++ b/source/blender/depsgraph/DEG_depsgraph_build.h @@ -48,6 +48,7 @@ struct Main; struct ModifierData; struct Object; struct Scene; +struct SceneLayer; #ifdef __cplusplus extern "C" { @@ -58,9 +59,10 @@ extern "C" { /* Build depsgraph for the given scene, and dump results in given * graph container. */ -void DEG_graph_build_from_scene(struct Depsgraph *graph, - struct Main *bmain, - struct Scene *scene); +void DEG_graph_build_from_scene_layer(struct Depsgraph *graph, + struct Main *bmain, + struct Scene *scene, + struct SceneLayer *scene_layer); /* Tag relations from the given graph for update. */ void DEG_graph_tag_relations_update(struct Depsgraph *graph); @@ -68,7 +70,8 @@ void DEG_graph_tag_relations_update(struct Depsgraph *graph); /* Create or update relations in the specified graph. */ void DEG_graph_relations_update(struct Depsgraph *graph, struct Main *bmain, - struct Scene *scene); + struct Scene *scene, + struct SceneLayer *scene_layer); /* Tag all relations in the database for update.*/ void DEG_relations_tag_update(struct Main *bmain); diff --git a/source/blender/depsgraph/DEG_depsgraph_debug.h b/source/blender/depsgraph/DEG_depsgraph_debug.h index 7546f1d9018..fd6dff4c973 100644 --- a/source/blender/depsgraph/DEG_depsgraph_debug.h +++ b/source/blender/depsgraph/DEG_depsgraph_debug.h @@ -40,6 +40,8 @@ extern "C" { #endif struct Depsgraph; +struct Scene; +struct SceneLayer; /* ------------------------------------------------ */ @@ -62,8 +64,8 @@ bool DEG_debug_compare(const struct Depsgraph *graph1, /* Check that dependnecies in the graph are really up to date. */ bool DEG_debug_graph_relations_validate(struct Depsgraph *graph, struct Main *bmain, - struct Scene *scene); - + struct Scene *scene, + struct SceneLayer *scene_layer); /* Perform consistency check on the graph. */ bool DEG_debug_consistency_check(struct Depsgraph *graph); diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h index 40d6a56e789..4a311cec4bd 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h @@ -157,8 +157,9 @@ struct DepsgraphNodeBuilder { const char *name = "", int name_tag = -1); - void build_scene(Scene *scene, - eDepsNode_LinkedState_Type linked_state); + void build_scene_layer(Scene *scene, + SceneLayer *scene_layer, + eDepsNode_LinkedState_Type linked_state); void build_group(Group *group); void build_object(Object *ob, eDepsNode_LinkedState_Type linked_state); diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene_layer.cc index 941a9bed5f1..8187adc7d15 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene_layer.cc @@ -65,7 +65,9 @@ extern "C" { namespace DEG { -void DepsgraphNodeBuilder::build_scene(Scene *scene, eDepsNode_LinkedState_Type linked_state) +void DepsgraphNodeBuilder::build_scene_layer(Scene *scene, + SceneLayer *scene_layer, + eDepsNode_LinkedState_Type linked_state) { /* scene ID block */ add_id_node(&scene->id); @@ -76,8 +78,9 @@ void DepsgraphNodeBuilder::build_scene(Scene *scene, eDepsNode_LinkedState_Type /* build subgraph for set, and link this in... */ // XXX: depending on how this goes, that scene itself could probably store its // own little partial depsgraph? - if (scene->set) { - build_scene(scene->set, DEG_ID_LINKED_VIA_SET); + if (scene->set != NULL) { + SceneLayer *set_scene_layer = BKE_scene_layer_from_scene_get(scene->set); + build_scene_layer(scene->set, set_scene_layer, DEG_ID_LINKED_VIA_SET); } /* Setup currently building context. */ @@ -85,12 +88,10 @@ void DepsgraphNodeBuilder::build_scene(Scene *scene, eDepsNode_LinkedState_Type /* scene objects */ int select_color = 1; - for (SceneLayer *sl = (SceneLayer *)scene->render_layers.first; sl; sl = sl->next) { - for (Base *base = (Base *)sl->object_bases.first; base; base = base->next) { - /* object itself */ - build_object(base->object, linked_state); - base->object->select_color = select_color++; - } + LINKLIST_FOREACH(Base *, base, &scene_layer->object_bases) { + /* object itself */ + build_object(base->object, linked_state); + base->object->select_color = select_color++; } if (scene->camera != NULL) { build_object(scene->camera, linked_state); diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.h b/source/blender/depsgraph/intern/builder/deg_builder_relations.h index 81636db0bcf..e433d3a92e2 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.h +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.h @@ -66,6 +66,7 @@ struct Object; struct bPoseChannel; struct bConstraint; struct Scene; +struct SceneLayer; struct Tex; struct World; struct EffectorWeights; @@ -186,7 +187,7 @@ struct DepsgraphRelationBuilder const DepsNodeHandle *handle, const char *description); - void build_scene(Scene *scene); + void build_scene_layer(Scene *scene, SceneLayer *scene_layer); void build_group(Object *object, Group *group); void build_object(Object *ob); void build_object_parent(Object *ob); diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations_scene_layer.cc index af37decdbc7..cbf4eddf13d 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations_scene_layer.cc @@ -68,23 +68,22 @@ extern "C" { namespace DEG { -void DepsgraphRelationBuilder::build_scene(Scene *scene) +void DepsgraphRelationBuilder::build_scene_layer(Scene *scene, SceneLayer *scene_layer) { - if (scene->set) { - build_scene(scene->set); + if (scene->set != NULL) { + SceneLayer *set_scene_layer = BKE_scene_layer_from_scene_get(scene->set); + build_scene_layer(scene->set, set_scene_layer); } - /* XXX store scene to access from DAG_get_scene */ graph_->scene = scene; + graph_->scene_layer = scene_layer; /* Setup currently building context. */ scene_ = scene; /* scene objects */ - for (SceneLayer *sl = (SceneLayer *)scene->render_layers.first; sl; sl = sl->next) { - for (Base *base = (Base *)sl->object_bases.first; base; base = base->next) { - build_object(base->object); - } + LINKLIST_FOREACH(Base *, base, &scene_layer->object_bases) { + build_object(base->object); } if (scene->camera != NULL) { build_object(scene->camera); diff --git a/source/blender/depsgraph/intern/depsgraph.cc b/source/blender/depsgraph/intern/depsgraph.cc index 3caf7e5923f..4a27dddf949 100644 --- a/source/blender/depsgraph/intern/depsgraph.cc +++ b/source/blender/depsgraph/intern/depsgraph.cc @@ -83,7 +83,8 @@ static DEG_EditorUpdateScenePreCb deg_editor_update_scene_pre_cb = NULL; Depsgraph::Depsgraph() : time_source(NULL), need_update(true), - scene(NULL) + scene(NULL), + scene_layer(NULL) { BLI_spin_init(&lock); id_hash = BLI_ghash_ptr_new("Depsgraph id hash"); diff --git a/source/blender/depsgraph/intern/depsgraph.h b/source/blender/depsgraph/intern/depsgraph.h index 1b4dca569d7..b3ac345cef7 100644 --- a/source/blender/depsgraph/intern/depsgraph.h +++ b/source/blender/depsgraph/intern/depsgraph.h @@ -47,6 +47,7 @@ struct GSet; struct PointerRNA; struct PropertyRNA; struct Scene; +struct SceneLayer; namespace DEG { @@ -174,8 +175,9 @@ struct Depsgraph { */ SpinLock lock; - // XXX: additional stuff like eval contexts, mempools for allocating nodes from, etc. - Scene *scene; /* XXX: We really shouldn't do that, but it's required for shader preview. */ + /* Scene and layer this dependency graph is built for. */ + Scene *scene; + SceneLayer *scene_layer; }; } // namespace DEG diff --git a/source/blender/depsgraph/intern/depsgraph_build.cc b/source/blender/depsgraph/intern/depsgraph_build.cc index c8c36646ade..7083e6134dd 100644 --- a/source/blender/depsgraph/intern/depsgraph_build.cc +++ b/source/blender/depsgraph/intern/depsgraph_build.cc @@ -192,16 +192,16 @@ void DEG_add_special_eval_flag(Depsgraph *graph, ID *id, short flag) /* ******************** */ /* Graph Building API's */ -/* Build depsgraph for the given scene, and dump results in given +/* Build depsgraph for the given scene layer, and dump results in given * graph container. */ -/* XXX: assume that this is called from outside, given the current scene as - * the "main" scene. - */ -void DEG_graph_build_from_scene(Depsgraph *graph, Main *bmain, Scene *scene) +void DEG_graph_build_from_scene_layer(Depsgraph *graph, + Main *bmain, + Scene *scene, + SceneLayer *scene_layer) { #ifdef DEBUG_TIME - TIMEIT_START(DEG_graph_build_from_scene); + TIMEIT_START(DEG_graph_build_from_scene_layer); #endif DEG::Depsgraph *deg_graph = reinterpret_cast<DEG::Depsgraph *>(graph); @@ -217,14 +217,16 @@ void DEG_graph_build_from_scene(Depsgraph *graph, Main *bmain, Scene *scene) /* 1) Generate all the nodes in the graph first */ DEG::DepsgraphNodeBuilder node_builder(bmain, deg_graph); node_builder.begin_build(); - node_builder.build_scene(scene, DEG::DEG_ID_LINKED_DIRECTLY); + node_builder.build_scene_layer(scene, + scene_layer, + DEG::DEG_ID_LINKED_DIRECTLY); /* 2) Hook up relationships between operations - to determine evaluation * order. */ DEG::DepsgraphRelationBuilder relation_builder(bmain, deg_graph); relation_builder.begin_build(); - relation_builder.build_scene(scene); + relation_builder.build_scene_layer(scene, scene_layer); if (DEG_depsgraph_use_copy_on_write()) { relation_builder.build_copy_on_write_relations(); } @@ -252,7 +254,7 @@ void DEG_graph_build_from_scene(Depsgraph *graph, Main *bmain, Scene *scene) #endif #ifdef DEBUG_TIME - TIMEIT_END(DEG_graph_build_from_scene); + TIMEIT_END(DEG_graph_build_from_scene_layer); #endif /* Relations are up to date. */ @@ -271,14 +273,17 @@ void DEG_graph_tag_relations_update(Depsgraph *graph) } /* Create or update relations in the specified graph. */ -void DEG_graph_relations_update(Depsgraph *graph, Main *bmain, Scene *scene) +void DEG_graph_relations_update(Depsgraph *graph, + Main *bmain, + Scene *scene, + SceneLayer *scene_layer) { DEG::Depsgraph *deg_graph = (DEG::Depsgraph *)graph; if (!deg_graph->need_update) { /* Graph is up to date, nothing to do. */ return; } - DEG_graph_build_from_scene(graph, bmain, scene); + DEG_graph_build_from_scene_layer(graph, bmain, scene, scene_layer); } /* Tag all relations for update. */ diff --git a/source/blender/depsgraph/intern/depsgraph_debug.cc b/source/blender/depsgraph/intern/depsgraph_debug.cc index dac084e4bad..72d074dd505 100644 --- a/source/blender/depsgraph/intern/depsgraph_debug.cc +++ b/source/blender/depsgraph/intern/depsgraph_debug.cc @@ -66,11 +66,12 @@ bool DEG_debug_compare(const struct Depsgraph *graph1, bool DEG_debug_graph_relations_validate(Depsgraph *graph, Main *bmain, - Scene *scene) + Scene *scene, + SceneLayer *scene_layer) { Depsgraph *temp_depsgraph = DEG_graph_new(); bool valid = true; - DEG_graph_build_from_scene(temp_depsgraph, bmain, scene); + DEG_graph_build_from_scene_layer(temp_depsgraph, bmain, scene, scene_layer); if (!DEG_debug_compare(temp_depsgraph, graph)) { fprintf(stderr, "ERROR! Depsgraph wasn't tagged for update when it should have!\n"); BLI_assert(!"This should not happen!"); diff --git a/source/blender/depsgraph/intern/depsgraph_query.cc b/source/blender/depsgraph/intern/depsgraph_query.cc index 864db49f601..8b451ccee32 100644 --- a/source/blender/depsgraph/intern/depsgraph_query.cc +++ b/source/blender/depsgraph/intern/depsgraph_query.cc @@ -91,11 +91,8 @@ Scene *DEG_get_evaluated_scene(Depsgraph *graph) SceneLayer *DEG_get_evaluated_scene_layer(Depsgraph *graph) { - Scene *scene = DEG_get_evaluated_scene(graph); - if (scene != NULL) { - return BKE_scene_layer_context_active_PLACEHOLDER(scene); - } - return NULL; + DEG::Depsgraph *deg_graph = reinterpret_cast<DEG::Depsgraph *>(graph); + return deg_graph->scene_layer; } Object *DEG_get_evaluated_object(Depsgraph *depsgraph, Object *object) diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h index f7219ce6846..51f1f38a9e9 100644 --- a/source/blender/editors/include/ED_screen.h +++ b/source/blender/editors/include/ED_screen.h @@ -168,7 +168,7 @@ bool ED_workspace_layout_cycle( struct bContext *C) ATTR_NONNULL(); /* anim */ -void ED_update_for_newframe(struct Main *bmain, struct Scene *scene, struct Depsgraph *depsgraph); +void ED_update_for_newframe(struct Main *bmain, struct Scene *scene, struct SceneLayer *scene_layer, struct Depsgraph *depsgraph); void ED_refresh_viewport_fps(struct bContext *C); int ED_screen_animation_play(struct bContext *C, int sync, int mode); diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index ac24b106383..f6a23a03aa4 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -1765,7 +1765,7 @@ static int convert_exec(bContext *C, wmOperator *op) Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene, sl, true); uint64_t customdata_mask_prev = scene->customdata_mask; scene->customdata_mask |= CD_MASK_MESH; - BKE_scene_graph_update_tagged(bmain->eval_ctx, depsgraph, bmain, scene); + BKE_scene_graph_update_tagged(bmain->eval_ctx, depsgraph, bmain, scene, sl); scene->customdata_mask = customdata_mask_prev; } diff --git a/source/blender/editors/physics/dynamicpaint_ops.c b/source/blender/editors/physics/dynamicpaint_ops.c index 210d8351945..c10604b0edd 100644 --- a/source/blender/editors/physics/dynamicpaint_ops.c +++ b/source/blender/editors/physics/dynamicpaint_ops.c @@ -365,7 +365,7 @@ static void dynamicPaint_bakeImageSequence(DynamicPaintBakeJob *job) frame = surface->start_frame; orig_frame = scene->r.cfra; scene->r.cfra = (int)frame; - ED_update_for_newframe(job->bmain, scene, job->depsgraph); + ED_update_for_newframe(job->bmain, scene, job->scene_layer, job->depsgraph); /* Init surface */ if (!dynamicPaint_createUVSurface(scene, surface, job->progress, job->do_update)) { @@ -391,7 +391,7 @@ static void dynamicPaint_bakeImageSequence(DynamicPaintBakeJob *job) /* calculate a frame */ scene->r.cfra = (int)frame; - ED_update_for_newframe(job->bmain, scene, job->depsgraph); + ED_update_for_newframe(job->bmain, scene, job->scene_layer, job->depsgraph); if (!dynamicPaint_calculateFrame(surface, job->eval_ctx, scene, cObject, frame)) { job->success = 0; return; diff --git a/source/blender/editors/physics/physics_fluid.c b/source/blender/editors/physics/physics_fluid.c index a5e92802c6f..071dafe08bb 100644 --- a/source/blender/editors/physics/physics_fluid.c +++ b/source/blender/editors/physics/physics_fluid.c @@ -409,7 +409,7 @@ static void fluid_init_all_channels(bContext *C, Object *UNUSED(fsDomain), Fluid /* Modifying the global scene isn't nice, but we can do it in * this part of the process before a threaded job is created */ scene->r.cfra = (int)eval_time; - ED_update_for_newframe(CTX_data_main(C), scene, depsgraph); + ED_update_for_newframe(CTX_data_main(C), scene, sl, depsgraph); /* now scene data should be current according to animation system, so we fill the channels */ @@ -959,7 +959,7 @@ static int fluidsimBake(bContext *C, ReportList *reports, Object *fsDomain, shor /* reset to original current frame */ scene->r.cfra = origFrame; - ED_update_for_newframe(CTX_data_main(C), scene, depsgraph); + ED_update_for_newframe(CTX_data_main(C), scene, sl, depsgraph); /* ******** init domain object's matrix ******** */ copy_m4_m4(domainMat, fsDomain->obmat); diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c index 61ff9264e95..3f2951b2a3e 100644 --- a/source/blender/editors/render/render_internal.c +++ b/source/blender/editors/render/render_internal.c @@ -101,6 +101,7 @@ static int render_break(void *rjv); typedef struct RenderJob { Main *main; Scene *scene; + SceneLayer *scene_layer; Scene *current_scene; /* TODO(sergey): Should not be needed once engine will have own * depsgraph and copy-on-write will be implemented. @@ -295,6 +296,8 @@ static void screen_render_scene_layer_set(wmOperator *op, Main *mainp, Scene **s static int screen_render_exec(bContext *C, wmOperator *op) { Scene *scene = CTX_data_scene(C); + SceneLayer *scene_layer = CTX_data_scene_layer(C); + Depsgraph *depsgraph = CTX_data_depsgraph(C); SceneRenderLayer *srl = NULL; Render *re; Image *ima; @@ -342,7 +345,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, CTX_data_depsgraph(C)); + ED_update_for_newframe(mainp, scene, scene_layer, depsgraph); WM_event_add_notifier(C, NC_SCENE | ND_RENDER_RESULT, scene); @@ -656,7 +659,7 @@ static void render_endjob(void *rjv) if (rj->anim && !(rj->scene->r.scemode & R_NO_FRAME_UPDATE)) { /* possible this fails of loading new file while rendering */ if (G.main->wm.first) { - ED_update_for_newframe(G.main, rj->scene, rj->depsgraph); + ED_update_for_newframe(G.main, rj->scene, rj->scene_layer, rj->depsgraph); } } @@ -919,6 +922,7 @@ static int screen_render_invoke(bContext *C, wmOperator *op, const wmEvent *even rj->main = mainp; rj->scene = scene; rj->current_scene = rj->scene; + rj->scene_layer = CTX_data_scene_layer(C); /* TODO(sergey): Render engine should be using own depsgraph. */ rj->depsgraph = CTX_data_depsgraph(C); rj->srl = srl; diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c index 03cffa5a384..d436c562f19 100644 --- a/source/blender/editors/render/render_opengl.c +++ b/source/blender/editors/render/render_opengl.c @@ -812,8 +812,10 @@ static void screen_opengl_render_end(bContext *C, OGLRender *oglrender) } if (oglrender->timer) { /* exec will not have a timer */ + Depsgraph *depsgraph = oglrender->depsgraph; + SceneLayer *scene_layer = oglrender->scene_layer; scene->r.cfra = oglrender->cfrao; - BKE_scene_graph_update_for_newframe(bmain->eval_ctx, oglrender->depsgraph, bmain, scene); + BKE_scene_graph_update_for_newframe(bmain->eval_ctx, depsgraph, bmain, scene, scene_layer); WM_event_remove_timer(oglrender->wm, oglrender->win, oglrender->timer); } @@ -1013,6 +1015,8 @@ static bool screen_opengl_render_anim_step(bContext *C, wmOperator *op) Main *bmain = CTX_data_main(C); OGLRender *oglrender = op->customdata; Scene *scene = oglrender->scene; + SceneLayer *scene_layer = oglrender->scene_layer; + Depsgraph *depsgraph = oglrender->depsgraph; char name[FILE_MAX]; bool ok = false; const bool view_context = (oglrender->v3d != NULL); @@ -1023,7 +1027,7 @@ static bool screen_opengl_render_anim_step(bContext *C, wmOperator *op) if (CFRA < oglrender->nfra) CFRA++; while (CFRA < oglrender->nfra) { - BKE_scene_graph_update_for_newframe(bmain->eval_ctx, oglrender->depsgraph, bmain, scene); + BKE_scene_graph_update_for_newframe(bmain->eval_ctx, depsgraph, bmain, scene, scene_layer); CFRA++; } @@ -1045,7 +1049,7 @@ static bool screen_opengl_render_anim_step(bContext *C, wmOperator *op) WM_cursor_time(oglrender->win, scene->r.cfra); - BKE_scene_graph_update_for_newframe(bmain->eval_ctx, oglrender->depsgraph, bmain, scene); + BKE_scene_graph_update_for_newframe(bmain->eval_ctx, depsgraph, bmain, scene, scene_layer); if (view_context) { if (oglrender->rv3d->persp == RV3D_CAMOB && oglrender->v3d->camera && oglrender->v3d->scenelock) { diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c index 84c843af020..47eca1ccba3 100644 --- a/source/blender/editors/render/render_preview.c +++ b/source/blender/editors/render/render_preview.c @@ -608,7 +608,7 @@ static Scene *preview_prepare_scene(Main *bmain, Scene *scene, ID *id, int id_ty /* TODO(sergey): Use proper flag for tagging here. */ DEG_graph_id_tag_update(pr_main, depsgraph, &sce->id, 0); DEG_relations_tag_update(pr_main); - BKE_scene_graph_update_tagged(pr_main->eval_ctx, depsgraph, pr_main, sce); + BKE_scene_graph_update_tagged(pr_main->eval_ctx, depsgraph, pr_main, sce, scene_layer); return sce; } diff --git a/source/blender/editors/scene/scene_edit.c b/source/blender/editors/scene/scene_edit.c index dca4cc77e5b..e68919aefaa 100644 --- a/source/blender/editors/scene/scene_edit.c +++ b/source/blender/editors/scene/scene_edit.c @@ -129,12 +129,12 @@ void ED_scene_changed_update(Main *bmain, bContext *C, Scene *scene_new, const b CTX_data_scene_set(C, scene_new); BKE_workspace_render_layer_set(CTX_wm_workspace(C), layer_new); BKE_scene_set_background(bmain, scene_new); - DEG_graph_relations_update(depsgraph, bmain, scene_new); + DEG_graph_relations_update(depsgraph, bmain, scene_new, layer_new); DEG_on_visible_update(bmain, false); ED_screen_update_after_scene_change(active_screen, scene_new, layer_new); ED_render_engine_changed(bmain); - ED_update_for_newframe(bmain, scene_new, depsgraph); + ED_update_for_newframe(bmain, scene_new, layer_new, depsgraph); /* complete redraw */ WM_event_add_notifier(C, NC_WINDOW, NULL); diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c index 749a857fdaa..dfe2942868f 100644 --- a/source/blender/editors/screen/screen_edit.c +++ b/source/blender/editors/screen/screen_edit.c @@ -1727,7 +1727,7 @@ void ED_screen_animation_timer_update(bScreen *screen, int redraws, int refresh) } /* results in fully updated anim system */ -void ED_update_for_newframe(Main *bmain, Scene *scene, struct Depsgraph *depsgraph) +void ED_update_for_newframe(Main *bmain, Scene *scene, SceneLayer *scene_layer, struct Depsgraph *depsgraph) { #ifdef DURIAN_CAMERA_SWITCH void *camera = BKE_scene_camera_switch_find(scene); @@ -1744,7 +1744,7 @@ void ED_update_for_newframe(Main *bmain, Scene *scene, struct Depsgraph *depsgra ED_clip_update_frame(bmain, scene->r.cfra); /* this function applies the changes too */ - BKE_scene_graph_update_for_newframe(bmain->eval_ctx, depsgraph, bmain, scene); + BKE_scene_graph_update_for_newframe(bmain->eval_ctx, depsgraph, bmain, scene, scene_layer); /* composite */ if (scene->use_nodes && scene->nodetree) diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index c02733d26bd..cb53de23983 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -3408,6 +3408,8 @@ static int screen_animation_step(bContext *C, wmOperator *UNUSED(op), const wmEv if (screen->animtimer && screen->animtimer == event->customdata) { Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); + SceneLayer *scene_layer = CTX_data_scene_layer(C); + struct Depsgraph *depsgraph = CTX_data_depsgraph(C); wmTimer *wt = screen->animtimer; ScreenAnimData *sad = wt->customdata; wmWindowManager *wm = CTX_wm_manager(C); @@ -3518,7 +3520,7 @@ static int screen_animation_step(bContext *C, wmOperator *UNUSED(op), const wmEv } /* since we follow drawflags, we can't send notifier but tag regions ourselves */ - ED_update_for_newframe(bmain, scene, CTX_data_depsgraph(C)); + ED_update_for_newframe(bmain, scene, scene_layer, depsgraph); for (window = wm->windows.first; window; window = window->next) { const bScreen *win_screen = WM_window_get_active_screen(window); diff --git a/source/blender/editors/sound/sound_ops.c b/source/blender/editors/sound/sound_ops.c index 0d6e0cf8e89..4fed7c4467e 100644 --- a/source/blender/editors/sound/sound_ops.c +++ b/source/blender/editors/sound/sound_ops.c @@ -311,6 +311,7 @@ static int sound_bake_animation_exec(bContext *C, wmOperator *UNUSED(op)) { Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); + SceneLayer *scene_layer = CTX_data_scene_layer(C); struct Depsgraph *depsgraph = CTX_data_depsgraph(C); int oldfra = scene->r.cfra; int cfra; @@ -319,11 +320,11 @@ static int sound_bake_animation_exec(bContext *C, wmOperator *UNUSED(op)) for (cfra = (scene->r.sfra > 0) ? (scene->r.sfra - 1) : 0; cfra <= scene->r.efra + 1; cfra++) { scene->r.cfra = cfra; - BKE_scene_graph_update_for_newframe(bmain->eval_ctx, depsgraph, bmain, scene); + BKE_scene_graph_update_for_newframe(bmain->eval_ctx, depsgraph, bmain, scene, scene_layer); } scene->r.cfra = oldfra; - BKE_scene_graph_update_for_newframe(bmain->eval_ctx, depsgraph, bmain, scene); + BKE_scene_graph_update_for_newframe(bmain->eval_ctx, depsgraph, bmain, scene, scene_layer); return OPERATOR_FINISHED; } diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index ed215a84dc7..922cae1320d 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -5559,7 +5559,7 @@ static void set_trans_object_base_flags(TransInfo *t) BKE_scene_base_flag_to_objects(t->scene_layer); /* Make sure depsgraph is here. */ - DEG_graph_relations_update(depsgraph, bmain, scene); + DEG_graph_relations_update(depsgraph, bmain, scene, sl); /* handle pending update events, otherwise they got copied below */ EvaluationContext eval_ctx; @@ -5696,7 +5696,7 @@ static int count_proportional_objects(TransInfo *t) /* all recalc flags get flushed to all layers, so a layer flip later on works fine */ - DEG_graph_relations_update(depsgraph, bmain, scene); + DEG_graph_relations_update(depsgraph, bmain, scene, sl); DEG_graph_flush_update(bmain, depsgraph); /* and we store them temporal in base (only used for transform code) */ diff --git a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp index 6f79b90fd8a..0424ed4bb16 100644 --- a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp +++ b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp @@ -972,7 +972,8 @@ Render *BlenderStrokeRenderer::RenderScene(Render * /*re*/, bool render) #endif Render *freestyle_render = RE_NewSceneRender(freestyle_scene); - DEG_graph_relations_update(freestyle_depsgraph, freestyle_bmain, freestyle_scene); + SceneLayer *scene_layer = (SceneLayer *)freestyle_scene->render_layers.first; + DEG_graph_relations_update(freestyle_depsgraph, freestyle_bmain, freestyle_scene, scene_layer); freestyle_render->depsgraph = freestyle_depsgraph; RE_RenderFreestyleStrokes(freestyle_render, freestyle_bmain, freestyle_scene, diff --git a/source/blender/makesrna/intern/rna_scene_api.c b/source/blender/makesrna/intern/rna_scene_api.c index 78afba0e426..3cdb6433882 100644 --- a/source/blender/makesrna/intern/rna_scene_api.c +++ b/source/blender/makesrna/intern/rna_scene_api.c @@ -90,7 +90,11 @@ static void rna_Scene_frame_set(Scene *scene, Main *bmain, int frame, float subf scene_layer = scene_layer->next) { Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene, scene_layer, true); - BKE_scene_graph_update_for_newframe(bmain->eval_ctx, depsgraph, bmain, scene); + BKE_scene_graph_update_for_newframe(bmain->eval_ctx, + depsgraph, + bmain, + scene, + scene_layer); } #ifdef WITH_PYTHON @@ -136,7 +140,11 @@ static void rna_Scene_update_tagged(Scene *scene, Main *bmain) scene_layer = scene_layer->next) { Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene, scene_layer, true); - BKE_scene_graph_update_tagged(bmain->eval_ctx, depsgraph, bmain, scene); + BKE_scene_graph_update_tagged(bmain->eval_ctx, + depsgraph, + bmain, + scene, + scene_layer); } #ifdef WITH_PYTHON diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index d7737381c46..608c182bd7b 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -5220,7 +5220,7 @@ 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); + BKE_scene_graph_update_for_newframe(re->eval_ctx, re->depsgraph, re->main, re->scene, NULL); render_update_anim_renderdata(re, &re->scene->r); } @@ -5392,7 +5392,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); + BKE_scene_graph_update_for_newframe(re->eval_ctx, re->depsgraph, re->main, re->scene, NULL); /* if no camera, viewmat should have been set! */ if (camera) { diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c index 28c0c1cbf14..61f59eace89 100644 --- a/source/blender/render/intern/source/external_engine.c +++ b/source/blender/render/intern/source/external_engine.c @@ -622,7 +622,7 @@ 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); + BKE_scene_graph_update_for_newframe(re->eval_ctx, re->depsgraph, re->main, scene, NULL); #ifdef WITH_PYTHON BPy_END_ALLOW_THREADS; @@ -657,7 +657,7 @@ 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); + BKE_scene_graph_update_for_newframe(re->eval_ctx, re->depsgraph, re->main, re->scene, NULL); render_update_anim_renderdata(re, &re->scene->r); } diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index cac17dcd86e..080e68d813e 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -1748,7 +1748,7 @@ static void do_render_blur_3d(Render *re) /* 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); + 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... */ @@ -2635,7 +2635,7 @@ static void do_render_composite_fields_blur_3d(Render *re) R.i.cfra = re->i.cfra; if (update_newframe) - BKE_scene_graph_update_for_newframe(re->eval_ctx, re->depsgraph, re->main, re->scene); + BKE_scene_graph_update_for_newframe(re->eval_ctx, re->depsgraph, re->main, re->scene, NULL); if (re->r.scemode & R_FULL_SAMPLE) do_merge_fullsample(re, ntree); @@ -3700,7 +3700,7 @@ void RE_BlenderAnim(Render *re, Main *bmain, Scene *scene, Object *camera_overri 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); + BKE_scene_graph_update_for_newframe(re->eval_ctx, re->depsgraph, bmain, scene, NULL); continue; } else diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 7701e501591..ffe417487d7 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -389,8 +389,8 @@ void wm_event_do_notifiers(bContext *C) } } if (ELEM(note->category, NC_SCENE, NC_OBJECT, NC_GEOM, NC_WM)) { - SceneLayer *sl = CTX_data_scene_layer(C); - ED_info_stats_clear(sl); + SceneLayer *scene_layer = CTX_data_scene_layer(C); + ED_info_stats_clear(scene_layer); WM_event_add_notifier(C, NC_SPACE | ND_SPACE_INFO, NULL); } } @@ -400,9 +400,10 @@ void wm_event_do_notifiers(bContext *C) * collide (happens on slow scenes), BKE_scene_graph_update_for_newframe can be called * twice which can depgraph update the same object at once */ if (G.is_rendering == false) { - /* depsgraph gets called, might send more notifiers */ - ED_update_for_newframe(CTX_data_main(C), scene, CTX_data_depsgraph(C)); + SceneLayer *scene_layer = CTX_data_scene_layer(C); + Depsgraph *depsgraph = CTX_data_depsgraph(C); + ED_update_for_newframe(CTX_data_main(C), scene, scene_layer, depsgraph); } } } @@ -2599,7 +2600,7 @@ void wm_event_do_handlers(bContext *C) wm_event_free_all(win); else { Scene *scene = WM_window_get_active_scene(win); - + if (scene) { int is_playing_sound = BKE_sound_scene_playing(scene); @@ -2622,7 +2623,9 @@ void wm_event_do_handlers(bContext *C) int ncfra = time * (float)FPS + 0.5f; if (ncfra != scene->r.cfra) { scene->r.cfra = ncfra; - ED_update_for_newframe(CTX_data_main(C), scene, CTX_data_depsgraph(C)); + SceneLayer *scene_layer = CTX_data_scene_layer(C); + Depsgraph *depsgraph = CTX_data_depsgraph(C); + ED_update_for_newframe(CTX_data_main(C), scene, scene_layer, depsgraph); WM_event_add_notifier(C, NC_WINDOW, NULL); } } diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index ee2d9553c60..d98d66f178d 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -3240,7 +3240,8 @@ static const EnumPropertyItem redraw_timer_type_items[] = { static void redraw_timer_step( - bContext *C, Main *bmain, Scene *scene, struct Depsgraph *depsgraph, + bContext *C, Main *bmain, Scene *scene, SceneLayer *scene_layer, + struct Depsgraph *depsgraph, wmWindow *win, ScrArea *sa, ARegion *ar, const int type, const int cfra) { @@ -3287,7 +3288,7 @@ static void redraw_timer_step( } else if (type == eRTAnimationStep) { scene->r.cfra += (cfra == scene->r.cfra) ? 1 : -1; - BKE_scene_graph_update_for_newframe(bmain->eval_ctx, depsgraph, bmain, scene); + BKE_scene_graph_update_for_newframe(bmain->eval_ctx, depsgraph, bmain, scene, scene_layer); } else if (type == eRTAnimationPlay) { /* play anim, return on same frame as started with */ @@ -3299,7 +3300,7 @@ static void redraw_timer_step( if (scene->r.cfra > scene->r.efra) scene->r.cfra = scene->r.sfra; - BKE_scene_graph_update_for_newframe(bmain->eval_ctx, depsgraph, bmain, scene); + BKE_scene_graph_update_for_newframe(bmain->eval_ctx, depsgraph, bmain, scene, scene_layer); redraw_timer_window_swap(C); } } @@ -3313,6 +3314,7 @@ static int redraw_timer_exec(bContext *C, wmOperator *op) { Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); + SceneLayer *scene_layer = CTX_data_scene_layer(C); wmWindow *win = CTX_wm_window(C); ScrArea *sa = CTX_wm_area(C); ARegion *ar = CTX_wm_region(C); @@ -3330,7 +3332,7 @@ static int redraw_timer_exec(bContext *C, wmOperator *op) time_start = PIL_check_seconds_timer(); for (a = 0; a < iter; a++) { - redraw_timer_step(C, bmain, scene, depsgraph, win, sa, ar, type, cfra); + redraw_timer_step(C, bmain, scene, scene_layer, depsgraph, win, sa, ar, type, cfra); iter_steps += 1; if (time_limit != 0.0) { diff --git a/source/creator/creator_args.c b/source/creator/creator_args.c index c3f355f3937..3b5fd82e096 100644 --- a/source/creator/creator_args.c +++ b/source/creator/creator_args.c @@ -91,6 +91,7 @@ #include "DEG_depsgraph.h" #include "DEG_depsgraph_build.h" +#include "DEG_depsgraph_debug.h" #include "creator_intern.h" /* own include */ @@ -441,7 +442,12 @@ static void render_set_depgraph(bContext *C, Render *re) */ SceneLayer *scene_layer = scene->render_layers.first; Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene, scene_layer, true); - DEG_graph_relations_update(depsgraph, bmain, scene); + DEG_graph_relations_update(depsgraph, bmain, scene, scene_layer); + { + FILE *stream = fopen("/home/sergey/deg.dot", "w"); + DEG_debug_graphviz(depsgraph, stream, "", false); + fclose(stream); + } DEG_graph_on_visible_update(bmain, depsgraph); RE_SetDepsgraph(re, depsgraph); diff --git a/tests/gtests/alembic/abc_export_test.cc b/tests/gtests/alembic/abc_export_test.cc index b5ef1a194e9..2e4d95f6f60 100644 --- a/tests/gtests/alembic/abc_export_test.cc +++ b/tests/gtests/alembic/abc_export_test.cc @@ -16,9 +16,9 @@ extern "C" { class TestableAbcExporter : public AbcExporter { public: TestableAbcExporter(Main *bmain, EvaluationContext *eval_ctx, - Scene *scene, Depsgraph *depsgraph, + Scene *scene, SceneLayer *scene_layer, Depsgraph *depsgraph, const char *filename, ExportSettings &settings) - : AbcExporter(bmain, eval_ctx, scene, depsgraph, filename, settings) + : AbcExporter(bmain, eval_ctx, scene, scene_layer, depsgraph, filename, settings) { } @@ -73,7 +73,8 @@ protected: // Call after setting up the settings. void createExporter() { - exporter = new TestableAbcExporter(bmain, &eval_ctx, &scene, depsgraph, "somefile.abc", settings); + SceneLayer *scene_layer = (SceneLayer *)scene.render_layers.first; + exporter = new TestableAbcExporter(bmain, &eval_ctx, &scene, scene_layer, depsgraph, "somefile.abc", settings); } }; |