public void Update(GameTime gameTime) { GuiHelper.CurrentIMGUI = _ui; _ui.UpdateAll(gameTime); if (Triggers.RectDrag.Pressed(false)) { _ui.GrabFocus(null); } Sidebar.Put(isLeftSide: true); string gridSizeString = $"{_gridSize}"; string gridLockString = $"{(_gridLock ? 1 : 0)}"; Label.Put(""); Label.Put("Lock Grid"); Textbox.Put(ref gridLockString); if (Int32.TryParse(gridLockString, out int newGridLock)) { _gridLock = newGridLock == 0 ? false : true; } Label.Put("Grid Size"); if (_gridLock) { Label.Put(gridSizeString); } else { Textbox.Put(ref gridSizeString); if (float.TryParse(gridSizeString, out float newGridSize)) { _gridSize = newGridSize; _gridWorld = _gridSize * Camera.ScreenToWorldScale; _adaptiveGrid = MathF.Max(GetAdaptiveGrid(_gridSize, _gridWorld), _gridSize); } } Label.Put("Adaptive Size"); Label.Put($"{_adaptiveGrid}"); Label.Put("Focal length"); string fl = $"{Camera.FocalLength}"; Textbox.Put(ref fl); if (float.TryParse(fl, out float focalLength)) { var temp = Camera.Z / Camera.FocalLength; Camera.FocalLength = focalLength; Camera.Z = focalLength * temp; } Sidebar.Pop(); bool addModifier = false; bool removeModifier = false; bool skipEditModifier = false; if (!_edit.IsDragged) { addModifier = Triggers.AddModifier.Held(); removeModifier = Triggers.RemoveModifier.Held(); skipEditModifier = Triggers.SkipEditModifier.Held(); } Camera.UpdateInput(); Camera.Update(); if (Triggers.Redo.Pressed()) { _historyHandler.Redo(); ComputedSelectionBounds(); } if (Triggers.Undo.Pressed()) { _historyHandler.Undo(); ComputedSelectionBounds(); } bool isEditDone = false; if (!addModifier && !removeModifier && !skipEditModifier) { if (Triggers.AlignToGrid.Held()) { isEditDone = _edit.UpdateInput(Camera.MouseWorld, false, grid: new Vector2(_adaptiveGrid)); } else { isEditDone = _edit.UpdateInput(Camera.MouseWorld, false); } } var isSelectionDone = _selection.UpdateInput(Camera.MouseWorld); ApplyEdit(isEditDone); SingleHover(); if (Triggers.Create.Pressed()) { Create(); isSelectionDone = true; } if (Triggers.CreateStuff.Pressed()) { CreateStuff(); isSelectionDone = true; } if (Triggers.Paste.Pressed()) { Paste(Camera.MouseWorld); isSelectionDone = true; } if (isSelectionDone) { ApplySelection(addModifier, removeModifier); } if (Triggers.ResetOrder.Pressed()) { ResetOrder(); } if (Triggers.ResetResize.Pressed()) { ResetResize(); } if (Triggers.Remove.Pressed()) { Remove(); } if (Triggers.Cut.Pressed()) { Cut(); } if (Triggers.Copy.Pressed()) { Copy(); } if (Triggers.ToggleLilypads.Pressed()) { _activeLayers ^= World.LayerType.Lilypads; } if (Triggers.ToggleWoods.Pressed()) { _activeLayers ^= World.LayerType.Woods; } if (Triggers.ToggleClouds.Pressed()) { _activeLayers ^= World.LayerType.Clouds; } _pathEditor.UpdateInput(); }
protected override void Update(GameTime gameTime) { // TODO: Start creating an API over the entity quadtree dictionary, etc. For addition, removal, updates. InputHelper.UpdateSetup(); _fps.Update(gameTime.ElapsedGameTime.TotalMilliseconds); Assets.Brown.Parameters["time"].SetValue((float)gameTime.TotalGameTime.TotalMilliseconds * 0.0001f); if (Triggers.Quit.Pressed()) { Exit(); } if (Triggers.ResetSolution.Pressed()) { _isInitialSeed = true; } if (Triggers.StartNewSeed.Pressed()) { _startNewSeed = true; } if (Triggers.Draw.Held()) { _startNewSeed = true; } if (Triggers.ResetDroppedFrames.Pressed()) { _fps.DroppedFrames = 0; } bool shiftModifier = Triggers.AddToSelection.Held(); bool ctrlModifier = Triggers.RemoveFromSelection.Held(); if (Triggers.Redo.Pressed()) { Utility.ClearQuadtree(_selectedEntities); _historyHandler.Redo(); _edit.Rect = null; } if (Triggers.Undo.Pressed()) { Utility.ClearQuadtree(_selectedEntities); _historyHandler.Undo(); _edit.Rect = null; } Camera.UpdateInput(); bool isEditDone = false; if (!shiftModifier && !ctrlModifier && !Triggers.SkipEdit.Held()) { isEditDone = _edit.UpdateInput(Camera.MouseWorld, false); } var isSelectionDone = _selection.UpdateInput(Camera.MouseWorld); _hoveredEntity = null; if (_selection.Rect == null) { // Do a single element hover bool addSelected = false; if (_selectedEntities.Count() == 1) { var bounds = _selectedEntities.First().Bounds; addSelected = !bounds.Contains(Camera.MouseWorld) && Utility.ExpandRect(new RectangleF(bounds.X, bounds.Y, bounds.Width, bounds.Height), _edit.HandleDistanceWorld).Contains(Camera.MouseWorld); } IOrderedEnumerable <Entity> hoverUnderMouse; IOrderedEnumerable <Entity> selectedAndHovered; if (addSelected) { hoverUnderMouse = _quadtree.Query(Camera.MouseWorld).Append(_selectedEntities.First()).OrderBy(e => e); selectedAndHovered = _selectedEntities.Query(Camera.MouseWorld).Append(_selectedEntities.First()).OrderBy(e => e); } else { hoverUnderMouse = _quadtree.Query(Camera.MouseWorld).OrderBy(e => e); selectedAndHovered = _selectedEntities.Query(Camera.MouseWorld).OrderBy(e => e); } var hoverCount = hoverUnderMouse.Count(); int cycleReset = 0; if (selectedAndHovered.Count() > 0) { cycleReset = hoverCount - 1 - hoverUnderMouse.ToList().IndexOf(selectedAndHovered.Last()); if (_cycleMouse == null) { _cycleIndex = cycleReset; } } if (_cycleMouse != null && Vector2.DistanceSquared(_cycleMouse.Value, Camera.MouseWorld) > Utility.ScreenArea(10)) { _cycleIndex = cycleReset; _cycleMouse = null; } int scrollDelta = InputHelper.NewMouse.ScrollWheelValue - InputHelper.OldMouse.ScrollWheelValue; if (scrollDelta != 0 && Triggers.SelectionCycle.Held()) { _cycleIndex += MathF.Sign(scrollDelta); _cycleMouse = Camera.MouseWorld; } if (hoverCount > 0) { _hoveredEntity = hoverUnderMouse.ElementAt(Utility.Mod(hoverCount - 1 - _cycleIndex, hoverCount)); } } if (Triggers.RemoveEntity.Pressed()) { _edit.Rect = null; _hoveredEntity = null; var all = _selectedEntities.ToArray(); _historyHandler.AutoCommit = false; foreach (var e in all) { HistoryRemoveEntity(e.Id, new RectangleF(e.Bounds.XY, e.Bounds.Size), e.SortOrder); _selectedEntities.Remove(e); } _historyHandler.Commit(); _historyHandler.AutoCommit = true; } if (Triggers.CreateEntity.Pressed()) { _hoveredEntity = null; HistoryCreateEntity(GetNextId(), new RectangleF(Camera.MouseWorld, new Vector2(100, 100)), GetNextSortOrder()); isSelectionDone = true; } if (Triggers.SpawnStuff.Pressed()) { _hoveredEntity = null; Random r = new Random(); _historyHandler.AutoCommit = false; for (int i = 0; i < 10000; i++) { var screenBounds = Camera.WorldBounds; var origin = Camera.Origin; float minX = screenBounds.Left; float maxX = screenBounds.Right; float minY = screenBounds.Top; float maxY = screenBounds.Bottom; HistoryCreateEntity(GetNextId(), new RectangleF(new Vector2(r.NextSingle(minX, maxX), r.NextSingle(minY, maxY)) - origin, new Vector2(r.NextSingle(50, 200), r.NextSingle(50, 200))), GetNextSortOrder()); } _historyHandler.Commit(); _historyHandler.AutoCommit = true; isSelectionDone = true; } if (isSelectionDone) { if (!shiftModifier && !ctrlModifier) { Utility.ClearQuadtree(_selectedEntities); } if (ctrlModifier && _selection.Rect != null) { foreach (var e in GetHovers()) { _selectedEntities.Remove(e); } } else { foreach (var e in GetHovers()) { if (!_selectedEntities.Contains(e)) { _selectedEntities.Add(e); } } } if (_selectedEntities.Count() >= 1) { using (IEnumerator <Entity> e = _selectedEntities.GetEnumerator()) { e.MoveNext(); var first = e.Current; var pos1 = first.Bounds.XY; float x1 = first.Bounds.X; float x2 = first.Bounds.X + first.Bounds.Width; float y1 = first.Bounds.Y; float y2 = first.Bounds.Y + first.Bounds.Height; while (e.MoveNext()) { var current = e.Current; x1 = MathF.Min(current.Bounds.X, x1); x2 = MathF.Max(current.Bounds.X + current.Bounds.Width, x2); y1 = MathF.Min(current.Bounds.Y, y1); y2 = MathF.Max(current.Bounds.Y + current.Bounds.Height, y2); var pos2 = current.Bounds.XY; current.Offset = pos2 - pos1; } _edit.IsResizable = _selectedEntities.Count() == 1; _editRectStartXY = new Vector2(x1, y1); _editRectStartSize = new Vector2(x2 - x1, y2 - y1); _edit.Rect = new RectangleF(_editRectStartXY, _editRectStartSize); first.Offset = pos1 - _editRectStartXY; } } else { _edit.Rect = null; } _selection.Rect = null; } if (_edit.Rect != null && !isEditDone && (_editRectStartXY != (Vector2)_edit.Rect.Value.Position || _editRectStartSize != (Vector2)_edit.Rect.Value.Size)) { using (IEnumerator <Entity> e = _selectedEntities.GetEnumerator()) { e.MoveNext(); var first = e.Current; var bound = first.Bounds; bound.XY = first.Offset + _edit.Rect.Value.Position; first.Bounds = bound; while (e.MoveNext()) { var current = e.Current; bound = current.Bounds; bound.XY = current.Offset + first.Bounds.XY; current.Bounds = bound; _quadtree.Update(current); _selectedEntities.Update(current); } if (_selectedEntities.Count() == 1) { bound.Size = _edit.Rect.Value.Size; first.Bounds = bound; } _quadtree.Update(first); _selectedEntities.Update(first); } } if (_edit.Rect != null && isEditDone && (_editRectStartXY != (Vector2)_edit.Rect.Value.Position || _editRectStartSize != (Vector2)_edit.Rect.Value.Size)) { using (IEnumerator <Entity> e = _selectedEntities.GetEnumerator()) { _historyHandler.AutoCommit = false; e.MoveNext(); var first = e.Current; Vector2 oldFirstStart = first.Offset + _editRectStartXY; Vector2 newFirstSTart = first.Offset + _edit.Rect.Value.Position; HistoryMoveEntity(first.Id, oldFirstStart, newFirstSTart); while (e.MoveNext()) { var current = e.Current; HistoryMoveEntity(current.Id, current.Offset + oldFirstStart, current.Offset + newFirstSTart); } if (_selectedEntities.Count() == 1) { HistoryResizeEntity(first.Id, _editRectStartSize, _edit.Rect.Value.Size); } _historyHandler.Commit(); _historyHandler.AutoCommit = true; _editRectStartXY = _edit.Rect.Value.Position; _editRectStartSize = _edit.Rect.Value.Size; } } InputHelper.UpdateCleanup(); base.Update(gameTime); }