示例#1
0
        private bool UpdateRoomPosition(Vector2 newRoomPos, Room roomReference, bool moveRooms)
        {
            VectorInt2 newRoomPosInt = VectorInt2.FromRounded(newRoomPos);
            VectorInt2 roomMovement  = newRoomPosInt - roomReference.SectorPos;

            if (roomMovement != new VectorInt2())
            {
                if (EditorActions.CheckForLockedRooms(this, _roomsToMove))
                {
                    _roomMouseClicked = null;
                }
                else
                {
                    var delta = new VectorInt3(roomMovement.X, 0, roomMovement.Y);

                    if (roomMovement.X != 0 || roomMovement.Y != 0)
                    {
                        _overallDelta += delta;
                        if (moveRooms)
                        {
                            EditorActions.MoveRooms(delta, _roomsToMove, true);
                            return(true);
                        }
                    }
                }
            }
            return(false);
        }
示例#2
0
        public MoveRoomsUndoInstance(EditorUndoManager parent, List <Room> rooms, VectorInt3 delta) : base(parent, null)
        {
            Delta = -delta;
            Rooms = rooms;
            Rooms.ForEach(room => Sizes.Add(room, room.SectorSize));

            Valid = () => Rooms != null && Rooms.All(room => room != null && room.ExistsInLevel && !room.Locked) &&
                    Rooms.All(room => !Parent.Editor.Level.GetConnectedRooms(room).Except(Rooms).Any()) &&
                    Rooms.All(room => Sizes.ContainsKey(room) && room.SectorSize == Sizes[room]);
            UndoAction   = () => EditorActions.MoveRooms(Delta, Rooms, true);
            RedoInstance = () => new MoveRoomsUndoInstance(Parent, Rooms, Delta);
        }
示例#3
0
 public void MoveRoomRelative(Room room, VectorInt3 pos)
 {
     if (panel3D.Camera.RotationY < Math.PI * (1.0 / 4.0))
     {
         EditorActions.MoveRooms(pos, room.Versions);
     }
     else if (panel3D.Camera.RotationY < Math.PI * (3.0 / 4.0))
     {
         EditorActions.MoveRooms(new VectorInt3(pos.Z, pos.Y, -pos.X), room.Versions); // valid
     }
     else if (panel3D.Camera.RotationY < Math.PI * (5.0 / 4.0))
     {
         EditorActions.MoveRooms(new VectorInt3(-pos.X, pos.Y, -pos.Z), room.Versions); // valid
     }
     else if (panel3D.Camera.RotationY < Math.PI * (7.0 / 4.0))
     {
         EditorActions.MoveRooms(new VectorInt3(-pos.Z, pos.Y, pos.X), room.Versions);
     }
     else
     {
         EditorActions.MoveRooms(pos, room.Versions);
     }
 }
