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.
This commit is contained in:
@@ -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<AZ::RPI::ViewportContextRequestsInterface>::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<float>(size.m_width), aznumeric_cast<float>(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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user