protected static District detectDistrict(RoadNetwork roadNetwork, float dimension, int startX, int startY, bool[,] visited)
    {
        District        result   = new District();
        Queue <Vector2> bfsQueue = new Queue <Vector2>();

        bfsQueue.Enqueue(new Vector2(startX, startY));
        while (bfsQueue.Count > 0)
        {
            Vector2 position = bfsQueue.Dequeue();
            int     px = (int)position.x, py = (int)position.y;
            if (px < 0 || px >= dimension || py < 0 || py >= dimension || visited[px, py])
            {
                continue;
            }

            result.cells.Add(new DistrictCell(position));
            visited[px, py] = true;

            if (RoadHelper.hasRoadAt(roadNetwork, position.x, position.y, position.x, position.y + 1))         // Left
            {
                result.cells[result.cells.Count - 1].edgeLeft = true;                                          // Update attribute for last added element
            }
            if (RoadHelper.hasRoadAt(roadNetwork, position.x, position.y, position.x + 1, position.y))         // Up
            {
                result.cells[result.cells.Count - 1].edgeUp = true;                                            // Update attribute for last added element
            }
            if (RoadHelper.hasRoadAt(roadNetwork, position.x + 1, position.y, position.x + 1, position.y + 1)) // Right
            {
                result.cells[result.cells.Count - 1].edgeRight = true;                                         // Update attribute for last added element
            }
            if (RoadHelper.hasRoadAt(roadNetwork, position.x, position.y + 1, position.x + 1, position.y + 1)) // Down
            {
                result.cells[result.cells.Count - 1].edgeBottom = true;                                        // Update attribute for last added
            }
            if (px > 0 && !visited[px - 1, py] &&
                !RoadHelper.hasRoadAt(roadNetwork, position.x, position.y, position.x, position.y + 1)) // Left
            {
                bfsQueue.Enqueue(new Vector2(position.x - 1, position.y));
            }

            if (py > 0 && !visited[px, py - 1] &&
                !RoadHelper.hasRoadAt(roadNetwork, position.x, position.y, position.x + 1, position.y)) // Up
            {
                bfsQueue.Enqueue(new Vector2(position.x, position.y - 1));
            }

            if ((px + 1) < dimension && !visited[px + 1, py] &&
                !RoadHelper.hasRoadAt(roadNetwork, position.x + 1, position.y, position.x + 1, position.y + 1)) // Right
            {
                bfsQueue.Enqueue(new Vector2(position.x + 1, position.y));
            }

            if ((py + 1) < dimension && !visited[px, py + 1] &&
                !RoadHelper.hasRoadAt(roadNetwork, position.x, position.y + 1, position.x + 1, position.y + 1)) // Down
            {
                bfsQueue.Enqueue(new Vector2(position.x, position.y + 1));
            }
        }
        return(result);
    }
Exemple #2
0
 public HashSet <RoadSegment> getRelatedRoadSegments(RoadNetwork roadNetwork)
 {
     if (relatedRoadSegments == null)
     {
         relatedRoadSegments = new HashSet <RoadSegment>();
         foreach (DistrictCell cell in this.cells)
         {
             if (cell.edgeBottom)
             {
                 relatedRoadSegments.Add(RoadHelper.getRelatedRoadSegment(roadNetwork, cell.x, cell.y + 1, cell.x + 1, cell.y + 1));
             }
             if (cell.edgeLeft)
             {
                 relatedRoadSegments.Add(RoadHelper.getRelatedRoadSegment(roadNetwork, cell.x, cell.y, cell.x, cell.y + 1));
             }
             if (cell.edgeUp)
             {
                 relatedRoadSegments.Add(RoadHelper.getRelatedRoadSegment(roadNetwork, cell.x, cell.y, cell.x + 1, cell.y));
             }
             if (cell.edgeRight)
             {
                 relatedRoadSegments.Add(RoadHelper.getRelatedRoadSegment(roadNetwork, cell.x + 1, cell.y, cell.x + 1, cell.y + 1));
             }
         }
     }
     return(relatedRoadSegments);
 }
Exemple #3
0
    public float getDistanceTo(District another, RoadNetwork roadNetwork)
    {
        if (!distancesCache.ContainsKey(another))
        {
            float result = float.MaxValue;
            HashSet <RoadSegment> roadSegments        = this.getRelatedRoadSegments(roadNetwork);
            HashSet <RoadSegment> anotherRoadSegments = another.getRelatedRoadSegments(roadNetwork);

            foreach (RoadSegment segment in roadSegments)
            {
                if (segment == null)
                {
                    continue;
                }
                foreach (RoadSegment anotherSegment in anotherRoadSegments)
                {
                    if (anotherSegment == null)
                    {
                        continue;
                    }
                    float distance = RoadHelper.getDistance(roadNetwork, segment, anotherSegment);
                    if (distance < result)
                    {
                        result = distance;
                    }
                }
            }
            distancesCache[another] = result;
        }

        return(distancesCache[another]);
    }
 protected bool hasIntersections(RoadNetwork network, Crossroad cr0, Crossroad cr1)
 {
     for (int i = 0; i < network.roadSegments.Count; i++)
     {
         if (RoadHelper.areRoadsIntersects(new RoadSegment(cr0, cr1), network.roadSegments[i]))
         {
             return(true);
         }
     }
     return(false);
 }
Exemple #5
0
    public float getDistanceTo(District another, RoadNetwork roadNetwork)
    {
        if (!distancesCache.ContainsKey(another))
        {
            float result = float.MaxValue;
            HashSet <RoadSegment> roadSegments        = this.getRelatedRoadSegments(roadNetwork);
            HashSet <RoadSegment> anotherRoadSegments = another.getRelatedRoadSegments(roadNetwork);

            foreach (RoadSegment segment in roadSegments)
            {
                if (segment == null)
                {
                    continue;
                }
                foreach (RoadSegment anotherSegment in anotherRoadSegments)
                {
                    if (anotherSegment == null)
                    {
                        continue;
                    }
                    float distance = RoadHelper.getDistance(roadNetwork, segment, anotherSegment);
                    if (distance < result)
                    {
                        result = distance;
                    }
                }
            }
            distancesCache[another] = result;
        }

        return(distancesCache[another]);

        //Vector2 thisPosition = new Vector2();
        //foreach (DistrictCell cell in cells)
        //{
        //    thisPosition.x += cell.x;
        //    thisPosition.y += cell.y;
        //}
        //thisPosition.x /= cells.Count;
        //thisPosition.y /= cells.Count;

        //Vector2 anotherPosition = new Vector2();
        //foreach (DistrictCell cell in another.cells)
        //{
        //    anotherPosition.x += cell.x;
        //    anotherPosition.y += cell.y;
        //}
        //anotherPosition.x /= cells.Count;
        //anotherPosition.y /= cells.Count;

        //return Vector2.Distance(thisPosition, anotherPosition);
    }
    public override void agentAction()
    {
        RoadNetwork network = generator.roadNetwork;
        Crossroad   cr0     = new Crossroad();

        do
        {
            cr0.x = Random.value * generator.meshDimension;
            cr0.y = Random.value * generator.meshDimension;
        } while (RoadHelper.isUnderWaterline(cr0, generator));
        cr0.x = (int)cr0.x;
        cr0.y = (int)cr0.y;
        network.crossroads.Add(cr0);
    }
