#pragma once #include #include #include #include namespace XCEngine::UI::Editor::App { class EditorSceneRuntime; struct SceneViewportTransformGizmoTriangle { ::XCEngine::UI::UIPoint a = {}; ::XCEngine::UI::UIPoint b = {}; ::XCEngine::UI::UIPoint c = {}; ::XCEngine::UI::UIColor color = {}; }; struct SceneViewportTransformGizmoFrame { bool visible = false; ::XCEngine::UI::UIRect clipRect = {}; std::vector triangles = {}; }; class SceneViewportTransformGizmo { public: SceneViewportTransformGizmo(); ~SceneViewportTransformGizmo(); SceneViewportTransformGizmo(const SceneViewportTransformGizmo&) = delete; SceneViewportTransformGizmo& operator=(const SceneViewportTransformGizmo&) = delete; SceneViewportTransformGizmo(SceneViewportTransformGizmo&&) noexcept; SceneViewportTransformGizmo& operator=(SceneViewportTransformGizmo&&) noexcept; void Refresh( EditorSceneRuntime& sceneRuntime, const ::XCEngine::UI::UIRect& viewportRect, const ::XCEngine::UI::UIPoint& pointerScreen, bool hoverEnabled); bool TryBeginDrag(EditorSceneRuntime& sceneRuntime); bool UpdateDrag(EditorSceneRuntime& sceneRuntime); bool EndDrag(EditorSceneRuntime& sceneRuntime); void CancelDrag(EditorSceneRuntime& sceneRuntime); void ResetVisualState(); bool IsActive() const; bool IsHoveringHandle() const; const SceneViewportTransformGizmoFrame& GetFrame() const; private: struct State; std::unique_ptr m_state = {}; }; void AppendSceneViewportTransformGizmo( ::XCEngine::UI::UIDrawList& drawList, const SceneViewportTransformGizmoFrame& frame); } // namespace XCEngine::UI::Editor::App