using System.Collections; using System.Collections.Generic; using Unity.Collections; using Unity.Entities; using Unity.Mathematics; using UnityEngine; public class StreetDataAuthoring : MonoBehaviour, IConvertGameObjectToEntity { //--------------------------------------------------------------- [Header("CityBuilder WebApi")] public string Address = "localhost"; public int Port = 44378; public bool IsHttps = true; [Header("City")] public int CityId = 15; public double LatitudeOrigin; public double LongitudeOrigin; public TrafficData StreetInfo; TrafficVisuaizer traffic; private EntityManager manager; // Start is called before the first frame update void Awake() { CityBuilderConnector.Initialize(Address, Port, IsHttps); StreetInfo = CityBuilderConnector.Instance.GetTrafficData(CityId); Debug.Log($"Features count = {StreetInfo.Features.Length}"); for(int i = 0; i < StreetInfo.Features.Length;i++) { var tiles = GetTiles(i); Debug.Log($"Tiles calculated in {i} length {tiles.Length}"); } traffic = FindObjectOfType(); manager = World.DefaultGameObjectInjectionWorld.EntityManager; // StartCoroutine(updatetrafficvolume()); } public float3[] GetTiles(int index) { GeoCoord geoOrigin; geoOrigin = new GeoCoord(LatitudeOrigin, LongitudeOrigin); var Feature = StreetInfo.Features[index]; var vertices = new List(); foreach (var p in Feature.Points) { GeoCoord coord = new GeoCoord(p.Y, p.X); coord.GetMapCoord(geoOrigin, out double X, out double Y); vertices.Add(new Vector3((float)X, 0f, (float)Y)); } double tilesize = 5; //tile section in meters; double currentposition = 0; int i = 1; List tiles = new List(); while (i < vertices.Count) { double sectionlength = (vertices[i] - vertices[i - 1]).magnitude; if (currentposition > sectionlength) { i++; currentposition = currentposition - sectionlength; } else { var pos3d = Vector3.Lerp(vertices[i - 1], vertices[i], (float)(currentposition / sectionlength)); currentposition += tilesize; tiles.Add(pos3d); } } return tiles.ToArray(); } public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem) { for(int i = 0; i < StreetInfo.Features.Length; i++) { var streetEntity = dstManager.CreateEntity(); #if UNITY_EDITOR dstManager.SetName(streetEntity, $"Street{i}_{StreetInfo.Features[i].STREET}"); #endif DynamicBuffer Buffer = dstManager.AddBuffer(streetEntity); InitializeBuffer(ref Buffer, i); int lanesA = 0; int lanesB = 0; switch (StreetInfo.Features[i].LANES) { case 100: lanesA = 1; break; case 101: lanesA = 1; lanesB = 1; break; case 102: lanesA = 1; lanesB = 2; break; case 103: lanesA = 1; lanesB = 3; break; case 104: lanesA = 1; lanesB = 4; break; case 105: lanesA = 1; lanesB = 5; break; case 106: lanesA = 1; lanesB = 6; break; case 200: lanesA = 2; lanesB = 0; break; case 201: lanesA = 2; lanesB = 1; break; case 202: lanesA = 2; lanesB = 2; break; case 203: lanesA = 2; lanesB = 3; break; case 204: lanesA = 2; lanesB = 4; break; case 205: lanesA = 2; lanesB = 5; break; case 206: lanesA = 2; lanesB = 6; break; case 300: lanesA = 3; lanesB = 0; break; case 301: lanesA = 3; lanesB = 1; break; case 302: lanesA = 3; lanesB = 2; break; case 303: lanesA = 3; lanesB = 3; break; case 400: lanesA = 4; lanesB = 0; break; case 500: lanesA = 5; lanesB = 0; break; case 0: lanesA = 1; break; default: Debug.LogError($"Lane {StreetInfo.Features[i].LANES} not defined"); break; } dstManager.AddComponentData(streetEntity, new StreetTraffic() { StreetId = StreetInfo.Features[i].Id, Direction = StreetInfo.Features[i].Direction, LanesA = lanesA, LanesB = lanesB }); } } private void InitializeBuffer(ref DynamicBuffer buffer, int streetindex) { var tiles = GetTiles(streetindex); buffer.ResizeUninitialized(tiles.Length); for(int i = 0; i < tiles.Length; i++) { buffer.ElementAt(i).StreetPosition.x = tiles[i].x; buffer.ElementAt(i).StreetPosition.z = tiles[i].z; /*Original*/ /* float angle = 0; if (i < tiles.Length - 1) { angle = Vector3.SignedAngle(Vector3.back, tiles[i+1]-tiles[i], Vector3.up) ; } buffer.ElementAt(i).StreetPosition.y = angle; //angle */ /* FABIAN */ buffer.ElementAt(i).StreetPosition.y = 0; } } //IEnumerator updatetrafficvolume() //{ // while (Application.isPlaying) // { // yield return new WaitForSecondsRealtime(1); // foreach(var f in StreetInfo.Features) // { // var x = traffic.CalculateCurrentVolume(f); // //https://forum.unity.com/threads/unity-tech-where-is-the-simple-bridge-between-monobehaviours-and-ecs.823485/ // var query = manager.CreateEntityQuery(ComponentType.ReadOnly()); // var entities = query.ToEntityArray(Allocator.TempJob); // Debug.Log($"Entities count: {entities.Length}"); // } // } //} }