Exemple #7
0
    public override void agentAction()
    {
        RoadNetwork network         = generator.roadNetwork;
        Crossroad   extensionOrigin = network.crossroads[Random.Range(0, network.crossroads.Count - 1)];

        if (denseGenerator && Random.value > denseProbability)
        {
            List <Crossroad> candidates = new List <Crossroad>();
            foreach (Crossroad cr in network.crossroads)
            {
                if (cr.adjacentSegemnts.Count > 1 && cr.adjacentSegemnts.Count < 4)
                {
                    candidates.Add(cr);
                }
            }
            if (candidates.Count > 0)
            {
                extensionOrigin = candidates[Random.Range(0, candidates.Count - 1)];
            }
        }
        Vector2     extension;
        Vector2     direction;
        RoadSegment segment;

        switch (Random.Range(0, 3))
        {
        case 0:     // Right
            direction = new Vector2(0, 1);
            break;

        case 1:     // Left
            direction = new Vector2(0, -1);
            break;

        case 2:     // Up
            direction = new Vector2(1, 0);
            break;

        case 3:     // Down
        default:
            direction = new Vector2(-1, 0);
            break;
        }
        extension = direction * ((int)Random.Range(minimumSegmentLength, maximumSegmentLength));

        for (int i = 0; i < extensionOrigin.adjacentSegemnts.Count; i++)
        {
            Crossroad anotherCr = extensionOrigin.adjacentSegemnts[i].getEnd().Equals(extensionOrigin) ? extensionOrigin.adjacentSegemnts[i].getStart() : extensionOrigin.adjacentSegemnts[i].getEnd();
            Vector2   v0 = new Vector2(extension.x, extension.y), v1 = new Vector2(anotherCr.x - extensionOrigin.x, anotherCr.y - extensionOrigin.y);
            if (Mathf.Abs(Vector2.Angle(v0, v1)) < 10.0f || Mathf.Abs(Vector2.Angle(v0, v1)) > 350.0f)
            {
                return;
            }
        }

        Crossroad testCr = new Crossroad();

        testCr.x = extensionOrigin.x + extension.x;
        testCr.y = extensionOrigin.y + extension.y;
        for (int i = 0; i < network.roadSegments.Count; i++)
        {
            if (network.roadSegments[i].getStart() == extensionOrigin || network.roadSegments[i].getEnd() == extensionOrigin)
            {
                continue;
            }
            if (RoadHelper.areRoadsIntersects(extensionOrigin, testCr, network.roadSegments[i].getStart(), network.roadSegments[i].getEnd(), network.roadSegments[i].width))
            {
                return;
            }
        }

        Crossroad cr1 = new Crossroad(extensionOrigin.x + extension.x, extensionOrigin.y + extension.y);

        if (cr1.x > generator.meshDimension - 1 || cr1.x < 1 || cr1.y > generator.meshDimension - 1 || cr1.y < 1)
        {
            return;
        }
        if (RoadHelper.isUnderWaterline(cr1, generator) || RoadHelper.getSegmentSlope(extensionOrigin, cr1, generator) >= generator.maximumSlope)
        {
            return;
        }
        network.crossroads.Add(cr1);
        segment = new RoadSegment(extensionOrigin, cr1);
        network.roadSegments.Add(segment);
        testCr   = new Crossroad();
        testCr.x = cr1.x + direction.x * extensionLength;
        testCr.y = cr1.y + direction.y * extensionLength;

        List <KeyValuePair <float, KeyValuePair <RoadSegment, Vector2> > > intersections = new List <KeyValuePair <float, KeyValuePair <RoadSegment, Vector2> > >();

        for (int i = 0; i < network.roadSegments.Count; i++)
        {
            if (RoadHelper.areRoadsIntersects(cr1, testCr, network.roadSegments[i].getStart(), network.roadSegments[i].getEnd(), network.roadSegments[i].width))
            {
                if (network.roadSegments[i].getStart() == cr1 || network.roadSegments[i].getEnd() == cr1)
                {
                    continue;
                }

                Vector2 segmentAngle  = new Vector2(cr1.x - testCr.x, cr1.y - testCr.y);
                Vector2 iSegmentAngle = new Vector2(network.roadSegments[i].getStart().x - network.roadSegments[i].getEnd().x,
                                                    network.roadSegments[i].getStart().y - network.roadSegments[i].getEnd().y);
                if (Mathf.Abs(Vector2.Angle(segmentAngle, iSegmentAngle)) <= 60.0f || Mathf.Abs(Vector2.Angle(segmentAngle, iSegmentAngle)) >= 300.0f)
                {
                    continue;
                }

                Vector2 intersectionPoint = RoadHelper.getIntersectionPoint(cr1, testCr, network.roadSegments[i].getStart(), network.roadSegments[i].getEnd());
                if (intersectionPoint == Vector2.zero)
                {
                    continue;
                }
                float distance = Vector2.Distance(new Vector2(cr1.x, cr1.y), intersectionPoint);
                intersections.Add(new KeyValuePair <float, KeyValuePair <RoadSegment, Vector2> >(distance, new KeyValuePair <RoadSegment, Vector2>(network.roadSegments[i], intersectionPoint)));
            }
        }
        Crossroad previousCr = cr1;

        intersections.Sort((a, b) => a.Key.CompareTo(b.Key));
        foreach (KeyValuePair <float, KeyValuePair <RoadSegment, Vector2> > intersection in intersections)
        {
            testCr = new Crossroad(intersection.Value.Value.x, intersection.Value.Value.y);
            if (RoadHelper.isUnderWaterline(testCr, generator) || RoadHelper.getSegmentSlope(previousCr, testCr, generator) >= generator.maximumSlope) //
            {
                continue;
            }
            network.crossroads.Add(testCr);
            segment = new RoadSegment(previousCr, testCr);
            network.roadSegments.Add(segment);
            Crossroad intersectedStart = intersection.Value.Key.getStart();
            Crossroad intersectedEnd   = intersection.Value.Key.getEnd();
            intersection.Value.Key.setEnd(null);
            intersection.Value.Key.setStart(null);
            network.roadSegments.Remove(intersection.Value.Key);
            segment = new RoadSegment(intersectedStart, testCr);
            network.roadSegments.Add(segment);
            segment = new RoadSegment(testCr, intersectedEnd);
            network.roadSegments.Add(segment);
            previousCr = testCr;
        }
    }
        public static void Setup6mSteelMesh(NetInfo info, NetInfoVersion version, NetInfo elevatedInfo)
        {
            var elevatedMaterial     = elevatedInfo.m_segments[0].m_material;
            var elevatedLODMaterial  = elevatedInfo.m_segments[0].m_lodMaterial;
            var trainTrackInfo       = Prefabs.Find <NetInfo>("Train Track");
            var railMaterial         = trainTrackInfo.m_segments[1].m_material;
            var railLODMaterial      = trainTrackInfo.m_segments[1].m_lodMaterial;
            var brElInfo             = Prefabs.Find <NetInfo>("Basic Road Elevated");
            var defaultElMaterial    = brElInfo.m_segments[0].m_material;
            var defaultElLODMaterial = brElInfo.m_segments[0].m_lodMaterial;
            var isTwoWay             = info.name.Contains("Two-Way");
            var nodeList             = new List <NetInfo.Node>();

            switch (version)
            {
            case NetInfoVersion.Ground:
            {
                var segments0 = info.m_segments[0].ShallowClone();
                var segments1 = info.m_segments[1].ShallowClone();

                var segments3 = info.m_segments[0].ShallowClone();
                var nodes0    = info.m_nodes[0].ShallowClone();

                nodeList.Add(nodes0);

                segments0
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Ground_Pavement.obj",
                    @"Meshes\6m\Ground_Pavement_LOD.obj");

                segments1
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Ground_Rail.obj",
                    @"Meshes\6m\Rail_LOD.obj");

                segments3
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\ThirdRail.obj",
                    @"Meshes\6m\Rail_LOD.obj")
                .SetConsistentUVs();

                nodes0
                .SetMeshes
                    (@"Meshes\6m\Ground_Node_Pavement.obj",
                    @"Meshes\6m\Ground_Node_Pavement_LOD.obj");

                RoadHelper.HandleAsymSegmentFlags(segments3);
                segments3.m_material    = railMaterial;
                segments3.m_lodMaterial = railLODMaterial;
                info.m_segments         = new[] { segments0, segments1, /*segments2*/ segments3 };
                break;
            }

            case NetInfoVersion.Elevated:
            {
                var segment0 = info.m_segments[0].ShallowClone();
                var segment1 = info.m_segments[1].ShallowClone();
                var segment2 = info.m_segments[0].ShallowClone();
                var segment3 = info.m_segments[0].ShallowClone();

                var node0  = info.m_nodes[0].ShallowClone();
                var node11 = info.m_nodes[0].ShallowClone();



                segment0
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Elevated_Pavement_Steel.obj",
                    @"Meshes\6m\Elevated_Pavement_Steel_LOD.obj")
                .SetConsistentUVs();

                segment1
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Ground_Rail.obj",
                    @"Meshes\6m\Rail_LOD.obj")
                .SetConsistentUVs();

                segment2
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\ThirdRail.obj",
                    @"Meshes\6m\Rail_LOD.obj")
                .SetConsistentUVs();

                segment3
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Elevated_ThirdRail_Base.obj", @"Meshes\6m\Blank.obj")
                .SetConsistentUVs();

                node0
                .SetFlags(NetNode.Flags.None, NetNode.Flags.Transition)
                .SetMeshes
                    (@"Meshes\6m\Elevated_Node_Pavement_Steel.obj",
                    @"Meshes\6m\Elevated_Node_Pavement_Steel_LOD.obj")
                .SetConsistentUVs();

                node11
                .SetFlags(NetNode.Flags.Transition, NetNode.Flags.None)
                .SetMeshes
                    (@"Meshes\6m\Elevated_Trans_Pavement_Steel.obj",
                    @"Meshes\6m\Elevated_Node_Pavement_Steel_LOD.obj")
                .SetConsistentUVs();

                nodeList.Add(node0);
                nodeList.Add(node11);

                RoadHelper.HandleAsymSegmentFlags(segment2);
                RoadHelper.HandleAsymSegmentFlags(segment3);
                segment0.m_material    = elevatedMaterial;
                segment0.m_lodMaterial = elevatedLODMaterial;
                segment2.m_material    = railMaterial;
                segment2.m_lodMaterial = railLODMaterial;
                node0.m_material       = elevatedMaterial;
                node0.m_lodMaterial    = elevatedLODMaterial;
                node11.m_material      = elevatedMaterial;
                node11.m_lodMaterial   = elevatedLODMaterial;
                info.m_segments        = new[] { segment0, segment1, segment2, segment3 };
                break;
            }

            case NetInfoVersion.Bridge:
            {
                var segment1 = info.m_segments[1].ShallowClone();
                var segment2 = info.m_segments[0].ShallowClone();
                var segment3 = info.m_segments[0].ShallowClone();

                var node3 = info.m_nodes[0].ShallowClone();
                //var node9 = info.m_nodes[0].ShallowClone();

                nodeList.Add(node3);
                //nodeList.Add(node9);

                segment1
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Ground_Rail.obj",
                    @"Meshes\6m\Rail_LOD.obj");
                segment2
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\ThirdRail.obj",
                    @"Meshes\6m\Rail_LOD.obj")
                .SetConsistentUVs();
                segment3
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Elevated_ThirdRail_Base.obj", @"Meshes\6m\Blank.obj")
                .SetConsistentUVs();

                node3
                .SetFlags(NetNode.Flags.Transition, NetNode.Flags.None)
                .SetMeshes
                    (@"Meshes\6m\Elevated_Trans_Pavement_Steel.obj",
                    @"Meshes\6m\Elevated_Node_Pavement_Steel_LOD.obj")
                .SetConsistentUVs();
                //node9
                //    .SetMeshes
                //    (@"Meshes\6m\Elevated_Node_Pavement_Steel_Insert.obj", @"Meshes\6m\Blank.obj")
                //    .SetConsistentUVs();
                segment2.m_material    = railMaterial;
                segment2.m_lodMaterial = railLODMaterial;
                node3.m_material       = elevatedMaterial;
                node3.m_lodMaterial    = elevatedLODMaterial;
                //node9.m_material = elevatedMaterial;
                //node9.m_lodMaterial = elevatedLODMaterial;
                //node9.m_directConnect = true;
                RoadHelper.HandleAsymSegmentFlags(segment2);
                RoadHelper.HandleAsymSegmentFlags(segment3);
                info.m_segments = new[] { segment1, segment2, segment3 };
                break;
            }

            case NetInfoVersion.Slope:
            {
                var segment0 = info.m_segments[0].ShallowClone();
                var segment1 = info.m_segments[1].ShallowClone();
                var segment2 = info.m_segments[0].ShallowClone();
                var segment3 = info.m_segments[3].ShallowClone();
                var segment4 = info.m_segments[3].ShallowClone();
                var node0    = info.m_nodes[0].ShallowClone();

                var node2 = info.m_nodes[1].ShallowClone();
                var node3 = info.m_nodes[3].ShallowClone();
                var node5 = info.m_nodes[0].ShallowClone();


                nodeList.Add(node0);
                nodeList.Add(node2);
                nodeList.Add(node3);
                nodeList.Add(node5);
                segment0
                .SetMeshes
                    (@"Meshes\6m\Tunnel_Pavement_Gray.obj",
                    @"Meshes\6m\Tunnel_Pavement_Gray_LOD.obj");
                segment1
                .SetMeshes
                    (@"Meshes\6m\Ground_Rail.obj",
                    @"Meshes\6m\Rail_LOD.obj");
                segment2
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\ThirdRail.obj",
                    @"Meshes\6m\Rail_LOD.obj")
                .SetConsistentUVs();
                segment3
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Slope_Pavement_Steel.obj",
                    @"Meshes\6m\Slope_Pavement_LOD.obj")
                .SetConsistentUVs();
                segment4
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Slope_Pavement_Steel_Ground.obj",
                    @"Meshes\10m\Blank.obj");
                node0
                .SetMeshes
                    (@"Meshes\6m\Tunnel_Pavement_Gray.obj",
                    @"Meshes\6m\Tunnel_Pavement_Gray_LOD.obj");
                node2
                .SetFlags(NetNode.Flags.Underground, NetNode.Flags.None)
                .SetMeshes
                    (@"Meshes\6m\Boosted_Rail.obj",
                    @"Meshes\6m\Blank.obj")
                .SetConsistentUVs();
                node3
                .SetMeshes
                    (@"Meshes\6m\Slope_Node_Pavement_Steel.obj",
                    @"Meshes\6m\Slope_Node_Pavement_LOD.obj")
                .SetConsistentUVs();
                node5
                .SetMeshes
                    (@"Meshes\6m\Tunnel_Node_Pavement_Steel.obj",
                    @"Meshes\6m\Tunnel_Node_Pavement_LOD.obj")
                .SetConsistentUVs();
                segment2.m_material    = railMaterial;
                segment2.m_lodMaterial = railLODMaterial;
                segment3.m_material    = elevatedMaterial;
                segment3.m_lodMaterial = elevatedLODMaterial;
                segment4.m_material    = elevatedMaterial;
                segment4.m_lodMaterial = elevatedLODMaterial;
                node2.m_connectGroup   = info.m_connectGroup;
                node3.m_material       = elevatedMaterial;
                node3.m_lodMaterial    = elevatedLODMaterial;
                node5.m_material       = elevatedMaterial;
                node5.m_lodMaterial    = elevatedLODMaterial;
                info.m_segments        = new[] { segment0, segment1, segment2, segment3, segment4 };
                break;
            }

            case NetInfoVersion.Tunnel:
            {
                var metroInfo = PrefabCollection <NetInfo> .FindLoaded("Metro Track");

                var segment0 = metroInfo.m_segments[0].ShallowClone();
                var segment1 = info.m_segments[0].ShallowClone();
                var segment2 = info.m_segments[0].ShallowClone();
                var segment3 = info.m_segments[0].ShallowClone();
                var segment4 = info.m_segments[0].ShallowClone();
                var node0    = metroInfo.m_nodes[0].ShallowClone();
                var node1    = info.m_nodes[0].ShallowClone();
                var node2    = info.m_nodes[0].ShallowClone();

                nodeList.Add(node0);
                nodeList.Add(node1);
                nodeList.Add(node2);

                segment0
                .SetMeshes
                    (@"Meshes\6m\Tunnel_Pavement_Steel_Gray.obj",
                    @"Meshes\6m\Tunnel_Pavement_Steel_Gray_LOD.obj");
                segment1
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Tunnel_Pavement_Steel.obj",
                    @"Meshes\6m\Tunnel_Pavement_Steel_LOD.obj")
                .SetConsistentUVs();
                segment2
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Ground_Rail.obj",
                    @"Meshes\6m\Rail_LOD.obj");
                segment3
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\ThirdRail.obj",
                    @"Meshes\6m\Rail_LOD.obj")
                .SetConsistentUVs();
                segment4
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Tunnel_Pavement_Steel_Ground.obj",
                    @"Meshes\6m\Blank.obj");
                node0
                .SetMeshes
                    (@"Meshes\6m\Tunnel_Pavement_Gray.obj",
                    @"Meshes\6m\Tunnel_Pavement_Gray_LOD.obj");
                node1
                .SetFlags(NetNode.Flags.None, NetNode.Flags.Transition)
                .SetMeshes
                    (@"Meshes\6m\Tunnel_Node_Pavement_Steel.obj",
                    @"Meshes\6m\Tunnel_Node_Pavement_Steel_LOD.obj")
                .SetConsistentUVs();
                node2
                .SetFlags(NetNode.Flags.Transition, NetNode.Flags.None)
                .SetMeshes
                    ($@"Meshes\6m\Tunnel_Trans_Pavement_Steel.obj",
                    $@"Meshes\6m\Tunnel_Node_Pavement_LOD.obj")
                .SetConsistentUVs();

                segment1.m_material    = defaultElMaterial;
                segment1.m_lodMaterial = defaultElLODMaterial;
                segment2.m_material    = railMaterial;
                segment2.m_lodMaterial = railLODMaterial;
                segment3.m_material    = railMaterial;
                segment3.m_lodMaterial = railLODMaterial;
                segment4.m_material    = defaultElMaterial;
                segment4.m_lodMaterial = defaultElLODMaterial;
                node1.m_material       = elevatedMaterial;
                node1.m_lodMaterial    = elevatedLODMaterial;
                node2.m_material       = elevatedMaterial;
                node2.m_lodMaterial    = elevatedLODMaterial;

                RoadHelper.HandleAsymSegmentFlags(segment1);
                RoadHelper.HandleAsymSegmentFlags(segment3);
                RoadHelper.HandleAsymSegmentFlags(segment4);
                info.m_segments = new[] { segment0, segment1, segment2, segment3, segment4 };
                break;
            }
            }
            for (int i = 0; i < nodeList.Count; i++)
            {
                nodeList[i].m_flagsForbidden |= NetNode.Flags.LevelCrossing;
            }
            nodeList.AddRange(SetupMeshUtil.GenerateSplitTracksAndLevelCrossings(info, version));
            info.m_nodes = nodeList.ToArray();
        }
        public static void Setup6mStationSteelMesh(NetInfo prefab, NetInfoVersion version, NetInfo elevatedInfo, NetInfo metroStationInfo)
        {
            var elevatedMaterial    = elevatedInfo.m_segments[0].m_material;
            var elevatedLODMaterial = elevatedInfo.m_segments[0].m_lodMaterial;
            var trainTrackInfo      = Prefabs.Find <NetInfo>("Train Track");
            var railMaterial        = trainTrackInfo.m_segments[1].m_material;
            var railLODMaterial     = trainTrackInfo.m_segments[1].m_lodMaterial;
            var isTwoWay            = prefab.name.Contains("Two-Way");
            var nodeList            = new List <NetInfo.Node>();

            switch (version)
            {
            case NetInfoVersion.Ground:
            {
                var segment0 = prefab.m_segments[0].ShallowClone();
                var segment1 = prefab.m_segments[1].ShallowClone();
                var segment2 = prefab.m_segments[0].ShallowClone();
                var node0    = prefab.m_nodes[0].ShallowClone();

                nodeList.Add(node0);
                segment0
                .SetMeshes
                    (@"Meshes\6m\Ground_Station_Pavement.obj",
                    @"Meshes\6m\Ground_Pavement_LOD.obj");
                segment1
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Ground_Rail.obj",
                    @"Meshes\6m\Rail_LOD.obj")
                .SetConsistentUVs();
                segment2
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\ThirdRail.obj",
                    @"Meshes\6m\Rail_LOD.obj")
                .SetConsistentUVs();

                node0
                .SetMeshes
                    (@"Meshes\6m\Ground_Node_Pavement.obj",
                    @"Meshes\6m\Ground_Node_Pavement_LOD.obj");

                RoadHelper.HandleAsymSegmentFlags(segment2);

                segment0.m_material    = elevatedMaterial;
                segment0.m_lodMaterial = elevatedLODMaterial;
                segment2.m_material    = railMaterial;
                segment2.m_lodMaterial = railLODMaterial;
                node0.m_material       = elevatedMaterial;
                node0.m_lodMaterial    = elevatedLODMaterial;
                prefab.m_segments      = new[] { segment0, segment1, segment2 };
                break;
            }

            case NetInfoVersion.Elevated:
            {
                var segment0 = prefab.m_segments[0].ShallowClone();
                var segment1 = prefab.m_segments[1].ShallowClone();
                var segment2 = prefab.m_segments[0].ShallowClone();
                var segment3 = prefab.m_segments[0].ShallowClone();

                var node0  = prefab.m_nodes[0].ShallowClone();
                var node11 = prefab.m_nodes[0].ShallowClone();

                nodeList.Add(node0);
                nodeList.Add(node11);

                segment0
                .SetMeshes
                    (@"Meshes\6m\Elevated_Station_Pavement_Steel.obj",
                    @"Meshes\6m\Elevated_Station_Pavement_LOD.obj");
                segment1
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Ground_Rail.obj",
                    @"Meshes\6m\Rail_LOD.obj")
                .SetConsistentUVs();

                segment2
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\ThirdRail.obj",
                    @"Meshes\6m\Rail_LOD.obj")
                .SetConsistentUVs();

                segment3
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Elevated_ThirdRail_Base.obj", @"Meshes\6m\Blank.obj")
                .SetConsistentUVs();

                node0
                .SetMeshes
                    (@"Meshes\6m\Elevated_Station_Node_Pavement_Steel.obj",
                    @"Meshes\6m\Elevated_Station_Node_Pavement_LOD.obj")
                .SetConsistentUVs();
                node11
                .SetFlags(NetNode.Flags.Transition, NetNode.Flags.None)
                .SetMeshes
                    (@"Meshes\6m\Elevated_Trans_Pavement_Steel.obj",
                    @"Meshes\6m\Elevated_Node_Pavement_Steel_LOD.obj")
                .SetConsistentUVs();

                RoadHelper.HandleAsymSegmentFlags(segment2);
                RoadHelper.HandleAsymSegmentFlags(segment3);
                segment0.m_material    = elevatedMaterial;
                segment0.m_lodMaterial = elevatedLODMaterial;
                segment2.m_material    = railMaterial;
                segment2.m_lodMaterial = railLODMaterial;
                node0.m_material       = elevatedMaterial;
                node0.m_lodMaterial    = elevatedLODMaterial;

                node11.m_material    = elevatedMaterial;
                node11.m_lodMaterial = elevatedLODMaterial;

                prefab.m_segments = new[] { segment0, segment1, segment2, segment3 };
                break;
            }
            }
            //if (version == NetInfoVersion.Ground || version == NetInfoVersion.Elevated) {
            //    nodeList[0].m_flagsForbidden |= NetNode.Flags.End;
            //}
            for (int i = 0; i < nodeList.Count; i++)
            {
                nodeList[i].m_flagsForbidden |= NetNode.Flags.LevelCrossing;
            }
            nodeList.AddRange(SetupMeshUtil.GenerateSplitTracksAndLevelCrossings(prefab, version));
            prefab.m_nodes = nodeList.ToArray();
        }
        public static void Setup10mMesh(NetInfo info, NetInfoVersion version, NetInfo elevatedInfo, NetInfo metroInfo)
        {
            var isOneWay            = info.name.Contains("One-Way");
            var isLarge             = info.name.Contains("Large");
            var width               = isLarge ? "18m":"10m";
            var brElInfo            = Prefabs.Find <NetInfo>("Basic Road Elevated");
            var elevatedbrMaterial  = brElInfo.m_segments[0].m_lodMaterial;
            var elevatedMaterial    = elevatedInfo.m_segments[0].m_material;
            var elevatedLODMaterial = elevatedInfo.m_segments[0].m_lodMaterial;

            switch (version)
            {
            case NetInfoVersion.Ground:
            {
                var segment0 = info.m_segments[0].ShallowClone();
                var segment1 = info.m_segments[1].ShallowClone();
                var segment2 = info.m_segments[0].ShallowClone();
                var node0    = info.m_nodes[0].ShallowClone();
                var node1    = info.m_nodes[1].ShallowClone();
                var node2    = info.m_nodes[2].ShallowClone();
                var node3    = info.m_nodes[1].ShallowClone();
                var node4    = info.m_nodes[0].ShallowClone();
                var node5    = info.m_nodes[2].ShallowClone();
                var node6    = info.m_nodes[1].ShallowClone();
                var nodeList = new List <NetInfo.Node>();
                nodeList.Add(node0);
                nodeList.Add(node1);
                //nodeList.Add(node2);
                //nodeList.Add(node3);
                nodeList.Add(node4);
                nodeList.Add(node5);
                //nodeList.Add(node6);
                segment0
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\Ground_Pavement.obj",
                    $@"Meshes\{width}\Ground_Pavement_LOD.obj");

                segment1
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\Rail.obj")
                .SetConsistentUVs();
                segment2
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\ThirdRail.obj", $@"Meshes\{width}\Blank.obj")
                .SetConsistentUVs();
                node0
                .SetMeshes
                    ($@"Meshes\{width}\Ground_Node_Pavement.obj",
                    $@"Meshes\{width}\Ground_Node_Pavement_LOD.obj");
                node1
                .SetMeshes
                    ($@"Meshes\{width}\Boosted_Rail.obj")
                .SetConsistentUVs();
                node2
                .SetMeshes
                    ($@"Meshes\{width}\LevelCrossing_Pavement.obj",
                    $@"Meshes\{width}\LevelCrossing_Pavement_LOD.obj")
                .SetConsistentUVs();
                node3
                .SetMeshes
                    ($@"Meshes\{width}\LevelCrossing_Rail.obj")
                .SetConsistentUVs();
                node4
                .SetMeshes
                    ($@"Meshes\{width}\ThirdRail_Node.obj", $@"Meshes\{width}\Blank.obj")
                .SetConsistentUVs();
                node5
                .SetMeshes
                    ($@"Meshes\{width}\ThirdRail_LevelCrossing.obj", $@"Meshes\{width}\Blank.obj")
                .SetConsistentUVs();
                node6
                .SetMeshes
                    ($@"Meshes\{width}\LevelCrossing_Rail_Insert.obj")
                .SetConsistentUVs();

                node1.m_flagsForbidden = NetNode.Flags.LevelCrossing;
                node3.m_flagsRequired  = NetNode.Flags.LevelCrossing;
                node5.m_flagsRequired  = NetNode.Flags.LevelCrossing;
                node6.m_material       = elevatedMaterial;
                node6.m_lodMaterial    = elevatedLODMaterial;
                node6.m_flagsRequired  = NetNode.Flags.LevelCrossing;
                nodeList.AddRange(GenerateLevelCrossing(info));
                if (isOneWay || isLarge)
                {
                    nodeList.AddRange(GenerateSplitTracks(info, version));
                }

                info.m_segments = new[] { segment0, segment1, segment2 };
                info.m_nodes    = nodeList.ToArray();
                break;
            }

            case NetInfoVersion.Elevated:
            {
                var segment0 = info.m_segments[0].ShallowClone();
                var segment1 = info.m_segments[1].ShallowClone();
                var segment2 = info.m_segments[0].ShallowClone();
                var segment3 = info.m_segments[0].ShallowClone();
                var node0    = info.m_nodes[0].ShallowClone();
                var node1    = info.m_nodes[1].ShallowClone();
                var node2    = info.m_nodes[0].ShallowClone();
                var node3    = info.m_nodes[3].ShallowClone();
                var node4    = info.m_nodes[0].ShallowClone();
                var nodeList = new List <NetInfo.Node>();
                nodeList.Add(node0);
                nodeList.Add(node1);
                nodeList.Add(node2);
                nodeList.Add(node3);
                nodeList.Add(node4);

                segment0
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\Elevated_Pavement.obj",
                    $@"Meshes\{width}\Elevated_Pavement_LOD.obj")
                .SetConsistentUVs();             //ehem

                segment1
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\Boosted_Rail.obj");
                segment2
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\ThirdRail.obj", $@"Meshes\{width}\Blank.obj")
                .SetConsistentUVs();
                segment3
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\Elevated_RailGuards.obj", $@"Meshes\{width}\Blank.obj")
                .SetConsistentUVs();
                node0
                .SetFlags(NetNode.Flags.None, NetNode.Flags.Transition)
                .SetMeshes
                    ($@"Meshes\{width}\Elevated_Node_Pavement.obj",
                    $@"Meshes\{width}\Elevated_Node_Pavement_LOD.obj");
                node1
                .SetMeshes
                    ($@"Meshes\{width}\Boosted_Rail.obj");
                node2
                .SetFlags(NetNode.Flags.Transition, NetNode.Flags.None)
                .SetMeshes
                    ($@"Meshes\10m\Elevated_Trans_Pavement.obj",
                    $@"Meshes\{width}\Elevated_Node_Pavement_LOD.obj");
                node4
                .SetMeshes
                    ($@"Meshes\{width}\ThirdRail_Node.obj", $@"Meshes\{width}\Blank.obj")
                .SetConsistentUVs();

                segment0.m_material    = elevatedMaterial;
                segment0.m_lodMaterial = elevatedLODMaterial;
                segment3.m_material    = elevatedMaterial;
                segment3.m_lodMaterial = elevatedLODMaterial;

                node0.m_material    = elevatedMaterial;
                node0.m_lodMaterial = elevatedLODMaterial;
                node2.m_material    = elevatedMaterial;
                node2.m_lodMaterial = elevatedLODMaterial;
                if (isOneWay || isLarge)
                {
                    nodeList.AddRange(GenerateLevelCrossing(info));
                    nodeList.AddRange(GenerateSplitTracks(info, version));
                }
                info.m_segments = new[] { segment0, segment1, segment2, segment3 };
                info.m_nodes    = nodeList.ToArray();
                break;
            }

            case NetInfoVersion.Bridge:
            {
                var segment0 = info.m_segments[0].ShallowClone();
                var segment1 = info.m_segments[1].ShallowClone();
                var segment2 = info.m_segments[0].ShallowClone();
                var segment3 = info.m_segments[0].ShallowClone();
                var node0    = info.m_nodes[0].ShallowClone();
                var node1    = info.m_nodes[1].ShallowClone();
                var node2    = info.m_nodes[0].ShallowClone();
                var node3    = info.m_nodes[3].ShallowClone();
                var node4    = info.m_nodes[0].ShallowClone();
                var nodeList = new List <NetInfo.Node>();
                nodeList.Add(node0);
                nodeList.Add(node1);
                nodeList.Add(node2);
                nodeList.Add(node3);
                nodeList.Add(node4);
                segment0
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\Bridge_Pavement.obj",
                    $@"Meshes\{width}\Bridge_Pavement_LOD.obj")
                .SetConsistentUVs();
                segment1
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\Boosted_Rail.obj");
                segment2
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\ThirdRail.obj", $@"Meshes\{width}\Blank.obj")
                .SetConsistentUVs();
                segment3
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\Elevated_RailGuards.obj", $@"Meshes\{width}\Blank.obj")
                .SetConsistentUVs();
                node0
                .SetFlags(NetNode.Flags.None, NetNode.Flags.Transition)
                .SetMeshes
                    ($@"Meshes\{width}\Bridge_Node_Pavement.obj",
                    $@"Meshes\{width}\Bridge_Node_Pavement_LOD.obj")
                .SetConsistentUVs();
                node1
                .SetMeshes
                    ($@"Meshes\{width}\Boosted_Rail.obj");
                node2
                .SetFlags(NetNode.Flags.Transition, NetNode.Flags.None)
                .SetMeshes
                    ($@"Meshes\10m\Bridge_Trans_Pavement.obj",
                    $@"Meshes\{width}\Bridge_Node_Pavement_LOD.obj")
                .SetConsistentUVs();
                node4
                .SetMeshes
                    ($@"Meshes\{width}\ThirdRail_Node.obj", $@"Meshes\{width}\Blank.obj")
                .SetConsistentUVs();
                segment0.m_material    = elevatedMaterial;
                segment0.m_lodMaterial = elevatedLODMaterial;
                segment3.m_material    = elevatedMaterial;
                segment3.m_lodMaterial = elevatedLODMaterial;
                node0.m_material       = elevatedMaterial;
                node0.m_lodMaterial    = elevatedLODMaterial;
                node2.m_material       = elevatedMaterial;
                node2.m_lodMaterial    = elevatedLODMaterial;
                if (isOneWay || isLarge)
                {
                    nodeList.AddRange(GenerateLevelCrossing(info));
                    nodeList.AddRange(GenerateSplitTracks(info, version));
                }
                info.m_segments = new[] { segment0, segment1, segment2, segment3 };
                info.m_nodes    = nodeList.ToArray();
                break;
            }

            case NetInfoVersion.Slope:
            {
                var segment0 = metroInfo.m_segments[0].ShallowClone();
                var segment1 = info.m_segments[1].ShallowClone();
                var segment2 = info.m_segments[3].ShallowClone();
                var segment3 = info.m_segments[1].ShallowClone();
                var node0    = metroInfo.m_nodes[0].ShallowClone();
                var node1    = info.m_nodes[1].ShallowClone();
                var node2    = info.m_nodes[3].ShallowClone();
                var node3    = info.m_nodes[1].ShallowClone();
                var node4    = info.m_nodes[4].ShallowClone();
                var node5    = info.m_nodes[0].ShallowClone();
                var node6    = info.m_nodes[1].ShallowClone();
                var node7    = info.m_nodes[3].ShallowClone();
                var node8    = info.m_nodes[3].ShallowClone();
                var nodeList = new List <NetInfo.Node>();
                nodeList.Add(node0);
                nodeList.Add(node1);
                nodeList.Add(node2);
                nodeList.Add(node3);
                nodeList.Add(node4);
                nodeList.Add(node5);
                nodeList.Add(node6);
                nodeList.Add(node7);
                nodeList.Add(node8);
                segment1
                .SetMeshes
                    ($@"Meshes\{width}\Boosted_Rail.obj")
                .SetConsistentUVs();
                segment2
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\Slope_Pavement.obj",
                    $@"Meshes\{width}\Slope_Pavement_LOD.obj")
                .SetConsistentUVs();
                segment3
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\ThirdRail.obj", $@"Meshes\{width}\Blank.obj")
                .SetConsistentUVs();
                node1
                .SetMeshes
                    ($@"Meshes\{width}\Boosted_Rail.obj")
                .SetConsistentUVs();
                node2
                .SetMeshes
                    ($@"Meshes\{width}\Slope_Node_Pavement.obj",
                    $@"Meshes\{width}\Slope_Node_Pavement_LOD.obj")
                .SetConsistentUVs();

                node3
                .SetFlags(NetNode.Flags.LevelCrossing, NetNode.Flags.None)
                .SetMeshes
                    ($@"Meshes\{width}\LevelCrossing_Rail.obj")
                .SetConsistentUVs();

                node4
                .SetMeshes
                    ($@"Meshes\{width}\LevelCrossing_Pavement.obj",
                    $@"Meshes\{width}\LevelCrossing_Pavement_LOD.obj")
                .SetConsistentUVs();

                node5
                .SetMeshes
                    ($@"Meshes\{width}\Slope_U_Node_Pavement.obj",
                    $@"Meshes\{width}\Tunnel_Node_Pavement_LOD.obj")
                .SetConsistentUVs();
                node6
                .SetFlags(NetNode.Flags.Underground, NetNode.Flags.None)
                .SetMeshes
                    ($@"Meshes\{width}\Boosted_Rail.obj")
                .SetConsistentUVs();
                node7
                .SetMeshes
                    ($@"Meshes\{width}\ThirdRail_Node.obj", $@"Meshes\{width}\Blank.obj")
                .SetConsistentUVs();
                node8
                .SetFlags(NetNode.Flags.Underground, NetNode.Flags.None)
                .SetMeshes
                    ($@"Meshes\{width}\ThirdRail_Node.obj", $@"Meshes\{width}\Blank.obj")
                .SetConsistentUVs();
                segment2.m_material    = elevatedMaterial;
                segment2.m_lodMaterial = elevatedLODMaterial;
                segment3.m_material    = elevatedMaterial;
                segment3.m_lodMaterial = elevatedLODMaterial;
                node2.m_material       = elevatedMaterial;
                node2.m_lodMaterial    = elevatedLODMaterial;
                node5.m_material       = elevatedMaterial;
                node5.m_lodMaterial    = elevatedLODMaterial;
                if (isOneWay || isLarge)
                {
                    nodeList.AddRange(GenerateLevelCrossing(info));
                    nodeList.AddRange(GenerateSplitTracks(info, version));
                }
                info.m_segments = new[] { segment0, segment1, segment2, segment3 };
                info.m_nodes    = nodeList.ToArray();
                break;
            }

            case NetInfoVersion.Tunnel:
            {
                var segment0 = metroInfo.m_segments[0].ShallowClone();
                var segment1 = info.m_segments[0].ShallowClone();
                var segment2 = info.m_segments[0].ShallowClone();
                var segment3 = info.m_segments[0].ShallowClone();
                var node0    = metroInfo.m_nodes[0].ShallowClone();
                var node1    = info.m_nodes[0].ShallowClone();
                var node2    = info.m_nodes[0].ShallowClone();
                var node3    = info.m_nodes[0].ShallowClone();

                var nodeList = new List <NetInfo.Node>();
                nodeList.Add(node0);
                nodeList.Add(node1);
                nodeList.Add(node2);

                segment1
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\Tunnel_Pavement.obj",
                    $@"Meshes\{width}\Tunnel_Pavement_LOD.obj")
                .SetConsistentUVs();
                segment2
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\Boosted_Rail.obj");
                segment3
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\ThirdRail.obj", $@"Meshes\{width}\Blank.obj")
                .SetConsistentUVs();
                node1
                .SetMeshes
                    ($@"Meshes\{width}\Tunnel_Node_Pavement.obj",
                    $@"Meshes\{width}\Tunnel_Node_Pavement_LOD.obj")
                .SetConsistentUVs();
                node2
                .SetMeshes
                    ($@"Meshes\{width}\Boosted_Rail.obj")
                .SetConsistentUVs();
                node3
                .SetMeshes
                    ($@"Meshes\{width}\ThirdRail_Node.obj", $@"Meshes\{width}\Blank.obj")
                .SetConsistentUVs();
                segment1.m_material    = elevatedbrMaterial;
                segment1.m_lodMaterial = elevatedLODMaterial;
                RoadHelper.HandleAsymSegmentFlags(segment1);
                segment2.m_material    = elevatedbrMaterial;
                segment2.m_lodMaterial = elevatedLODMaterial;
                segment3.m_material    = elevatedbrMaterial;
                segment3.m_lodMaterial = elevatedLODMaterial;
                node1.m_material       = elevatedMaterial;
                node1.m_lodMaterial    = elevatedLODMaterial;
                node2.m_material       = elevatedMaterial;
                node2.m_lodMaterial    = elevatedLODMaterial;
                node2.m_connectGroup   = isOneWay ? (NetInfo.ConnectGroup) 32 | NetInfo.ConnectGroup.NarrowTram : NetInfo.ConnectGroup.NarrowTram;
                node2.m_directConnect  = true;
                node3.m_material       = elevatedMaterial;
                node3.m_lodMaterial    = elevatedLODMaterial;
                if (isOneWay || isLarge)
                {
                    nodeList.AddRange(GenerateSplitTracks(info, version));
                }
                info.m_segments = new[] { segment0, segment1, segment2, segment3 };
                info.m_nodes    = nodeList.ToArray();
                break;
            }
            }
        }
