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:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2018-04-04 14:51:39 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2018-04-04 18:59:46 +0300
commit5fba4458e9a7a995343a3432abe230c9ea293813 (patch)
tree3af087eeb7ec4d6646e461454196df89e1a737b2 /source/blender/render
parentdb3c3d133817cd16ce3022ddce01559ed28cb532 (diff)
Fix Cycles motion blur and engine.frame_set() not working.
Diffstat (limited to 'source/blender/render')
-rw-r--r--source/blender/render/extern/include/RE_engine.h10
-rw-r--r--source/blender/render/intern/source/external_engine.c110
2 files changed, 74 insertions, 46 deletions
diff --git a/source/blender/render/extern/include/RE_engine.h b/source/blender/render/extern/include/RE_engine.h
index ad0cb34d382..2a1d51158b3 100644
--- a/source/blender/render/extern/include/RE_engine.h
+++ b/source/blender/render/extern/include/RE_engine.h
@@ -39,7 +39,10 @@
struct bNode;
struct bNodeTree;
+struct BakePixel;
+struct Depsgraph;
struct Depsgraph;
+struct EvaluationContext;
struct IDProperty;
struct Main;
struct Object;
@@ -51,7 +54,7 @@ struct RenderLayer;
struct RenderResult;
struct ReportList;
struct Scene;
-struct BakePixel;
+struct ViewLayer;
/* External Engine */
@@ -133,6 +136,11 @@ typedef struct RenderEngine {
struct ReportList *reports;
+ /* Depsgraph */
+ struct EvaluationContext *eval_ctx;
+ struct Depsgraph *depsgraph;
+ struct ViewLayer *view_layer;
+
/* for blender internal only */
int update_flag;
int job_update_flag;
diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c
index 285cf8d660b..617e49c5d0f 100644
--- a/source/blender/render/intern/source/external_engine.c
+++ b/source/blender/render/intern/source/external_engine.c
@@ -527,6 +527,65 @@ RenderData *RE_engine_get_render_data(Render *re)
return &re->r;
}
+/* Depsgraph */
+static void engine_depsgraph_init(RenderEngine *engine, ViewLayer *view_layer)
+{
+ engine->eval_ctx = DEG_evaluation_context_new(DAG_EVAL_RENDER);
+ engine->depsgraph = DEG_graph_new();
+ engine->view_layer = view_layer;
+
+ DEG_evaluation_context_init_from_view_layer_for_render(
+ engine->eval_ctx,
+ engine->depsgraph,
+ engine->re->scene,
+ view_layer);
+
+ BKE_scene_graph_update_tagged(
+ engine->eval_ctx,
+ engine->depsgraph,
+ engine->re->main,
+ engine->re->scene,
+ view_layer);
+}
+
+static void engine_depsgraph_free(RenderEngine *engine)
+{
+ DEG_graph_free(engine->depsgraph);
+ DEG_evaluation_context_free(engine->eval_ctx);
+
+ engine->eval_ctx = NULL;
+ engine->depsgraph = NULL;
+ engine->view_layer = NULL;
+}
+
+void RE_engine_frame_set(RenderEngine *engine, int frame, float subframe)
+{
+ if(!engine->depsgraph) {
+ return;
+ }
+
+ Render *re = engine->re;
+ double cfra = (double)frame + (double)subframe;
+
+ CLAMP(cfra, MINAFRAME, MAXFRAME);
+ BKE_scene_frame_set(re->scene, cfra);
+ BKE_scene_graph_update_for_newframe(engine->eval_ctx,
+ engine->depsgraph,
+ re->main,
+ re->scene,
+ engine->view_layer);
+
+#ifdef WITH_PYTHON
+ BPy_BEGIN_ALLOW_THREADS;
+#endif
+
+#ifdef WITH_PYTHON
+ BPy_END_ALLOW_THREADS;
+#endif
+
+ BKE_scene_camera_switch_update(re->scene);
+}
+
/* Bake */
void RE_bake_engine_set_engine_parameters(Render *re, Main *bmain, Scene *scene)
{
@@ -583,20 +642,11 @@ bool RE_bake_engine(
type->update(engine, re->main, re->scene);
if (type->bake) {
- EvaluationContext *eval_ctx = DEG_evaluation_context_new(DAG_EVAL_RENDER);
- Depsgraph *depsgraph = DEG_graph_new();
ViewLayer *view_layer = BLI_findlink(&re->scene->view_layers, re->scene->active_view_layer);
-
- 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);
+ engine_depsgraph_init(engine, view_layer);
type->bake(engine,
- depsgraph,
+ engine->depsgraph,
re->scene,
object,
pass_type,
@@ -607,8 +657,7 @@ bool RE_bake_engine(
depth,
result);
- DEG_graph_free(depsgraph);
- DEG_evaluation_context_free(eval_ctx);
+ engine_depsgraph_free(engine);
}
engine->tile_x = 0;
@@ -632,26 +681,6 @@ bool RE_bake_engine(
return true;
}
-void RE_engine_frame_set(RenderEngine *engine, int frame, float subframe)
-{
- Render *re = engine->re;
- Scene *scene = re->scene;
- double cfra = (double)frame + (double)subframe;
-
- CLAMP(cfra, MINAFRAME, MAXFRAME);
- BKE_scene_frame_set(scene, cfra);
-
-#ifdef WITH_PYTHON
- BPy_BEGIN_ALLOW_THREADS;
-#endif
-
-#ifdef WITH_PYTHON
- BPy_END_ALLOW_THREADS;
-#endif
-
- BKE_scene_camera_switch_update(scene);
-}
-
/* Render */
int RE_engine_render(Render *re, int do_all)
@@ -755,21 +784,12 @@ int RE_engine_render(Render *re, int do_all)
if (type->render_to_image) {
FOREACH_VIEW_LAYER_TO_RENDER_BEGIN(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));
+ engine_depsgraph_init(engine, view_layer);
- 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);
+ type->render_to_image(engine, engine->depsgraph);
- DEG_graph_free(depsgraph);
- DEG_evaluation_context_free(eval_ctx);
+ engine_depsgraph_free(engine);
}
FOREACH_VIEW_LAYER_TO_RENDER_END;
}