////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Returns: the current frame index inside the sequence ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// int BlenderSession::load_internal_mb_sequence(bool &stop_render, BL::RenderLayer *layer) { stop_render = false; int cur_frame = b_scene.frame_current(); float frames_cnt = shuttertime / mb_frame_time_sampling; int first_frame, last_frame; if(mb_direction == AFTER) { first_frame = cur_frame; last_frame = static_cast<int>(ceilf(static_cast<float>(cur_frame)+frames_cnt)); } else if(mb_direction == BEFORE) { first_frame = static_cast<int>(floorf(static_cast<float>(cur_frame)-frames_cnt)); last_frame = cur_frame; } else if(mb_direction == SYMMETRIC) { first_frame = static_cast<int>(floorf(static_cast<float>(cur_frame)-frames_cnt / 2)); last_frame = static_cast<int>(ceilf(static_cast<float>(cur_frame)+frames_cnt / 2)); } CLAMP(first_frame, b_scene.frame_start(), b_scene.frame_end()); CLAMP(last_frame, b_scene.frame_start(), b_scene.frame_end()); double last_cfra; for(int cur_mb_frame = first_frame; cur_mb_frame <= last_frame; ++cur_mb_frame) { //b_scene.frame_set(cur_mb_frame, 0); //Crashes due to BPy_BEGIN_ALLOW_THREADS-BPy_END_ALLOW_THREADS block in rna_Scene_frame_set() last_cfra = (double)cur_mb_frame; CLAMP(last_cfra, MINAFRAME, MAXFRAME); BKE_scene_frame_set((::Scene *)b_scene.ptr.data, last_cfra); BKE_scene_update_for_newframe_ex(G.main->eval_ctx, G.main, (::Scene *)b_scene.ptr.data, (1 << 20) - 1, true); BKE_scene_camera_switch_update((::Scene *)b_scene.ptr.data); sync->sync_data(b_v3d, b_engine.camera_override(), layer); sync->sync_camera(b_engine.camera_override(), width, height); session->update_scene_to_server(cur_mb_frame - first_frame, last_frame - first_frame + 1); if(!interactive && session->progress.get_cancel()) { stop_render = true; break; } } //b_scene.frame_set(cur_frame, 0); //Crashes due to BPy_BEGIN_ALLOW_THREADS-BPy_END_ALLOW_THREADS block in rna_Scene_frame_set() double cfra = (double)cur_frame; CLAMP(cfra, MINAFRAME, MAXFRAME); if(last_cfra != cfra) { BKE_scene_frame_set((::Scene *)b_scene.ptr.data, cfra); BKE_scene_update_for_newframe_ex(G.main->eval_ctx, G.main, (::Scene *)b_scene.ptr.data, (1 << 20) - 1, true); BKE_scene_camera_switch_update((::Scene *)b_scene.ptr.data); } return cur_frame - first_frame; } //load_internal_mb_sequence()
static void rna_Scene_frame_set(Scene *scene, int frame, float subframe) { 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(G.main->eval_ctx, G.main, scene, (1 << 20) - 1, true); #ifdef WITH_PYTHON BPy_END_ALLOW_THREADS; #endif BKE_scene_camera_switch_update(scene); /* don't do notifier when we're rendering, avoid some viewport crashes * redrawing while the data is being modified for render */ if (!G.is_rendering) { /* cant use NC_SCENE|ND_FRAME because this causes wm_event_do_notifiers to call * BKE_scene_update_for_newframe which will loose any un-keyed changes [#24690] */ /* WM_main_add_notifier(NC_SCENE|ND_FRAME, scene); */ /* instead just redraw the views */ WM_main_add_notifier(NC_WINDOW, NULL); } }
static void rna_Scene_frame_set(Scene *scene, int frame, float subframe) { double cfra = (double)frame + (double)subframe; CLAMP(cfra, MINAFRAME, MAXFRAME); BKE_scene_frame_set(scene, cfra); BKE_scene_update_for_newframe(G.main, scene, (1 << 20) - 1); BKE_scene_camera_switch_update(scene); /* don't do notifier when we're rendering, avoid some viewport crashes * redrawing while the data is being modified for render */ if (!G.is_rendering) { /* cant use NC_SCENE|ND_FRAME because this causes wm_event_do_notifiers to call * BKE_scene_update_for_newframe which will loose any un-keyed changes [#24690] */ /* WM_main_add_notifier(NC_SCENE|ND_FRAME, scene); */ /* instead just redraw the views */ WM_main_add_notifier(NC_WINDOW, NULL); } }
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" python API function ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void BlenderSession::render() { // Get buffer parameters SessionParams session_params = BlenderSync::get_session_params(b_engine, b_userpref, b_scene, interactive); if(session_params.export_alembic) { session->update_scene_to_server(0, 0); session->server->start_render(width, height, 0, session_params.out_of_core_enabled, session_params.out_of_core_mem_limit, session_params.out_of_core_gpu_headroom); if(b_engine.test_break() || b_scene.frame_current() >= b_scene.frame_end()) { session->progress.set_status("Transferring alembic file..."); session->server->stop_render(session_params.fps); } return; } BufferParams buffer_params = BlenderSync::get_display_buffer_params(scene->camera, width, height); // Render each layer BL::RenderSettings render = b_scene.render(); if(motion_blur && mb_type == SUBFRAME && mb_samples > 1) session->params.samples = session->params.samples / mb_samples; if(session->params.samples < 1) session->params.samples = 1; bool stop_render = false; BL::RenderSettings::layers_iterator b_iter; for(render.layers.begin(b_iter); b_iter != render.layers.end(); ++b_iter) { clear_passes_buffers(); BL::RenderLayer cur_layer(*b_iter); // Render if(motion_blur && mb_type == SUBFRAME && mb_samples > 1) { mb_sample_in_work = 0; float subframe = 0; int cur_frame = b_scene.frame_current(); for(mb_cur_sample = 1; mb_cur_sample <= mb_samples; ++mb_cur_sample) { session->start("Final render", true, 0, 0); session->params.image_stat.cur_samples = 0; if(mb_cur_sample < mb_samples) { subframe += shuttertime / (mb_samples - 1); if(subframe < 1.0f) { //b_scene.frame_set(cur_frame, subframe); //Crashes due to BPy_BEGIN_ALLOW_THREADS-BPy_END_ALLOW_THREADS block in rna_Scene_frame_set() double cfra = (double)cur_frame + (double)subframe; CLAMP(cfra, MINAFRAME, MAXFRAME); BKE_scene_frame_set((::Scene *)b_scene.ptr.data, cfra); BKE_scene_update_for_newframe_ex(G.main->eval_ctx, G.main, (::Scene *)b_scene.ptr.data, (1 << 20) - 1, true); BKE_scene_camera_switch_update((::Scene *)b_scene.ptr.data); } sync->sync_data(b_v3d, b_engine.camera_override(), &cur_layer); sync->sync_camera(b_engine.camera_override(), width, height); } if(session->progress.get_cancel()) { stop_render = true; break; } } //b_scene.frame_set(cur_frame, 0); //Crashes due to BPy_BEGIN_ALLOW_THREADS-BPy_END_ALLOW_THREADS block in rna_Scene_frame_set() double cfra = (double)cur_frame; CLAMP(cfra, MINAFRAME, MAXFRAME); BKE_scene_frame_set((::Scene *)b_scene.ptr.data, cfra); BKE_scene_update_for_newframe_ex(G.main->eval_ctx, G.main, (::Scene *)b_scene.ptr.data, (1 << 20) - 1, true); BKE_scene_camera_switch_update((::Scene *)b_scene.ptr.data); } else if(motion_blur && mb_type == INTERNAL) { int int_frame_idx = load_internal_mb_sequence(stop_render, &cur_layer); if(!stop_render) { session->start("Final render", true, int_frame_idx, 0); session->params.image_stat.cur_samples = 0; } } else { if(motion_blur) motion_blur = false; mb_cur_sample = 0; if(!stop_render) { session->start("Final render", true, 0, 0); session->params.image_stat.cur_samples = 0; } } write_render_img(); if(session->progress.get_cancel()) { stop_render = true; break; } } //for(r.layers.begin(b_iter); b_iter != r.layers.end(); ++b_iter) clear_passes_buffers(); if(stop_render || !b_engine.is_animation() || b_scene.frame_current() >= b_scene.frame_end()) session->server->stop_render(session_params.fps); } //render()