Exemple #11
0
        public static void Setup22mMesh(this NetInfo info, NetInfoVersion version, LanesLayoutStyle lanesLayoutStyle = LanesLayoutStyle.Symmetrical)
        {
            ///////////////////////////
            // Template              //
            ///////////////////////////
            var highwayInfo        = Prefabs.Find <NetInfo>(NetInfos.Vanilla.HIGHWAY_3L);
            var defaultMaterial    = highwayInfo.m_nodes[0].m_material;
            var defaultLODMaterial = highwayInfo.m_nodes[0].m_lodMaterial;

            if (version == NetInfoVersion.Ground)
            {
                if (lanesLayoutStyle != LanesLayoutStyle.Symmetrical)
                {
                    var segment0 = info.m_segments[0].ShallowClone();
                    RoadHelper.HandleAsymSegmentFlags(segment0);
                    info.m_segments = new[] { segment0 };
                }
            }
            if (version == NetInfoVersion.Elevated || version == NetInfoVersion.Bridge)
            {
                if (lanesLayoutStyle != LanesLayoutStyle.Symmetrical)
                {
                    var segment0 = info.m_segments[0].ShallowClone();
                    RoadHelper.HandleAsymSegmentFlags(segment0);
                    var segments = info.m_segments.ToList();
                    segments[0]     = segment0;
                    info.m_segments = segments.ToArray();
                }
            }
            if (version == NetInfoVersion.Slope)
            {
                var segments0 = info.m_segments[0].ShallowClone();
                var segments1 = info.m_segments[1].ShallowClone();
                var segments2 = info.m_segments[1].ShallowClone();
                var nodes0    = info.m_nodes[0].ShallowClone();
                var nodes1    = info.m_nodes[1].ShallowClone();
                var nodes2    = info.m_nodes[0].ShallowClone();
                //var nodes1 = info.m_nodes[1].ShallowClone();
                segments1
                .SetMeshes
                    (@"Roads\Highways\Common\Meshes\22m\Slope.obj");

                segments2
                .SetMeshes
                    (@"Roads\Highways\Common\Meshes\22m\Slope_Cover.obj",
                    @"Roads\Common\Meshes\Blank.obj")
                .SetConsistentUVs();

                nodes2
                .SetFlags(NetNode.Flags.Underground, NetNode.Flags.None)
                .SetMeshes
                    (@"Roads\Highways\Common\Meshes\22m\Slope_U_Node.obj",
                    @"Roads\Highways\Common\Meshes\22m\Slope_U_Node_LOD.obj");
                //nodes1
                //    .SetFlags(NetNode.Flags.UndergroundTransition, NetNode.Flags.None)
                //    .SetMeshes
                //    (@"Roads\Highways\Common\Meshes\22m\Slope_U_Trans.obj",
                //    @"Roads\Highways\Common\Meshes\22m\Slope_U_Trans_LOD.obj");
                if (lanesLayoutStyle != LanesLayoutStyle.Symmetrical)
                {
                    RoadHelper.HandleAsymSegmentFlags(segments1);
                }
                nodes2.m_material    = defaultMaterial;
                nodes2.m_lodMaterial = defaultLODMaterial;
                //nodes1.m_material = defaultMaterial;
                //nodes1.m_lodMaterial = defaultLODMaterial;

                info.m_segments = new[] { segments0, segments1 };
                info.m_nodes    = new[] { nodes0, nodes1, nodes2 };
            }
            else if (version == NetInfoVersion.Tunnel)
            {
                var segments0 = info.m_segments[0].ShallowClone();
                var segments1 = info.m_segments[0].ShallowClone();
                var nodes0    = info.m_nodes[0].ShallowClone();
                var nodes1    = info.m_nodes[0].ShallowClone();
                var nodes2    = info.m_nodes[0].ShallowClone();

                nodes1.m_flagsForbidden = NetNode.Flags.None;
                nodes1.m_flagsRequired  = NetNode.Flags.None;

                segments1.SetMeshes
                    (@"Roads\Highways\Common\Meshes\22m\Tunnel.obj",
                    @"Roads\Highways\Common\Meshes\22m\Tunnel_LOD.obj");

                nodes1.SetMeshes
                    (@"Roads\Highways\Common\Meshes\22m\Tunnel_Node.obj",
                    @"Roads\Highways\Common\Meshes\22m\Tunnel_Node_LOD.obj");

                //nodes2.SetMeshes
                //    (@"Roads\Highways\Common\Meshes\22m\Tunnel_Trans.obj",
                //     @"Roads\Highways\Common\Meshes\22m\Tunnel_Trans_LOD.obj");

                if (lanesLayoutStyle != LanesLayoutStyle.Symmetrical)
                {
                    RoadHelper.HandleAsymSegmentFlags(segments1);
                }

                segments1.m_material    = defaultMaterial;
                segments1.m_lodMaterial = defaultLODMaterial;
                nodes1.m_material       = defaultMaterial;
                nodes1.m_lodMaterial    = defaultLODMaterial;

                info.m_segments = new[] { segments0, segments1 };
                info.m_nodes    = new[] { nodes0, nodes1, nodes2 };
            }
        }
        public static void Setup10mMesh(NetInfo info, NetInfoVersion version, NetInfo elevatedInfo, NetInfo metroInfo)
        {
            var isOneWay            = info.name.Contains("One-Way");
            var isLarge             = info.name.Contains("Large");
            var width               = isLarge ? "18m" : "10m";
            var brElInfo            = Prefabs.Find <NetInfo>("Basic Road Elevated");
            var trainTrackInfo      = Prefabs.Find <NetInfo>("Train Track");
            var elevatedbrMaterial  = brElInfo.m_segments[0].m_lodMaterial;
            var elevatedMaterial    = elevatedInfo.m_segments[0].m_material;
            var elevatedLODMaterial = elevatedInfo.m_segments[0].m_lodMaterial;
            var railMaterial        = trainTrackInfo.m_segments[1].m_material;
            var railLODMaterial     = trainTrackInfo.m_segments[1].m_lodMaterial;
            var nodeList            = new List <NetInfo.Node>();

            switch (version)
            {
            case NetInfoVersion.Ground:
            {
                var segment0 = info.m_segments[0].ShallowClone();
                var segment1 = info.m_segments[1].ShallowClone();
                var segment2 = info.m_segments[0].ShallowClone();
                var node0    = info.m_nodes[0].ShallowClone();

                var node4 = info.m_nodes[0].ShallowClone();

                nodeList.Add(node0);
                nodeList.Add(node4);

                segment0
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\Ground_Pavement.obj",
                    $@"Meshes\{width}\Ground_Pavement_LOD.obj");
                //if (isLarge)
                //{
                segment1
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\Rail.obj",
                    $@"Meshes\{width}\Rail_LOD.obj")
                .SetConsistentUVs();
                //}
                //else
                //{
                //    segment1
                //        .SetFlagsDefault()
                //        .SetMeshes
                //        ($@"Meshes\{width}\Rail.obj")
                //        .SetConsistentUVs();
                //}

                segment2
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\ThirdRail.obj",
                    $@"Meshes\{width}\Rail_LOD.obj")
                .SetConsistentUVs();
                node0
                .SetMeshes
                    ($@"Meshes\{width}\Ground_Node_Pavement.obj",
                    $@"Meshes\{width}\Ground_Node_Pavement_LOD.obj");
                node4
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\ThirdRail_Node.obj", $@"Meshes\{width}\Rail_LOD.obj")
                .SetConsistentUVs();
                segment2.m_material    = railMaterial;
                segment2.m_lodMaterial = railLODMaterial;
                node4.m_material       = railMaterial;
                node4.m_lodMaterial    = railLODMaterial;
                info.m_segments        = new[] { segment0, segment1, segment2 };
                break;
            }

            case NetInfoVersion.Elevated:
            {
                var segment0 = info.m_segments[0].ShallowClone();
                var segment1 = info.m_segments[0].ShallowClone();
                var segment2 = info.m_segments[1].ShallowClone();
                var segment3 = info.m_segments[0].ShallowClone();
                var segment4 = info.m_segments[1].ShallowClone();
                var node0    = info.m_nodes[0].ShallowClone();

                var node2 = info.m_nodes[0].ShallowClone();
                var node4 = info.m_nodes[0].ShallowClone();

                nodeList.Add(node0);
                nodeList.Add(node2);
                nodeList.Add(node4);

                segment0
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\Elevated_Pavement.obj",
                    $@"Meshes\{width}\Elevated_Pavement_LOD.obj");

                segment1
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\Boosted_Rail.obj",
                    $@"Meshes\{width}\Blank.obj")
                .SetConsistentUVs();
                segment4
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\Rail.obj",
                    $@"Meshes\{width}\Rail_LOD.obj")
                .SetConsistentUVs();

                segment2
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\ThirdRail.obj",
                    $@"Meshes\{width}\Rail_LOD.obj")
                .SetConsistentUVs();
                segment3
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\Elevated_RailGuards.obj", $@"Meshes\{width}\Blank.obj")
                .SetConsistentUVs();
                node0
                .SetFlags(NetNode.Flags.None, NetNode.Flags.Transition)
                .SetMeshes
                    ($@"Meshes\{width}\Elevated_Node_Pavement.obj",
                    $@"Meshes\{width}\Elevated_Node_Pavement_LOD.obj");
                node2
                .SetFlags(NetNode.Flags.Transition, NetNode.Flags.None)
                .SetMeshes
                    ($@"Meshes\{width}\Elevated_Trans_Pavement.obj",
                    $@"Meshes\{width}\Elevated_Node_Pavement_LOD.obj");
                node4
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\ThirdRail_Node.obj", $@"Meshes\{width}\Rail_LOD.obj")
                .SetConsistentUVs();
                segment0.m_material    = elevatedMaterial;
                segment0.m_lodMaterial = elevatedbrMaterial;
                segment2.m_material    = railMaterial;
                segment2.m_lodMaterial = railLODMaterial;
                node0.m_material       = elevatedMaterial;
                node0.m_lodMaterial    = elevatedbrMaterial;
                node2.m_material       = elevatedMaterial;
                node2.m_lodMaterial    = elevatedLODMaterial;
                node4.m_material       = railMaterial;
                node4.m_lodMaterial    = railLODMaterial;
                info.m_segments        = new[] { segment0, segment1, segment2, segment3, segment4 };
                break;
            }

            case NetInfoVersion.Bridge:
            {
                var segment0 = info.m_segments[0].ShallowClone();
                var segment1 = info.m_segments[0].ShallowClone();
                var segment2 = info.m_segments[1].ShallowClone();
                var segment3 = info.m_segments[0].ShallowClone();
                var segment4 = info.m_segments[1].ShallowClone();
                var node0    = info.m_nodes[0].ShallowClone();

                var node2 = info.m_nodes[0].ShallowClone();
                var node4 = info.m_nodes[0].ShallowClone();

                nodeList.Add(node0);
                nodeList.Add(node2);
                nodeList.Add(node4);
                segment0
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\Bridge_Pavement.obj",
                    $@"Meshes\{width}\Bridge_Pavement_LOD.obj")
                .SetConsistentUVs();

                segment1
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\Boosted_Rail.obj",
                    $@"Meshes\{width}\Blank.obj")
                .SetConsistentUVs();

                segment4
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\Rail.obj",
                    $@"Meshes\{width}\Rail_LOD.obj")
                .SetConsistentUVs();

                segment2
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\ThirdRail.obj",
                    $@"Meshes\{width}\Rail_LOD.obj")
                .SetConsistentUVs();
                segment3
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\Elevated_RailGuards.obj", $@"Meshes\{width}\Blank.obj")
                .SetConsistentUVs();
                node0
                .SetFlags(NetNode.Flags.None, NetNode.Flags.Transition)
                .SetMeshes
                    ($@"Meshes\{width}\Bridge_Node_Pavement.obj",
                    $@"Meshes\{width}\Bridge_Node_Pavement_LOD.obj")
                .SetConsistentUVs();

                node2
                .SetFlags(NetNode.Flags.Transition, NetNode.Flags.None)
                .SetMeshes
                    ($@"Meshes\{width}\Bridge_Trans_Pavement.obj",
                    $@"Meshes\{width}\Bridge_Node_Pavement_LOD.obj")
                .SetConsistentUVs();
                node4
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\ThirdRail_Node.obj", $@"Meshes\{width}\Rail_LOD.obj")
                .SetConsistentUVs();
                segment0.m_material    = elevatedMaterial;
                segment0.m_lodMaterial = elevatedbrMaterial;
                segment2.m_material    = railMaterial;
                segment2.m_lodMaterial = railLODMaterial;
                segment3.m_material    = elevatedMaterial;
                segment3.m_lodMaterial = elevatedbrMaterial;
                node0.m_material       = elevatedMaterial;
                node0.m_lodMaterial    = elevatedbrMaterial;
                node2.m_material       = elevatedMaterial;
                node2.m_lodMaterial    = elevatedLODMaterial;
                node4.m_material       = railMaterial;
                node4.m_lodMaterial    = railLODMaterial;
                info.m_segments        = new[] { segment0, segment1, segment2, segment3, segment4 };
                break;
            }

            case NetInfoVersion.Slope:
            {
                var segment0 = metroInfo.m_segments[0].ShallowClone();
                var segment1 = info.m_segments[3].ShallowClone();
                var segment2 = info.m_segments[3].ShallowClone();
                var segment3 = info.m_segments[0].ShallowClone();
                var segment4 = info.m_segments[1].ShallowClone();
                var node0    = metroInfo.m_nodes[0].ShallowClone();

                var node2 = info.m_nodes[3].ShallowClone();
                var node5 = info.m_nodes[0].ShallowClone();
                var node7 = info.m_nodes[0].ShallowClone();

                nodeList.Add(node0);

                nodeList.Add(node2);
                nodeList.Add(node5);
                nodeList.Add(node7);
                segment0
                .SetMeshes
                    ($@"Meshes\{width}\Tunnel_Pavement_Gray.obj",
                    $@"Meshes\{width}\Tunnel_Pavement_Gray_LOD.obj");

                segment1
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\Boosted_Rail.obj",
                    $@"Meshes\{width}\Blank.obj")
                .SetConsistentUVs();
                segment4
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\Rail.obj",
                    $@"Meshes\{width}\Rail_LOD.obj")
                .SetConsistentUVs();

                segment2
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\Slope_Pavement.obj",
                    $@"Meshes\{width}\Slope_Pavement_LOD.obj")
                .SetConsistentUVs();
                segment3
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\ThirdRail.obj",
                    $@"Meshes\{width}\Rail_LOD.obj")
                .SetConsistentUVs();
                node0
                .SetMeshes
                    ($@"Meshes\{width}\Tunnel_Pavement_Gray.obj",
                    $@"Meshes\{width}\Tunnel_Pavement_Gray_LOD.obj");
                node2
                .SetMeshes
                    ($@"Meshes\{width}\Slope_Node_Pavement.obj",
                    $@"Meshes\{width}\Slope_Node_Pavement_LOD.obj")
                .SetConsistentUVs();

                node5
                .SetMeshes
                    ($@"Meshes\{width}\Slope_U_Node_Pavement.obj",
                    $@"Meshes\{width}\Tunnel_Node_Pavement_LOD.obj")
                .SetConsistentUVs();

                node7
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\ThirdRail_Node.obj", $@"Meshes\{width}\Rail_LOD.obj")
                .SetConsistentUVs();
                segment2.m_material    = elevatedMaterial;
                segment2.m_lodMaterial = elevatedLODMaterial;
                segment3.m_material    = railMaterial;
                segment3.m_lodMaterial = railLODMaterial;
                node2.m_material       = elevatedMaterial;
                node2.m_lodMaterial    = elevatedLODMaterial;
                node5.m_material       = elevatedMaterial;
                node5.m_lodMaterial    = elevatedLODMaterial;
                node7.m_material       = railMaterial;
                node7.m_lodMaterial    = railLODMaterial;
                //node6.m_connectGroup = info.m_connectGroup;
                info.m_segments = new[] { segment0, segment1, segment2, segment3, segment4 };
                break;
            }

            case NetInfoVersion.Tunnel:
            {
                var segment0 = metroInfo.m_segments[0].ShallowClone();
                var segment1 = info.m_segments[0].ShallowClone();
                var segment2 = info.m_segments[0].ShallowClone();
                var segment3 = info.m_segments[0].ShallowClone();
                var segment4 = info.m_segments[0].ShallowClone();
                var node0    = metroInfo.m_nodes[0].ShallowClone();
                var node1    = info.m_nodes[0].ShallowClone();
                var node3    = info.m_nodes[0].ShallowClone();

                nodeList.Add(node0);
                nodeList.Add(node1);
                nodeList.Add(node3);
                segment0
                .SetMeshes
                    ($@"Meshes\{width}\Tunnel_Pavement_Gray.obj",
                    $@"Meshes\{width}\Tunnel_Pavement_Gray_LOD.obj");
                segment1
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\Tunnel_Pavement.obj",
                    $@"Meshes\{width}\Tunnel_Pavement_LOD.obj")
                .SetConsistentUVs();
                segment2
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\Boosted_Rail.obj");
                segment3
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\ThirdRail.obj",
                    $@"Meshes\{width}\Rail_LOD.obj")
                .SetConsistentUVs();
                segment4
                .SetFlagsDefault()
                .SetMeshes
                    ($@"Meshes\{width}\Rail.obj");
                node0
                .SetMeshes
                    ($@"Meshes\{width}\Tunnel_Pavement_Gray.obj",
                    $@"Meshes\{width}\Tunnel_Pavement_Gray_LOD.obj");
                node1
                .SetMeshes
                    ($@"Meshes\{width}\Tunnel_Node_Pavement.obj",
                    $@"Meshes\{width}\Tunnel_Node_Pavement_LOD.obj")
                .SetConsistentUVs();

                node3
                .SetMeshes
                    ($@"Meshes\{width}\ThirdRail_Node.obj", $@"Meshes\{width}\Rail_LOD.obj")
                .SetConsistentUVs();

                RoadHelper.HandleAsymSegmentFlags(segment1);
                segment1.m_material    = elevatedbrMaterial;
                segment1.m_lodMaterial = elevatedLODMaterial;
                segment2.m_material    = elevatedbrMaterial;
                segment2.m_lodMaterial = elevatedLODMaterial;
                segment3.m_material    = railMaterial;
                segment3.m_lodMaterial = railLODMaterial;
                segment4.m_material    = railMaterial;
                segment4.m_lodMaterial = railLODMaterial;
                node1.m_material       = elevatedMaterial;
                node1.m_lodMaterial    = elevatedLODMaterial;
                node3.m_material       = railMaterial;
                node3.m_lodMaterial    = railLODMaterial;
                info.m_segments        = new[] { segment0, segment1, segment2, segment3, segment4 };
                break;
            }
            }
            for (int i = 0; i < nodeList.Count; i++)
            {
                nodeList[i].m_flagsForbidden |= NetNode.Flags.LevelCrossing;
            }
            nodeList.AddRange(SetupMeshUtil.GenerateSplitTracksAndLevelCrossings(info, version));
            info.m_nodes = nodeList.ToArray();
        }
