private void HandleDeleteDoors()
        {
            var doors      = target as Doors;
            var gameObject = doors.transform.gameObject;
            var e          = Event.current;

            var tilePosition = GetCurrentTilePosition();

            // Make sure that the current active object in the inspector is not deselected
            Selection.activeGameObject = gameObject;
            var controlId = GUIUtility.GetControlID(FocusType.Passive);

            HandleUtility.AddDefaultControl(controlId);

            if (e.type == EventType.MouseUp)
            {
                for (int i = doors.DoorsList.Count - 1; i >= 0; i--)
                {
                    var door           = doors.DoorsList[i];
                    var orthogonalLine = new OrthogonalLine(door.From.RoundToUnityIntVector3(), door.To.RoundToUnityIntVector3());

                    if (orthogonalLine.Contains(tilePosition) != -1)
                    {
                        Undo.RecordObject(target, "Deleted door position");
                        doors.DoorsList.RemoveAt(i);
                        EditorUtility.SetDirty(target);
                    }
                }

                Event.current.Use();
            }
        }
        protected override void RemoveDoor(Vector3Int position)
        {
            for (int i = doors.HybridDoorModeData.DoorLines.Count - 1; i >= 0; i--)
            {
                var door           = doors.HybridDoorModeData.DoorLines[i];
                var orthogonalLine = new OrthogonalLine(door.From, door.To);

                if (orthogonalLine.Contains(position) != -1)
                {
                    Undo.RecordObject(doors, "Deleted door position");
                    doors.HybridDoorModeData.DoorLines.RemoveAt(i);
                    EditorUtility.SetDirty(doors);
                }
            }
        }
        protected override void RemoveDoor(Vector3Int position)
        {
            for (int i = doors.ManualDoorModeData.DoorsList.Count - 1; i >= 0; i--)
            {
                var door           = doors.ManualDoorModeData.DoorsList[i];
                var orthogonalLine = new OrthogonalLine(door.From.RoundToUnityIntVector3(), door.To.RoundToUnityIntVector3());

                if (orthogonalLine.Contains(position) != -1)
                {
                    Undo.RecordObject(doors, "Deleted door position");
                    doors.ManualDoorModeData.DoorsList.RemoveAt(i);
                    EditorUtility.SetDirty(doors);
                }
            }
        }
