public void GenerateHiRes(Ets2NavigationSegmentOption opt) { var pts = 512; if (Type == Ets2NavigationSegmentType.Road) { var curve1 = new List<Ets2Point>(); foreach (var rd in Roads) { var rdc = rd.GenerateRoadCurve(pts, opt.LeftLane, opt.EntryLane); if (!curve1.Any()) { if (!Entry.Point.CloseTo(rdc.FirstOrDefault())) rdc = rdc.Reverse(); } else { var lp = curve1.LastOrDefault(); if (!rdc.FirstOrDefault().CloseTo(lp)) rdc = rdc.Reverse(); } curve1.AddRange(rdc); } var curve2 = new List<Ets2Point>(); foreach (var rd in Roads) { var rdc = rd.GenerateRoadCurve(pts, opt.LeftLane, opt.ExitLane); if (!curve2.Any()) { if (!Entry.Point.CloseTo(rdc.FirstOrDefault())) rdc = rdc.Reverse(); } else { var lp = curve2.LastOrDefault(); if (!rdc.FirstOrDefault().CloseTo(lp)) rdc = rdc.Reverse(); } curve2.AddRange(rdc); } var curve = new List<Ets2Point>(); curve.AddRange(curve1.Skip(0).Take(curve2.Count / 2)); curve.AddRange(curve2.Skip(curve2.Count / 2).Take(curve2.Count / 2)); if (ReversedRoadChain) curve.Reverse(); opt.HiResPoints = curve; } if (Type == Ets2NavigationSegmentType.Prefab) { opt.HiResPoints = opt.Points; } }
public void GenerateOptions(Ets2NavigationSegment prevSeg, Ets2NavigationSegment nextSeg) { if (Type == Ets2NavigationSegmentType.Prefab) { var entryNode = -1; var exitNode = -1; var i = 0; // find node id's foreach (var kvp in Prefab.NodesList) { if (Entry != null && kvp.Value.NodeUID == Entry.NodeUID) entryNode = i; if (Exit != null && kvp.Value.NodeUID == Exit.NodeUID) exitNode = i; i++; } //var routes = Prefab.Prefab.GetRoute(entryNode, exitNode); var routes = Prefab.Prefab.GetAllRoutes(); if (routes == null || !routes.Any()) { return; } // Create options (we do this by just saving paths) foreach (var route in routes) { var option = new Ets2NavigationSegmentOption(); option.EntryLane = -1; option.ExitLane = -1; option.Points = Prefab.Prefab.GeneratePolygonForRoute(route, Prefab.NodesList.FirstOrDefault().Value, Prefab.Origin).ToList(); Options.Add(option); } } var curveSize = 32; if (Type == Ets2NavigationSegmentType.Road) { var firstRoad = Roads.FirstOrDefault(); // TODO: support UK // We have x number of lanes for (int startLane = 0; startLane < firstRoad.RoadLook.LanesRight; startLane++) { var curve1 = new List<Ets2Point>(); foreach (var rd in Roads) { var rdc = rd.GenerateRoadCurve(curveSize, false, startLane); if (!curve1.Any()) { if (!Entry.Point.CloseTo(rdc.FirstOrDefault())) rdc = rdc.Reverse(); } else { var lp = curve1.LastOrDefault(); if (!rdc.FirstOrDefault().CloseTo(lp)) rdc = rdc.Reverse(); } curve1.AddRange(rdc); } for (int endLane = 0; endLane < firstRoad.RoadLook.LanesRight; endLane++) { var curve2 = new List<Ets2Point>(); foreach (var rd in Roads) { var rdc = rd.GenerateRoadCurve(curveSize, false, endLane); if (!curve2.Any()) { if (!Entry.Point.CloseTo(rdc.FirstOrDefault())) rdc = rdc.Reverse(); } else { var lp = curve2.LastOrDefault(); if (!rdc.FirstOrDefault().CloseTo(lp)) rdc = rdc.Reverse(); } curve2.AddRange(rdc); } var curve = new List<Ets2Point>(); curve.AddRange(curve1.Skip(0).Take(curve2.Count/2)); curve.AddRange(curve2.Skip(curve2.Count / 2).Take(curve2.Count / 2)); if (ReversedRoadChain) curve.Reverse(); var option = new Ets2NavigationSegmentOption(); option.LeftLane = false; option.EntryLane = startLane; option.ExitLane = endLane; option.Points = curve; option.LaneCrossOver = (startLane != endLane); Options.Add(option); } } for (int startLane = 0; startLane < firstRoad.RoadLook.LanesLeft; startLane++) { var curve1 = new List<Ets2Point>(); foreach (var rd in Roads) { var rdc = rd.GenerateRoadCurve(curveSize, true, startLane); if (!curve1.Any()) { if (!Entry.Point.CloseTo(rdc.FirstOrDefault())) rdc = rdc.Reverse(); } else { var lp = curve1.LastOrDefault(); if (!rdc.FirstOrDefault().CloseTo(lp)) rdc = rdc.Reverse(); } curve1.AddRange(rdc); } for (int endLane = 0; endLane < firstRoad.RoadLook.LanesLeft; endLane++) { var curve2 = new List<Ets2Point>(); foreach (var rd in Roads) { var rdc = rd.GenerateRoadCurve(curveSize, true, endLane); if (!curve2.Any()) { if (!Entry.Point.CloseTo(rdc.FirstOrDefault())) rdc = rdc.Reverse(); } else { var lp = curve2.LastOrDefault(); if (!rdc.FirstOrDefault().CloseTo(lp)) rdc = rdc.Reverse(); } curve2.AddRange(rdc); } var curve = new List<Ets2Point>(); curve.AddRange(curve1.Skip(0).Take(curve2.Count / 2)); curve.AddRange(curve2.Skip(curve2.Count / 2).Take(curve2.Count / 2)); if (!ReversedRoadChain) curve.Reverse(); var option = new Ets2NavigationSegmentOption(); option.LeftLane = true; option.EntryLane = startLane; option.ExitLane = endLane; option.Points = curve; option.LaneCrossOver = (startLane != endLane); Options.Add(option); } } } }
public void GenerateOptions(Ets2NavigationSegment prevSeg, Ets2NavigationSegment nextSeg) { if (Type == Ets2NavigationSegmentType.Prefab) { var entryNode = -1; var exitNode = -1; var i = 0; // find node id's foreach (var kvp in Prefab.NodesList) { if (Entry != null && kvp.Value.NodeUID == Entry.NodeUID) { entryNode = i; } if (Exit != null && kvp.Value.NodeUID == Exit.NodeUID) { exitNode = i; } i++; } //var routes = Prefab.Prefab.GetRoute(entryNode, exitNode); var routes = Prefab.Prefab.GetAllRoutes(); if (routes == null || !routes.Any()) { return; } // Create options (we do this by just saving paths) foreach (var route in routes) { var option = new Ets2NavigationSegmentOption(); option.EntryLane = -1; option.ExitLane = -1; option.Points = Prefab.Prefab.GeneratePolygonForRoute(route, Prefab.NodesList.FirstOrDefault().Value, Prefab.Origin).ToList(); Options.Add(option); } } var curveSize = 32; if (Type == Ets2NavigationSegmentType.Road) { var firstRoad = Roads.FirstOrDefault(); // TODO: support UK // We have x number of lanes for (int startLane = 0; startLane < firstRoad.RoadLook.LanesRight; startLane++) { var curve1 = new List <Ets2Point>(); foreach (var rd in Roads) { var rdc = rd.GenerateRoadCurve(curveSize, false, startLane); if (!curve1.Any()) { if (!Entry.Point.CloseTo(rdc.FirstOrDefault())) { rdc = rdc.Reverse(); } } else { var lp = curve1.LastOrDefault(); if (!rdc.FirstOrDefault().CloseTo(lp)) { rdc = rdc.Reverse(); } } curve1.AddRange(rdc); } for (int endLane = 0; endLane < firstRoad.RoadLook.LanesRight; endLane++) { var curve2 = new List <Ets2Point>(); foreach (var rd in Roads) { var rdc = rd.GenerateRoadCurve(curveSize, false, endLane); if (!curve2.Any()) { if (!Entry.Point.CloseTo(rdc.FirstOrDefault())) { rdc = rdc.Reverse(); } } else { var lp = curve2.LastOrDefault(); if (!rdc.FirstOrDefault().CloseTo(lp)) { rdc = rdc.Reverse(); } } curve2.AddRange(rdc); } var curve = new List <Ets2Point>(); curve.AddRange(curve1.Skip(0).Take(curve2.Count / 2)); curve.AddRange(curve2.Skip(curve2.Count / 2).Take(curve2.Count / 2)); if (ReversedRoadChain) { curve.Reverse(); } var option = new Ets2NavigationSegmentOption(); option.LeftLane = false; option.EntryLane = startLane; option.ExitLane = endLane; option.Points = curve; option.LaneCrossOver = (startLane != endLane); Options.Add(option); } } for (int startLane = 0; startLane < firstRoad.RoadLook.LanesLeft; startLane++) { var curve1 = new List <Ets2Point>(); foreach (var rd in Roads) { var rdc = rd.GenerateRoadCurve(curveSize, true, startLane); if (!curve1.Any()) { if (!Entry.Point.CloseTo(rdc.FirstOrDefault())) { rdc = rdc.Reverse(); } } else { var lp = curve1.LastOrDefault(); if (!rdc.FirstOrDefault().CloseTo(lp)) { rdc = rdc.Reverse(); } } curve1.AddRange(rdc); } for (int endLane = 0; endLane < firstRoad.RoadLook.LanesLeft; endLane++) { var curve2 = new List <Ets2Point>(); foreach (var rd in Roads) { var rdc = rd.GenerateRoadCurve(curveSize, true, endLane); if (!curve2.Any()) { if (!Entry.Point.CloseTo(rdc.FirstOrDefault())) { rdc = rdc.Reverse(); } } else { var lp = curve2.LastOrDefault(); if (!rdc.FirstOrDefault().CloseTo(lp)) { rdc = rdc.Reverse(); } } curve2.AddRange(rdc); } var curve = new List <Ets2Point>(); curve.AddRange(curve1.Skip(0).Take(curve2.Count / 2)); curve.AddRange(curve2.Skip(curve2.Count / 2).Take(curve2.Count / 2)); if (!ReversedRoadChain) { curve.Reverse(); } var option = new Ets2NavigationSegmentOption(); option.LeftLane = true; option.EntryLane = startLane; option.ExitLane = endLane; option.Points = curve; option.LaneCrossOver = (startLane != endLane); Options.Add(option); } } } }