示例#4
0
        public void MouseMove(MouseEventArgs e, Size parentControlSize)
        {
            RectangleF barArea = getBarArea(parentControlSize);

            switch (_selectionMode)
            {
            case SelectionMode.SelectedLimit0:
                _selectedLimit0 = FromVisualY(barArea, e.Y);
                InvalidateParent?.Invoke();
                break;

            case SelectionMode.SelectedLimit1:
                _selectedLimit1 = FromVisualY(barArea, e.Y);
                InvalidateParent?.Invoke();
                break;

            case SelectionMode.SelectedLimitBoth:
                float barHeight = _selectedLimit1 - _selectedLimit0;
                float newBarPos = FromVisualY(barArea, _barMouseOffset + e.Y);
                newBarPos = (float)Math.Max(Math.Min(newBarPos + (double)barHeight, MaxDepth), MinDepth) - barHeight;

                _selectedLimit0 = newBarPos;
                _selectedLimit1 = newBarPos + barHeight;
                InvalidateParent?.Invoke();
                break;

            case SelectionMode.RoomMove:
                float destinationHeight = FromVisualY(barArea, e.Y) - _roomMouseOffset;

                if (_roomsToMove == null)
                {
                    HashSet <Room> roomsToMove = new HashSet <Room>();

                    // If multiple rooms are selected, build a list of rooms to move based on that.
                    // Otherwise, use only room which was clicked before.
                    if (_editor.SelectedRooms.Count > 1)
                    {
                        foreach (var room in _editor.SelectedRooms)
                        {
                            roomsToMove.UnionWith(_editor.Level.GetConnectedRooms(room));
                        }
                    }
                    else
                    {
                        roomsToMove = _editor.Level.GetConnectedRooms(_roomMouseClicked);
                    }


                    if (EditorActions.CheckForLockedRooms(GetParent?.Invoke(), roomsToMove))
                    {
                        _roomsToMove   = null;
                        _selectionMode = SelectionMode.None;
                        break;
                    }
                    _roomsToMove = roomsToMove;
                    InvalidateParent?.Invoke();
                }

                // limit room movement to valid range
                float maxHeight = MaxDepth;
                float minHeight = MinDepth;
                foreach (Room room in _roomsToMove)
                {
                    float roomUpperLimit = MaxDepth - (room.Position.Y - _roomMouseClicked.Position.Y + room.GetHighestCorner());
                    float roomLowerLimit = MinDepth - (room.Position.Y - _roomMouseClicked.Position.Y + room.GetLowestCorner());
                    maxHeight = Math.Min(maxHeight, roomUpperLimit);
                    minHeight = Math.Max(minHeight, roomLowerLimit);
                }

                destinationHeight = Math.Max(Math.Min(destinationHeight, maxHeight), minHeight);
                int delta = (int)(Math.Ceiling(destinationHeight) - _roomMouseClicked.Position.Y);

                // Snapping
                if (!(Control.ModifierKeys.HasFlag(Keys.Alt) || Control.ModifierKeys.HasFlag(Keys.Shift)))
                {
                    HashSet <Room> roomsInGroup = new HashSet <Room>();
                    List <List <RelevantRoom> > roomSequences = groupBuildRoomSequences(Vector2.Zero, _groupMouseClicked);

                    for (int i = 0; i < roomSequences.Count; ++i)
                    {
                        for (int j = 0; j < roomSequences[i].Count; ++j)
                        {
                            roomsInGroup.Add(roomSequences[i][j].Room);
                        }
                    }

                    int highestGroupPoint = _editor.Level.GetHighestRoomGroupPoint(_roomsToMove);
                    int lowestGroupPoint  = _editor.Level.GetLowestRoomGroupPoint(_roomsToMove);

                    Room nearbyRoom = _editor.Level.GetNearbyRoomBelow(_roomsToMove, roomsInGroup, lowestGroupPoint, _snappingMargin);

                    if (nearbyRoom != null)
                    {
                        if (Math.Abs(delta) <= _snappingMargin)
                        {
                            int newDelta = -(lowestGroupPoint - (nearbyRoom.Position.Y + nearbyRoom.GetHighestCorner()));
                            if (newDelta + highestGroupPoint > MaxDepth)
                            {
                                break;     // Do not push room out of bounds
                            }
                            delta = newDelta;
                        }
                        else if (Math.Abs(delta) <= _snappingMargin + 1)
                        {
                            break;     // Noise reduction
                        }
                    }
                    else
                    {
                        nearbyRoom = _editor.Level.GetNearbyRoomAbove(_roomsToMove, roomsInGroup, highestGroupPoint, 5);
                        if (nearbyRoom != null)
                        {
                            if (Math.Abs(delta) <= _snappingMargin)
                            {
                                int newDelta = ((nearbyRoom.Position.Y + nearbyRoom.GetLowestCorner()) - highestGroupPoint);
                                if (newDelta + lowestGroupPoint < MinDepth)
                                {
                                    break;     // Do not push room out of bounds
                                }
                                delta = newDelta;
                            }
                            else if (Math.Abs(delta) <= _snappingMargin + 1)
                            {
                                break;     // Noise reduction
                            }
                        }
                    }
                }

                // do movement
                if (delta != 0)
                {
                    _overallDelta += delta;
                    EditorActions.MoveRooms(new VectorInt3(0, delta, 0), _roomsToMove, true);
                }
                break;
            }
        }