Exemplo n.º 1
0
        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();
        }
Exemplo n.º 2
0
        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);
        }