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