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 */

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to