#pragma once #include "Scene/SceneToolState.h" #include "Ports/PortFwd.h" #include #include #include #include #include #include #include namespace XCEngine::UI::Editor::App { inline constexpr std::size_t kSceneViewportToolOverlayInvalidIndex = static_cast(-1); enum class SceneViewportToggleButtonKind : std::uint8_t { Pivot = 0, Space }; struct SceneViewportToggleButtonFrame { SceneViewportToggleButtonKind kind = SceneViewportToggleButtonKind::Pivot; ::XCEngine::UI::UIRect rect = {}; std::string label = {}; bool active = false; bool hovered = false; bool pressed = false; }; struct SceneViewportToggleOverlayFrame { bool visible = false; ::XCEngine::UI::UIRect panelRect = {}; std::array buttons = {}; }; 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 = {}; SceneViewportToggleOverlayFrame toggleFrame = {}; ::XCEngine::UI::UIRect panelRect = {}; std::array buttons = {}; }; class SceneViewportToolOverlay { public: bool Initialize( const std::filesystem::path& repoRoot, Ports::TexturePort& renderer); void Shutdown(Ports::TexturePort& renderer); void ResetFrame(); void BuildFrame( const ::XCEngine::UI::UIRect& viewportRect, const ::XCEngine::UI::UIRect& topBarRect, const ::XCEngine::UI::UIRect& clipRect, SceneToolMode activeMode, SceneToolPivotMode pivotMode, SceneToolSpaceMode spaceMode, std::size_t hoveredIndex, std::size_t pressedIndex, std::size_t hoveredToggleIndex, std::size_t pressedToggleIndex); std::size_t HitTest(const ::XCEngine::UI::UIPoint& point) const; std::size_t HitTestToggle(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