[Bf-blender-cvs] [5fba4458e9a] blender2.8: Fix Cycles motion blur and engine.frame_set() not working.

Brecht Van Lommel noreply at git.blender.org
Wed Apr 4 17:59:59 CEST 2018


Commit: 5fba4458e9a7a995343a3432abe230c9ea293813
Author: Brecht Van Lommel
Date:   Wed Apr 4 13:51:39 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB5fba4458e9a7a995343a3432abe230c9ea293813

Fix Cycles motion blur and engine.frame_set() not working.

===================================================================

M	intern/cycles/blender/blender_object.cpp
M	source/blender/render/extern/include/RE_engine.h
M	source/blender/render/intern/source/external_engine.c

===================================================================

diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp
index 86c42e88e24..d0df8e1800f 100644
--- a/intern/cycles/blender/blender_object.cpp
+++ b/intern/cycles/blender/blender_object.cpp
@@ -633,7 +633,6 @@ void BlenderSync::sync_motion(BL::RenderSettings& b_render,
 			frame_center_delta = shuttertime * 0.5f;
 		}
 
-		/* TODO: move frame on depsgraph. */
 		float time = frame_center + subframe_center + frame_center_delta;
 		int frame = (int)floorf(time);
 		float subframe = time - frame;
@@ -666,7 +665,6 @@ void BlenderSync::sync_motion(BL::RenderSettings& b_render,
 		int frame = (int)floorf(time);
 		float subframe = time - frame;
 
-		/* TODO: move frame on depsgraph. */
 		/* change frame */
 		python_thread_state_restore(python_thread_state);
 		b_engine.frame_set(frame, subframe);
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;
 	}



More information about the Bf-blender-cvs mailing list