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. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to