Skip to content

Commit

Permalink
Allow to pause and resume rendering in appleseed.studio
Browse files Browse the repository at this point in the history
  • Loading branch information
Kevin Masson authored and dictoon committed Jun 27, 2018
1 parent d9656e7 commit a11da58
Show file tree
Hide file tree
Showing 20 changed files with 477 additions and 9 deletions.
Binary file added sandbox/icons/rendering_pause_resume.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added sandbox/icons/rendering_pause_resume_disabled.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added sandbox/icons/rendering_pause_resume_hover.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
32 changes: 32 additions & 0 deletions src/appleseed.python/bindrenderercontroller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,38 @@ namespace
}
}

void on_rendering_pause() override
{
// Lock Python's global interpreter lock (GIL),
// it was released in MasterRenderer.render.
ScopedGILLock lock;

try
{
get_override("on_rendering_pause")();
}
catch (bpy::error_already_set)
{
PyErr_Print();
}
}

void on_rendering_resume() override
{
// Lock Python's global interpreter lock (GIL),
// it was released in MasterRenderer.render.
ScopedGILLock lock;

try
{
get_override("on_rendering_resume")();
}
catch (bpy::error_already_set)
{
PyErr_Print();
}
}

void on_frame_begin() override
{
// Lock Python's global interpreter lock (GIL),
Expand Down
40 changes: 40 additions & 0 deletions src/appleseed.studio/mainwindow/mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -407,6 +407,7 @@ void MainWindow::build_menus()

connect(m_ui->action_rendering_start_interactive_rendering, SIGNAL(triggered()), SLOT(slot_start_interactive_rendering()));
connect(m_ui->action_rendering_start_final_rendering, SIGNAL(triggered()), SLOT(slot_start_final_rendering()));
connect(m_ui->action_rendering_pause_resume_rendering, SIGNAL(toggled(bool)), SLOT(slot_pause_or_resume_rendering(const bool)));
connect(m_ui->action_rendering_stop_rendering, SIGNAL(triggered()), &m_rendering_manager, SLOT(slot_abort_rendering()));
connect(m_ui->action_rendering_rendering_settings, SIGNAL(triggered()), SLOT(slot_show_rendering_settings_window()));

Expand Down Expand Up @@ -576,6 +577,17 @@ void MainWindow::update_recent_files_menu(const QStringList& files)
m_recently_opened[i]->setVisible(false);
}

void MainWindow::update_pause_resume_checkbox(const bool checked)
{
bool old_state = m_action_pause_resume_rendering->blockSignals(true);
m_action_pause_resume_rendering->setChecked(checked);
m_action_pause_resume_rendering->blockSignals(old_state);

old_state = m_ui->action_rendering_pause_resume_rendering->blockSignals(true);
m_ui->action_rendering_pause_resume_rendering->setChecked(checked);
m_ui->action_rendering_pause_resume_rendering->blockSignals(old_state);
}

