using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; public class FeatureRender : MonoBehaviour { public TrafficFeature Feature; public double LatitudeOrigin; public double LongitudeOrigin; public LineRenderer LineA; public LineRenderer LineB; public TextMeshPro TextA; public TextMeshPro TextB; public float ThresholdYellow = 1700; public float ThresholdRed = 10000; private List vertices = new List(); private Texture2D background; private CurrentTrafficVolume trafficVolume; //VOL AB & BA private Rect rect0 = new Rect(0, 0, 90, 50); private Rect rect1 = new Rect(0, 0, 90, 27); private GUIStyle style; //Line Render private float lineWidth0 = 3; //Line with Both Directions private float lineDisplacement0 = 1.5f; private float lineWidth1 = 8; //Line with One Direction private float lineDisplacement1 = 0; //--------------------------------------------------------------- void Start() { GeoCoord geoOrigin; geoOrigin = new GeoCoord(LatitudeOrigin, LongitudeOrigin); 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, 0.3f, (float)Y)); } float lWidth = lineWidth0; float lineDisplacement = lineDisplacement0; if (Feature.Direction != 0) //One Direction { lWidth = lineWidth1; lineDisplacement = lineDisplacement1; } //LINE A LineA.startWidth = lWidth; LineA.endWidth = lWidth; LineA.positionCount = vertices.Count; LineA.SetPositions(Displacement(vertices.ToArray(), lineDisplacement)); LineA.startColor = CalcColor(Feature.DAYVOL_AB); LineA.endColor = CalcColor(Feature.DAYVOL_AB); //TEXT A TextA.transform.position = new Vector3((LineA.GetPosition(0).x + LineA.GetPosition(1).x) / 2.0f, (LineA.GetPosition(0).y+LineA.GetPosition(1).y)/2.0f, (LineA.GetPosition(0).z + LineA.GetPosition(1).z) / 2.0f); Vector3 relativePosA = LineA.GetPosition(1) - TextA.transform.position; Quaternion rotationA = Quaternion.LookRotation(relativePosA, Vector3.right); TextA.transform.rotation = rotationA; TextA.transform.Rotate(new Vector3(0, -90, 0)); TextA.text = string.Format("{0:#####}",Feature.DAYVOL_AB); LineB.startWidth = lWidth; LineB.endWidth = lWidth; LineB.positionCount = vertices.Count; LineB.SetPositions(Displacement( vertices.ToArray(), -1.0f* lineDisplacement)); LineB.startColor = CalcColor(Feature.DAYVOL_BA); LineB.endColor = CalcColor(Feature.DAYVOL_BA); TextB.transform.position = new Vector3((LineB.GetPosition(0).x + LineB.GetPosition(1).x) / 2.0f, (LineB.GetPosition(0).y + LineB.GetPosition(1).y) / 2.0f, (LineB.GetPosition(0).z + LineA.GetPosition(1).z) / 2.0f); Vector3 relativePosB = LineB.GetPosition(1)- TextB.transform.position; // the second argument, upwards, defaults to Vector3.up Quaternion rotationB = Quaternion.LookRotation(relativePosB, Vector3.left); TextB.transform.rotation = rotationB; TextB.transform.Rotate(new Vector3(0,90,0)); TextB.text = string.Format("{0:#####}", Feature.DAYVOL_BA); if (Feature.Direction == 0) { //Both Directions } else if (Feature.Direction == 1) { LineB.gameObject.SetActive(false); TextB.gameObject.SetActive(false); } else //-1 { LineA.gameObject.SetActive(false); TextA.gameObject.SetActive(false); } this.gameObject.name = $"{Feature.Id}"; } //--------------------------------------------------------------- // SHOW LINE COLORS & TEXTS //--------------------------------------------------------------- public void SetTime(double timestampSeconds, CurrentTrafficVolume trafficVol) { //Calculate volAB & volBA //CalculateCurrentVolume(timestampSeconds); trafficVolume = trafficVol; LineA.startColor = CalcColor(trafficVolume.AB); LineA.endColor = CalcColor(trafficVolume.BA); LineB.startColor = CalcColor(trafficVolume.AB); LineB.endColor = CalcColor(trafficVolume.BA); TextA.text = string.Format("{0:#####}", trafficVolume.AB); TextB.text = string.Format("{0:#####}", trafficVolume.BA); } //--------------------------------------------------------------- // SHOW UI COLORS & TEXTS //--------------------------------------------------------------- private void OnGUI() { if (style == null) { style = new GUIStyle(GUI.skin.box); style.fontSize = 20; style.normal.background = MakeTex(1, 1, new Color(0f, 0f, 0f, 0.5f)); style.normal.textColor = Color.white; } var point = Camera.main.WorldToScreenPoint((vertices[0] + vertices[1])/2); //SHOW TEXT BOX if (point.z > 0 && point.z<500) { Rect rect = rect1; if (Feature.Direction == 0) rect = rect0; rect.x = point.x; rect.y = Screen.height - point.y - rect.height; string text = ""; if (Feature.Direction == 0 || Feature.Direction == 1) text = $"{trafficVolume.AB.ToString("0")}"; if (Feature.Direction == 0) text += "\n"; if (Feature.Direction ==0 || !(Feature.Direction == 1)) text += $"{trafficVolume.BA.ToString("0")}"; GUI.Box(rect,text,style); } } //--------------------------------------------------------------- private Color CalcColor(double volume) { Color color0 = Color.green; Color color1 = Color.yellow; Color color2 = Color.red; if (volume <= ThresholdYellow) { return Color.Lerp(color0, color1, (float)volume / ThresholdYellow); } else { return Color.Lerp(color1, color2, ((float)volume - ThresholdYellow) / ThresholdRed); } } //--------------------------------------------------------------- private Vector3[] Displacement(Vector3[] Source, float distance) { List result = new List(); Vector3 direction = Source[1] - Source[0]; Vector3 vertical = Source[0] - new Vector3(Source[0].x, -1, Source[0].z); Vector3 perpendicular = (Vector3.Cross(direction, vertical)).normalized; foreach (var item in Source) { result.Add(item + perpendicular * distance); } return result.ToArray(); } //--------------------------------------------------------------- private Texture2D MakeTex(int width, int height, Color col) { Color[] pix = new Color[width * height]; for (int i = 0; i < pix.Length; ++i) { pix[i] = col; } Texture2D result = new Texture2D(width, height); result.SetPixels(pix); result.Apply(); return result; } }