/// <summary>
        /// Sets the active mode.
        /// </summary>
        /// <param name="mode">The mode.</param>
        public void SetActiveMode(EditorGizmoMode mode)
        {
            if (mode == _activeMode)
            {
                return;
            }
            if (mode != null)
            {
                if (!_modes.Contains(mode))
                {
                    throw new ArgumentException("Not added.");
                }
                if (mode.Viewport != this)
                {
                    throw new ArgumentException("Not added to this viewport.");
                }
            }

            _activeMode?.OnDeactivated();

            Gizmos.Active = null;
            _activeMode   = mode;

            _activeMode?.OnActivated();

            ActiveModeChanged?.Invoke(mode);
        }
 private void DisposeModes()
 {
     // Cleanup
     _activeMode = null;
     for (int i = 0; i < _modes.Count; i++)
     {
         _modes[i].Dispose();
     }
     _modes.Clear();
 }
        private void InitModes()
        {
            // Add default modes used by the editor
            _modes.Add(new TransformGizmoMode());
            _modes.Add(SculptTerrainGizmo = new Tools.Terrain.SculptTerrainGizmoMode());
            _modes.Add(PaintTerrainGizmo  = new Tools.Terrain.PaintTerrainGizmoMode());
            _modes.Add(EditTerrainGizmo   = new Tools.Terrain.EditTerrainGizmoMode());
            for (int i = 0; i < _modes.Count; i++)
            {
                _modes[i].Init(this);
            }

            // Activate transform mode first
            _activeMode = _modes[0];
        }
        /// <summary>
        /// Adds the mode to the viewport.
        /// </summary>
        /// <param name="mode">The mode.</param>
        public void AddMode(EditorGizmoMode mode)
        {
            if (mode == null)
            {
                throw new ArgumentNullException(nameof(mode));
            }
            if (_modes.Contains(mode))
            {
                throw new ArgumentException("Already added.");
            }
            if (mode.Viewport != null)
            {
                throw new ArgumentException("Already added to other viewport.");
            }

            _modes.Add(mode);
        }
        /// <summary>
        /// Removes the mode from the viewport.
        /// </summary>
        /// <param name="mode">The mode.</param>
        public void RemoveMode(EditorGizmoMode mode)
        {
            if (mode == null)
            {
                throw new ArgumentNullException(nameof(mode));
            }
            if (!_modes.Contains(mode))
            {
                throw new ArgumentException("Not added.");
            }
            if (mode.Viewport != this)
            {
                throw new ArgumentException("Not added to this viewport.");
            }

            if (_activeMode == mode)
            {
                SetActiveMode(null);
            }

            _modes.Remove(mode);
        }