Fix #34714: cycles viewport render would restart when minimizing and unminimizing

a maximized Blender window in Ubuntu Unity. The window size would slightly change
as part of the unminimize effect.

Now cycles waits 0.2 seconds before restarting rendering after a viewport resize,
also a bit less flickery when changing the 3d view size in Blender itself.
This commit is contained in:
Brecht Van Lommel 2013-04-24 20:12:12 +00:00
parent a0e03a6c77
commit 18b1ab1598
2 changed files with 35 additions and 11 deletions

@ -50,7 +50,8 @@ BlenderSession::BlenderSession(BL::RenderEngine b_engine_, BL::UserPreferences b
height = (int)(b_render.resolution_y()*b_render.resolution_percentage()/100);
background = true;
last_redraw_time = 0.0f;
last_redraw_time = 0.0;
start_resize_time = 0.0;
create_session();
}
@ -66,7 +67,8 @@ BlenderSession::BlenderSession(BL::RenderEngine b_engine_, BL::UserPreferences b
width = width_;
height = height_;
background = false;
last_redraw_time = 0.0f;
last_redraw_time = 0.0;
start_resize_time = 0.0;
create_session();
session->start();
@ -85,6 +87,7 @@ void BlenderSession::create_session()
/* reset status/progress */
last_status = "";
last_progress = -1.0f;
start_resize_time = 0.0;
/* create scene */
scene = new Scene(scene_params, session_params.device);
@ -163,6 +166,9 @@ void BlenderSession::reset_session(BL::BlendData b_data_, BL::Scene b_scene_)
session->reset(buffer_params, session_params.samples);
b_engine.use_highlight_tiles(session_params.progressive_refine == false);
/* reset time */
start_resize_time = 0.0;
}
void BlenderSession::free_session()
@ -487,6 +493,9 @@ void BlenderSession::synchronize()
if(scene->need_reset()) {
BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_scene, b_v3d, b_rv3d, scene->camera, width, height);
session->reset(buffer_params, session_params.samples);
/* reset time */
start_resize_time = 0.0;
}
}
@ -497,6 +506,25 @@ bool BlenderSession::draw(int w, int h)
if(session->ready_to_reset()) {
bool reset = false;
/* if dimensions changed, reset */
if(width != w || height != h) {
if(start_resize_time == 0.0) {
/* don't react immediately to resizes to avoid flickery resizing
* of the viewport, and some window managers changing the window
* size temporarily on unminimize */
start_resize_time = time_dt();
tag_redraw();
}
else if(time_dt() - start_resize_time < 0.2f) {
tag_redraw();
}
else {
width = w;
height = h;
reset = true;
}
}
/* try to acquire mutex. if we can't, come back later */
if(!session->scene->mutex.try_lock()) {
tag_update();
@ -504,7 +532,7 @@ bool BlenderSession::draw(int w, int h)
else {
/* update camera from 3d view */
sync->sync_view(b_v3d, b_rv3d, w, h);
sync->sync_view(b_v3d, b_rv3d, width, height);
if(scene->camera->need_update)
reset = true;
@ -512,19 +540,14 @@ bool BlenderSession::draw(int w, int h)
session->scene->mutex.unlock();
}
/* if dimensions changed, reset */
if(width != w || height != h) {
width = w;
height = h;
reset = true;
}
/* reset if requested */
if(reset) {
SessionParams session_params = BlenderSync::get_session_params(b_engine, b_userpref, b_scene, background);
BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_scene, b_v3d, b_rv3d, scene->camera, w, h);
BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_scene, b_v3d, b_rv3d, scene->camera, width, height);
session->reset(buffer_params, session_params.samples);
start_resize_time = 0.0;
}
}
else {

@ -90,6 +90,7 @@ public:
float last_progress;
int width, height;
double start_resize_time;
protected:
void do_write_update_render_result(BL::RenderResult b_rr, BL::RenderLayer b_rlay, RenderTile& rtile, bool do_update_only);