[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [39778] branches/cycles/intern/cycles: Cycles: pause button to interrupt viewport renders, in the 3d view header.
Brecht Van Lommel
brechtvanlommel at pandora.be
Mon Aug 29 18:54:15 CEST 2011
Revision: 39778
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=39778
Author: blendix
Date: 2011-08-29 16:54:13 +0000 (Mon, 29 Aug 2011)
Log Message:
-----------
Cycles: pause button to interrupt viewport renders, in the 3d view header.
Modified Paths:
--------------
branches/cycles/intern/cycles/blender/addon/properties.py
branches/cycles/intern/cycles/blender/addon/ui.py
branches/cycles/intern/cycles/blender/blender_session.cpp
branches/cycles/intern/cycles/blender/blender_sync.cpp
branches/cycles/intern/cycles/blender/blender_sync.h
branches/cycles/intern/cycles/render/scene.cpp
branches/cycles/intern/cycles/render/session.cpp
branches/cycles/intern/cycles/render/session.h
Modified: branches/cycles/intern/cycles/blender/addon/properties.py
===================================================================
--- branches/cycles/intern/cycles/blender/addon/properties.py 2011-08-29 16:07:44 UTC (rev 39777)
+++ branches/cycles/intern/cycles/blender/addon/properties.py 2011-08-29 16:54:13 UTC (rev 39778)
@@ -36,6 +36,9 @@
default=10, min=1, max=2147483647)
cls.preview_passes = IntProperty(name="Preview Passes", description="Number of passes to render in the viewport, unlimited if 0",
default=0, min=0, max=2147483647)
+ cls.preview_pause = BoolProperty(name="Pause Preview", description="Pause all viewport preview renders",
+ default=False)
+
cls.min_bounces = IntProperty(name="Min Bounces", description="Minimum number of bounces",
default=3, min=0, max=1024)
cls.max_bounces = IntProperty(name="Max Bounces", description="Maximum number of bounces",
Modified: branches/cycles/intern/cycles/blender/addon/ui.py
===================================================================
--- branches/cycles/intern/cycles/blender/addon/ui.py 2011-08-29 16:07:44 UTC (rev 39777)
+++ branches/cycles/intern/cycles/blender/addon/ui.py 2011-08-29 16:54:13 UTC (rev 39778)
@@ -473,6 +473,17 @@
if cscene.device == 'CPU' and engine.with_osl():
layout.prop(cscene, "shading_system")
+def draw_pause(self, context):
+ layout = self.layout
+ scene = context.scene
+
+ if scene.render.engine == "CYCLES":
+ view = context.space_data
+
+ if view.viewport_shade == "RENDERED":
+ cscene = scene.cycles
+ layout.prop(cscene, "preview_pause", icon="PAUSE", text="")
+
def get_panels():
return [
bpy.types.RENDER_PT_render,
@@ -514,12 +525,14 @@
def register():
bpy.types.RENDER_PT_render.append(draw_device)
+ bpy.types.VIEW3D_HT_header.append(draw_pause)
for panel in get_panels():
panel.COMPAT_ENGINES.add('CYCLES')
def unregister():
bpy.types.RENDER_PT_render.remove(draw_device)
+ bpy.types.VIEW3D_HT_header.remove(draw_pause)
for panel in get_panels():
panel.COMPAT_ENGINES.remove('CYCLES')
Modified: branches/cycles/intern/cycles/blender/blender_session.cpp
===================================================================
--- branches/cycles/intern/cycles/blender/blender_session.cpp 2011-08-29 16:07:44 UTC (rev 39777)
+++ branches/cycles/intern/cycles/blender/blender_session.cpp 2011-08-29 16:54:13 UTC (rev 39778)
@@ -93,6 +93,7 @@
session->scene = scene;
session->progress.set_update_callback(function_bind(&BlenderSession::tag_redraw, this));
session->progress.set_cancel_callback(function_bind(&BlenderSession::test_cancel, this));
+ session->set_pause(BlenderSync::get_session_pause(b_scene, background));
/* start rendering */
session->reset(width, height, session_params.passes);
@@ -159,6 +160,7 @@
/* increase passes, but never decrease */
session->set_passes(session_params.passes);
+ session->set_pause(BlenderSync::get_session_pause(b_scene, background));
/* copy recalc flags, outside of mutex so we can decide to do the real
synchronization at a later time to not block on running updates */
@@ -178,12 +180,12 @@
else
sync->sync_camera(width, height);
+ /* unlock */
+ session->scene->mutex.unlock();
+
/* reset if needed */
if(scene->need_reset())
session->reset(width, height, session_params.passes);
-
- /* unlock */
- session->scene->mutex.unlock();
}
bool BlenderSession::draw(int w, int h)
Modified: branches/cycles/intern/cycles/blender/blender_sync.cpp
===================================================================
--- branches/cycles/intern/cycles/blender/blender_sync.cpp 2011-08-29 16:07:44 UTC (rev 39777)
+++ branches/cycles/intern/cycles/blender/blender_sync.cpp 2011-08-29 16:54:13 UTC (rev 39778)
@@ -185,6 +185,12 @@
/* Session Parameters */
+bool BlenderSync::get_session_pause(BL::Scene b_scene, bool background)
+{
+ PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
+ return (background)? false: get_boolean(cscene, "preview_pause");
+}
+
SessionParams BlenderSync::get_session_params(BL::Scene b_scene, bool background)
{
SessionParams params;
Modified: branches/cycles/intern/cycles/blender/blender_sync.h
===================================================================
--- branches/cycles/intern/cycles/blender/blender_sync.h 2011-08-29 16:07:44 UTC (rev 39777)
+++ branches/cycles/intern/cycles/blender/blender_sync.h 2011-08-29 16:54:13 UTC (rev 39778)
@@ -61,6 +61,7 @@
/* get parameters */
static SceneParams get_scene_params(BL::Scene b_scene);
static SessionParams get_session_params(BL::Scene b_scene, bool background);
+ static bool get_session_pause(BL::Scene b_scene, bool background);
private:
/* sync */
Modified: branches/cycles/intern/cycles/render/scene.cpp
===================================================================
--- branches/cycles/intern/cycles/render/scene.cpp 2011-08-29 16:07:44 UTC (rev 39777)
+++ branches/cycles/intern/cycles/render/scene.cpp 2011-08-29 16:54:13 UTC (rev 39778)
@@ -57,31 +57,31 @@
Scene::~Scene()
{
- camera->device_free(device, &dscene);
+ if(device) camera->device_free(device, &dscene);
delete camera;
- filter->device_free(device, &dscene);
+ if(device) filter->device_free(device, &dscene);
delete filter;
- film->device_free(device, &dscene);
+ if(device) film->device_free(device, &dscene);
delete film;
- background->device_free(device, &dscene);
+ if(device) background->device_free(device, &dscene);
delete background;
- mesh_manager->device_free(device, &dscene);
+ if(device) mesh_manager->device_free(device, &dscene);
delete mesh_manager;
- object_manager->device_free(device, &dscene);
+ if(device) object_manager->device_free(device, &dscene);
delete object_manager;
- integrator->device_free(device, &dscene);
+ if(device) integrator->device_free(device, &dscene);
delete integrator;
- shader_manager->device_free(device, &dscene);
+ if(device) shader_manager->device_free(device, &dscene);
delete shader_manager;
- light_manager->device_free(device, &dscene);
+ if(device) light_manager->device_free(device, &dscene);
delete light_manager;
foreach(Shader *s, shaders)
@@ -93,7 +93,7 @@
foreach(Light *l, lights)
delete l;
- image_manager->device_free(device, &dscene);
+ if(device) image_manager->device_free(device, &dscene);
delete image_manager;
}
Modified: branches/cycles/intern/cycles/render/session.cpp
===================================================================
--- branches/cycles/intern/cycles/render/session.cpp 2011-08-29 16:07:44 UTC (rev 39777)
+++ branches/cycles/intern/cycles/render/session.cpp 2011-08-29 16:54:13 UTC (rev 39778)
@@ -47,6 +47,7 @@
start_time = 0.0;
reset_time = 0.0;
preview_time = 0.0;
+ paused_time = 0.0;
pass = 0;
delayed_reset.do_reset = false;
@@ -64,9 +65,16 @@
{
if(session_thread) {
progress.set_cancel("Exiting");
+
gpu_need_tonemap = false;
gpu_need_tonemap_cond.notify_all();
- set_pause(false);
+
+ {
+ thread_scoped_lock pause_lock(pause_mutex);
+ pause = false;
+ }
+ pause_cond.notify_all();
+
wait();
}
@@ -152,41 +160,55 @@
{
start_time = time_dt();
reset_time = time_dt();
+ paused_time = 0.0;
while(!progress.get_cancel()) {
/* advance to next tile */
- bool done = !tile_manager.next();
+ bool no_tiles = !tile_manager.next();
- /* any work left? */
- if(done) {
- /* if in background mode, we can stop immediately */
- if(params.background) {
+ if(params.background) {
+ /* if no work left and in background mode, we can stop immediately */
+ if(no_tiles)
break;
- }
- else {
- /* in interactive mode, we wait until woken up */
- thread_scoped_lock pause_lock(pause_mutex);
- pause_cond.wait(pause_lock);
- }
}
else {
- /* test for pause and wait until woken up */
+ /* if in interactive mode, and we are either paused or done for now,
+ wait for pause condition notify to wake up again */
thread_scoped_lock pause_lock(pause_mutex);
- while(pause)
- pause_cond.wait(pause_lock);
+
+ if(pause || no_tiles) {
+ update_status_time(pause, no_tiles);
+
+ while(1) {
+ double pause_start = time_dt();
+ pause_cond.wait(pause_lock);
+ paused_time += time_dt() - pause_start;
+
+ update_status_time(pause, no_tiles);
+ progress.set_update();
+
+ if(!pause)
+ break;
+ }
+ }
+
+ if(progress.get_cancel())
+ break;
}
- {
+ if(!no_tiles) {
+ /* update scene */
+ update_scene();
+ if(progress.get_cancel())
+ break;
+ }
+
+ if(!no_tiles) {
/* buffers mutex is locked entirely while rendering each
pass, and released/reacquired on each iteration to allow
reset and draw in between */
thread_scoped_lock buffers_lock(buffers->mutex);
- /* update scene */
- update_scene();
- if(progress.get_cancel())
- break;
-
/* update status and timing */
update_status_time();
@@ -276,29 +298,40 @@
while(!progress.get_cancel()) {
/* advance to next tile */
- bool done = !tile_manager.next();
+ bool no_tiles = !tile_manager.next();
bool need_tonemap = false;
- /* any work left? */
- if(done) {
- /* if in background mode, we can stop immediately */
- if(params.background) {
+ if(params.background) {
+ /* if no work left and in background mode, we can stop immediately */
+ if(no_tiles)
break;
- }
- else {
- /* in interactive mode, we wait until woken up */
- thread_scoped_lock pause_lock(pause_mutex);
- pause_cond.wait(pause_lock);
- }
}
else {
- /* test for pause and wait until woken up */
+ /* if in interactive mode, and we are either paused or done for now,
+ wait for pause condition notify to wake up again */
thread_scoped_lock pause_lock(pause_mutex);
- while(pause)
- pause_cond.wait(pause_lock);
+
+ if(pause || no_tiles) {
+ update_status_time(pause, no_tiles);
+
+ while(1) {
+ double pause_start = time_dt();
+ pause_cond.wait(pause_lock);
+ paused_time += time_dt() - pause_start;
+
+ update_status_time(pause, no_tiles);
+ progress.set_update();
+
+ if(!pause)
+ break;
+ }
+ }
+
+ if(progress.get_cancel())
+ break;
}
- if(!done) {
+ if(!no_tiles) {
/* buffers mutex is locked entirely while rendering each
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list