From 27cebb26517b9c5b336645dfd0de4ace32cc8912 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 21 May 2014 15:47:11 +0200 Subject: [PATCH] Fix T39711: cycles particle motion blur affected by viewport draw method. --- intern/cycles/blender/blender_object.cpp | 4 ++-- source/blender/makesrna/intern/rna_render.c | 7 ++++++ .../blender/render/extern/include/RE_engine.h | 2 ++ .../render/intern/source/external_engine.c | 23 +++++++++++++++++++ .../bad_level_call_stubs/stubs.c | 1 + 5 files changed, 35 insertions(+), 2 deletions(-) diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp index ec195d8c547..d6a33892e75 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 16cc82bbca1..3d0c455b4b5 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 2c6492b5c5a..c76cf3406a1 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 e8751210540..6ba2c57a6fc 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 af6541e9008..20a07418ef3 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 */