[Bf-blender-cvs] [27cebb2] master: Fix T39711: cycles particle motion blur affected by viewport draw method.

Brecht Van Lommel noreply at git.blender.org
Wed May 21 15:51:48 CEST 2014


Commit: 27cebb26517b9c5b336645dfd0de4ace32cc8912
Author: Brecht Van Lommel
Date:   Wed May 21 15:47:11 2014 +0200
https://developer.blender.org/rB27cebb26517b9c5b336645dfd0de4ace32cc8912

Fix T39711: cycles particle motion blur affected by viewport draw method.

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

M	intern/cycles/blender/blender_object.cpp
M	source/blender/makesrna/intern/rna_render.c
M	source/blender/render/extern/include/RE_engine.h
M	source/blender/render/intern/source/external_engine.c
M	source/blenderplayer/bad_level_call_stubs/stubs.c

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

diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp
index ec195d8..d6a3389 100644
--- a/intern/cycles/blender/blender_object.cpp
+++ b/intern/cycles/blender/blender_object.cpp
@@ -576,7 +576,7 @@ void BlenderSync::sync_motion(BL::SpaceView3D b_v3d, BL::Object b_override, void
 
 		/* change frame */
 		python_thread_state_restore(python_thread_state);
-		b_scene.frame_set(frame, subframe);
+		b_engine.frame_set(frame, subframe);
 		python_thread_state_save(python_thread_state);
 
 		/* sync camera, only supports two times at the moment */
@@ -591,7 +591,7 @@ void BlenderSync::sync_motion(BL::SpaceView3D b_v3d, BL::Object b_override, void
 	 * function assumes it is being executed from python and will
 	 * try to save the thread state */
 	python_thread_state_restore(python_thread_state);
-	b_scene.frame_set(frame_center, 0.0f);
+	b_engine.frame_set(frame_center, 0.0f);
 	python_thread_state_save(python_thread_state);
 
 	/* tag camera for motion update */
diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c
index 16cc82b..3d0c455 100644
--- a/source/blender/makesrna/intern/rna_render.c
+++ b/source/blender/makesrna/intern/rna_render.c
@@ -492,6 +492,13 @@ static void rna_def_render_engine(BlenderRNA *brna)
 	prop = RNA_def_string(func, "info", NULL, 0, "Info", "");
 	RNA_def_property_flag(prop, PROP_REQUIRED);
 
+	func = RNA_def_function(srna, "frame_set", "RE_engine_frame_set");
+	RNA_def_function_ui_description(func, "Evaluate scene at a different frame (for motion blur)");
+	prop = RNA_def_int(func, "frame", 0, INT_MIN, INT_MAX, "Frame", "", INT_MIN, INT_MAX);
+	RNA_def_property_flag(prop, PROP_REQUIRED);
+	prop = RNA_def_float(func, "subframe", 0.0f, 0.0f, 1.0f, "Subframe", "", 0.0f, 1.0f);
+	RNA_def_property_flag(prop, PROP_REQUIRED);
+
 	func = RNA_def_function(srna, "update_progress", "RE_engine_update_progress");
 	RNA_def_function_ui_description(func, "Update progress percentage of render");
 	prop = RNA_def_float(func, "progress", 0, 0.0f, 1.0f, "", "Percentage of render that's done", 0.0f, 1.0f);
diff --git a/source/blender/render/extern/include/RE_engine.h b/source/blender/render/extern/include/RE_engine.h
index 2c6492b..c76cf34 100644
--- a/source/blender/render/extern/include/RE_engine.h
+++ b/source/blender/render/extern/include/RE_engine.h
@@ -147,6 +147,8 @@ int RE_engine_render(struct Render *re, int do_all);
 
 bool RE_engine_is_external(struct Render *re);
 
+void RE_engine_frame_set(struct RenderEngine *engine, int frame, float subframe);
+
 /* Engine Types */
 
 void RE_engines_init(void);
diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c
index e875121..6ba2c57 100644
--- a/source/blender/render/intern/source/external_engine.c
+++ b/source/blender/render/intern/source/external_engine.c
@@ -481,6 +481,29 @@ 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
+
+	/* It's possible that here we're including layers which were never visible before. */
+	BKE_scene_update_for_newframe_ex(re->eval_ctx, re->main, scene, (1 << 20) - 1, true);
+
+#ifdef WITH_PYTHON
+	BPy_END_ALLOW_THREADS;
+#endif
+
+	BKE_scene_camera_switch_update(scene);
+}
+
 /* Render */
 
 static bool render_layer_exclude_animated(Scene *scene, SceneRenderLayer *srl)
diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c
index af6541e..20a0741 100644
--- a/source/blenderplayer/bad_level_call_stubs/stubs.c
+++ b/source/blenderplayer/bad_level_call_stubs/stubs.c
@@ -585,6 +585,7 @@ void RE_engine_free(struct RenderEngine *engine) RET_NONE
 struct RenderEngineType *RE_engines_find(const char *idname) RET_NULL
 void RE_engine_update_memory_stats(struct RenderEngine *engine, float mem_used, float mem_peak) RET_NONE
 struct RenderEngine *RE_engine_create(struct RenderEngineType *type) RET_NULL
+void RE_engine_frame_set(struct RenderEngine *engine, int frame, float subframe) RET_NONE
 void RE_FreePersistentData(void) RET_NONE
 
 /* python */




More information about the Bf-blender-cvs mailing list