void MainWindow::build_toolbar()
{
//
Expand Down Expand Up @@ -617,6 +629,11 @@ void MainWindow::build_toolbar()
connect(m_action_start_final_rendering, SIGNAL(triggered()), SLOT(slot_start_final_rendering()));
m_ui->main_toolbar->addAction(m_action_start_final_rendering);

m_action_pause_resume_rendering = new QAction(load_icons("rendering_pause_resume"), combine_name_and_shortcut("Pause/Resume Rendering", m_ui->action_rendering_pause_resume_rendering->shortcut()), this);
m_action_pause_resume_rendering->setCheckable(true);
connect(m_action_pause_resume_rendering, SIGNAL(toggled(bool)), SLOT(slot_pause_or_resume_rendering(const bool)));
m_ui->main_toolbar->addAction(m_action_pause_resume_rendering);

m_action_stop_rendering = new QAction(load_icons("rendering_stop"), combine_name_and_shortcut("Stop Rendering", m_ui->action_rendering_stop_rendering->shortcut()), this);
connect(m_action_stop_rendering, SIGNAL(triggered()), &m_rendering_manager, SLOT(slot_abort_rendering()));
m_ui->main_toolbar->addAction(m_action_stop_rendering);
Expand Down Expand Up @@ -714,6 +731,7 @@ void MainWindow::update_workspace()
set_project_explorer_enabled(true);
set_rendering_widgets_enabled(true, NotRendering);
set_diagnostics_widgets_enabled(true, NotRendering);
update_pause_resume_checkbox(false);
m_ui->attribute_editor_scrollarea_contents->setEnabled(true);

// Add/remove light paths tab.
Expand Down Expand Up @@ -849,6 +867,10 @@ void MainWindow::set_rendering_widgets_enabled(const bool is_enabled, const Rend
m_ui->action_rendering_start_final_rendering->setEnabled(allow_start);
m_action_start_final_rendering->setEnabled(allow_start);

// Rendering -> Pause/Resume Rendering.
m_ui->action_rendering_pause_resume_rendering->setEnabled(allow_stop);
m_action_pause_resume_rendering->setEnabled(allow_stop);

// Rendering -> Stop Rendering.
m_ui->action_rendering_stop_rendering->setEnabled(allow_stop);
m_action_stop_rendering->setEnabled(allow_stop);
Expand Down Expand Up @@ -1703,6 +1725,24 @@ void MainWindow::slot_start_rendering_once(const QString& filepath, const QStrin
}
}

void MainWindow::slot_pause_or_resume_rendering(const bool checked)
{
// Ignore updates when not rendering.
assert(!m_rendering_manager.is_rendering());

if (checked)
{
assert(!m_rendering_manager.is_rendering_paused());
m_rendering_manager.pause_rendering();
}
else
{
m_rendering_manager.resume_rendering();
}

update_pause_resume_checkbox(checked);
}

void MainWindow::slot_rendering_end()
{
apply_false_colors_settings();
Expand Down
4 changes: 4 additions & 0 deletions src/appleseed.studio/mainwindow/mainwindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ class MainWindow

QAction* m_action_start_interactive_rendering;
QAction* m_action_start_final_rendering;
QAction* m_action_pause_resume_rendering;
QAction* m_action_stop_rendering;
QAction* m_action_rendering_settings;

Expand Down Expand Up @@ -182,6 +183,7 @@ class MainWindow
void build_recent_files_menu();
void update_recent_files_menu(const QString& filepath);
void update_recent_files_menu(const QStringList& files);
void update_pause_resume_checkbox(const bool checked);

// Other UI elements.
void build_toolbar();
Expand Down Expand Up @@ -266,6 +268,8 @@ class MainWindow
const QString& filepath,
const QString& configuration,
const bool successful);
void slot_pause_or_resume_rendering(
const bool checked);
void slot_rendering_end();
void slot_camera_changed();

Expand Down
12 changes: 12 additions & 0 deletions src/appleseed.studio/mainwindow/mainwindow.ui
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@
</property>
<addaction name="action_rendering_start_interactive_rendering"/>
<addaction name="action_rendering_start_final_rendering"/>
<addaction name="action_rendering_pause_resume_rendering"/>
<addaction name="action_rendering_stop_rendering"/>
<addaction name="separator"/>
<addaction name="action_rendering_rendering_settings"/>
Expand Down Expand Up @@ -405,6 +406,17 @@
<string>F5</string>
</property>
</action>
<action name="action_rendering_pause_resume_rendering">
<property name="checkable">
<bool>true</bool>
</property>
<property name="text">
<string>&amp;Pause/Resume Rendering</string>
</property>
<property name="shortcut">
<string>Ctrl+F5</string>
</property>
</action>
<action name="action_rendering_stop_rendering">
<property name="text">
<string>S&amp;top Rendering</string>
Expand Down
10 changes: 10 additions & 0 deletions src/appleseed.studio/mainwindow/rendering/qtrenderercontroller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,16 @@ void QtRendererController::on_rendering_abort()
emit signal_rendering_abort();
}

