diff --git a/src/appleseed.studio/mainwindow/rendering/lightpathsviewportmanager.cpp b/src/appleseed.studio/mainwindow/rendering/lightpathsviewportmanager.cpp index d9c6911276..76fbc596a2 100644 --- a/src/appleseed.studio/mainwindow/rendering/lightpathsviewportmanager.cpp +++ b/src/appleseed.studio/mainwindow/rendering/lightpathsviewportmanager.cpp @@ -33,7 +33,6 @@ #include "mainwindow/rendering/lightpathspickinghandler.h" #include "mainwindow/rendering/lightpathslayer.h" #include "mainwindow/rendering/viewporttab.h" -#include "mainwindow/rendering/viewportwidget.h" #include "utility/miscellaneous.h" #include "utility/settingskeys.h" @@ -77,9 +76,11 @@ namespace studio { LightPathsViewportManager::LightPathsViewportManager( ViewportTab* viewport_tab, - Project& project, + Project* project, ParamArray& settings) : m_enabled(false) + , m_picking_enabled(true) + , m_paths_display_active(false) , m_project(project) , m_settings(settings) , m_viewport_tab(viewport_tab) @@ -94,15 +95,49 @@ LightPathsViewportManager::LightPathsViewportManager( recreate_handlers(); } +void LightPathsViewportManager::reset(renderer::Project* project) +{ + set_enabled(false); + set_display_enabled(false); + set_picking_enabled(true); + m_project = project; +} + +void LightPathsViewportManager::slot_base_layer_changed(const ViewportWidget::BaseLayer layer) +{ + if (layer == ViewportWidget::BaseLayer::FinalRender) + set_picking_enabled(true); + else + set_picking_enabled(false); +} + void LightPathsViewportManager::set_enabled(const bool enabled) { m_enabled = enabled; if (enabled) + { m_toolbar->show(); + } else + { + set_display_enabled(false); m_toolbar->hide(); - + } m_toolbar->setDisabled(!enabled); + + emit signal_should_display(m_enabled && m_paths_display_active); +} + +void LightPathsViewportManager::set_display_enabled(const bool enabled) +{ + m_paths_display_active = enabled; + + emit signal_should_display(m_enabled && m_paths_display_active); +} + +void LightPathsViewportManager::set_picking_enabled(const bool enabled) +{ + m_picking_enabled = enabled; m_screen_space_paths_picking_handler->set_enabled(enabled); } @@ -113,9 +148,11 @@ QToolBar* LightPathsViewportManager::toolbar() const void LightPathsViewportManager::slot_entity_picked(const ScenePicker::PickingResult& result) { - if (!m_enabled) return; + if (!m_picking_enabled || !m_enabled) return; - const CanvasProperties& props = m_project.get_frame()->image().properties(); + set_display_enabled(true); + + const CanvasProperties& props = m_project->get_frame()->image().properties(); m_screen_space_paths_picking_handler->pick( Vector2i( result.m_ndc[0] * static_cast(props.m_canvas_width), @@ -129,8 +166,9 @@ void LightPathsViewportManager::slot_light_paths_display_toggled(const bool acti void LightPathsViewportManager::slot_rectangle_selection(const QRect& rect) { - if (!m_enabled) return; + if (!m_picking_enabled || !m_enabled) return; + set_display_enabled(true); m_screen_space_paths_picking_handler->pick( AABB2i( Vector2i(rect.x(), rect.y()), @@ -139,15 +177,17 @@ void LightPathsViewportManager::slot_rectangle_selection(const QRect& rect) void LightPathsViewportManager::slot_light_path_selection_changed( const int selected_light_path_index, - const int total_light_paths) const + const int total_light_paths) { if (total_light_paths > 0) { + set_display_enabled(true); m_prev_path_button->setEnabled(selected_light_path_index > -1); m_next_path_button->setEnabled(selected_light_path_index < total_light_paths - 1); } else { + set_display_enabled(false); m_prev_path_button->setEnabled(false); m_next_path_button->setEnabled(false); } @@ -172,7 +212,7 @@ void LightPathsViewportManager::slot_save_light_paths() filepath = QDir::toNativeSeparators(filepath); // Write light paths to disk. - m_project.get_light_path_recorder().write(filepath.toUtf8().constData()); + m_project->get_light_path_recorder().write(filepath.toUtf8().constData()); } void LightPathsViewportManager::slot_camera_changed() @@ -192,7 +232,7 @@ void LightPathsViewportManager::create_toolbar() // Save Light Paths button. QToolButton* save_light_paths_button = new QToolButton(); save_light_paths_button->setIcon(load_icons("lightpathstab_save_light_paths")); - const auto light_path_count = m_project.get_light_path_recorder().get_light_path_count(); + const auto light_path_count = m_project->get_light_path_recorder().get_light_path_count(); save_light_paths_button->setToolTip( QString("Save %1 Light Path%2...") .arg(QString::fromStdString(pretty_uint(light_path_count))) @@ -233,8 +273,8 @@ void LightPathsViewportManager::create_toolbar() backface_culling_button->setCheckable(true); backface_culling_button->setChecked(false); connect( - backface_culling_button, SIGNAL(toggled()), - light_paths_layer, SLOT(slot_toggle_backface_culling())); + backface_culling_button, SIGNAL(toggled(bool)), + light_paths_layer, SLOT(slot_toggle_backface_culling(bool))); m_toolbar->addWidget(backface_culling_button); // Synchronize Camera button. @@ -268,7 +308,7 @@ void LightPathsViewportManager::recreate_handlers() new LightPathsPickingHandler( m_viewport_tab->get_viewport_widget(), *m_mouse_tracker.get(), - m_project)); + *m_project)); m_screen_space_paths_picking_handler->set_enabled(false); // The world-space paths picking handler is used to pick paths in the light paths widget. diff --git a/src/appleseed.studio/mainwindow/rendering/lightpathsviewportmanager.h b/src/appleseed.studio/mainwindow/rendering/lightpathsviewportmanager.h index d61746d4d5..5894a83c97 100644 --- a/src/appleseed.studio/mainwindow/rendering/lightpathsviewportmanager.h +++ b/src/appleseed.studio/mainwindow/rendering/lightpathsviewportmanager.h @@ -32,6 +32,7 @@ #include "mainwindow/rendering/cameracontroller.h" #include "mainwindow/rendering/lightpathspickinghandler.h" #include "mainwindow/rendering/renderclipboardhandler.h" +#include "mainwindow/rendering/viewportwidget.h" #include "utility/mousecoordinatestracker.h" #include "utility/scrollareapanhandler.h" #include "utility/widgetzoomhandler.h" @@ -72,12 +73,19 @@ class LightPathsViewportManager public: LightPathsViewportManager( ViewportTab* viewport_tab, - renderer::Project& project, + renderer::Project* project, renderer::ParamArray& settings); + void reset(renderer::Project* project); + QToolBar* toolbar() const; void set_enabled(const bool enabled); + void set_picking_enabled(const bool enabled); + void set_display_enabled(const bool enabled); + + signals: + void signal_should_display(const bool should_display); public slots: void slot_entity_picked(const renderer::ScenePicker::PickingResult& result); @@ -85,16 +93,19 @@ class LightPathsViewportManager void slot_light_paths_display_toggled(const bool active); private slots: + void slot_base_layer_changed(const ViewportWidget::BaseLayer layer); void slot_light_path_selection_changed( const int selected_light_path_index, - const int total_light_paths) const; + const int total_light_paths); void slot_save_light_paths(); void slot_camera_changed(); private: bool m_enabled; + bool m_picking_enabled; + bool m_paths_display_active; - renderer::Project& m_project; + renderer::Project* m_project; renderer::ParamArray& m_settings; ViewportTab* m_viewport_tab; QToolBar* m_toolbar; diff --git a/src/appleseed.studio/mainwindow/rendering/viewporttab.cpp b/src/appleseed.studio/mainwindow/rendering/viewporttab.cpp index 9ba95e517a..b360343935 100644 --- a/src/appleseed.studio/mainwindow/rendering/viewporttab.cpp +++ b/src/appleseed.studio/mainwindow/rendering/viewporttab.cpp @@ -34,7 +34,6 @@ #include "mainwindow/project/projectexplorer.h" #include "mainwindow/rendering/lightpathsviewportmanager.h" #include "mainwindow/rendering/renderingmanager.h" -#include "mainwindow/rendering/viewportwidget.h" #include "utility/miscellaneous.h" // appleseed.renderer headers. @@ -93,9 +92,9 @@ ViewportTab::ViewportTab( layout()->setMargin(0); create_viewport_widget(); - create_light_paths_manager(m_application_settings); create_toolbar(); create_scrollarea(); + create_light_paths_manager(); layout()->addWidget(m_toolbar); layout()->addWidget(m_light_paths_manager->toolbar()); @@ -134,7 +133,8 @@ void ViewportTab::render_began() { m_viewport_widget->get_render_layer()->darken(); m_viewport_widget->get_light_paths_layer()->update_render_camera_transform(); - set_light_paths_enabled(false); + m_light_paths_manager.get()->reset(&m_project); + set_light_paths_toggle_enabled(false); update(); } @@ -176,29 +176,21 @@ void ViewportTab::load_state(const State& state) m_pan_handler->load_state(state.m_pan_handler_state); } -void ViewportTab::set_light_paths_enabled(const bool enabled) +void ViewportTab::slot_base_layer_changed(const ViewportWidget::BaseLayer base_layer) { - m_light_paths_toggle_button->setDisabled(!enabled); - m_light_paths_manager->set_enabled(enabled); -} - -void ViewportTab::slot_base_layer_changed(int index) -{ - assert(index < ViewportWidget::BaseLayer::BASE_LAYER_MAX_VALUE); - auto base_layer = static_cast(index); - switch (base_layer) { - case ViewportWidget::BaseLayer::FinalRender: - if (m_rendering_manager.is_rendering() - && m_rendering_manager.get_rendering_mode() == RenderingManager::RenderingMode::InteractiveRendering) + case ViewportWidget::BaseLayer::FinalRender: + if (m_rendering_manager.is_rendering() + && m_rendering_manager.get_rendering_mode() == RenderingManager::RenderingMode::InteractiveRendering) + m_camera_controller.get()->set_enabled(true); + else + m_camera_controller.get()->set_enabled(false); + break; + + case ViewportWidget::BaseLayer::OpenGL: m_camera_controller.get()->set_enabled(true); - else - m_camera_controller.get()->set_enabled(false); - break; - case ViewportWidget::BaseLayer::OpenGL: - m_camera_controller.get()->set_enabled(true); - break; + break; } } @@ -257,12 +249,25 @@ void ViewportTab::create_viewport_widget() m_viewport_widget->setMouseTracking(true); } -void ViewportTab::create_light_paths_manager(renderer::ParamArray application_settings) +void ViewportTab::create_light_paths_manager() { - m_light_paths_manager = new LightPathsViewportManager( + m_light_paths_manager.reset(new LightPathsViewportManager( this, - m_project, - application_settings); + &m_project, + m_application_settings)); + + connect( + m_viewport_widget, SIGNAL(signal_base_layer_changed(const ViewportWidget::BaseLayer)), + m_light_paths_manager.get(), SLOT(slot_base_layer_changed(const ViewportWidget::BaseLayer)) + ); + connect( + m_light_paths_manager.get(), SIGNAL(signal_should_display(const bool)), + m_viewport_widget, SLOT(slot_light_paths_should_display(const bool)) + ); + connect( + m_light_paths_toggle_button, SIGNAL(toggled(bool)), + m_light_paths_manager.get(), SLOT(slot_light_paths_display_toggled(bool)) + ); } void ViewportTab::create_toolbar() @@ -289,8 +294,8 @@ void ViewportTab::create_toolbar() m_viewport_widget, SLOT(slot_base_layer_changed(int)) ); connect( - m_base_layer_combo, SIGNAL(activated(int)), - SLOT(slot_base_layer_changed(int)) + m_viewport_widget, SIGNAL(signal_base_layer_changed(const ViewportWidget::BaseLayer)), + SLOT(slot_base_layer_changed(const ViewportWidget::BaseLayer)) ); m_light_paths_toggle_button = new QToolButton(); @@ -548,7 +553,7 @@ void ViewportTab::recreate_handlers() m_camera_controller.get(), SLOT(slot_entity_picked(renderer::ScenePicker::PickingResult))); connect( m_scene_picking_handler.get(), SIGNAL(signal_entity_picked(renderer::ScenePicker::PickingResult)), - m_light_paths_manager, SLOT(slot_entity_picked(renderer::ScenePicker::PickingResult))); + m_light_paths_manager.get(), SLOT(slot_entity_picked(renderer::ScenePicker::PickingResult))); // Handler for setting render regions with the mouse. m_viewport_selection_handler.reset( @@ -560,7 +565,7 @@ void ViewportTab::recreate_handlers() SIGNAL(signal_rectangle_selection(const QRect&))); connect( m_viewport_selection_handler.get(), SIGNAL(signal_rectangle_selection(const QRect&)), - m_light_paths_manager, SLOT(slot_rectangle_selection(const QRect&))); + m_light_paths_manager.get(), SLOT(slot_rectangle_selection(const QRect&))); connect( m_viewport_selection_handler.get(), SIGNAL(signal_render_region(const QRect&)), SLOT(slot_set_render_region(const QRect&))); @@ -590,6 +595,14 @@ void ViewportTab::recreate_handlers() const QString&))); } +void ViewportTab::set_light_paths_toggle_enabled(const bool enabled) +{ + if (!enabled) + m_light_paths_toggle_button->setChecked(false); + + m_light_paths_toggle_button->setDisabled(!enabled); +} + } // namespace studio } // namespace appleseed diff --git a/src/appleseed.studio/mainwindow/rendering/viewporttab.h b/src/appleseed.studio/mainwindow/rendering/viewporttab.h index a15230904e..aee299095d 100644 --- a/src/appleseed.studio/mainwindow/rendering/viewporttab.h +++ b/src/appleseed.studio/mainwindow/rendering/viewporttab.h @@ -37,6 +37,7 @@ #include "mainwindow/rendering/renderclipboardhandler.h" #include "mainwindow/rendering/scenepickinghandler.h" #include "mainwindow/rendering/viewportregionselectionhandler.h" +#include "mainwindow/rendering/viewportwidget.h" #include "utility/mousecoordinatestracker.h" #include "utility/scrollareapanhandler.h" #include "utility/widgetzoomhandler.h" @@ -55,7 +56,6 @@ namespace OCIO = OCIO_NAMESPACE; // Forward declarations. namespace appleseed { namespace studio { class LightPathsViewportManager; } } namespace appleseed { namespace studio { class ProjectExplorer; } } -namespace appleseed { namespace studio { class ViewportWidget; } } namespace renderer { class Entity; } namespace renderer { class Project; } namespace renderer { class RenderingManager; } @@ -91,8 +91,8 @@ class ViewportTab CameraController* get_camera_controller() const; ScenePickingHandler* get_scene_picking_handler() const; - void set_light_paths_enabled(const bool enabled); void set_clear_frame_button_enabled(const bool enabled); + void set_light_paths_toggle_enabled(const bool enabled); void set_render_region_buttons_enabled(const bool enabled); void render_began(); @@ -128,7 +128,7 @@ class ViewportTab private slots: void slot_camera_changed(); - void slot_base_layer_changed(int index); + void slot_base_layer_changed(const ViewportWidget::BaseLayer base_layer); void slot_set_render_region(const QRect& rect); void slot_toggle_pixel_inspector(const bool checked); void slot_toggle_render_region(const bool checked); @@ -136,7 +136,6 @@ class ViewportTab private: ViewportWidget* m_viewport_widget; - LightPathsViewportManager* m_light_paths_manager; QScrollArea* m_scroll_area; QToolBar* m_toolbar; @@ -158,6 +157,7 @@ class ViewportTab RenderingManager& m_rendering_manager; renderer::ParamArray m_application_settings; + std::unique_ptr m_light_paths_manager; std::unique_ptr m_zoom_handler; std::unique_ptr m_pan_handler; std::unique_ptr m_material_drop_handler; @@ -171,7 +171,7 @@ class ViewportTab OCIO::ConstConfigRcPtr m_ocio_config; - void create_light_paths_manager(renderer::ParamArray application_settings); + void create_light_paths_manager(); void create_scrollarea(); void create_toolbar(); void create_viewport_widget(); diff --git a/src/appleseed.studio/mainwindow/rendering/viewportwidget.cpp b/src/appleseed.studio/mainwindow/rendering/viewportwidget.cpp index 01b69c4425..f5509d1f7d 100644 --- a/src/appleseed.studio/mainwindow/rendering/viewportwidget.cpp +++ b/src/appleseed.studio/mainwindow/rendering/viewportwidget.cpp @@ -285,12 +285,6 @@ void ViewportWidget::resizeGL( m_gl->glBindTexture(GL_TEXTURE_2D, 0); } -void ViewportWidget::set_draw_light_paths_enabled(const bool enabled) -{ - m_draw_light_paths = enabled; - update(); -} - void ViewportWidget::paintGL() { @@ -408,11 +402,14 @@ void ViewportWidget::slot_base_layer_changed(int index) assert(index < BaseLayer::BASE_LAYER_MAX_VALUE); m_active_base_layer = static_cast(index); update(); + + emit signal_base_layer_changed(m_active_base_layer); } -void ViewportWidget::slot_light_paths_toggled(bool checked) +void ViewportWidget::slot_light_paths_should_display(const bool should_display) { - set_draw_light_paths_enabled(checked); + m_draw_light_paths = should_display; + update(); } } // namespace studio diff --git a/src/appleseed.studio/mainwindow/rendering/viewportwidget.h b/src/appleseed.studio/mainwindow/rendering/viewportwidget.h index 94f02aef89..1a41c88595 100644 --- a/src/appleseed.studio/mainwindow/rendering/viewportwidget.h +++ b/src/appleseed.studio/mainwindow/rendering/viewportwidget.h @@ -109,15 +109,16 @@ class ViewportWidget GLSceneLayer* get_gl_scene_layer(); LightPathsLayer* get_light_paths_layer(); - void set_draw_light_paths_enabled(const bool enabled); - signals: void signal_material_dropped( const foundation::Vector2d& drop_pos, const QString& material_name); + void signal_base_layer_changed(const ViewportWidget::BaseLayer layer); + + public slots: + void slot_light_paths_should_display(const bool should_display); private slots: - void slot_light_paths_toggled(bool checked); void slot_base_layer_changed(int index); private: