/// <summary> /// Create the terrain for the road /// </summary> /// <param name="sections">The number of sections</param> /// <param name="tm">The terrain modifier</param> private void CreateCrossRoadsTerrain(int sections, TerrainModifier tm) { float couveSize = 2.5f; _roadNetworkNode.OrderRoads(); IMaterialFrequency materialFrequency = _roadNetworkNode.GetComponent <OverridableMaterialFrequency>(); if (materialFrequency == null) { materialFrequency = RoadConstructorHelper.MaterialFrequencySet; } RoadNetworkNode roadA, roadB, roadC, roadD; RoadCrossSection rA, rB, rC, rD; RoadUnionHelper.DefineCrossSectionOffSet(couveSize, 0, _roadNetworkNode, out roadA, out rA); RoadUnionHelper.DefineCrossSectionOffSet(couveSize, 1, _roadNetworkNode, out roadB, out rB); RoadUnionHelper.DefineCrossSectionOffSet(couveSize, 2, _roadNetworkNode, out roadC, out rC); RoadUnionHelper.DefineCrossSectionOffSet(couveSize, 3, _roadNetworkNode, out roadD, out rD); int connectionSet = IntersectionManager.Instance.AddLinkedIntersecions(rA, rB, rC, rD); DrawDetailsCrossRoad drs = new DrawDetailsCrossRoad(connectionSet, _roadNetworkNode, RoadConstructorHelper.GetMainMaterial(materialFrequency)); drs.ModifyTerrain(_roadNetworkNode.BuildData, tm); RoadConstructorHelper.ApplyLeadingStrights(_roadNetworkNode, tm, 0); RoadConstructorHelper.ApplyLeadingStrights(_roadNetworkNode, tm, 1); RoadConstructorHelper.ApplyLeadingStrights(_roadNetworkNode, tm, 2); RoadConstructorHelper.ApplyLeadingStrights(_roadNetworkNode, tm, 3); }
/// <summary> /// Create the road object /// </summary> /// <param name="roadObject">The base object to add the road to</param> /// <param name="sections">The number of sections to use for this road</param> private void CreateFiveRoads(RoadBuilder roadObject, int sections) { float couveSize = 2.5f; _roadNetworkNode.OrderRoads(); IMaterialFrequency materialFrequency = _roadNetworkNode.GetComponent <OverridableMaterialFrequency>(); if (materialFrequency == null) { materialFrequency = RoadConstructorHelper.MaterialFrequencySet; } RoadNetworkNode roadA, roadB, roadC, roadD, roadE; RoadCrossSection rA, rB, rC, rD, rE; RoadUnionHelper.DefineCrossSectionOffSet(couveSize, 0, _roadNetworkNode, out roadA, out rA); RoadUnionHelper.DefineCrossSectionOffSet(couveSize, 1, _roadNetworkNode, out roadB, out rB); RoadUnionHelper.DefineCrossSectionOffSet(couveSize, 2, _roadNetworkNode, out roadC, out rC); RoadUnionHelper.DefineCrossSectionOffSet(couveSize, 3, _roadNetworkNode, out roadD, out rD); RoadUnionHelper.DefineCrossSectionOffSet(couveSize, 4, _roadNetworkNode, out roadE, out rE); int connectionSet = IntersectionManager.Instance.AddLinkedIntersecions(rA, rB, rC, rD, rE); _meshSection.AddFiveRoad(connectionSet, _roadNetworkNode, RoadConstructorHelper.GetMainMaterial(materialFrequency)); _meshSection.UpdateEndPoints(roadObject); StreetManager.Instance.AddStreetEnd(_roadNetworkNode.name, _roadNetworkNode.Details.Roads[0].name, RoadConstructorHelper.CrossSection(_roadNetworkNode.Details.Roads[0]), RoadConstructorHelper.Materials(roadA), rA); StreetManager.Instance.AddStreetEnd(_roadNetworkNode.name, _roadNetworkNode.Details.Roads[1].name, RoadConstructorHelper.CrossSection(_roadNetworkNode.Details.Roads[1]), RoadConstructorHelper.Materials(roadB), rB); StreetManager.Instance.AddStreetEnd(_roadNetworkNode.name, _roadNetworkNode.Details.Roads[2].name, RoadConstructorHelper.CrossSection(_roadNetworkNode.Details.Roads[2]), RoadConstructorHelper.Materials(roadC), rC); StreetManager.Instance.AddStreetEnd(_roadNetworkNode.name, _roadNetworkNode.Details.Roads[3].name, RoadConstructorHelper.CrossSection(_roadNetworkNode.Details.Roads[3]), RoadConstructorHelper.Materials(roadD), rD); StreetManager.Instance.AddStreetEnd(_roadNetworkNode.name, _roadNetworkNode.Details.Roads[4].name, RoadConstructorHelper.CrossSection(_roadNetworkNode.Details.Roads[4]), RoadConstructorHelper.Materials(roadE), rE); List <Guid> list = IntersectionManager.Instance[connectionSet]; RoadCrossSection rscA = IntersectionManager.Instance[list[0]]; RoadCrossSection rscB = IntersectionManager.Instance[list[1]]; RoadCrossSection rscC = IntersectionManager.Instance[list[2]]; RoadCrossSection rscD = IntersectionManager.Instance[list[3]]; RoadCrossSection rscE = IntersectionManager.Instance[list[4]]; StreetManager.Instance.ReplaceRoadWithId(_roadNetworkNode.name, _roadNetworkNode.Details.Roads[0].name, RoadConstructorHelper.CrossSection(_roadNetworkNode.Details.Roads[0]), rscA); StreetManager.Instance.ReplaceRoadWithId(_roadNetworkNode.name, _roadNetworkNode.Details.Roads[1].name, RoadConstructorHelper.CrossSection(_roadNetworkNode.Details.Roads[1]), rscB); StreetManager.Instance.ReplaceRoadWithId(_roadNetworkNode.name, _roadNetworkNode.Details.Roads[2].name, RoadConstructorHelper.CrossSection(_roadNetworkNode.Details.Roads[2]), rscC); StreetManager.Instance.ReplaceRoadWithId(_roadNetworkNode.name, _roadNetworkNode.Details.Roads[3].name, RoadConstructorHelper.CrossSection(_roadNetworkNode.Details.Roads[3]), rscD); StreetManager.Instance.ReplaceRoadWithId(_roadNetworkNode.name, _roadNetworkNode.Details.Roads[4].name, RoadConstructorHelper.CrossSection(_roadNetworkNode.Details.Roads[4]), rscE); }
/// <summary> /// Get materials frequency for this node /// </summary> /// <param name="node">The node</param> /// <returns>The materials frequency</returns> public static IMaterialFrequency Materials(RoadNetworkNode node) { IMaterialFrequency mf = node.gameObject.GetComponent <IMaterialFrequency>(); if (mf == null) { mf = RoadConstructorHelper.MaterialFrequencySet; } return(mf); }
/// <summary> /// Gets the main material from the frequency /// </summary> /// <param name="materialFrequency">The material frequency</param> /// <returns>The name of the main material</returns> public static string GetMainMaterial(IMaterialFrequency materialFrequency) { foreach (MaterialFrequency mf in materialFrequency.GetDetails) { if (mf.Frequency == MaterialFrequency.FrequencyRate.MainTexture) { return(mf.Material.name); } } return(string.Empty); }
/// <summary> /// Set the materials array /// </summary> /// <param name="materialFrequency">The material frequency</param> /// <param name="materials">The names of the all the materials to set</param> public static void SetMaterialsArray(string[] materials, IMaterialFrequency materialFrequency) { if (materialFrequency.GetDetails.Length < 0) { return; } foreach (MaterialFrequency mf in materialFrequency.GetDetails) { if (mf.Frequency == MaterialFrequency.FrequencyRate.MainTexture) { for (int i = 0; i < materials.Length; i++) { materials[i] = mf.Material.name; } } } foreach (MaterialFrequency mf in materialFrequency.GetDetails) { if (mf.Frequency == MaterialFrequency.FrequencyRate.Randon50Percent) { List <int> diffArray = GetPercentOfIndexs(50, materials.Length); foreach (int number in diffArray) { materials[number] = mf.Material.name; } } if (mf.Frequency == MaterialFrequency.FrequencyRate.Randon25Percent) { List <int> diffArray = GetPercentOfIndexs(25, materials.Length); foreach (int number in diffArray) { materials[number] = mf.Material.name; } } if (mf.Frequency == MaterialFrequency.FrequencyRate.OncePerRoad) { int r = UnityEngine.Random.Range(0, materials.Length - 1); materials[r] = mf.Material.name; } if (mf.Frequency == MaterialFrequency.FrequencyRate.MiddleOfRoad) { int r = (materials.Length - 1) / 2; materials[r] = mf.Material.name; } } }
/// <summary> /// Copy the material frequency detials /// </summary> /// <param name="materialFrequency">The master material frequency</param> public void Copy(IMaterialFrequency materialFrequency) { if (materialFrequency == null) { return; } Details = new MaterialFrequency[materialFrequency.GetDetails.Length]; for (int i = 0; i < materialFrequency.GetDetails.Length; i++) { Details[i] = new MaterialFrequency(); Details[i].Frequency = materialFrequency.GetDetails[i].Frequency; Details[i].Material = new Material(materialFrequency.GetDetails[i].Material); } }
/// <summary> /// Extrude the road out, by creating a new node /// </summary> /// <returns>The newly created road section</returns> public GameObject ExtrudeRoad() { Details.CompressRoads(); Details.Modified = true; float roadAngle = GetCurrentAngle() + (float)(Math.PI / 2); if (Details.Union != UNION_TYPE.END) { roadAngle += (float)(Math.PI / 2); } Vector3 pos = MathsHelper.OffSetVector(transform.position, roadAngle, 100); GameObject newNode = RoadNetworkNodeHelper.CreateBasicNode(pos, RoadConstructorHelper.GetUniqueRoadName(gameObject), gameObject); GameObject rnnB = gameObject; RoadNetworkLayout.AddRoadToNode(newNode.GetComponent <RoadNetworkNode>(), rnnB.GetComponent <RoadNetworkNode>()); RoadNetworkLayout.AddRoadToNode(rnnB.GetComponent <RoadNetworkNode>(), newNode.GetComponent <RoadNetworkNode>()); ICrossSection sc = gameObject.GetComponent <ICrossSection>(); if (sc != null) { newNode.AddComponent <OverridableCrossSection>(); OverridableCrossSection ocs = newNode.GetComponent <OverridableCrossSection>(); ocs.Copy(sc); } IMaterialFrequency fm = gameObject.GetComponent <IMaterialFrequency>(); if (fm != null) { newNode.AddComponent <OverridableMaterialFrequency>(); OverridableMaterialFrequency ocs = newNode.GetComponent <OverridableMaterialFrequency>(); ocs.Copy(fm); } return(newNode); }
/// <summary> /// Created the intersections of the roads /// </summary> /// <param name="roadBuilderObject">The road builder object</param> public void CreateLayout(RoadBuilder roadBuilderObject) { float angleRoadStart = RoadUnionHelper.AngleClamp(RoadUnionHelper.GetAngleOfRoad(_roadNetworkNode, 0)); Vector3 pos = _roadNetworkNode.transform.position; ICrossSection sc = _roadNetworkNode.gameObject.GetComponent <ICrossSection>(); if (sc == null) { sc = RoadConstructorHelper.CrossSectionDetails; } IMaterialFrequency mf = _roadNetworkNode.gameObject.GetComponent <IMaterialFrequency>(); if (mf == null) { mf = RoadConstructorHelper.MaterialFrequencySet; } RoadCrossSection rA = new RoadCrossSection(pos, angleRoadStart, sc, mf); StreetManager.Instance.AddStreetEnd(_roadNetworkNode.name, _roadNetworkNode.Details.Roads[0].name, sc, mf, rA); }
/// <summary> /// Create the steet layout /// </summary> public void CreateStreetLayout(int subDivide) { if (_startRoadId == null) { return; } if (_endRoadId == null) { return; } RoadCrossSection rA = _startRoadId; ICrossSection crossSectionStart = _startCrossSection; if (crossSectionStart == null) { crossSectionStart = RoadConstructorHelper.CrossSectionDetails; } RoadCrossSection rB = _endRoadId; ICrossSection crossSectionEnd = _endCrossSection; if (crossSectionEnd == null) { crossSectionEnd = RoadConstructorHelper.CrossSectionDetails; } IMaterialFrequency materialFrequency = _materialFrequency; if (materialFrequency == null) { materialFrequency = RoadConstructorHelper.MaterialFrequencySet; } Vector3 len = rA.Middle - rB.Middle; float mag = len.magnitude; int sections = (int)(mag / crossSectionStart.RoadWidthValue); RoadCrossSection[] array = new RoadCrossSection[sections + 1]; string[] materialNames = new string[sections + 1]; float an = rB.Angle; Vector3 start = rB.Middle; if (sections < 2) { Vector3 another = rB.Middle; another = rA.Middle; RoadCrossSection rn = new RoadCrossSection(another, an, crossSectionStart, materialFrequency); _meshSection.AddBasicRoad(IntersectionManager.Instance.AddLinkedIntersecions(rB, rn), RoadConstructorHelper.GetMainMaterial(materialFrequency), 0); // TODO SubDivide return; } Vector3 gap = len / sections; float mag2 = gap.magnitude; for (int i = 0; i < sections + 1; i++) { ICrossSection crossSection = CrossSection.Lerp(crossSectionEnd, crossSectionStart, (mag2 * i) / mag); RoadCrossSection rn = new RoadCrossSection(start, an, crossSection, materialFrequency); array[i] = rn; start += gap; } RoadConstructorHelper.SetMaterialsArray(materialNames, materialFrequency); for (int i = 0; i < sections; i++) { _meshSection.AddBasicRoad(IntersectionManager.Instance.AddLinkedIntersecions(array[i], array[i + 1]), materialNames[i], subDivide); } }
/// <summary> /// Standard Constructor /// </summary> /// <param name="id">The id of the first road</param> /// <param name="crossSection">The cross section details</param> /// <param name="mf">The materials frequency</param> public StreetData(RoadCrossSection id, ICrossSection crossSection, IMaterialFrequency mf) { _startRoadId = id; _startCrossSection = crossSection; _materialFrequency = mf; }
/// <summary> /// Standard construsctors /// </summary> /// <param name="startPosition">The middle point on the road</param> /// <param name="angle">The angle of the road</param> /// <param name="crossSections">The cross section for the road</param> /// <param name="mf">The materials frequency</param> public RoadCrossSection(Vector3 startPosition, float angle, ICrossSection crossSections, IMaterialFrequency mf) { _angle = angle; float x = Mathf.Sin(angle); float z = Mathf.Cos(angle); _middle = startPosition; _left = startPosition; _left.x -= (float)(x * crossSections.RoadWidthValue / 2); _left.z += (float)(z * crossSections.RoadWidthValue / 2); _curbUpLeft = Left; if (crossSections.WithCurbValue) { _curbUpLeft.y += crossSections.CurbLipHeightValue; _curbUpLeft.x += (float)(x * -crossSections.CurbLipSlopeValue); _curbUpLeft.z -= (float)(z * -crossSections.CurbLipSlopeValue); } _curbEndLeft = _curbUpLeft; if (crossSections.WithCurbValue) { _curbEndLeft.x -= (float)(x * crossSections.CurbWidthValue); _curbEndLeft.z += (float)(z * crossSections.CurbWidthValue); } _right = startPosition; _right.x += (float)(x * crossSections.RoadWidthValue / 2); _right.z -= (float)(z * crossSections.RoadWidthValue / 2); _curbUpRight = Right; if (crossSections.WithCurbValue) { _curbUpRight.y += crossSections.CurbLipHeightValue; _curbUpRight.x += (float)(x * crossSections.CurbLipSlopeValue); _curbUpRight.z -= (float)(z * crossSections.CurbLipSlopeValue); } _curbEndRight = _curbUpRight; if (crossSections.WithCurbValue) { _curbEndRight.x += (float)(x * crossSections.CurbWidthValue); _curbEndRight.z -= (float)(z * crossSections.CurbWidthValue); } _curbEndLeftDrop = _curbEndLeft; _curbEndRightDrop = _curbEndRight; if (crossSections.WithCurbValue) { _curbEndLeftDrop.y -= crossSections.CurbEdgeDropValue; _curbEndRightDrop.y -= crossSections.CurbEdgeDropValue; } if (crossSections.WithCurbValue) { _curbLipHeight = crossSections.CurbLipHeightValue; _curbEdgeDrop = crossSections.CurbEdgeDropValue; } else { _curbLipHeight = 0; _curbEdgeDrop = 0; } }
/// <summary> /// Add the street end /// </summary> /// <param name="nameStart">The name of the street</param> /// <param name="nameEnd">The second path of the name</param> /// <param name="crossSectionDetails">The cross section details</param> /// <param name="materialFreq">The material frequency details</param> /// <param name="roadCrossSection">The road cross section</param> public void AddStreetEnd(string nameStart, string nameEnd, ICrossSection crossSectionDetails, IMaterialFrequency materialFreq, RoadCrossSection roadCrossSection) { string[] stringArray = new string[2] { nameStart, nameEnd }; Array.Sort(stringArray); string streetFullName = string.Join("-", stringArray); StreetData street = null; if (!_streets.TryGetValue(streetFullName, out street)) { street = new StreetData(roadCrossSection, crossSectionDetails, materialFreq); _streets.Add(streetFullName, street); } else { street.AddSecondRoad(roadCrossSection, crossSectionDetails); } }
/// <summary> /// Modify the terrain for the corner /// </summary> /// <param name="sections">The number of sections</param> /// <param name="tm">The terrain modifier</param> private void CreateCornerTerrain(int sections, TerrainModifier tm) { // this is not the best way - but it's a start // maybe have a function that returns a list of cross sections // find the point where the two roads meet Vector3 pos = _roadNetworkNode.gameObject.transform.position; // create a corne at this postion Vector3 newpos = pos; float roadAngleA = RoadUnionHelper.AngleClamp(RoadUnionHelper.GetAngleOfRoadClampped(_roadNetworkNode, 0) - Mathf.PI / 2); float roadAngleB = RoadUnionHelper.AngleClamp(RoadUnionHelper.GetAngleOfRoadClampped(_roadNetworkNode, 1) + Mathf.PI / 2); float roadAngleDifference = roadAngleB - roadAngleA; float couveSize = 1.85f; float x, z; float road_A_length = GetLengthOfRoad(0); float road_B_length = GetLengthOfRoad(1); float minLength = Mathf.Min(road_A_length, road_B_length); float offSetDownRoad = RoadConstructorHelper.CrossSectionDetails.RoadWidthValue * couveSize; if (offSetDownRoad > minLength / 2) { offSetDownRoad = minLength / 2; } RoadNetworkNode oppositeEnd = _roadNetworkNode.Details.Roads[1].GetComponent <RoadNetworkNode>(); Vector3 roadPointA = oppositeEnd.GetOffSetDownRoad(pos, (offSetDownRoad)); Vector3 outA; bool offSetPos = _roadNetworkNode.GetInnerCorner(0, 1, (offSetDownRoad), out outA); Vector3 CornerPoint = outA; newpos = CornerPoint; // get the gap form point to point Vector3 gap = CornerPoint - roadPointA; couveSize = offSetPos ? gap.magnitude : 0; couveSize = offSetPos ? gap.magnitude : 0; Radian currentAngle = new Radian(roadAngleA - (float)(Math.PI / 2)); roadAngleDifference = MathsHelper.ClampAngle(roadAngleDifference); if (roadAngleDifference > Mathf.PI) { roadAngleDifference = (Mathf.PI * 2) - roadAngleDifference; currentAngle = new Radian(roadAngleB + (float)(Math.PI / 2)); } float diff = roadAngleDifference; x = Mathf.Sin(currentAngle.Value) * (couveSize); z = Mathf.Cos(currentAngle.Value) * (couveSize); newpos.x -= x; newpos.z += z; ICrossSection crossSectionMiddle = RoadConstructorHelper.CrossSection(_roadNetworkNode); IMaterialFrequency materialFrequency = _roadNetworkNode.gameObject.GetComponent <IMaterialFrequency>(); if (materialFrequency == null) { materialFrequency = RoadConstructorHelper.MaterialFrequencySet; } RoadCrossSection rA = new RoadCrossSection(newpos, currentAngle.Value, crossSectionMiddle, materialFrequency); float angleStep = Mathf.Abs(diff / sections); for (int i = 0; i < sections; i++) { newpos = CornerPoint; currentAngle.Value += angleStep; x = Mathf.Sin(currentAngle.Value) * (couveSize); z = Mathf.Cos(currentAngle.Value) * (couveSize); newpos.x -= x; newpos.z += z; RoadCrossSection rB = new RoadCrossSection(newpos, currentAngle.Value, crossSectionMiddle, materialFrequency); tm.ApplyToTerrain(rA, rB); rA = rB; } RoadConstructorHelper.ApplyLeadingStrights(_roadNetworkNode, tm, 0); RoadConstructorHelper.ApplyLeadingStrights(_roadNetworkNode, tm, 1); }
/// <summary> /// Create the road object /// </summary> /// <param name="roadObject">The base object to add the road to</param> /// <param name="sections">The number of sections to use for this road</param> private void CreateCorner(RoadBuilder roadObject, int sections) { // find the point where the two roads meet Vector3 pos = _roadNetworkNode.gameObject.transform.position; // create a corne at this postion Vector3 newpos = pos; float roadAngleA = RoadUnionHelper.AngleClamp(RoadUnionHelper.GetAngleOfRoadClampped(_roadNetworkNode, 0) - (Mathf.PI / 2)); float roadAngleB = RoadUnionHelper.AngleClamp(RoadUnionHelper.GetAngleOfRoadClampped(_roadNetworkNode, 1) + (Mathf.PI / 2)); float roadAngleDifference = roadAngleB - roadAngleA; float couveSize = 1.85f; float x, z; float road_A_length = GetLengthOfRoad(0); float road_B_length = GetLengthOfRoad(1); float minLength = Mathf.Min(road_A_length, road_B_length); float offSetDownRoad = RoadConstructorHelper.CrossSectionDetails.RoadWidthValue * couveSize; if (offSetDownRoad > minLength / 2) { offSetDownRoad = minLength / 2; } RoadNetworkNode oppositeEnd = _roadNetworkNode.Details.Roads[1].GetComponent <RoadNetworkNode>(); Vector3 roadPointA = oppositeEnd.GetOffSetDownRoad(pos, (offSetDownRoad)); Vector3 outA; bool offSetPos = _roadNetworkNode.GetInnerCorner(0, 1, (offSetDownRoad), out outA); Vector3 CornerPoint = outA; newpos = CornerPoint; // get the gap form point to point Vector3 gap = CornerPoint - roadPointA; couveSize = offSetPos ? gap.magnitude : 0; couveSize = offSetPos ? gap.magnitude : 0; bool backward = false; Radian currentAngle = new Radian(roadAngleA - (float)(Math.PI / 2)); roadAngleDifference = MathsHelper.ClampAngle(roadAngleDifference); if (roadAngleDifference > Mathf.PI) { roadAngleDifference = (Mathf.PI * 2) - roadAngleDifference; currentAngle = new Radian(roadAngleB + (float)(Math.PI / 2)); backward = true; } float diff = roadAngleDifference; x = Mathf.Sin(currentAngle.Value) * (couveSize); z = Mathf.Cos(currentAngle.Value) * (couveSize); newpos.x -= x; newpos.z += z; ICrossSection crossSectionMiddle = RoadConstructorHelper.CrossSection(_roadNetworkNode); IMaterialFrequency materialFrequency = _roadNetworkNode.gameObject.GetComponent <IMaterialFrequency>(); if (materialFrequency == null) { materialFrequency = RoadConstructorHelper.MaterialFrequencySet; } RoadCrossSection rA = new RoadCrossSection(newpos, currentAngle.Value, crossSectionMiddle, materialFrequency); RoadCrossSection Start = rA; float angleStep = Mathf.Abs(diff / sections); for (int i = 0; i < sections; i++) { newpos = CornerPoint; currentAngle.Value += angleStep; x = Mathf.Sin(currentAngle.Value) * (couveSize); z = Mathf.Cos(currentAngle.Value) * (couveSize); newpos.x -= x; newpos.z += z; RoadCrossSection rB = new RoadCrossSection(newpos, currentAngle.Value, crossSectionMiddle, materialFrequency); // TODO Sub divide corners - need to update before the add basic road! _meshSection.AddBasicRoad(IntersectionManager.Instance.AddLinkedIntersecions(rA, rB), RoadConstructorHelper.GetMainMaterial(materialFrequency), 0); rA = rB; } RoadCrossSection End = rA; if (backward) { StreetManager.Instance.AddStreetEnd(_roadNetworkNode.name, _roadNetworkNode.Details.Roads[0].name, crossSectionMiddle, materialFrequency, End); StreetManager.Instance.AddStreetEnd(_roadNetworkNode.name, _roadNetworkNode.Details.Roads[1].name, crossSectionMiddle, materialFrequency, Start); } else { StreetManager.Instance.AddStreetEnd(_roadNetworkNode.name, _roadNetworkNode.Details.Roads[1].name, crossSectionMiddle, materialFrequency, End); StreetManager.Instance.AddStreetEnd(_roadNetworkNode.name, _roadNetworkNode.Details.Roads[0].name, crossSectionMiddle, materialFrequency, Start); } }