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

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/blenkernel/BKE_workspace.h9
-rw-r--r--source/blender/blenkernel/intern/scene.c38
-rw-r--r--source/blender/blenkernel/intern/workspace.c14
-rw-r--r--source/blender/depsgraph/intern/depsgraph_eval.cc1
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c9
5 files changed, 60 insertions, 11 deletions
diff --git a/source/blender/blenkernel/BKE_workspace.h b/source/blender/blenkernel/BKE_workspace.h
index bff40d7c85b..b48fa678531 100644
--- a/source/blender/blenkernel/BKE_workspace.h
+++ b/source/blender/blenkernel/BKE_workspace.h
@@ -28,6 +28,9 @@
#include "BLI_compiler_attrs.h"
struct bScreen;
+struct EvaluationContext;
+struct Main;
+struct Scene;
struct TransformOrientation;
/**
@@ -121,6 +124,12 @@ struct ViewRender *BKE_workspace_view_render_get(struct WorkSpace *workspace) GE
bool BKE_workspace_use_scene_settings_get(const struct WorkSpace *workspace) GETTER_ATTRS;
void BKE_workspace_use_scene_settings_set(struct WorkSpace *workspace, bool value) SETTER_ATTRS;
+/* Update / evaluate */
+void BKE_workspace_update_tagged(struct EvaluationContext *eval_ctx,
+ struct Main *bmain,
+ struct WorkSpace *workspace,
+ struct Scene *scene);
+
#undef GETTER_ATTRS
#undef SETTER_ATTRS
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index f5aa6223d5d..dfa9227b679 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -1587,6 +1587,9 @@ static void prepare_mesh_for_viewport_render(Main *bmain, Scene *scene)
}
}
+/* TODO(sergey): This actually should become scene_layer_graph or so.
+ * Same applies to update_for_newframe.
+ */
void BKE_scene_graph_update_tagged(EvaluationContext *eval_ctx,
Depsgraph *depsgraph,
Main *bmain,
@@ -2436,10 +2439,37 @@ Depsgraph *BKE_scene_get_depsgraph(Scene *scene,
SceneLayer *scene_layer,
bool allocate)
{
- (void) scene_layer;
- Depsgraph *depsgraph = scene->depsgraph_legacy;
- if (depsgraph == NULL && allocate) {
- scene->depsgraph_legacy = depsgraph = DEG_graph_new();
+ BLI_assert(scene != NULL);
+ BLI_assert(scene_layer != NULL);
+ /* Make sure hash itself exists. */
+ if (allocate) {
+ BKE_scene_ensure_depsgraph_hash(scene);
+ }
+ if (scene->depsgraph_hash == NULL) {
+ return NULL;
+ }
+ /* Either ensure item is in the hash or simply return NULL if it's not,
+ * depending on whether caller wants us to create depsgraph or not.
+ */
+ DepsgraphKey key;
+ key.scene_layer = scene_layer;
+ Depsgraph *depsgraph;
+ if (allocate) {
+ DepsgraphKey **key_ptr;
+ Depsgraph **depsgraph_ptr;
+ if (!BLI_ghash_ensure_p_ex(scene->depsgraph_hash,
+ &key,
+ (void***)&key_ptr,
+ (void***)&depsgraph_ptr))
+ {
+ *key_ptr = MEM_mallocN(sizeof(DepsgraphKey), __func__);
+ **key_ptr = key;
+ *depsgraph_ptr = DEG_graph_new();
+ }
+ depsgraph = *depsgraph_ptr;
+ }
+ else {
+ depsgraph = BLI_ghash_lookup(scene->depsgraph_hash, &key);
}
return depsgraph;
}
diff --git a/source/blender/blenkernel/intern/workspace.c b/source/blender/blenkernel/intern/workspace.c
index 04b18e6ecdb..79e1af810a5 100644
--- a/source/blender/blenkernel/intern/workspace.c
+++ b/source/blender/blenkernel/intern/workspace.c
@@ -469,3 +469,17 @@ void BKE_workspace_use_scene_settings_set(WorkSpace *workspace, bool value)
workspace->flags &= ~WORKSPACE_USE_SCENE_SETTINGS;
}
}
+
+/* Update / evaluate */
+
+void BKE_workspace_update_tagged(struct EvaluationContext *eval_ctx,
+ Main *bmain,
+ WorkSpace *workspace,
+ Scene *scene)
+{
+ SceneLayer *scene_layer = BKE_workspace_render_layer_get(workspace);
+ struct Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene,
+ scene_layer,
+ true);
+ BKE_scene_graph_update_tagged(eval_ctx, depsgraph, bmain, scene);
+}
diff --git a/source/blender/depsgraph/intern/depsgraph_eval.cc b/source/blender/depsgraph/intern/depsgraph_eval.cc
index 6dbbba0391b..00b07307933 100644
--- a/source/blender/depsgraph/intern/depsgraph_eval.cc
+++ b/source/blender/depsgraph/intern/depsgraph_eval.cc
@@ -89,6 +89,7 @@ void DEG_evaluation_context_init_from_scene(EvaluationContext *eval_ctx,
eval_ctx->scene_layer = scene_layer;
eval_ctx->engine = engine;
eval_ctx->ctime = BKE_scene_frame_get(scene);
+ BLI_assert(eval_ctx->depsgraph != NULL);
}
/* Free evaluation context. */
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index ba3dab60972..7701e501591 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -311,13 +311,8 @@ void wm_event_do_refresh_wm_and_depsgraph(bContext *C)
/* XXX, hack so operators can enforce datamasks [#26482], gl render */
scene->customdata_mask |= scene->customdata_mask_modal;
- for (SceneLayer *scene_layer = scene->render_layers.first;
- scene_layer != NULL;
- 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);
- }
+ WorkSpace *workspace = WM_window_get_active_workspace(win);
+ BKE_workspace_update_tagged(bmain->eval_ctx, bmain, workspace, scene);
}
}