Пример #1
0
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 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()
Пример #2
0
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);
	}
}
Пример #3
0
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);
	}
}
Пример #4
0
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);
}
Пример #5
0
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// "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()