Esempio n. 4
0
        /// <summary>
        /// Merges two lists of events.
        /// </summary>
        /// <param name="events1"></param>
        /// <param name="events2"></param>
        /// <param name="line"></param>
        /// <returns></returns>
        protected List <Tuple <IntVector2, bool> > MergeEvents(List <Tuple <IntVector2, bool> > events1, List <Tuple <IntVector2, bool> > events2, OrthogonalLine line)
        {
            if (events1.Count == 0)
            {
                return(events2);
            }

            if (events2.Count == 0)
            {
                return(events1);
            }

            var merged = new List <Tuple <IntVector2, bool> >();

            var counter1 = 0;
            var counter2 = 0;

            var lastOverlap = false;
            var overlap1    = false;
            var overlap2    = false;

            // Run the main loop while both lists still have elements
            while (counter1 < events1.Count && counter2 < events2.Count)
            {
                var pair1 = events1[counter1];
                var pos1  = line.Contains(pair1.Item1);

                var pair2 = events2[counter2];
                var pos2  = line.Contains(pair2.Item1);

                if (pos1 <= pos2)
                {
                    overlap1 = pair1.Item2;
                    counter1++;
                }

                if (pos1 >= pos2)
                {
                    overlap2 = pair2.Item2;
                    counter2++;
                }

                var overlap = overlap1 || overlap2;

                if (overlap != lastOverlap)
                {
                    if (pos1 < pos2)
                    {
                        merged.Add(Tuple.Create(pair1.Item1, overlap));
                    }
                    else
                    {
                        merged.Add(Tuple.Create(pair2.Item1, overlap));
                    }
                }

                lastOverlap = overlap;
            }

            // Add remaining elements from the first list
            if (events2.Last().Item2 != true)
            {
                while (counter1 < events1.Count)
                {
                    var pair = events1[counter1];

                    if (merged.Last().Item2 != pair.Item2)
                    {
                        merged.Add(pair);
                    }

                    counter1++;
                }
            }

            // Add remaining elements from the second list
            if (events1.Last().Item2 != true)
            {
                while (counter2 < events2.Count)
                {
                    var pair = events2[counter2];

                    if (merged.Last().Item2 != pair.Item2)
                    {
                        merged.Add(pair);
                    }

                    counter2++;
                }
            }

            return(merged);
        }
        private void DrawSpecifPositions()
        {
            var doors = target as Doors;

            foreach (var door in doors.DoorsList)
            {
                DrawOutline(door.From, door.To, Color.red);
            }

            if (highlightInfo != null)
            {
                DrawOutline(highlightInfo.From, highlightInfo.To, Color.yellow);
            }

            if (deleteDoorPositions)
            {
                var go = doors.transform.gameObject;
                var e  = Event.current;

                Selection.activeGameObject = go;

                var mouseWorldPosition = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition).origin;
                mouseWorldPosition  -= doors.transform.position;
                mouseWorldPosition.z = 0;
                mouseWorldPosition.x = (float)Math.Floor(mouseWorldPosition.x);
                mouseWorldPosition.y = (float)Math.Floor(mouseWorldPosition.y);

                var controlId = GUIUtility.GetControlID(FocusType.Passive);
                HandleUtility.AddDefaultControl(controlId);

                if (e.type == EventType.MouseUp)
                {
                    for (int i = doors.DoorsList.Count - 1; i >= 0; i--)
                    {
                        var door           = doors.DoorsList[i];
                        var orthogonalLine = new OrthogonalLine(door.From.RoundToUnityIntVector3(), door.To.RoundToUnityIntVector3());

                        if (orthogonalLine.Contains(mouseWorldPosition.RoundToUnityIntVector3()) != -1)
                        {
                            Undo.RecordObject(target, "Deleted door position");
                            doors.DoorsList.RemoveAt(i);
                            EditorUtility.SetDirty(target);
                        }
                    }

                    Event.current.Use();
                }
            }

            if (addSpecificDoorPositions)
            {
                var go = doors.transform.gameObject;
                var e  = Event.current;

                Selection.activeGameObject = go;

                var mouseWorldPosition = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition).origin;
                mouseWorldPosition  -= doors.transform.position;
                mouseWorldPosition.z = 0;
                mouseWorldPosition.x = (float)Math.Floor(mouseWorldPosition.x);
                mouseWorldPosition.y = (float)Math.Floor(mouseWorldPosition.y);

                var controlId = GUIUtility.GetControlID(FocusType.Passive);
                HandleUtility.AddDefaultControl(controlId);

                switch (e.type)
                {
                case EventType.MouseDown:
                    if (e.button == 0)
                    {
                        firstPoint     = mouseWorldPosition;
                        hasFirstPoint  = true;
                        hasSecondPoint = false;

                        Event.current.Use();
                    }

                    break;

                case EventType.MouseUp:
                    if (e.button == 0)
                    {
                        if (hasFirstPoint)
                        {
                            hasSecondPoint = true;
                        }

                        Event.current.Use();
                    }

                    break;
                }

                if (hasFirstPoint)
                {
                    highlightInfo = null;

                    var from = firstPoint;
                    var to   = mouseWorldPosition;

                    if (from.x != to.x && from.y != to.y)
                    {
                        to.x = from.x;
                    }

                    DrawOutline(from, to, Color.yellow, false);

                    if (hasSecondPoint)
                    {
                        hasFirstPoint  = false;
                        hasSecondPoint = false;

                        var newDoorInfo = new DoorInfoEditor()
                        {
                            From = from,
                            To   = to,
                        };

                        if (!doors.DoorsList.Contains(newDoorInfo))
                        {
                            Undo.RecordObject(target, "Added door position");

                            doors.DoorsList.Add(newDoorInfo);

                            EditorUtility.SetDirty(target);
                        }
                    }

                    SceneView.RepaintAll();
                }
            }
        }