using Gley.TrafficSystem.Internal; using Gley.UrbanSystem.Internal; using System.Collections.Generic; using UnityEngine; #if GLEY_PEDESTRIAN_SYSTEM using Gley.PedestrianSystem.Internal; using Gley.PedestrianSystem.Editor; #endif namespace Gley.TrafficSystem.Editor { /// /// Convert editor intersections to play mode intersections. /// public class IntersectionConverter { private IntersectionEditorData _intersectionData; private TrafficWaypointEditorData _waypointData; public IntersectionConverter() { _intersectionData = new IntersectionEditorData(); _waypointData = new TrafficWaypointEditorData(); } public void ConvertAllIntersections() { ConvertIntersections(); AssignIntersectionsToCell(); AddPedestrianWaypoints(); } private void ConvertIntersections() { var allEditorIntersections = _intersectionData.GetAllIntersections(); var _allEditorWaypoints = _waypointData.GetAllWaypoints(); List priorityIntersections = new List(); List lightsIntersections = new List(); List trafficLightsCrossings = new List(); List priorityCrossings = new List(); var AllIntersections = new Internal.IntersectionDataType[allEditorIntersections.Length]; for (int i = 0; i < allEditorIntersections.Length; i++) { if (allEditorIntersections[i].GetType().Equals(typeof(TrafficLightsIntersectionSettings))) { TrafficLightsIntersectionData intersection = ((TrafficLightsIntersectionSettings)allEditorIntersections[i]).ToPlayModeIntersection(_allEditorWaypoints); lightsIntersections.Add(intersection); AllIntersections[i] = new Internal.IntersectionDataType(IntersectionType.TrafficLights, lightsIntersections.Count - 1, intersection.Name); } if (allEditorIntersections[i].GetType().Equals(typeof(TrafficLightsCrossingSettings))) { TrafficLightsCrossingData intersection = ((TrafficLightsCrossingSettings)allEditorIntersections[i]).ToPlayModeIntersection(_allEditorWaypoints); trafficLightsCrossings.Add(intersection); AllIntersections[i] = new Internal.IntersectionDataType(IntersectionType.LightsCrossing, trafficLightsCrossings.Count - 1, intersection.Name); } if (allEditorIntersections[i].GetType().Equals(typeof(PriorityIntersectionSettings))) { PriorityIntersectionData intersection = ((PriorityIntersectionSettings)allEditorIntersections[i]).ToPlayModeIntersection(_allEditorWaypoints); priorityIntersections.Add(intersection); AllIntersections[i] = new Internal.IntersectionDataType(IntersectionType.Priority, priorityIntersections.Count - 1, intersection.Name); } if (allEditorIntersections[i].GetType().Equals(typeof(PriorityCrossingSettings))) { PriorityCrossingData intersection = ((PriorityCrossingSettings)allEditorIntersections[i]).ToPlayModeIntersection(_allEditorWaypoints); priorityCrossings.Add(intersection); AllIntersections[i] = new Internal.IntersectionDataType(IntersectionType.PriorityCrossing, priorityCrossings.Count - 1, intersection.Name); } } var trafficIntersectionsData = MonoBehaviourUtilities.GetOrCreateObjectScript(TrafficSystemConstants.PlayHolder, false); trafficIntersectionsData.SetTrafficIntersectionData( AllIntersections, lightsIntersections.ToArray(), priorityIntersections.ToArray(), trafficLightsCrossings.ToArray(), priorityCrossings.ToArray()); } private void AssignIntersectionsToCell() { GridDataHandler gridDataHandler; if (MonoBehaviourUtilities.TryGetSceneScript(out var gridData)) { gridDataHandler = new GridDataHandler(gridData.Value); } else { Debug.LogError(gridData.Error); return; } var allEditorIntersections = _intersectionData.GetAllIntersections(); for (int i = 0; i < allEditorIntersections.Length; i++) { List intersectionWaypoints = allEditorIntersections[i].GetAssignedWaypoints(); for (int j = 0; j < intersectionWaypoints.Count; j++) { for (int k = 0; k < intersectionWaypoints[j].roadWaypoints.Count; k++) { var cellData = gridDataHandler.GetCell(intersectionWaypoints[j].roadWaypoints[k].transform.position); gridDataHandler.AddIntersection(cellData, i); } } } } private void AddPedestrianWaypoints() { #if GLEY_PEDESTRIAN_SYSTEM IntersectionsDataHandler trafficIntersectionsDatahandler; if (MonoBehaviourUtilities.TryGetSceneScript(out var trafficIntersectionData)) { trafficIntersectionsDatahandler = new IntersectionsDataHandler(trafficIntersectionData.Value); } else { Debug.LogError(trafficIntersectionData.Error); return; } var allIntersections = trafficIntersectionsDatahandler.GetIntersectionData(); var allEditorIntersections = _intersectionData.GetAllIntersections(); var _allPedestrianEditorWaypoints = new PedestrianWaypointEditorData().GetAllWaypoints(); for (int i = 0; i < allIntersections.Length; i++) { switch (allIntersections[i].Type) { case IntersectionType.Priority: PriorityIntersectionData priorityInersection = trafficIntersectionsDatahandler.GetPriorityIntersectionData(allIntersections[i].OtherListIndex); PriorityIntersectionSettings priorityIntersectionEditor = (PriorityIntersectionSettings)allEditorIntersections[i]; for (int j = 0; j < priorityIntersectionEditor.enterWaypoints.Count; j++) { priorityInersection.AddPedestrianWaypoints(j, priorityIntersectionEditor.enterWaypoints[j].pedestrianWaypoints.ToListIndex(_allPedestrianEditorWaypoints), priorityIntersectionEditor.enterWaypoints[j].directionWaypoints.ToListIndex(_allPedestrianEditorWaypoints)); } break; case IntersectionType.PriorityCrossing: PriorityCrossingData priorityCrossing = trafficIntersectionsDatahandler.GetPriorityCrossingData(allIntersections[i].OtherListIndex); PriorityCrossingSettings priorityCrossingEditor = (PriorityCrossingSettings)allEditorIntersections[i]; for (int j = 0; j < priorityCrossingEditor.enterWaypoints.Count; j++) { priorityCrossing.AddPedestrianWaypoints(j, priorityCrossingEditor.enterWaypoints[j].pedestrianWaypoints.ToListIndex(_allPedestrianEditorWaypoints), priorityCrossingEditor.enterWaypoints[j].directionWaypoints.ToListIndex(_allPedestrianEditorWaypoints)); } break; case IntersectionType.TrafficLights: TrafficLightsIntersectionData trafficLightsIntersection = trafficIntersectionsDatahandler.GetTrafficLightsIntersectionData(allIntersections[i].OtherListIndex); TrafficLightsIntersectionSettings trafficLightsIntersectionEditor = (TrafficLightsIntersectionSettings)allEditorIntersections[i]; trafficLightsIntersection.AddPedestrianWaypoints(trafficLightsIntersectionEditor.pedestrianWaypoints.ToListIndex(_allPedestrianEditorWaypoints), trafficLightsIntersectionEditor.directionWaypoints.ToListIndex(_allPedestrianEditorWaypoints), trafficLightsIntersectionEditor.pedestrianRedLightObjects.ToArray(), trafficLightsIntersectionEditor.pedestrianGreenLightObjects.ToArray(), trafficLightsIntersectionEditor.pedestrianGreenLightTime); break; case IntersectionType.LightsCrossing: TrafficLightsCrossingData trafficLightsCrossing = trafficIntersectionsDatahandler.GetTrafficLightsCrossingData(allIntersections[i].OtherListIndex); TrafficLightsCrossingSettings trafficLightsCrossingEditor = (TrafficLightsCrossingSettings)allEditorIntersections[i]; trafficLightsCrossing.AddPedestrianWaypoints(trafficLightsCrossingEditor.pedestrianWaypoints.ToListIndex(_allPedestrianEditorWaypoints), trafficLightsCrossingEditor.directionWaypoints.ToListIndex(_allPedestrianEditorWaypoints), trafficLightsCrossingEditor.pedestrianRedLightObjects.ToArray(), trafficLightsCrossingEditor.pedestrianGreenLightObjects.ToArray()); break; } } #endif } } }