/// <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);
        }
Example #3
0
    /// <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);
    }
Example #4
0
    /// <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);
    }
Example #5
0
    /// <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;
            }
        }
    }
Example #6
0
        /// <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);
            }
        }
Example #7
0
        /// <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;
 }
Example #11
0
        /// <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);
            }
        }