////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Tell Blender engine that we want to redraw ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void BlenderSession::tag_redraw() { if(!interactive) { // Update stats and progress, only for background here because in 3d view we do it in draw for thread safety reasons update_status_progress(); // Offline render, redraw if timeout passed if(time_dt() - last_redraw_time > 1.0) { b_engine.tag_redraw(); last_redraw_time = time_dt(); } } else { // Tell blender that we want to redraw b_engine.tag_redraw(); } } //tag_redraw()
bool BlenderSession::draw(int w, int h) { /* before drawing, we verify camera and viewport size changes, because we do not get update callbacks for those, we must detect them here */ if(session->ready_to_reset()) { bool reset = false; /* try to acquire mutex. if we can't, come back later */ if(!session->scene->mutex.try_lock()) { tag_update(); } else { /* update camera from 3d view */ bool need_update = scene->camera->need_update; sync->sync_view(b_v3d, b_rv3d, w, h); if(scene->camera->need_update && !need_update) reset = true; 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_userpref, b_scene, background); BufferParams buffer_params = BlenderSync::get_buffer_params(b_scene, b_rv3d, width, height); session->reset(buffer_params, session_params.samples); } } /* update status and progress for 3d view draw */ update_status_progress(); /* draw */ BufferParams buffer_params = BlenderSync::get_buffer_params(b_scene, b_rv3d, width, height); return !session->draw(buffer_params); }
void BlenderSession::tag_redraw() { if(background) { /* update stats and progress, only for background here because * in 3d view we do it in draw for thread safety reasons */ update_status_progress(); /* offline render, redraw if timeout passed */ if(time_dt() - last_redraw_time > 1.0) { b_engine.tag_redraw(); last_redraw_time = time_dt(); } } else { /* tell blender that we want to redraw */ b_engine.tag_redraw(); } }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // "draw" python API function ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// bool BlenderSession::draw(int w, int h) { BufferParams buffer_params; bool reset = false; // Before drawing, we verify camera and viewport size changes, because // we do not get update callbacks for those, we must detect them here if(session->ready_to_reset()) { // Try to acquire mutex. If we can't, come back later. if(!session->scene->mutex.try_lock()) tag_redraw(); else { sync->sync_view(b_v3d, b_rv3d, w, 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) { buffer_params = BlenderSync::get_display_buffer_params(scene->camera, w, h); session->update(buffer_params); } } // Update status and progress for 3d view draw update_status_progress(); // Draw if(!reset) buffer_params = BlenderSync::get_display_buffer_params(scene->camera, width, height); if(!session->draw(buffer_params)) { session->update(buffer_params); if(!session->draw(buffer_params)) tag_redraw(); } return true; } //draw()
bool BlenderSession::draw(int w, int h) { /* pause in redraw in case update is not being called due to final render */ session->set_pause(BlenderSync::get_session_pause(b_scene, background)); /* before drawing, we verify camera and viewport size changes, because * we do not get update callbacks for those, we must detect them here */ 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.2) { 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(); } else { /* update camera from 3d view */ sync->sync_view(b_v3d, b_rv3d, width, height); if(scene->camera->need_update) reset = true; session->scene->mutex.unlock(); } /* 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_v3d, b_rv3d, scene->camera, width, height); bool session_pause = BlenderSync::get_session_pause(b_scene, background); if(session_pause == false) { session->reset(buffer_params, session_params.samples); start_resize_time = 0.0; } } } else { tag_update(); } /* update status and progress for 3d view draw */ update_status_progress(); /* draw */ BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_v3d, b_rv3d, scene->camera, width, height); DeviceDrawParams draw_params; if(session->params.display_buffer_linear) { draw_params.bind_display_space_shader_cb = function_bind(&BL::RenderEngine::bind_display_space_shader, &b_engine, b_scene); draw_params.unbind_display_space_shader_cb = function_bind(&BL::RenderEngine::unbind_display_space_shader, &b_engine); } return !session->draw(buffer_params, draw_params); }