#pragma once #include "Scene/SceneToolState.h" #include "Host/HostFwd.h" #include #include #include #include #include namespace XCEngine::UI::Editor::App { inline constexpr std::size_t kSceneViewportToolOverlayInvalidIndex = static_cast(-1); struct SceneViewportToolOverlayButtonFrame { SceneToolMode mode = SceneToolMode::View; ::XCEngine::UI::UIRect rect = {}; ::XCEngine::UI::UITextureHandle texture = {}; const char* label = ""; bool active = false; bool hovered = false; bool pressed = false; }; struct SceneViewportToolOverlayFrame { bool visible = false; ::XCEngine::UI::UIRect clipRect = {}; ::XCEngine::UI::UIRect panelRect = {}; std::array buttons = {}; }; class SceneViewportToolOverlay { public: bool Initialize( const std::filesystem::path& repoRoot, Host::TextureHost& renderer); void Shutdown(Host::TextureHost& renderer); void ResetFrame(); void BuildFrame( const ::XCEngine::UI::UIRect& viewportRect, SceneToolMode activeMode, std::size_t hoveredIndex, std::size_t pressedIndex); std::size_t HitTest(const ::XCEngine::UI::UIPoint& point) const; bool Contains(const ::XCEngine::UI::UIPoint& point) const; const SceneViewportToolOverlayFrame& GetFrame() const; private: struct ToolTextureSet { SceneToolMode mode = SceneToolMode::View; const char* label = ""; ::XCEngine::UI::UITextureHandle inactiveTexture = {}; ::XCEngine::UI::UITextureHandle activeTexture = {}; }; std::array m_toolTextures = {}; SceneViewportToolOverlayFrame m_frame = {}; }; void AppendSceneViewportToolOverlay( ::XCEngine::UI::UIDrawList& drawList, const SceneViewportToolOverlayFrame& frame); } // namespace XCEngine::UI::Editor::App