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);
}
}
}
}