void QtRendererController::on_rendering_pause()
{
emit signal_rendering_pause();
}

void QtRendererController::on_rendering_resume()
{
emit signal_rendering_resume();
}

void QtRendererController::on_frame_begin()
{
const Status status = get_status();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,12 @@ class QtRendererController
// This method is called after rendering was aborted.
void on_rendering_abort() override;

// This method is called after rendering was paused.
void on_rendering_pause() override;

// This method is called after rendering was resumed.
void on_rendering_resume() override;

// This method is called before rendering a single frame.
void on_frame_begin() override;

Expand All @@ -78,6 +84,8 @@ class QtRendererController
void signal_rendering_begin();
void signal_rendering_success();
void signal_rendering_abort();
void signal_rendering_pause();
void signal_rendering_resume();
void signal_frame_begin();
void signal_frame_end();

Expand Down
29 changes: 29 additions & 0 deletions src/appleseed.studio/mainwindow/rendering/renderingmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,16 @@ RenderingManager::RenderingManager(StatusBar& status_bar)
SLOT(slot_rendering_end()),
Qt::BlockingQueuedConnection);

connect(
&m_renderer_controller, SIGNAL(signal_rendering_pause()),
SLOT(slot_rendering_pause()),
Qt::BlockingQueuedConnection);

connect(
&m_renderer_controller, SIGNAL(signal_rendering_resume()),
SLOT(slot_rendering_resume()),
Qt::BlockingQueuedConnection);

connect(
&m_renderer_controller, SIGNAL(signal_rendering_success()),
SIGNAL(signal_rendering_end()));
Expand Down Expand Up @@ -220,6 +230,11 @@ bool RenderingManager::is_rendering() const
return m_master_renderer.get() != nullptr;
}

bool RenderingManager::is_rendering_paused() const
{
return m_renderer_controller.get_status() == IRendererController::PauseRendering;
}

void RenderingManager::wait_until_rendering_end()
{
while (is_rendering())
Expand Down Expand Up @@ -387,6 +402,20 @@ void RenderingManager::slot_rendering_begin()
m_has_camera_changed = false;
}

void RenderingManager::slot_rendering_pause()
{
assert(m_master_renderer.get());

m_rendering_timer.pause();
}

void RenderingManager::slot_rendering_resume()
{
assert(m_master_renderer.get());

m_rendering_timer.resume();
}

void RenderingManager::slot_rendering_end()
{
if (m_rendering_mode == InteractiveRendering)
Expand Down
5 changes: 5 additions & 0 deletions src/appleseed.studio/mainwindow/rendering/renderingmanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,9 @@ class RenderingManager
// Return true if currently rendering, false otherwise.
bool is_rendering() const;

// Return true if current rendering state is paused, false otherwise.
bool is_rendering_paused() const;

// Wait until rendering has ended.
void wait_until_rendering_end();

Expand Down Expand Up @@ -189,6 +192,8 @@ class RenderingManager

private slots:
void slot_rendering_begin();
void slot_rendering_pause();
void slot_rendering_resume();
void slot_rendering_end();
void slot_rendering_failed();
void slot_frame_begin();
Expand Down
1 change: 1 addition & 0 deletions src/appleseed/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -470,6 +470,7 @@ set (foundation_meta_tests_sources
foundation/meta/tests/test_spline.cpp
foundation/meta/tests/test_statistics.cpp
foundation/meta/tests/test_stlallocatortestbed.cpp
foundation/meta/tests/test_stopwatch.cpp
foundation/meta/tests/test_string.cpp
foundation/meta/tests/test_test.cpp
foundation/meta/tests/test_thread.cpp
Expand Down
Loading

0 comments on commit a11da58

Please sign in to comment.