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 SizePositionButton DrawSizePositionHandles(SizePositionCategory category, Bounds bounds) { var minX = bounds.min.x; var maxX = bounds.max.x; var minZ = bounds.min.z; var maxZ = bounds.max.z; var c = bounds.center; var isSizeTool = category == SizePositionCategory.Size; var size = 1.5f; var pickSize = 2f; var offset = isSizeTool ? 5f : 2f; var l = new Vector3(minX - offset, c.y, c.z); var r = new Vector3(maxX + offset, c.y, c.z); var t = new Vector3(c.x, c.y, maxZ + offset); var b = new Vector3(c.x, c.y, minZ - offset); var button = SizePositionButton.None; using (new ColorScope(Color.magenta)) if (Handles.Button(l, Quaternion.Euler(0f, -90f, 0f), size, pickSize, Handles.ConeHandleCap)) { button = SizePositionButton.Left; } using (new ColorScope(Color.red)) if (Handles.Button(r, Quaternion.Euler(0f, 90f, 0f), size, pickSize, Handles.ConeHandleCap)) { button = SizePositionButton.Right; } using (new ColorScope(Color.blue)) if (Handles.Button(t, Quaternion.Euler(0f, 0f, 0f), size, pickSize, Handles.ConeHandleCap)) { button = SizePositionButton.Up; } using (new ColorScope(Color.cyan)) if (Handles.Button(b, Quaternion.Euler(0f, 180f, 0f), size, pickSize, Handles.ConeHandleCap)) { button = SizePositionButton.Down; } if (!isSizeTool) { return(button); } offset = 2f; l = new Vector3(minX - offset, c.y, c.z); r = new Vector3(maxX + offset, c.y, c.z); t = new Vector3(c.x, c.y, maxZ + offset); b = new Vector3(c.x, c.y, minZ - offset); using (new ColorScope(Color.magenta)) if (Handles.Button(r, Quaternion.Euler(0f, -90f, 0f), size, pickSize, Handles.ConeHandleCap)) { button = SizePositionButton.SizeRightEdgeLeft; } using (new ColorScope(Color.red)) if (Handles.Button(l, Quaternion.Euler(0f, 90f, 0f), size, pickSize, Handles.ConeHandleCap)) { button = SizePositionButton.SizeLeftEdgeRight; } using (new ColorScope(Color.blue)) if (Handles.Button(b, Quaternion.Euler(0f, 0f, 0f), size, pickSize, Handles.ConeHandleCap)) { button = SizePositionButton.SizeBottomUp; } using (new ColorScope(Color.cyan)) if (Handles.Button(t, Quaternion.Euler(0f, 180f, 0f), size, pickSize, Handles.ConeHandleCap)) { button = SizePositionButton.SizeTopDown; } return(button); }
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; } }
public static void SizeToolsCategoryGUI(ref SizePositionCategory cat) => cat = (SizePositionCategory)EditorGUILayout.EnumPopup("Size/Position: ", cat);
// ReSharper disable once MethodTooLong static SizePositionButton SizeToolsInnerGUI(out SizePositionCategory cat, out SizePositionButton button) { cat = SizePositionCategory.None; button = SizePositionButton.None; using (new GUILayout.HorizontalScope()) { using (new GUILayout.VerticalScope()) { using (new GUILayout.HorizontalScope()) { GUILayout.Space(57); if (GUILayout.Button("^", GUILayout.Width(20))) { cat = SizePositionCategory.Size; button = SizePositionButton.SizeTopUp; } } using (new GUILayout.HorizontalScope()) { GUILayout.Space(57); if (GUILayout.Button("v", GUILayout.Width(20))) { cat = SizePositionCategory.Size; button = SizePositionButton.SizeTopDown; } } using (new GUILayout.HorizontalScope()) { if (GUILayout.Button("<", GUILayout.Width(20))) { cat = SizePositionCategory.Size; button = SizePositionButton.SizeLeftEdgeLeft; } if (GUILayout.Button(">", GUILayout.Width(20))) { cat = SizePositionCategory.Size; button = SizePositionButton.SizeLeftEdgeRight; } GUILayout.Label("Size", GUILayout.Width(30)); if (GUILayout.Button("<", GUILayout.Width(20))) { cat = SizePositionCategory.Size; button = SizePositionButton.SizeRightEdgeLeft; } if (GUILayout.Button(">", GUILayout.Width(20))) { cat = SizePositionCategory.Size; button = SizePositionButton.SizeRightEdgeRight; } } using (new GUILayout.HorizontalScope()) { GUILayout.Space(57); if (GUILayout.Button("^", GUILayout.Width(20))) { cat = SizePositionCategory.Size; button = SizePositionButton.SizeBottomUp; } } using (new GUILayout.HorizontalScope()) { GUILayout.Space(57); if (GUILayout.Button("v", GUILayout.Width(20))) { cat = SizePositionCategory.Size; button = SizePositionButton.SizeBottomDown; } } } //GUILayout.Space(100); using (new GUILayout.VerticalScope()) { GUILayout.Space(14); using (new GUILayout.HorizontalScope()) { GUILayout.Space(42); if (GUILayout.Button("^", GUILayout.Width(20))) { cat = SizePositionCategory.Position; button = SizePositionButton.Up; } } GUILayout.Space(10); using (new GUILayout.HorizontalScope()) { if (GUILayout.Button("<", GUILayout.Width(20))) { cat = SizePositionCategory.Position; button = SizePositionButton.Left; } GUILayout.Label("Position", GUILayout.Width(50)); if (GUILayout.Button(">", GUILayout.Width(20))) { cat = SizePositionCategory.Position; button = SizePositionButton.Right; } } GUILayout.Space(10); using (new GUILayout.HorizontalScope()) { GUILayout.Space(42); if (GUILayout.Button("v", GUILayout.Width(20))) { cat = SizePositionCategory.Position; button = SizePositionButton.Down; } } } using (new GUILayout.VerticalScope()) { GUILayout.Space(14); using (new GUILayout.HorizontalScope()) { GUILayout.Space(42); if (GUILayout.Button("^", GUILayout.Width(20))) { cat = SizePositionCategory.Tiles; button = SizePositionButton.Up; } } GUILayout.Space(10); using (new GUILayout.HorizontalScope()) { if (GUILayout.Button("<", GUILayout.Width(20))) { cat = SizePositionCategory.Tiles; button = SizePositionButton.Left; } GUILayout.Label(" Tiles", GUILayout.Width(50)); if (GUILayout.Button(">", GUILayout.Width(20))) { cat = SizePositionCategory.Tiles; button = SizePositionButton.Right; } } GUILayout.Space(10); using (new GUILayout.HorizontalScope()) { GUILayout.Space(42); if (GUILayout.Button("v", GUILayout.Width(20))) { cat = SizePositionCategory.Tiles; button = SizePositionButton.Down; } } } } GUILayout.Space(10); return(button); }