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; } }