// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved. namespace FlaxEngine.GUI { /// /// Root control implementation used by the actor. /// /// [HideInEditor] public sealed class CanvasRootControl : RootControl { private UICanvas _canvas; private Vector2 _mousePosition; /// /// Gets the owning canvas. /// public UICanvas Canvas => _canvas; /// /// Gets a value indicating whether canvas is 2D (screen-space). /// public bool Is2D => _canvas.RenderMode == CanvasRenderMode.ScreenSpace; /// /// Gets a value indicating whether canvas is 3D (world-space or camera-space). /// public bool Is3D => _canvas.RenderMode != CanvasRenderMode.ScreenSpace; /// /// Initializes a new instance of the class. /// /// The canvas. internal CanvasRootControl(UICanvas canvas) { _canvas = canvas; } /// public override CursorType Cursor { get => CursorType.Default; set { } } /// public override Control FocusedControl { get => Parent?.Root.FocusedControl; set { if (Parent != null) Parent.Root.FocusedControl = value; } } /// public override Vector2 TrackingMouseOffset => Vector2.Zero; /// public override Vector2 MousePosition { get => _mousePosition; set { } } /// public override void StartTrackingMouse(Control control, bool useMouseScreenOffset) { // Not used in games (editor-only feature) } /// public override void EndTrackingMouse() { // Not used in games (editor-only feature) } /// public override bool GetKey(KeyboardKeys key) { return Input.GetKey(key); } /// public override bool GetKeyDown(KeyboardKeys key) { return Input.GetKeyDown(key); } /// public override bool GetKeyUp(KeyboardKeys key) { return Input.GetKeyUp(key); } /// public override bool GetMouseButton(MouseButton button) { return Input.GetMouseButton(button); } /// public override bool GetMouseButtonDown(MouseButton button) { return Input.GetMouseButtonDown(button); } /// public override bool GetMouseButtonUp(MouseButton button) { return Input.GetMouseButtonUp(button); } /// public override Vector2 PointToParent(ref Vector2 location) { if (Is2D) return base.PointToParent(ref location); var camera = Camera.MainCamera; if (!camera) return location; // Transform canvas local-space point to the game root location Matrix world; _canvas.GetWorldMatrix(out world); Vector3 locationWorldSpace; Vector3 locationCanvasSpace = new Vector3(location, 0.0f); Vector3.Transform(ref locationCanvasSpace, ref world, out locationWorldSpace); camera.ProjectPoint(locationWorldSpace, out location); return location; } /// public override bool ContainsPoint(ref Vector2 location) { return base.ContainsPoint(ref location) && (_canvas.TestCanvasIntersection == null || _canvas.TestCanvasIntersection(ref location)); } /// public override bool OnCharInput(char c) { if (!_canvas.ReceivesEvents) return false; return base.OnCharInput(c); } /// public override DragDropEffect OnDragDrop(ref Vector2 location, DragData data) { if (!_canvas.ReceivesEvents) return DragDropEffect.None; return base.OnDragDrop(ref location, data); } /// public override DragDropEffect OnDragEnter(ref Vector2 location, DragData data) { if (!_canvas.ReceivesEvents) return DragDropEffect.None; return base.OnDragEnter(ref location, data); } /// public override void OnDragLeave() { if (!_canvas.ReceivesEvents) return; base.OnDragLeave(); } /// public override DragDropEffect OnDragMove(ref Vector2 location, DragData data) { if (!_canvas.ReceivesEvents) return DragDropEffect.None; return base.OnDragMove(ref location, data); } /// public override bool OnKeyDown(KeyboardKeys key) { if (!_canvas.ReceivesEvents) return false; return base.OnKeyDown(key); } /// public override void OnKeyUp(KeyboardKeys key) { if (!_canvas.ReceivesEvents) return; base.OnKeyUp(key); } /// public override bool OnMouseDoubleClick(Vector2 location, MouseButton button) { if (!_canvas.ReceivesEvents) return false; return base.OnMouseDoubleClick(location, button); } /// public override bool OnMouseDown(Vector2 location, MouseButton button) { if (!_canvas.ReceivesEvents) return false; return base.OnMouseDown(location, button); } /// public override void OnMouseEnter(Vector2 location) { if (!_canvas.ReceivesEvents) return; _mousePosition = location; base.OnMouseEnter(location); } /// public override void OnMouseLeave() { _mousePosition = Vector2.Zero; if (!_canvas.ReceivesEvents) return; base.OnMouseLeave(); } /// public override void OnMouseMove(Vector2 location) { if (!_canvas.ReceivesEvents) return; _mousePosition = location; base.OnMouseMove(location); } /// public override bool OnMouseUp(Vector2 location, MouseButton button) { if (!_canvas.ReceivesEvents) return false; return base.OnMouseUp(location, button); } /// public override bool OnMouseWheel(Vector2 location, float delta) { if (!_canvas.ReceivesEvents) return false; return base.OnMouseWheel(location, delta); } /// public override void OnTouchEnter(Vector2 location, int pointerId) { if (!_canvas.ReceivesEvents) return; base.OnTouchEnter(location, pointerId); } /// public override bool OnTouchDown(Vector2 location, int pointerId) { if (!_canvas.ReceivesEvents) return false; return base.OnTouchDown(location, pointerId); } /// public override void OnTouchMove(Vector2 location, int pointerId) { if (!_canvas.ReceivesEvents) return; base.OnTouchMove(location, pointerId); } /// public override bool OnTouchUp(Vector2 location, int pointerId) { if (!_canvas.ReceivesEvents) return false; return base.OnTouchUp(location, pointerId); } /// public override void OnTouchLeave(int pointerId) { if (!_canvas.ReceivesEvents) return; base.OnTouchLeave(pointerId); } /// public override void Focus() { } /// public override void DoDragDrop(DragData data) { } } }