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

This commit is contained in:
Brecht Van Lommel 2014-05-21 15:47:11 +02:00
parent ebbeb082d1
commit 27cebb2651
Notes: blender-bot 2023-02-14 10:48:31 +01:00
Referenced by issue #39711, Cycles particles do not motion blur when rendered unless displayed in 3D view as "rendered"
5 changed files with 35 additions and 2 deletions

View File

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

View File

@ -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);

View File

@ -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);

View File

@ -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)

View File

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