public static void SizeSceneGUI(SizePositionCategory category, IPlatformLayer layer, ISizeData roomSize)
        {
            if (category == SizePositionCategory.None)
            {
                return;
            }
            var             bounds = GetBounds(layer);
            var             button = DrawSizePositionHandles(category, bounds);
            SizePositionMod mod    = default;

            SizeToolsButtonToData(category, button, ref mod);
            ApplySizeTool(layer, layer, roomSize, mod);
        }
 static void SizeToolsRoomOptionGUI(ref SizePositionMod mod)
 {
     using (new GUILayout.HorizontalScope())
     {
         mod.AffectRoom = ActivityButton(m_sizeToolsAffectRoom, "Room") || m_sizeToolsAffectRoom;
         if (ActivityButton(!m_sizeToolsAffectRoom, "Level"))
         {
             mod.AffectRoom = false;
         }
         if (mod.AffectRoom == m_sizeToolsAffectRoom)
         {
             return;
         }
         m_sizeToolsAffectRoom = mod.AffectRoom;
         EditorPrefs.SetBool(k_editorPrefSizeToolsAffectRoom, m_sizeToolsAffectRoom);
     }
 }
        static void ApplySizeTool(IPlatformLayerSpatialData platform, IPlatformLayerTiles tiles, ISizeData roomSize,
                                  SizePositionMod mod)
        {
            if (mod.SpecialCase)
            {
                mod.TileModifier = (mod.PosModifier * -1);
            }

            var sizeModifier   = mod.SizeModifier;
            var offsetModifier = mod.PosModifier;
            var tileModifier   = mod.TileModifier;

            var newSize = platform.TileDim + sizeModifier;
            var newPos  = platform.Position + offsetModifier;

            // level cannot begin before room begins, shrink size, add offset
            if (newPos.x < 0)
            {
                tileModifier += Vector2Int.right * newPos.x;
                newSize       = new Vector2Int(Mathf.Max(0, newSize.x + newPos.x), newSize.y);
                newPos        = new Vector2Int(0, newPos.y);
            }
            if (newPos.y < 0)
            {
                tileModifier += Vector2Int.up * newPos.y;
                newSize       = new Vector2Int(newSize.x, Mathf.Max(0, newSize.y + newPos.y));
                newPos        = new Vector2Int(newPos.x, 0);
            }

            if (ApplySizeTool_CheckLevelOutsideOfRoom(platform, tiles, roomSize, newPos, newSize, out var roomTileDim))
            {
                return;
            }

            CutIfOverflowing(newPos, ref newSize, roomTileDim);

            var newTiles = new ushort[newSize.x * newSize.y];

            //var newTiles = new PlatformLayerTilesArray() { Tiles_ = new PlatformLayerTilesBufferElement[newSize.x * newSize.y] };
            ApplySizeTool(platform, tiles, newSize, tileModifier, newTiles);
            platform.Position = newPos;
            platform.Size     = newSize - new Vector2Int(1, 1);
            tiles.SetTiles(newTiles);

            SceneView.RepaintAll();
        }
        // ReSharper disable once FlagArgument
        static ChangeCheck SizeToolsGUI(AnimBool showTools, out SizePositionMod mod, bool roomOption)
        {
            mod.SizeModifier = Vector2Int.zero;
            mod.PosModifier  = Vector2Int.zero;
            mod.TileModifier = Vector2Int.zero;
            mod.SpecialCase  = false;
            mod.AffectRoom   = false;

            using (new GUILayout.VerticalScope(EditorStyles.helpBox, GUILayout.Width(Screen.width - 122)))
            {
                var show = EditorGUILayout.Foldout(showTools.target, "Size/Position Tools", true, MiniFoldoutStyle);
                if (show != showTools.target)
                {
                    showTools.target = show;
                    EditorPrefs.SetBool(k_editorPrefShowSizeTools, showTools.target);
                }

                using (var fade = new EditorGUILayout.FadeGroupScope(showTools.faded))
                {
                    if (fade.visible)
                    {
                        if (roomOption)
                        {
                            SizeToolsRoomOptionGUI(ref mod);
                        }

                        SizeToolsInnerGUI(out var cat, out var button);
                        SizeToolsButtonToData(cat, button, ref mod);
                    }
                }
            }

            if (Equals(Vector2Int.zero, mod.PosModifier) && (Equals(Vector2Int.zero, mod.SizeModifier)) && (Equals(Vector2Int.zero, mod.TileModifier)))
            {
                return(ChangeCheck.NotChanged);
            }
            return(ChangeCheck.Changed);
        }
        static void SizeToolsButtonToData(SizePositionCategory cat, SizePositionButton button, ref SizePositionMod mod)
        {
            switch (cat)
            {
            case SizePositionCategory.Size: switch (button)
                {
                case SizePositionButton.SizeTopUp:
                    mod.SizeModifier = Vector2Int.up;
                    break;

                case SizePositionButton.SizeTopDown:
                    mod.SizeModifier = Vector2Int.down;
                    break;

                case SizePositionButton.SizeLeftEdgeRight:
                    mod.SizeModifier = Vector2Int.left;
                    mod.PosModifier  = Vector2Int.right;
                    mod.SpecialCase  = true;
                    break;

                case SizePositionButton.SizeLeftEdgeLeft:
                    mod.SizeModifier = Vector2Int.right;
                    mod.PosModifier  = Vector2Int.left;
                    mod.SpecialCase  = true;
                    break;

                case SizePositionButton.SizeRightEdgeRight:
                    mod.SizeModifier = Vector2Int.right;
                    break;

                case SizePositionButton.SizeRightEdgeLeft:
                    mod.SizeModifier = Vector2Int.left;
                    break;

                case SizePositionButton.SizeBottomDown:
                    mod.SizeModifier = Vector2Int.up;
                    mod.PosModifier  = Vector2Int.down;
                    mod.SpecialCase  = true;
                    break;

                case SizePositionButton.SizeBottomUp:
                    mod.SizeModifier = Vector2Int.down;
                    mod.PosModifier  = Vector2Int.up;
                    mod.SpecialCase  = true;
                    break;
                }
                break;

            case SizePositionCategory.Position: switch (button)
                {
                case SizePositionButton.Left: mod.PosModifier = Vector2Int.left; break;

                case SizePositionButton.Up: mod.PosModifier = Vector2Int.up; break;

                case SizePositionButton.Down: mod.PosModifier = Vector2Int.down; break;

                case SizePositionButton.Right: mod.PosModifier = Vector2Int.right; break;
                }
                break;

            case SizePositionCategory.Tiles: switch (button)
                {
                case SizePositionButton.Left: mod.TileModifier = Vector2Int.left; break;

                case SizePositionButton.Up: mod.TileModifier = Vector2Int.up; break;

                case SizePositionButton.Down: mod.TileModifier = Vector2Int.down; break;

                case SizePositionButton.Right: mod.TileModifier = Vector2Int.right; break;
                }
                break;
            }
        }