private void Init() { var segment = Utilities.GetSegment(Id); IsStartSide = segment.m_startNode == Markup.Id; IsLaneInvert = IsStartSide ^ segment.IsInvert(); var info = segment.Info; var lanes = segment.GetLanesId().ToArray(); var driveLanesIdxs = info.m_sortedLanes.Where(s => Utilities.IsDriveLane(info.m_lanes[s])); if (!IsLaneInvert) { driveLanesIdxs = driveLanesIdxs.Reverse(); } DriveLanes = driveLanesIdxs.Select(d => new DriveLane(this, lanes[d], info.m_lanes[d])).ToArray(); if (!DriveLanes.Any()) { return; } Lines = new SegmentMarkupLine[DriveLanes.Length + 1]; for (int i = 0; i < Lines.Length; i += 1) { var left = i - 1 >= 0 ? DriveLanes[i - 1] : null; var right = i < DriveLanes.Length ? DriveLanes[i] : null; var markupLine = new SegmentMarkupLine(this, left, right); Lines[i] = markupLine; } }
private void CreatePoints(NetSegment segment) { var info = segment.Info; var lanes = segment.GetLanesId().ToArray(); var driveLanesIdxs = info.m_sortedLanes.Where(s => Utilities.IsDriveLane(info.m_lanes[s])); if (!IsLaneInvert) { driveLanesIdxs = driveLanesIdxs.Reverse(); } DriveLanes = driveLanesIdxs.Select(d => new DriveLane(this, lanes[d], info.m_lanes[d])).ToArray(); if (!DriveLanes.Any()) { return; } Lines = new SegmentMarkupLine[DriveLanes.Length + 1]; for (int i = 0; i < Lines.Length; i += 1) { var left = i - 1 >= 0 ? DriveLanes[i - 1] : null; var right = i < DriveLanes.Length ? DriveLanes[i] : null; var markupLine = new SegmentMarkupLine(this, left, right); Lines[i] = markupLine; } foreach (var markupLine in Lines) { PointsList.AddRange(markupLine.GetMarkupPoints()); } }
private void CalculateCorner(NetSegment segment) { var cornerAngle = (IsStartSide ? segment.m_cornerAngleStart : segment.m_cornerAngleEnd) / 255f * 360f; if (IsLaneInvert) { cornerAngle = cornerAngle >= 180 ? cornerAngle - 180 : cornerAngle + 180; } CornerAngle = cornerAngle * Mathf.Deg2Rad; CornerDir = DriveLanes.Length <= 1 ? CornerAngle.Direction() : (DriveLanes.Last().NetLane.CalculatePosition(T) - DriveLanes.First().NetLane.CalculatePosition(T)).normalized; NormalDir = (DriveLanes.Any() ? DriveLanes.Aggregate(Vector3.zero, (v, l) => v + l.NetLane.CalculateDirection(T)).normalized : Vector3.zero) * (IsStartSide ? -1 : 1); NormalAngle = NormalDir.AbsoluteAngle(); var angle = Vector3.Angle(NormalDir, CornerDir); CornerAndNormalAngle = (angle > 90 ? 180 - angle : angle) * Mathf.Deg2Rad; }