From fb2ca8e02c22dd6ecb72ad369d82eb50e8f7358c Mon Sep 17 00:00:00 2001 From: nvsickle Date: Wed, 21 Apr 2021 17:42:02 -0700 Subject: [PATCH 1/8] Fix Editor crash in test teardown calling set_view_pane_layout If Atom isn't initialized and able to produce a ViewportContext, the Editor would crash. This attempts to make the initialization fail a bit more gracefully and fixes the crash in the cases I've tested. --- Code/Sandbox/Editor/EditorViewportWidget.cpp | 11 ++++-- Code/Sandbox/Editor/MainWindow.cpp | 1 - .../Viewport/RenderViewportWidget.h | 9 ++++- .../Source/Viewport/RenderViewportWidget.cpp | 36 ++++++++++++++++--- .../Viewport/MaterialViewportWidget.cpp | 2 +- Gems/LyShine/Code/Editor/ViewportWidget.cpp | 2 +- 6 files changed, 49 insertions(+), 12 deletions(-) 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()) From 795ce4dfca753d0f2d937faa1347a20ca4cab1d8 Mon Sep 17 00:00:00 2001 From: nvsickle Date: Wed, 21 Apr 2021 17:43:22 -0700 Subject: [PATCH 2/8] Revert accidental change --- Code/Sandbox/Editor/MainWindow.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Code/Sandbox/Editor/MainWindow.cpp b/Code/Sandbox/Editor/MainWindow.cpp index 1925bb0861..902b04f266 100644 --- a/Code/Sandbox/Editor/MainWindow.cpp +++ b/Code/Sandbox/Editor/MainWindow.cpp @@ -1234,6 +1234,7 @@ 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) From e1ae61ca06d614493e7eb623845d7c26dfbdb879 Mon Sep 17 00:00:00 2001 From: nvsickle Date: Thu, 22 Apr 2021 11:22:09 -0700 Subject: [PATCH 3/8] Fix ImGui sometimes not respecting the viewport resolution in-Editor ImguiAtomSystemComponent isn't guaranteed to initialize before ImGuiManager, which caused some issues. Additionally, because we allow the user to configure ImGui's render resolution, I've refactored the window size override into a new OverrideRenderWindowSize API in ImGuiManager to decouple it from the target render resolution. --- .../Code/Source/ImguiAtomSystemComponent.cpp | 40 ++++++++++++++----- .../Code/Source/ImguiAtomSystemComponent.h | 2 + Gems/ImGui/Code/Include/ImGuiBus.h | 2 + Gems/ImGui/Code/Source/ImGuiManager.cpp | 17 +++++++- Gems/ImGui/Code/Source/ImGuiManager.h | 3 ++ 5 files changed, 54 insertions(+), 10 deletions(-) diff --git a/Gems/AtomLyIntegration/ImguiAtom/Code/Source/ImguiAtomSystemComponent.cpp b/Gems/AtomLyIntegration/ImguiAtom/Code/Source/ImguiAtomSystemComponent.cpp index 2ae62023c7..33931efe97 100644 --- a/Gems/AtomLyIntegration/ImguiAtom/Code/Source/ImguiAtomSystemComponent.cpp +++ b/Gems/AtomLyIntegration/ImguiAtom/Code/Source/ImguiAtomSystemComponent.cpp @@ -59,14 +59,8 @@ namespace AZ const AZ::Name contextName = atomViewportRequests->GetDefaultViewportContextName(); AZ::RPI::ViewportContextNotificationBus::Handler::BusConnect(contextName); -#if defined(IMGUI_ENABLED) - ImGui::ImGuiManagerListenerBus::Broadcast(&ImGui::IImGuiManagerListener::SetResolutionMode, ImGui::ImGuiResolutionMode::LockToResolution); - auto defaultViewportContext = atomViewportRequests->GetDefaultViewportContext(); - if (defaultViewportContext) - { - OnViewportSizeChanged(defaultViewportContext->GetViewportSize()); - } -#endif + m_initialized = false; + InitializeViewportSizeIfNeeded(); } void ImguiAtomSystemComponent::Deactivate() @@ -75,6 +69,23 @@ namespace AZ AZ::RPI::ViewportContextNotificationBus::Handler::BusDisconnect(); } + void ImguiAtomSystemComponent::InitializeViewportSizeIfNeeded() + { +#if defined(IMGUI_ENABLED) + if (m_initialized) + { + return; + } + auto atomViewportRequests = AZ::Interface::Get(); + auto defaultViewportContext = atomViewportRequests->GetDefaultViewportContext(); + if (defaultViewportContext) + { + // If this succeeds, m_initialized will be set to true. + OnViewportSizeChanged(defaultViewportContext->GetViewportSize()); + } +#endif + } + void ImguiAtomSystemComponent::RenderImGuiBuffers(const ImDrawData& drawData) { Render::ImGuiSystemRequestBus::Broadcast(&Render::ImGuiSystemRequests::RenderImGuiBuffersToCurrentViewport, drawData); @@ -83,6 +94,7 @@ namespace AZ void ImguiAtomSystemComponent::OnRenderTick() { #if defined(IMGUI_ENABLED) + InitializeViewportSizeIfNeeded(); ImGui::ImGuiManagerListenerBus::Broadcast(&ImGui::IImGuiManagerListener::Render); #endif } @@ -90,7 +102,17 @@ namespace AZ void ImguiAtomSystemComponent::OnViewportSizeChanged(AzFramework::WindowSize size) { #if defined(IMGUI_ENABLED) - ImGui::ImGuiManagerListenerBus::Broadcast(&ImGui::IImGuiManagerListener::SetImGuiRenderResolution, ImVec2{aznumeric_cast(size.m_width), aznumeric_cast(size.m_height)}); + ImGui::ImGuiManagerListenerBus::Broadcast([this, size](ImGui::ImGuiManagerListenerBus::Events* imgui) + { + imgui->OverrideRenderWindowSize(size.m_width, size.m_height); + // ImGuiManagerListenerBus may not have been connected when this system component is activated + // as ImGuiManager is not part of a system component we can require and instead just listens for ESYSTEM_EVENT_GAME_POST_INIT. + // Let our ImguiAtomSystemComponent know once we successfully connect and update the viewport size. + if (!m_initialized) + { + m_initialized = true; + } + }); #endif } } diff --git a/Gems/AtomLyIntegration/ImguiAtom/Code/Source/ImguiAtomSystemComponent.h b/Gems/AtomLyIntegration/ImguiAtom/Code/Source/ImguiAtomSystemComponent.h index d3bdb7c4fc..a5663216d5 100644 --- a/Gems/AtomLyIntegration/ImguiAtom/Code/Source/ImguiAtomSystemComponent.h +++ b/Gems/AtomLyIntegration/ImguiAtom/Code/Source/ImguiAtomSystemComponent.h @@ -48,6 +48,7 @@ namespace AZ void Deactivate() override; private: + void InitializeViewportSizeIfNeeded(); // OtherActiveImGuiRequestBus overrides ... void RenderImGuiBuffers(const ImDrawData& drawData) override; @@ -57,6 +58,7 @@ namespace AZ void OnViewportSizeChanged(AzFramework::WindowSize size) override; DebugConsole m_debugConsole; + bool m_initialized = false; }; } // namespace LYIntegration } // namespace AZ diff --git a/Gems/ImGui/Code/Include/ImGuiBus.h b/Gems/ImGui/Code/Include/ImGuiBus.h index 2b2afacb8e..29e40e2985 100644 --- a/Gems/ImGui/Code/Include/ImGuiBus.h +++ b/Gems/ImGui/Code/Include/ImGuiBus.h @@ -90,6 +90,8 @@ namespace ImGui virtual void SetResolutionMode(ImGuiResolutionMode state) = 0; virtual const ImVec2& GetImGuiRenderResolution() const = 0; virtual void SetImGuiRenderResolution(const ImVec2& res) = 0; + virtual void OverrideRenderWindowSize(uint32_t width, uint32_t height) = 0; + virtual void RestoreRenderWindowSizeToDefault() = 0; virtual void Render() = 0; }; typedef AZ::EBus ImGuiManagerListenerBus; diff --git a/Gems/ImGui/Code/Source/ImGuiManager.cpp b/Gems/ImGui/Code/Source/ImGuiManager.cpp index c446c98175..3fb36afd43 100644 --- a/Gems/ImGui/Code/Source/ImGuiManager.cpp +++ b/Gems/ImGui/Code/Source/ImGuiManager.cpp @@ -262,6 +262,21 @@ void ImGuiManager::Shutdown() ImGui::DestroyContext(m_imguiContext); } +void ImGui::ImGuiManager::OverrideRenderWindowSize(uint32_t width, uint32_t height) +{ + m_windowSize.m_width = width; + m_windowSize.m_height = height; + m_overridingWindowSize = true; + // Don't listen for window updates if our window size is being overridden + AzFramework::WindowNotificationBus::Handler::BusDisconnect(); +} + +void ImGui::ImGuiManager::RestoreRenderWindowSizeToDefault() +{ + m_overridingWindowSize = false; + InitWindowSize(); +} + void ImGuiManager::Render() { if (m_clientMenuBarState == DisplayState::Hidden && m_editorWindowState == DisplayState::Hidden) @@ -757,7 +772,7 @@ void ImGuiManager::InitWindowSize() { // We only need to initialize the window size by querying the window the first time. // After that we will get OnWindowResize notifications - if (!AzFramework::WindowNotificationBus::Handler::BusIsConnected()) + if (!m_overridingWindowSize && !AzFramework::WindowNotificationBus::Handler::BusIsConnected()) { AzFramework::NativeWindowHandle windowHandle = nullptr; AzFramework::WindowSystemRequestBus::BroadcastResult(windowHandle, &AzFramework::WindowSystemRequestBus::Events::GetDefaultWindowHandle); diff --git a/Gems/ImGui/Code/Source/ImGuiManager.h b/Gems/ImGui/Code/Source/ImGuiManager.h index 6d2281d8d3..b8dd4b41c3 100644 --- a/Gems/ImGui/Code/Source/ImGuiManager.h +++ b/Gems/ImGui/Code/Source/ImGuiManager.h @@ -60,6 +60,8 @@ namespace ImGui void SetResolutionMode(ImGuiResolutionMode mode) override { m_resolutionMode = mode; } const ImVec2& GetImGuiRenderResolution() const override { return m_renderResolution; } void SetImGuiRenderResolution(const ImVec2& res) override { m_renderResolution = res; } + void OverrideRenderWindowSize(uint32_t width, uint32_t height) override; + void RestoreRenderWindowSizeToDefault() override; void Render() override; // -- ImGuiManagerListenerBus Interface ------------------------------------------------------------------- @@ -89,6 +91,7 @@ namespace ImGui ImVec2 m_renderResolution = ImVec2(1920.0f, 1080.0f); ImVec2 m_lastRenderResolution; AzFramework::WindowSize m_windowSize = AzFramework::WindowSize(1920, 1080); + bool m_overridingWindowSize = false; // Rendering buffers std::vector m_vertBuffer; From 9e6244dc990d277ab930ce0519f5e2c5e49e2ebf Mon Sep 17 00:00:00 2001 From: nvsickle Date: Thu, 22 Apr 2021 17:35:27 -0700 Subject: [PATCH 4/8] Fix game mode camera components not working in-Editor Ensures RPI::View updates always make it back to the ViewportContext, even if you talk directly to the View --- .../RPI/Code/Include/Atom/RPI.Public/View.h | 9 +++++++++ .../Include/Atom/RPI.Public/ViewportContext.h | 2 ++ Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp | 18 +++++++++++++++++ .../Source/RPI.Public/ViewportContext.cpp | 20 +++++++++++++++---- 4 files changed, 45 insertions(+), 4 deletions(-) diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/View.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/View.h index ba652a2b94..46fb5cea01 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/View.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/View.h @@ -118,6 +118,12 @@ namespace AZ //! Update View's SRG values and compile. This should only be called once per frame before execute command lists. void UpdateSrg(); + using MatrixChangedEvent = AZ::Event; + //! Notifies consumers when the world to view matrix has changed. + void ConnectWorldToViewMatrixChangedHandler(MatrixChangedEvent::Handler& handler); + //! Notifies consumers when the world to clip matrix has changed. + void ConnectWorldToClipMatrixChangedHandler(MatrixChangedEvent::Handler& handler); + private: View() = delete; View(const AZ::Name& name, UsageFlags usage); @@ -182,6 +188,9 @@ namespace AZ // view class doesn't contain subroutines called at the end of each frame bool m_worldToClipMatrixChanged = true; bool m_worldToClipPrevMatrixNeedsUpdate = false; + + MatrixChangedEvent m_oWworldToClipMatrixChange; + MatrixChangedEvent m_onWorldToViewMatrixChange; }; AZ_DEFINE_ENUM_BITWISE_OPERATORS(View::UsageFlags); diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewportContext.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewportContext.h index d3d3155715..4f24a20f35 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewportContext.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewportContext.h @@ -125,7 +125,9 @@ namespace AZ AzFramework::WindowSize m_viewportSize; SizeChangedEvent m_sizeChangedEvent; MatrixChangedEvent m_viewMatrixChangedEvent; + MatrixChangedEvent::Handler m_onViewMatrixChangedHandler; MatrixChangedEvent m_projectionMatrixChangedEvent; + MatrixChangedEvent::Handler m_onProjectionMatrixChangedHandler; SceneChangedEvent m_sceneChangedEvent; ViewportContextManager* m_manager; RenderPipelinePtr m_currentPipeline; diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp index 4fe9843534..1d7e10c1ee 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp @@ -104,6 +104,9 @@ namespace AZ m_worldToClipMatrix = m_viewToClipMatrix * m_worldToViewMatrix; m_worldToClipMatrixChanged = true; + m_onWorldToViewMatrixChange.Signal(m_worldToViewMatrix); + m_oWworldToClipMatrixChange.Signal(m_worldToClipMatrix); + InvalidateSrg(); } @@ -132,6 +135,9 @@ namespace AZ m_clipToWorldMatrix = m_viewToWorldMatrix * m_clipToViewMatrix; m_worldToClipMatrixChanged = true; + m_onWorldToViewMatrixChange.Signal(m_worldToViewMatrix); + m_oWworldToClipMatrixChange.Signal(m_worldToClipMatrix); + InvalidateSrg(); } @@ -166,6 +172,8 @@ namespace AZ m_unprojectionConstants.SetZ(float(-tanHalfFovX)); m_unprojectionConstants.SetW(float(tanHalfFovY)); + m_oWworldToClipMatrixChange.Signal(m_worldToClipMatrix); + InvalidateSrg(); } @@ -225,6 +233,16 @@ namespace AZ passWithDrawListTag->SortDrawList(drawList); } + void View::ConnectWorldToViewMatrixChangedHandler(View::MatrixChangedEvent::Handler& handler) + { + handler.Connect(m_onWorldToViewMatrixChange); + } + + void View::ConnectWorldToClipMatrixChangedHandler(View::MatrixChangedEvent::Handler& handler) + { + handler.Connect(m_oWworldToClipMatrixChange); + } + // [GFX TODO] This function needs unit tests and might need to be reworked RHI::DrawItemSortKey View::GetSortKeyForPosition(const Vector3& positionInWorld) const { diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/ViewportContext.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/ViewportContext.cpp index eb8aaf4440..9482458bd9 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/ViewportContext.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/ViewportContext.cpp @@ -34,8 +34,16 @@ namespace AZ &AzFramework::WindowRequestBus::Events::GetClientAreaSize); AzFramework::WindowNotificationBus::Handler::BusConnect(nativeWindow); - SetRenderScene(renderScene); - } + m_onProjectionMatrixChangedHandler = ViewportContext::MatrixChangedEvent::Handler([this](const AZ::Matrix4x4& matrix) + { + m_projectionMatrixChangedEvent.Signal(matrix); + }); + m_onViewMatrixChangedHandler = ViewportContext::MatrixChangedEvent::Handler([this](const AZ::Matrix4x4& matrix) + { + m_projectionMatrixChangedEvent.Signal(matrix); + }); + + SetRenderScene(renderScene); } ViewportContext::~ViewportContext() { @@ -175,7 +183,6 @@ namespace AZ void ViewportContext::SetCameraProjectionMatrix(const AZ::Matrix4x4& matrix) { GetDefaultView()->SetViewToClipMatrix(matrix); - m_projectionMatrixChangedEvent.Signal(matrix); } AZ::Transform ViewportContext::GetCameraTransform() const @@ -192,18 +199,23 @@ namespace AZ { const auto view = GetDefaultView(); view->SetCameraTransform(AZ::Matrix3x4::CreateFromTransform(transform.GetOrthogonalized())); - m_viewMatrixChangedEvent.Signal(view->GetWorldToViewMatrix()); } void ViewportContext::SetDefaultView(ViewPtr view) { if (m_defaultView != view) { + m_onProjectionMatrixChangedHandler.Disconnect(); + m_onViewMatrixChangedHandler.Disconnect(); + m_defaultView = view; UpdatePipelineView(); m_viewMatrixChangedEvent.Signal(view->GetWorldToViewMatrix()); m_projectionMatrixChangedEvent.Signal(view->GetViewToClipMatrix()); + + view->ConnectWorldToViewMatrixChangedHandler(m_onViewMatrixChangedHandler); + view->ConnectWorldToClipMatrixChangedHandler(m_onProjectionMatrixChangedHandler); } } From e6cfe36a03ddf971a6fc2bdbd377e74eb4a8f6b4 Mon Sep 17 00:00:00 2001 From: nvsickle Date: Thu, 22 Apr 2021 20:13:10 -0700 Subject: [PATCH 5/8] Fix typo --- Gems/Atom/RPI/Code/Include/Atom/RPI.Public/View.h | 2 +- Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/View.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/View.h index 46fb5cea01..512c57cc2f 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/View.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/View.h @@ -189,7 +189,7 @@ namespace AZ bool m_worldToClipMatrixChanged = true; bool m_worldToClipPrevMatrixNeedsUpdate = false; - MatrixChangedEvent m_oWworldToClipMatrixChange; + MatrixChangedEvent m_onworldToClipMatrixChange; MatrixChangedEvent m_onWorldToViewMatrixChange; }; diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp index 1d7e10c1ee..ee5cc02a7e 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp @@ -105,7 +105,7 @@ namespace AZ m_worldToClipMatrixChanged = true; m_onWorldToViewMatrixChange.Signal(m_worldToViewMatrix); - m_oWworldToClipMatrixChange.Signal(m_worldToClipMatrix); + m_onworldToClipMatrixChange.Signal(m_worldToClipMatrix); InvalidateSrg(); } From 228fa7ff6b1ee972aaa8273733539125681817cd Mon Sep 17 00:00:00 2001 From: nvsickle Date: Thu, 22 Apr 2021 20:15:42 -0700 Subject: [PATCH 6/8] Fix search and replace fail --- Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp index ee5cc02a7e..7cf5e980bf 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp @@ -136,7 +136,7 @@ namespace AZ m_worldToClipMatrixChanged = true; m_onWorldToViewMatrixChange.Signal(m_worldToViewMatrix); - m_oWworldToClipMatrixChange.Signal(m_worldToClipMatrix); + m_onworldToClipMatrixChange.Signal(m_worldToClipMatrix); InvalidateSrg(); } @@ -172,7 +172,7 @@ namespace AZ m_unprojectionConstants.SetZ(float(-tanHalfFovX)); m_unprojectionConstants.SetW(float(tanHalfFovY)); - m_oWworldToClipMatrixChange.Signal(m_worldToClipMatrix); + m_onworldToClipMatrixChange.Signal(m_worldToClipMatrix); InvalidateSrg(); } @@ -240,7 +240,7 @@ namespace AZ void View::ConnectWorldToClipMatrixChangedHandler(View::MatrixChangedEvent::Handler& handler) { - handler.Connect(m_oWworldToClipMatrixChange); + handler.Connect(m_onworldToClipMatrixChange); } // [GFX TODO] This function needs unit tests and might need to be reworked From f835372c0f35143d7b1712fad96d00a1241227f2 Mon Sep 17 00:00:00 2001 From: nvsickle Date: Thu, 22 Apr 2021 23:47:06 -0700 Subject: [PATCH 7/8] Fix capitalization... --- Gems/Atom/RPI/Code/Include/Atom/RPI.Public/View.h | 2 +- Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/View.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/View.h index 512c57cc2f..8721e08028 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/View.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/View.h @@ -189,7 +189,7 @@ namespace AZ bool m_worldToClipMatrixChanged = true; bool m_worldToClipPrevMatrixNeedsUpdate = false; - MatrixChangedEvent m_onworldToClipMatrixChange; + MatrixChangedEvent m_onWorldToClipMatrixChange; MatrixChangedEvent m_onWorldToViewMatrixChange; }; diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp index 7cf5e980bf..9dbc5463af 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp @@ -105,7 +105,7 @@ namespace AZ m_worldToClipMatrixChanged = true; m_onWorldToViewMatrixChange.Signal(m_worldToViewMatrix); - m_onworldToClipMatrixChange.Signal(m_worldToClipMatrix); + m_onWorldToClipMatrixChange.Signal(m_worldToClipMatrix); InvalidateSrg(); } @@ -136,7 +136,7 @@ namespace AZ m_worldToClipMatrixChanged = true; m_onWorldToViewMatrixChange.Signal(m_worldToViewMatrix); - m_onworldToClipMatrixChange.Signal(m_worldToClipMatrix); + m_onWorldToClipMatrixChange.Signal(m_worldToClipMatrix); InvalidateSrg(); } @@ -172,7 +172,7 @@ namespace AZ m_unprojectionConstants.SetZ(float(-tanHalfFovX)); m_unprojectionConstants.SetW(float(tanHalfFovY)); - m_onworldToClipMatrixChange.Signal(m_worldToClipMatrix); + m_onWorldToClipMatrixChange.Signal(m_worldToClipMatrix); InvalidateSrg(); } @@ -240,7 +240,7 @@ namespace AZ void View::ConnectWorldToClipMatrixChangedHandler(View::MatrixChangedEvent::Handler& handler) { - handler.Connect(m_onworldToClipMatrixChange); + handler.Connect(m_onWorldToClipMatrixChange); } // [GFX TODO] This function needs unit tests and might need to be reworked From 12468fd81aec34872fc69f50204c2d918b109720 Mon Sep 17 00:00:00 2001 From: nvsickle Date: Fri, 23 Apr 2021 02:08:50 -0700 Subject: [PATCH 8/8] Fix spacing from merge --- Gems/Atom/RPI/Code/Source/RPI.Public/ViewportContext.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/ViewportContext.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/ViewportContext.cpp index 9482458bd9..e1e87086e7 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/ViewportContext.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/ViewportContext.cpp @@ -43,7 +43,8 @@ namespace AZ m_projectionMatrixChangedEvent.Signal(matrix); }); - SetRenderScene(renderScene); } + SetRenderScene(renderScene); + } ViewportContext::~ViewportContext() {