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); } } }
/// <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(); } } }