diff --git a/Code/Sandbox/Editor/EditorViewportWidget.cpp b/Code/Sandbox/Editor/EditorViewportWidget.cpp index 86fda8ceae..2647b4cd05 100644 --- a/Code/Sandbox/Editor/EditorViewportWidget.cpp +++ b/Code/Sandbox/Editor/EditorViewportWidget.cpp @@ -1218,13 +1218,18 @@ void EditorViewportWidget::SetViewportId(int id) CViewport::SetViewportId(id); // Now that we have an ID, we can initialize our viewport. - m_renderViewport = new AtomToolsFramework::RenderViewportWidget(id, this); - m_defaultViewportContextName = m_renderViewport->GetViewportContext()->GetName(); + m_renderViewport = new AtomToolsFramework::RenderViewportWidget(this, false); + if (!m_renderViewport->InitializeViewportContext(id)) + { + AZ_Warning("EditorViewportWidget", false, "Failed to initialize RenderViewportWidget's ViewportContext"); + return; + } + auto viewportContext = m_renderViewport->GetViewportContext(); + m_defaultViewportContextName = viewportContext->GetName(); QBoxLayout* layout = new QBoxLayout(QBoxLayout::Direction::TopToBottom, this); layout->setContentsMargins(QMargins()); layout->addWidget(m_renderViewport); - auto viewportContext = m_renderViewport->GetViewportContext(); viewportContext->ConnectViewMatrixChangedHandler(m_cameraViewMatrixChangeHandler); viewportContext->ConnectProjectionMatrixChangedHandler(m_cameraProjectionMatrixChangeHandler); diff --git a/Code/Sandbox/Editor/MainWindow.cpp b/Code/Sandbox/Editor/MainWindow.cpp index 902b04f266..1925bb0861 100644 --- a/Code/Sandbox/Editor/MainWindow.cpp +++ b/Code/Sandbox/Editor/MainWindow.cpp @@ -1234,7 +1234,6 @@ void MainWindow::InitActions() // View actions am->AddAction(ID_VIEW_OPENVIEWPANE, tr("Open View Pane")); am->AddAction(ID_VIEW_CONSOLEWINDOW, tr(LyViewPane::ConsoleMenuName)) - .SetShortcut(tr("^")) .SetReserved() .SetStatusTip(tr("Show or hide the console window")) .SetCheckable(true) diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h index 93f94475e4..dd71bbc431 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h @@ -43,9 +43,16 @@ namespace AtomToolsFramework //! Creates a RenderViewportWidget. //! Requires the Atom RPI to be initialized in order //! to internally construct an RPI::ViewportContext. - explicit RenderViewportWidget(AzFramework::ViewportId id = AzFramework::InvalidViewportId, QWidget* parent = nullptr); + //! If initializeViewportContext is set to false, nothing will be displayed on-screen until InitiliazeViewportContext is called. + explicit RenderViewportWidget(QWidget* parent = nullptr, bool shouldInitializeViewportContext = true); ~RenderViewportWidget(); + //! Initializes the underlying ViewportContext, if it hasn't already been. + //! If id is specified, the target ViewportContext will be overridden. + //! NOTE: ViewportContext IDs must be unique. + //! Returns true if the ViewportContext is available + //! (i.e. GetViewportContext will return a valid pointer). + bool InitializeViewportContext(AzFramework::ViewportId id = AzFramework::InvalidViewportId); //! Gets the name associated with this viewport's ViewportContext. //! This context name can be used to adjust the current Camera //! independently of the underlying viewport. diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/RenderViewportWidget.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/RenderViewportWidget.cpp index bf46ece27b..0f1e5718db 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/RenderViewportWidget.cpp +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/RenderViewportWidget.cpp @@ -31,12 +31,35 @@ namespace AtomToolsFramework { - RenderViewportWidget::RenderViewportWidget(AzFramework::ViewportId id, QWidget* parent) + RenderViewportWidget::RenderViewportWidget(QWidget* parent, bool shouldInitializeViewportContext) : QWidget(parent) , AzFramework::InputChannelEventListener(AzFramework::InputChannelEventListener::GetPriorityDefault()) { + if (shouldInitializeViewportContext) + { + InitializeViewportContext(); + } + + setUpdatesEnabled(false); + setFocusPolicy(Qt::FocusPolicy::WheelFocus); + setMouseTracking(true); + } + + bool RenderViewportWidget::InitializeViewportContext(AzFramework::ViewportId id) + { + if (m_viewportContext != nullptr) + { + AZ_Assert(id == AzFramework::InvalidViewportId || m_viewportContext->GetId() == id, "Attempted to reinitialize RenderViewportWidget with a different ID"); + return true; + } + auto viewportContextManager = AZ::Interface::Get(); - AZ_Assert(viewportContextManager, "Attempted to construct RenderViewportWidget without ViewportContextManager"); + AZ_Assert(viewportContextManager, "Attempted to initialize RenderViewportWidget without ViewportContextManager"); + + if (viewportContextManager == nullptr) + { + return false; + } // Before we do anything else, we must create a ViewportContext which will give us a ViewportId if we didn't manually specify one. AZ::RPI::ViewportContextRequestsInterface::CreationParameters params; @@ -46,6 +69,11 @@ namespace AtomToolsFramework AzFramework::WindowRequestBus::Handler::BusConnect(params.windowHandle); m_viewportContext = viewportContextManager->CreateViewportContext(AZ::Name(), params); + if (m_viewportContext == nullptr) + { + return false; + } + SetControllerList(AZStd::make_shared()); AZ::Name cameraName = AZ::Name(AZStd::string::format("Viewport %i Default Camera", m_viewportContext->GetId())); @@ -58,9 +86,7 @@ namespace AtomToolsFramework AZ::TickBus::Handler::BusConnect(); AzFramework::WindowRequestBus::Handler::BusConnect(params.windowHandle); - setUpdatesEnabled(false); - setFocusPolicy(Qt::FocusPolicy::WheelFocus); - setMouseTracking(true); + return true; } RenderViewportWidget::~RenderViewportWidget() diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/MaterialViewportWidget.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/MaterialViewportWidget.cpp index 085d38b064..26279e531b 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/MaterialViewportWidget.cpp +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/MaterialViewportWidget.cpp @@ -38,7 +38,7 @@ namespace MaterialEditor { MaterialViewportWidget::MaterialViewportWidget(QWidget* parent) - : AtomToolsFramework::RenderViewportWidget(AzFramework::InvalidViewportId, parent) + : AtomToolsFramework::RenderViewportWidget(parent) , m_ui(new Ui::MaterialViewportWidget) { m_ui->setupUi(this); diff --git a/Gems/LyShine/Code/Editor/ViewportWidget.cpp b/Gems/LyShine/Code/Editor/ViewportWidget.cpp index 2b1ea16c97..9956a39647 100644 --- a/Gems/LyShine/Code/Editor/ViewportWidget.cpp +++ b/Gems/LyShine/Code/Editor/ViewportWidget.cpp @@ -204,7 +204,7 @@ namespace } // anonymous namespace. ViewportWidget::ViewportWidget(EditorWindow* parent) - : AtomToolsFramework::RenderViewportWidget(AzFramework::InvalidViewportId, parent) + : AtomToolsFramework::RenderViewportWidget(parent) , m_editorWindow(parent) , m_viewportInteraction(new ViewportInteraction(m_editorWindow)) , m_viewportAnchor(new ViewportAnchor())