#pragma once #include namespace XCEngine::UI::Editor::Host { class HostRuntimeState { public: void Reset() { m_windowDpi = 96u; m_inInteractiveResize = false; m_renderFrameQueued = false; m_hasPendingWindowResize = false; m_pendingWindowResizeWidth = 0u; m_pendingWindowResizeHeight = 0u; } void SetWindowDpi(UINT dpi) { m_windowDpi = dpi == 0u ? 96u : dpi; } UINT GetWindowDpi() const { return m_windowDpi; } float GetDpiScale(float baseDpiScale) const { return baseDpiScale > 0.0f ? static_cast(m_windowDpi) / baseDpiScale : 1.0f; } void BeginInteractiveResize() { m_inInteractiveResize = true; } void EndInteractiveResize() { m_inInteractiveResize = false; } bool IsInteractiveResize() const { return m_inInteractiveResize; } void QueueWindowResize(UINT width, UINT height) { if (width == 0u || height == 0u) { return; } m_pendingWindowResizeWidth = width; m_pendingWindowResizeHeight = height; m_hasPendingWindowResize = true; } bool ConsumePendingWindowResize(UINT& outWidth, UINT& outHeight) { outWidth = 0u; outHeight = 0u; if (!m_hasPendingWindowResize) { return false; } m_hasPendingWindowResize = false; outWidth = m_pendingWindowResizeWidth; outHeight = m_pendingWindowResizeHeight; return outWidth > 0u && outHeight > 0u; } bool TryQueueDeferredRender() { if (m_renderFrameQueued) { return false; } m_renderFrameQueued = true; return true; } void ClearDeferredRenderRequest() { m_renderFrameQueued = false; } private: UINT m_windowDpi = 96u; bool m_inInteractiveResize = false; bool m_renderFrameQueued = false; bool m_hasPendingWindowResize = false; UINT m_pendingWindowResizeWidth = 0u; UINT m_pendingWindowResizeHeight = 0u; }; } // namespace XCEngine::UI::Editor::Host