SimShift.MapTool.Ets2NavigationSegment.GenerateOptions C# (CSharp) Method

GenerateOptions() public method

public GenerateOptions ( Ets2NavigationSegment prevSeg, Ets2NavigationSegment nextSeg ) : void
prevSeg Ets2NavigationSegment
nextSeg Ets2NavigationSegment
return void
        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);
                    }
                }
            }
        }