Exemple #13
0
        public static void Setup6mMesh(this NetInfo info, NetInfoVersion version)
        {
            var ttInfo   = Prefabs.Find <NetInfo>("Train Track");
            var brElInfo = Prefabs.Find <NetInfo>("Basic Road Elevated");
            //var ttElInfo = Prefabs.Find<NetInfo>("Train Track Elevated");
            var defaultMaterial    = brElInfo.m_segments[0].m_material;
            var defaultLODMaterial = brElInfo.m_segments[0].m_lodMaterial;
            var railMaterial       = ttInfo.m_segments[1].m_material;
            var railLODMaterial    = ttInfo.m_segments[1].m_lodMaterial;
            var isTwoWay           = info.name.Contains("Two-Way");
            var nodeList           = new List <NetInfo.Node>();

            switch (version)
            {
            case NetInfoVersion.Ground:
            {
                var segments0 = info.m_segments[0].ShallowClone();
                var segments1 = info.m_segments[1].ShallowClone();
                var segments3 = info.m_segments[1].ShallowClone();
                var nodes0    = info.m_nodes[0].ShallowClone();
                nodeList.Add(nodes0);

                segments0
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Ground_Pavement.obj",
                    @"Meshes\6m\Ground_Pavement_LOD.obj");

                segments1
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Ground_Rail.obj",
                    @"Meshes\6m\Rail_LOD.obj");

                segments3
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\ThirdRail.obj",
                    $@"Meshes\6m\Rail_LOD.obj")
                .SetConsistentUVs();

                nodes0
                .SetMeshes
                    (@"Meshes\6m\Ground_Node_Pavement.obj",
                    @"Meshes\6m\Ground_Node_Pavement_LOD.obj");

                RoadHelper.HandleAsymSegmentFlags(segments3);
                info.m_segments = new[] { segments0, segments1, /*segments2*/ segments3 };
                break;
            }

            case NetInfoVersion.Elevated:
            {
                var segments0 = info.m_segments[0].ShallowClone();
                var segments1 = info.m_segments[0].ShallowClone();
                var segments2 = info.m_segments[1].ShallowClone();
                var segments3 = info.m_segments[0].ShallowClone();
                var segments4 = info.m_segments[0].ShallowClone();
                var nodes0    = info.m_nodes[0].ShallowClone();
                var nodes2    = info.m_nodes[0].ShallowClone();
                nodeList.Add(nodes0);
                nodeList.Add(nodes2);
                segments0
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Elevated_Pavement.obj",
                    @"Meshes\6m\Elevated_Pavement_LOD.obj");

                segments1
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Boosted_Rail.obj",
                    @"Meshes\10m\Blank.obj");
                segments2
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Rail.obj",
                    @"Meshes\6m\Rail_LOD.obj");
                segments3
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\ThirdRail.obj",
                    $@"Meshes\6m\Rail_LOD.obj")
                .SetConsistentUVs();
                segments4
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Elevated_RailGuards.obj",
                    @"Meshes\10m\Blank.obj")
                .SetConsistentUVs();
                nodes0
                .SetFlags(NetNode.Flags.None, NetNode.Flags.Transition)
                .SetMeshes
                    (@"Meshes\6m\Elevated_Pavement.obj",
                    @"Meshes\6m\Elevated_Node_Pavement_LOD.obj");

                nodes2
                .SetFlags(NetNode.Flags.Transition, NetNode.Flags.None)
                .SetMeshes
                    (@"Meshes\6m\Elevated_Trans_Pavement.obj",
                    @"Meshes\6m\Elevated_Node_Pavement_LOD.obj");
                RoadHelper.HandleAsymSegmentFlags(segments3);
                segments0.m_material    = defaultMaterial;
                segments0.m_lodMaterial = defaultLODMaterial;
                segments3.m_material    = railMaterial;
                segments3.m_lodMaterial = railLODMaterial;
                segments4.m_material    = defaultMaterial;
                segments4.m_lodMaterial = defaultLODMaterial;
                nodes0.m_material       = defaultMaterial;
                nodes0.m_lodMaterial    = defaultLODMaterial;
                nodes2.m_material       = defaultMaterial;
                nodes2.m_lodMaterial    = defaultLODMaterial;
                info.m_segments         = new[] { segments0, segments1, segments2, segments3, segments4 };
                break;
            }

            case NetInfoVersion.Bridge:
            {
                var segments0 = info.m_segments[0].ShallowClone();
                var segments1 = info.m_segments[0].ShallowClone();
                var segments2 = info.m_segments[1].ShallowClone();
                var segments3 = info.m_segments[1].ShallowClone();
                var segments4 = info.m_segments[0].ShallowClone();
                var nodes0    = info.m_nodes[0].ShallowClone();
                var nodes2    = info.m_nodes[0].ShallowClone();
                nodeList.Add(nodes0);
                nodeList.Add(nodes2);
                segments0
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Bridge_Pavement.obj",
                    @"Meshes\6m\Bridge_Pavement_LOD.obj");

                segments1
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Boosted_Rail.obj",
                    @"Meshes\10m\Blank.obj");
                segments2
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Rail.obj",
                    @"Meshes\6m\Rail_LOD.obj");
                segments3
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\ThirdRail.obj",
                    $@"Meshes\6m\Rail_LOD.obj")
                .SetConsistentUVs();
                segments4
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Elevated_RailGuards.obj",
                    @"Meshes\10m\Blank.obj")
                .SetConsistentUVs();
                nodes0
                .SetFlags(NetNode.Flags.None, NetNode.Flags.Transition)
                .SetMeshes
                    (@"Meshes\6m\Bridge_Node_Pavement.obj",
                    @"Meshes\6m\Elevated_Node_Pavement_LOD.obj")
                .SetConsistentUVs();

                nodes2
                .SetFlags(NetNode.Flags.Transition, NetNode.Flags.None)
                .SetMeshes
                    (@"Meshes\6m\Bridge_Trans_Pavement.obj",
                    @"Meshes\6m\Elevated_Node_Pavement_LOD.obj")
                .SetConsistentUVs();
                var segmentNormals  = segments0.m_mesh.normals;
                var segmentVertices = segments0.m_mesh.vertices;
                var colors          = new List <UnityEngine.Color>();
                var colors32        = new List <UnityEngine.Color32>();

                for (int i = 0; i < segments0.m_mesh.vertexCount; i++)
                {
                    if (segmentNormals[i].y == 1 && segmentVertices[i].y == 0)
                    {
                        colors.Add(new UnityEngine.Color(255, 255, 255, 255));
                        colors32.Add(new UnityEngine.Color32(255, 255, 255, 255));
                    }
                    else
                    {
                        colors.Add(new UnityEngine.Color(255, 0, 255, 255));
                        colors32.Add(new UnityEngine.Color32(255, 0, 255, 255));
                    }
                }
                segments0.m_mesh.colors   = colors.ToArray();
                segments0.m_mesh.colors32 = colors32.ToArray();

                segmentNormals  = segments0.m_lodMesh.normals;
                segmentVertices = segments0.m_lodMesh.vertices;
                colors          = new List <UnityEngine.Color>();
                colors32        = new List <UnityEngine.Color32>();

                for (int i = 0; i < segments0.m_lodMesh.vertexCount; i++)
                {
                    if (segmentNormals[i].y == 1 && Math.Abs(segmentVertices[i].x) <= 3 && segmentVertices[i].y < 3)
                    {
                        colors.Add(new UnityEngine.Color(255, 255, 255, 255));
                        colors32.Add(new UnityEngine.Color32(255, 255, 255, 255));
                    }
                    else
                    {
                        colors.Add(new UnityEngine.Color(255, 0, 255, 255));
                        colors32.Add(new UnityEngine.Color32(255, 0, 255, 255));
                    }
                }
                segments0.m_lodMesh.colors   = colors.ToArray();
                segments0.m_lodMesh.colors32 = colors32.ToArray();
                RoadHelper.HandleAsymSegmentFlags(segments3);
                segments0.m_material    = defaultMaterial;
                segments0.m_lodMaterial = defaultLODMaterial;
                segments3.m_material    = railMaterial;
                segments3.m_lodMaterial = railLODMaterial;
                segments4.m_material    = defaultMaterial;
                segments4.m_lodMaterial = defaultLODMaterial;
                nodes0.m_material       = defaultMaterial;
                nodes0.m_lodMaterial    = defaultLODMaterial;
                nodes2.m_material       = defaultMaterial;
                nodes2.m_lodMaterial    = defaultLODMaterial;
                info.m_segments         = new[] { segments0, segments1, segments2, segments3, segments4 };
                break;
            }

            case NetInfoVersion.Slope:
            {
                var segments0 = info.m_segments[0].ShallowClone();
                var segments1 = info.m_segments[0].ShallowClone();
                var segments2 = info.m_segments[1].ShallowClone();
                var segments3 = info.m_segments[0].ShallowClone();
                var segments4 = info.m_segments[1].ShallowClone();
                var nodes0    = info.m_nodes[0].ShallowClone();
                //var nodes2 wires
                var nodes3 = info.m_nodes[3].ShallowClone();
                var nodes9 = info.m_nodes[0].ShallowClone();

                //var nodes10 = info.m_nodes[1].ShallowClone();
                nodeList.Add(nodes0);
                nodeList.Add(nodes3);
                nodeList.Add(nodes9);
                segments0
                .SetMeshes
                    ($@"Meshes\6m\Tunnel_Pavement_Gray.obj",
                    $@"Meshes\6m\Tunnel_Pavement_Gray_LOD.obj");
                segments1
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Boosted_Rail.obj",
                    @"Meshes\10m\Blank.obj")
                .SetConsistentUVs();
                segments2
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Rail.obj",
                    @"Meshes\6m\Rail_LOD.obj")
                .SetConsistentUVs();
                segments3
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Slope_Pavement.obj",
                    @"Meshes\6m\Slope_Pavement_LOD.obj")
                .SetConsistentUVs();

                segments4
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\ThirdRail.obj",
                    $@"Meshes\6m\Rail_LOD.obj")
                .SetConsistentUVs();
                nodes0
                .SetMeshes
                    (@"Meshes\6m\Tunnel_Pavement_Gray.obj",
                    @"Meshes\6m\Tunnel_Pavement_Gray_LOD.obj");

                nodes3
                .SetMeshes
                    (@"Meshes\6m\Slope_Node_Pavement.obj",
                    @"Meshes\6m\Ground_Node_Pavement_LOD.obj");
                nodes9
                .SetMeshes
                    (@"Meshes\6m\Slope_U_Node_Pavement.obj",
                    @"Meshes\6m\Tunnel_Node_Pavement_LOD.obj")
                .SetConsistentUVs();

                RoadHelper.HandleAsymSegmentFlags(segments4);
                segments1.m_material    = defaultMaterial;
                segments1.m_lodMaterial = defaultLODMaterial;
                segments3.m_material    = defaultMaterial;
                segments3.m_lodMaterial = defaultLODMaterial;
                segments4.m_material    = railMaterial;
                segments4.m_lodMaterial = railLODMaterial;
                nodes9.m_material       = defaultMaterial;
                nodes9.m_lodMaterial    = defaultLODMaterial;

                info.m_segments = new[] { segments0, segments1, segments2, segments3, segments4 };
                break;
            }

            case NetInfoVersion.Tunnel:
            {
                var segment0 = info.m_segments[0].ShallowClone();
                var segment1 = info.m_segments[0].ShallowClone();
                var segment2 = info.m_segments[0].ShallowClone();
                var segment3 = info.m_segments[0].ShallowClone();
                var segment4 = info.m_segments[0].ShallowClone();
                var node0    = info.m_nodes[0].ShallowClone();
                var node1    = info.m_nodes[0].ShallowClone();

                nodeList.Add(node0);
                nodeList.Add(node1);
                segment0
                .SetMeshes
                    (@"Meshes\6m\Tunnel_Pavement_Gray.obj",
                    @"Meshes\6m\Tunnel_Pavement_Gray_LOD.obj");
                segment1
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Tunnel_Pavement.obj")
                .SetConsistentUVs();
                segment2
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Boosted_Rail.obj",
                    @"Meshes\10m\Blank.obj");
                segment3
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\ThirdRail.obj",
                    @"Meshes\6m\Rail_LOD.obj")
                .SetConsistentUVs();
                segment4
                .SetFlagsDefault()
                .SetMeshes
                    (@"Meshes\6m\Rail.obj",
                    @"Meshes\6m\Rail_LOD.obj")
                .SetConsistentUVs();
                node0
                .SetMeshes
                    (@"Meshes\6m\Tunnel_Pavement_Gray.obj",
                    @"Meshes\6m\Tunnel_Pavement_Gray_LOD.obj");
                node1
                .SetMeshes
                    (@"Meshes\6m\Tunnel_Node_Pavement.obj",
                    @"Meshes\6m\Tunnel_Node_Pavement_LOD.obj")
                .SetConsistentUVs();

                segment1.m_material    = defaultMaterial;
                segment1.m_lodMaterial = defaultLODMaterial;
                segment2.m_material    = defaultMaterial;
                segment2.m_lodMaterial = defaultLODMaterial;
                segment3.m_material    = defaultMaterial;
                segment3.m_lodMaterial = defaultLODMaterial;
                segment4.m_material    = railMaterial;
                segment4.m_lodMaterial = railLODMaterial;
                RoadHelper.HandleAsymSegmentFlags(segment1);
                RoadHelper.HandleAsymSegmentFlags(segment3);
                node1.m_material    = defaultMaterial;
                node1.m_lodMaterial = defaultLODMaterial;

                info.m_segments = new[] { segment0, segment1, segment2, segment3, segment4 };
            }
            break;
            }
            for (int i = 0; i < nodeList.Count; i++)
            {
                nodeList[i].m_flagsForbidden |= NetNode.Flags.LevelCrossing;
            }
            nodeList.AddRange(SetupMeshUtil.GenerateSplitTracksAndLevelCrossings(info, version));
            info.m_nodes = nodeList.ToArray();
        }
        public static void Setup24mMesh(this NetInfo info, NetInfoVersion version, LanesLayoutStyle lanesLayoutStyle = LanesLayoutStyle.Symmetrical)
        {
            ///////////////////////////
            // Template              //
            ///////////////////////////
            var highwayInfo     = Prefabs.Find <NetInfo>(NetInfos.Vanilla.HIGHWAY_3L);
            var defaultMaterial = highwayInfo.m_nodes[0].m_material;

            if (version == NetInfoVersion.Ground)
            {
                var segments0 = info.m_segments[0].ShallowClone();
                var nodes0    = info.m_nodes[0].ShallowClone();
                var nodes1    = info.m_nodes[1].ShallowClone();
                segments0.SetMeshes(
                    @"Roads\Highways\Common\Meshes\24m\Ground.obj",
                    @"Roads\Highways\Common\Meshes\24m\Ground_LOD.obj");

                nodes0.SetMeshes(
                    @"Roads\Highways\Common\Meshes\24m\Ground_Node.obj",
                    @"Roads\Highways\Common\Meshes\24m\Ground_Node_LOD.obj");

                nodes1.SetMeshes(
                    @"Roads\Highways\Common\Meshes\24m\Ground_Trans.obj",
                    @"Roads\Highways\Common\Meshes\24m\Ground_Trans_LOD.obj");

                if (lanesLayoutStyle != LanesLayoutStyle.Symmetrical)
                {
                    RoadHelper.HandleAsymSegmentFlags(segments0);
                }

                info.m_segments = new[] { segments0 };
                info.m_nodes    = new[] { nodes0, nodes1 };
            }
            if (version == NetInfoVersion.Slope)
            {
                var segments0 = info.m_segments[0].ShallowClone();
                var segments1 = info.m_segments[1].ShallowClone();
                var segments2 = segments1.ShallowClone();
                var nodes0    = info.m_nodes[0].ShallowClone();
                var nodes1    = info.m_nodes[1].ShallowClone();
                var nodes2    = nodes0.ShallowClone();
                var nodes3    = nodes1.ShallowClone();

                segments0.m_backwardForbidden = NetSegment.Flags.None;
                segments0.m_backwardRequired  = NetSegment.Flags.None;

                segments0.m_forwardForbidden = NetSegment.Flags.None;
                segments0.m_forwardRequired  = NetSegment.Flags.None;

                segments1.m_backwardForbidden = NetSegment.Flags.None;
                segments1.m_backwardRequired  = NetSegment.Flags.None;

                segments1.m_forwardForbidden = NetSegment.Flags.None;
                segments1.m_forwardRequired  = NetSegment.Flags.None;

                segments2.m_backwardForbidden = NetSegment.Flags.None;
                segments2.m_backwardRequired  = NetSegment.Flags.None;

                segments2.m_forwardForbidden = NetSegment.Flags.None;
                segments2.m_forwardRequired  = NetSegment.Flags.None;

                nodes0.m_flagsForbidden = NetNode.Flags.None;
                nodes0.m_flagsRequired  = NetNode.Flags.Underground;

                nodes1.m_flagsForbidden = NetNode.Flags.UndergroundTransition;
                nodes1.m_flagsRequired  = NetNode.Flags.None;

                nodes2.m_flagsForbidden = NetNode.Flags.None;
                nodes2.m_flagsRequired  = NetNode.Flags.Underground;

                nodes3.m_flagsForbidden = NetNode.Flags.None;
                nodes3.m_flagsRequired  = NetNode.Flags.Transition;

                nodes1.SetMeshes
                    (@"Roads\Highways\Common\Meshes\24m\Ground_Node.obj",
                    @"Roads\Highways\Common\Meshes\24m\Ground_Node_LOD.obj");

                nodes2.SetMeshes
                    (@"Roads\Highways\Common\Meshes\24m\Slope_U_Node.obj",
                    @"Roads\Highways\Common\Meshes\24m\Slope_U_Node_LOD.obj");

                nodes3.SetMeshes
                    (@"Roads\Highways\Common\Meshes\24m\Ground_Trans.obj",
                    @"Roads\Highways\Common\Meshes\24m\Ground_Trans_LOD.obj");

                nodes2.m_material = defaultMaterial;

                info.m_segments = new[] { segments0, segments1 };
                info.m_nodes    = new[] { nodes0, nodes1, nodes2, nodes3 };
            }
            else if (version == NetInfoVersion.Tunnel)
            {
                var segments0 = info.m_segments[0].ShallowClone();
                var segments1 = segments0.ShallowClone();
                var nodes0    = info.m_nodes[0].ShallowClone();
                var nodes1    = nodes0.ShallowClone();
                //var nodes2 = nodes1.ShallowClone();

                //segments1.m_backwardForbidden = NetSegment.Flags.None;
                //segments1.m_backwardRequired = NetSegment.Flags.None;

                //segments1.m_forwardForbidden = NetSegment.Flags.None;
                //segments1.m_forwardRequired = NetSegment.Flags.None;

                nodes0.m_flagsForbidden = NetNode.Flags.None;
                nodes0.m_flagsRequired  = NetNode.Flags.None;

                nodes1.m_flagsForbidden = NetNode.Flags.None;
                nodes1.m_flagsRequired  = NetNode.Flags.None;

                //nodes2.m_flagsForbidden = NetNode.Flags.None;
                // nodes2.m_flagsRequired = NetNode.Flags.UndergroundTransition;

                segments0.SetMeshes
                    (@"Roads\Highways\Common\Meshes\24m\Tunnel_Gray.obj",
                    @"Roads\Highways\Common\Meshes\24m\Ground_LOD.obj");
                segments1.SetMeshes
                    (@"Roads\Highways\Common\Meshes\24m\Tunnel.obj",
                    @"Roads\Highways\Common\Meshes\24m\Tunnel_LOD.obj");
                nodes0.SetMeshes
                    (@"Roads\Highways\Common\Meshes\24m\Tunnel_Node_Gray.obj",
                    @"Roads\Highways\Common\Meshes\24m\Ground_Node_LOD.obj");
                nodes1.SetMeshes
                    (@"Roads\Highways\Common\Meshes\24m\Tunnel_Node.obj",
                    @"Roads\Highways\Common\Meshes\24m\Tunnel_Node_LOD.obj");

                // nodes2.SetMeshes
                //    (@"Roads\Highways\Common\Meshes\32m\Tunnel.obj",
                //    @"Roads\Highways\Common\Meshes\32m\Ground_LOD.obj");

                segments1.m_material = defaultMaterial;
                nodes1.m_material    = defaultMaterial;
                //nodes2.m_material = defaultMaterial;

                info.m_segments = new[] { segments0, segments1 };
                info.m_nodes    = new[] { nodes0, nodes1 };
            }
        }