コード例 #1
0
        private static GSD.Roads.GSDRoadUtil.Construction2DRect SetDetailCoords(float param,ref Vector3 tVect1,ref Vector3 POS1,ref Vector3 tVect2,ref Vector3 POS2, float Sep, float TreeSep, ref GSD.Roads.GSDTerraforming.TempTerrainData TTD, ref GSDSplineC tSpline)
        {
            Vector3 lVect1far = default(Vector3);
            Vector3 rVect1far = default(Vector3);
            Vector3 lVect2far = default(Vector3);
            Vector3 rVect2far = default(Vector3);

            bool bIsInBridge = tSpline.IsInBridgeTerrain(param);
            bool bIsInTunnel = tSpline.IsInTunnelTerrain(param);
            int x2,y2,x3,y3;
            GetTempHeights_Coordinates(ref tVect1,ref TTD,out x2,out y2);
            if(x2 >= TTD.HM){ x2=-1; }
            if(y2 >= TTD.HM){ y2=-1; }
            if(x2 < 0){ x2=-1; }
            if(y2 < 0){ y2=-1; }
            if(x2 == -1){ return null; }
            if(y2 == -1){ return null; }

            float tDiff1 = ((TTD.heights[x2,y2]*(float)TTD.TerrainSize.y) - tVect1.y);
            GetTempHeights_Coordinates(ref tVect2,ref TTD,out x3,out y3);
            if(x3 >= TTD.HM){ x3=-1; }
            if(y3 >= TTD.HM){ y3=-1; }
            if(x3 < 0){ x3=-1; }
            if(y3 < 0){ y3=-1; }
            if(x3 == -1){ return null; }
            if(y3 == -1){ return null; }
            float tDiff2 = ((TTD.heights[x3,y3]*(float)TTD.TerrainSize.y) - tVect2.y);

            GSD.Roads.GSDRoadUtil.Construction2DRect tRect = null;
            if(tSpline.tRoad.opt_TreeModEnabled){
                bool bQuit = false;
                if(x2 == -1){ bQuit = true; }
                if(y2 == -1){ bQuit = true; }

                if(bIsInBridge && !bQuit){
                    if(tDiff1 < 0f){ tDiff1 *= -1f; }
                    if(tDiff2 < 0f){ tDiff2 *= -1f; }
                    if(tDiff1 > tSpline.tRoad.opt_ClearTreesDistanceHeight){
                        bQuit = true;
                    }
                    if(tDiff2 > tSpline.tRoad.opt_ClearTreesDistanceHeight){
                        bQuit = true;
                    }
                }
                if(bIsInTunnel && !bQuit){
                    if(tDiff1 < 0f){
                        if((tDiff1*-1f) > tSpline.tRoad.opt_ClearTreesDistanceHeight){
                            bQuit = true;
                        }
                    }else{
                        if(tDiff1 > (tSpline.tRoad.opt_ClearTreesDistanceHeight*0.1f)){
                            bQuit = true;
                        }
                    }
                    if(tDiff2 < 0f){
                        if((tDiff2*-1f) > tSpline.tRoad.opt_ClearTreesDistanceHeight){
                            bQuit = true;
                        }
                    }else{
                        if(tDiff2 > (tSpline.tRoad.opt_ClearTreesDistanceHeight*0.1f)){
                            bQuit = true;
                        }
                    }
                }

                if(!bQuit){
                    TreeSep = TreeSep * 0.5f;
                    lVect1far = (tVect1 + new Vector3(TreeSep*-POS1.normalized.z,0,TreeSep*POS1.normalized.x));
                    rVect1far = (tVect1 + new Vector3(TreeSep*POS1.normalized.z,0,TreeSep*-POS1.normalized.x));
                    lVect2far = (tVect2 + new Vector3(TreeSep*-POS2.normalized.z,0,TreeSep*POS2.normalized.x));
                    rVect2far = (tVect2 + new Vector3(TreeSep*POS2.normalized.z,0,TreeSep*-POS2.normalized.x));
                    tRect = new GSD.Roads.GSDRoadUtil.Construction2DRect(new Vector2(lVect1far.x,lVect1far.z),new Vector2(rVect1far.x,rVect1far.z),new Vector2(rVect2far.x,rVect2far.z),new Vector2(lVect2far.x,lVect2far.z),0f);
                }
            }

            if(tSpline.tRoad.opt_DetailModEnabled){
                if(bIsInBridge || bIsInTunnel){
                    if(tDiff1 < 0f){ tDiff1 *= -1f; }
                    if(tDiff2 < 0f){ tDiff2 *= -1f; }

                    bool bQuit = false;
                    if(x2 == -1){ bQuit = true; }
                    if(y2 == -1){ bQuit = true; }

                    if(tDiff1 > tSpline.tRoad.opt_ClearDetailsDistanceHeight){
                        bQuit = true;
                    }
                    if(tDiff2 > tSpline.tRoad.opt_ClearDetailsDistanceHeight){
                        bQuit = true;
                    }

                    if(bQuit){
                        return tRect;
                    }
                }

                Sep = Sep * 0.5f;

                lVect1far = (tVect1 + new Vector3(Sep*-POS1.normalized.z,0,Sep*POS1.normalized.x));
                rVect1far = (tVect1 + new Vector3(Sep*POS1.normalized.z,0,Sep*-POS1.normalized.x));
                lVect2far = (tVect2 + new Vector3(Sep*-POS2.normalized.z,0,Sep*POS2.normalized.x));
                rVect2far = (tVect2 + new Vector3(Sep*POS2.normalized.z,0,Sep*-POS2.normalized.x));

                int[] Xs = new int[4];
                int[] Ys = new int[4];

                int x1,y1;
                GetTempDetails_Coordinates(ref lVect1far,ref TTD,out x1, out y1);
                Xs[0] = x1;
                Ys[0] = y1;
                GetTempDetails_Coordinates(ref lVect2far,ref TTD,out x1, out y1);
                Xs[1] = x1;
                Ys[1] = y1;
                GetTempDetails_Coordinates(ref rVect1far,ref TTD,out x1, out y1);
                Xs[2] = x1;
                Ys[2] = y1;
                GetTempDetails_Coordinates(ref rVect2far,ref TTD,out x1, out y1);
                Xs[3] = x1;
                Ys[3] = y1;
            //
            //				if(TTD.DetailLayersCount == 1 && x1 > 0 && y1 > 0){
            //					Debug.Log(Xs[0]+","+Ys[0] + " " + Xs[1]+","+Ys[1]);
            //				}

                int MinX = Mathf.Min(Xs);
                int MinY = Mathf.Min(Ys);
                int MaxX = Mathf.Max(Xs);
                int MaxY = Mathf.Max(Ys);

                if(MinX >= TTD.DetailMaxIndex){ MinX = TTD.DetailMaxIndex-1; }
                if(MinY >= TTD.DetailMaxIndex){ MinY = TTD.DetailMaxIndex-1; }
                if(MaxX >= TTD.DetailMaxIndex){ MaxX = TTD.DetailMaxIndex-1; }
                if(MaxY >= TTD.DetailMaxIndex){ MaxY = TTD.DetailMaxIndex-1; }

                if(MinX < 0){ MinX = 0; }
                if(MinY < 0){ MinY = 0; }
                if(MaxX < 0){ MaxX = 0; }
                if(MaxY < 0){ MaxY = 0; }

            //				int DetailI = 0;
                if(tSpline.tRoad.bProfiling){ Profiler.BeginSample("Dorectsdetails"); }
                int tInt = 0;
                for(int i=MinX;i<=MaxX;i++){
                    for(int k=MinY;k<=MaxY;k++){
                        //Bitfield for identification:
                        tInt = k;
                        tInt = tInt << 16;
               			 		tInt = tInt | (ushort)i;
                        if(!TTD.DetailHasProcessed.Contains(tInt)){
            //							for(int h=0;h<TTD.DetailLayersCount;h++){
            //								if(TTD.DetailLayersSkip.Contains(h)){ continue; }
            //							if(!TTD.DetailHasProcessed[h][i,k]){// && TTD.DetailValues[h][i,k] > 0){

                            TTD.MainDetailsX.Add((ushort)i);
                            TTD.MainDetailsY.Add((ushort)k);

            //								DetailI = TTD.DetailsI[h];

            //								TTD.DetailsX[h].Add((ushort)i);
            //								TTD.DetailsY[h].Add((ushort)k);

            //								TTD.DetailsX[h][DetailI] = (ushort)i;
            //								TTD.DetailsY[h][DetailI] = (ushort)k;
            //								TTD.OldDetailsValue[h][DetailI] = (ushort)TTD.DetailValues[h][i,k];
            //								TTD.DetailValues[h][i,k] = 0;

            //								TTD.DetailsI[h]+=1;

            //							}
                            TTD.DetailHasProcessed.Add(tInt);
                        }
                    }
                }
                if(tSpline.tRoad.bProfiling){ Profiler.EndSample(); }
            }

            return tRect;
        }
コード例 #2
0
        private static void AddIntersectionBounds(ref GSDRoad tRoad, ref GSD.Roads.RoadConstructorBufferMaker RCS)
        {
            bool bIsBridge = false;
            bool bBridgeInitial = false; if(bBridgeInitial == false){ }
            bool bTempbridge = false;
            bool bBridgeLast = false; if(bBridgeLast == false){ }

            bool bIsTunnel = false;
            bool bTunnelInitial = false; if(bTunnelInitial == false){ }
            bool bTempTunnel = false;
            bool bTunnelLast = false; if(bTunnelLast == false){ }

            GSDRoadIntersection GSDRI = null;
            bool bIsPastInter = false;
            bool bMaxIntersection = false;
            bool bWasPrevMaxInter = false;
            Vector3 tVect = default(Vector3);
            Vector3 POS = default(Vector3);
            float tIntHeight = 0f;
            float tIntStrength = 0f;
            float tIntStrength_temp = 0f;
            //			float tIntDistCheck = 75f;
            bool bFirstInterNode = false;
            Vector3 tVect_Prev = default(Vector3); 		if(tVect_Prev == default(Vector3)){ }
            Vector3 rVect_Prev = default(Vector3); 		if(rVect_Prev == default(Vector3)){ }
            Vector3 lVect_Prev = default(Vector3); 		if(lVect_Prev == default(Vector3)){ }
            Vector3 rVect = default(Vector3);			if(rVect == default(Vector3)){ }
            Vector3 lVect = default(Vector3);			if(lVect == default(Vector3)){ }
            Vector3 ShoulderR_rVect = default(Vector3);	if(ShoulderR_rVect == default(Vector3)){ }
            Vector3 ShoulderR_lVect = default(Vector3);	if(ShoulderR_lVect == default(Vector3)){ }
            Vector3 ShoulderL_rVect = default(Vector3);	if(ShoulderL_rVect == default(Vector3)){ }
            Vector3 ShoulderL_lVect = default(Vector3);	if(ShoulderL_lVect == default(Vector3)){ }

            Vector3 RampR_R = default(Vector3);
            Vector3 RampR_L = default(Vector3);
            Vector3 RampL_R = default(Vector3);
            Vector3 RampL_L = default(Vector3);
            float ShoulderR_OuterAngle = 0f;	if(ShoulderR_OuterAngle < 0f){ }
            float ShoulderL_OuterAngle = 0f;	if(ShoulderL_OuterAngle < 0f){ }
            Vector3 ShoulderR_PrevLVect = default(Vector3); if(ShoulderR_PrevLVect == default(Vector3)){ }
            Vector3 ShoulderL_PrevRVect = default(Vector3); if(ShoulderL_PrevRVect == default(Vector3)){ }
            Vector3 ShoulderR_PrevRVect = default(Vector3); if(ShoulderR_PrevRVect == default(Vector3)){ }
            Vector3 ShoulderL_PrevLVect = default(Vector3); if(ShoulderL_PrevLVect == default(Vector3)){ }
            //			Vector3 ShoulderR_PrevRVect2 = default(Vector3);
            //			Vector3 ShoulderL_PrevLVect2 = default(Vector3);
            //			Vector3 ShoulderR_PrevRVect3 = default(Vector3);
            //			Vector3 ShoulderL_PrevLVect3 = default(Vector3);
            Vector3 RampR_PrevR = default(Vector3); if(RampR_PrevR == default(Vector3)){ }
            Vector3 RampR_PrevL = default(Vector3); if(RampR_PrevL == default(Vector3)){ }
            Vector3 RampL_PrevR = default(Vector3); if(RampL_PrevR == default(Vector3)){ }
            Vector3 RampL_PrevL = default(Vector3); if(RampL_PrevL == default(Vector3)){ }
            GSDSplineC tSpline = tRoad.GSDSpline;
            //Road width:
            float RoadWidth = tRoad.RoadWidth();
            float ShoulderWidth = tRoad.opt_ShoulderWidth;
            float RoadSeperation = RoadWidth / 2f;
            float RoadSeperation_NoTurn = RoadWidth / 2f;
            float ShoulderSeperation = RoadSeperation + ShoulderWidth;
            float LaneWidth = tRoad.opt_LaneWidth;
            float RoadSep1Lane = (RoadSeperation + (LaneWidth*0.5f));
            float RoadSep2Lane = (RoadSeperation + (LaneWidth*1.5f));
            float ShoulderSep1Lane = (ShoulderSeperation + (LaneWidth*0.5f));		if(ShoulderSep1Lane < 0f){ }
            float ShoulderSep2Lane = (ShoulderSeperation + (LaneWidth*1.5f));		if(ShoulderSep2Lane < 0f){ }

            //			float tAngle = 0f;
            //			float OrigStep = 0.06f;
            float Step = tRoad.opt_RoadDefinition / tSpline.distance;

            GSDSplineN xNode = null;
            float tInterSubtract = 4f;
            float tLastInterHeight = -4f;

            //			GameObject xObj = null;
            //			xObj = GameObject.Find("temp22");
            //			while(xObj != null){
            //				Object.DestroyImmediate(xObj);
            //				xObj = GameObject.Find("temp22");
            //			}
            //			xObj = GameObject.Find("temp23");
            //			while(xObj != null){
            //				Object.DestroyImmediate(xObj);
            //				xObj = GameObject.Find("temp23");
            //			}
            //			xObj = GameObject.Find("temp22_RR");
            //			while(xObj != null){
            //				Object.DestroyImmediate(xObj);
            //				xObj = GameObject.Find("temp22_RR");
            //			}
            //			xObj = GameObject.Find("temp22_RL");
            //			while(xObj != null){
            //				Object.DestroyImmediate(xObj);
            //				xObj = GameObject.Find("temp22_RL");
            //			}
            //			xObj = GameObject.Find("temp22_LR");
            //			while(xObj != null){
            //				Object.DestroyImmediate(xObj);
            //				xObj = GameObject.Find("temp22_LR");
            //			}
            //			xObj = GameObject.Find("temp22_LL");
            //			while(xObj != null){
            //				Object.DestroyImmediate(xObj);
            //				xObj = GameObject.Find("temp22_LL");
            //			}

            bool bFinalEnd = false;
            float i = 0f;

            float FinalMax = 1f;
            float StartMin = 0f;
            if(tSpline.bSpecialEndControlNode){
                FinalMax = tSpline.mNodes[tSpline.GetNodeCount()-2].tTime;
            }
            if(tSpline.bSpecialStartControlNode){
                StartMin = tSpline.mNodes[1].tTime;
            }

            //			int StartIndex = tSpline.GetClosestRoadDefIndex(StartMin,true,false);
            //			int EndIndex = tSpline.GetClosestRoadDefIndex(FinalMax,false,true);
            //			float cDist = 0f;
            bool kSkip = true;
            bool kSkipFinal = false;
            int kCount = 0;
            int kFinalCount = tSpline.RoadDefKeysArray.Length;
            int spamcheckmax1 = 18000;
            int spamcheck1 = 0;

            if(IsApproximately(StartMin,0f,0.0001f)){
                kSkip = false;
            }
            if(IsApproximately(FinalMax,1f,0.0001f)){
                kSkipFinal = true;
            }

            while(!bFinalEnd && spamcheck1 < spamcheckmax1){
                spamcheck1++;

                if(kSkip){
                    i = StartMin;
                    kSkip = false;
                }else{
                    if(kCount >= kFinalCount){
                        i = FinalMax;
                        if(kSkipFinal){ break; }
                    }else{
                        i = tSpline.TranslateInverseParamToFloat(tSpline.RoadDefKeysArray[kCount]);
                        kCount+=1;
                    }
                }

                if(i > 1f){ break; }
                if(i < 0f){ i = 0f; }

                if(IsApproximately(i,FinalMax,0.00001f)){
                    bFinalEnd = true;
                }else if(i > FinalMax){
                    if(tSpline.bSpecialEndControlNode){
                        i = FinalMax;
                        bFinalEnd = true;
                    }else{
                        bFinalEnd = true;
                        break;
                    }
                }

                tSpline.GetSplineValue_Both(i,out tVect,out POS);
                bIsPastInter = false;
                tIntStrength = tSpline.IntersectionStrength(ref tVect,ref tIntHeight, ref GSDRI, ref bIsPastInter, ref i, ref xNode);
                if(IsApproximately(tIntStrength,1f,0.001f) || tIntStrength > 1f){
                    bMaxIntersection = true;
                }else{
                    bMaxIntersection = false;
                }

                if(bMaxIntersection){
                    if(string.Compare(xNode.UID,GSDRI.Node1.UID) == 0){
                        bFirstInterNode = true;
                    }else{
                        bFirstInterNode = false;
                    }

                    //Convoluted for initial trigger:
                    bBridgeInitial = false;
                    bBridgeLast = false;
                    bTempbridge = tSpline.IsInBridge(i);
                    if(!bIsBridge && bTempbridge){
                        bIsBridge = true;
                        bBridgeInitial = true;
                    }else if(bIsBridge && !bTempbridge){
                        bIsBridge = false;
                    }
                    //Check if this is the last bridge run for this bridge:
                    if(bIsBridge){
                        bTempbridge = tSpline.IsInBridge(i+Step);
                        if(!bTempbridge){
                            bBridgeLast = true;
                        }
                    }

                    //Convoluted for initial trigger:
                    bTunnelInitial = false;
                    bTunnelLast = false;
                    bTempTunnel = tSpline.IsInTunnel(i);
                    if(!bIsTunnel && bTempTunnel){
                        bIsTunnel = true;
                        bTunnelInitial = true;
                    }else if(bIsTunnel && !bTempTunnel){
                        bIsTunnel = false;
                    }
                    //Check if this is the last Tunnel run for this Tunnel:
                    if(bIsTunnel){
                        bTempTunnel = tSpline.IsInTunnel(i+Step);
                        if(!bTempTunnel){
                            bTunnelLast = true;
                        }
                    }

                    if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.NoTurnLane){
                        rVect = (tVect + new Vector3(RoadSeperation_NoTurn*POS.normalized.z,0,RoadSeperation_NoTurn*-POS.normalized.x));
                        lVect = (tVect + new Vector3(RoadSeperation_NoTurn*-POS.normalized.z,0,RoadSeperation_NoTurn*POS.normalized.x));
                    }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.TurnLane){
                        rVect = (tVect + new Vector3(RoadSep1Lane*POS.normalized.z,0,RoadSep1Lane*-POS.normalized.x));
                        lVect = (tVect + new Vector3(RoadSep1Lane*-POS.normalized.z,0,RoadSep1Lane*POS.normalized.x));
                    }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.BothTurnLanes){
                        if(bIsPastInter){
                            rVect = (tVect + new Vector3(RoadSep1Lane*POS.normalized.z,0,RoadSep1Lane*-POS.normalized.x));
                            lVect = (tVect + new Vector3(RoadSep2Lane*-POS.normalized.z,0,RoadSep2Lane*POS.normalized.x));;
                        }else{
                            rVect = (tVect + new Vector3(RoadSep2Lane*POS.normalized.z,0,RoadSep2Lane*-POS.normalized.x));
                            lVect = (tVect + new Vector3(RoadSep1Lane*-POS.normalized.z,0,RoadSep1Lane*POS.normalized.x));
                        }
                    }else{
                        rVect = (tVect + new Vector3(RoadSeperation*POS.normalized.z,0,RoadSeperation*-POS.normalized.x));
                        lVect = (tVect + new Vector3(RoadSeperation*-POS.normalized.z,0,RoadSeperation*POS.normalized.x));
                    }

                    if(tIntStrength >= 1f){
                        tVect.y -= tInterSubtract;
                        tLastInterHeight = tVect.y;
                        rVect.y -= tInterSubtract;
                        lVect.y -= tInterSubtract;
                    }else{
                        if(!IsApproximately(tIntStrength,0f,0.001f)){ tVect.y = (tIntStrength*tIntHeight) + ((1-tIntStrength)*tVect.y); }
                        tIntStrength_temp = tRoad.GSDSpline.IntersectionStrength(ref rVect,ref tIntHeight, ref GSDRI,ref bIsPastInter,ref i, ref xNode);
                        if(!IsApproximately(tIntStrength_temp,0f,0.001f)){ rVect.y = (tIntStrength_temp*tIntHeight) + ((1-tIntStrength_temp)*rVect.y); ShoulderR_lVect = rVect; }
                    }

                    //Add bounds for later removal:
                    GSD.Roads.GSDRoadUtil.Construction2DRect vRect = null;
                    if(!bIsBridge && !bIsTunnel && bMaxIntersection && bWasPrevMaxInter){
                        bool bGoAhead = true;
                        if(xNode.bIsEndPoint){
                            if(xNode.idOnSpline == 1){
                                if(i < xNode.tTime){
                                    bGoAhead = false;
                                }
                            }else{
                                if(i > xNode.tTime){
                                    bGoAhead = false;
                                }
                            }
                        }
                        //Get this and prev lvect rvect rects:
                        if(Vector3.Distance(xNode.pos,tVect) < (3f * RoadWidth) && bGoAhead){
                            if(GSDRI.bFlipped && !bFirstInterNode){
                                vRect = new GSD.Roads.GSDRoadUtil.Construction2DRect(
                                    new Vector2(rVect.x,rVect.z),
                                    new Vector2(lVect.x,lVect.z),
                                    new Vector2(rVect_Prev.x,rVect_Prev.z),
                                    new Vector2(lVect_Prev.x,lVect_Prev.z),
                                    tLastInterHeight
                                    );
                            }else{
                                 vRect = new GSD.Roads.GSDRoadUtil.Construction2DRect(
                                    new Vector2(lVect.x,lVect.z),
                                    new Vector2(rVect.x,rVect.z),
                                    new Vector2(lVect_Prev.x,lVect_Prev.z),
                                    new Vector2(rVect_Prev.x,rVect_Prev.z),
                                    tLastInterHeight
                                    );
                            }
            //							GameObject tObj = GameObject.CreatePrimitive(PrimitiveType.Cube);
            //							tObj.transform.position = lVect;
            //							tObj.transform.localScale = new Vector3(0.2f,20f,0.2f);
            //							tObj.transform.name = "temp22";
            //
            //							tObj = GameObject.CreatePrimitive(PrimitiveType.Cube);
            //							tObj.transform.position = rVect;
            //							tObj.transform.localScale = new Vector3(0.2f,20f,0.2f);
            //							tObj.transform.name = "temp22";

                            RCS.tIntersectionBounds.Add(vRect);
                        }
                    }
                }

                bWasPrevMaxInter = bMaxIntersection;
                tVect_Prev = tVect;
                rVect_Prev = rVect;
                lVect_Prev = lVect;
                ShoulderR_PrevLVect = ShoulderR_lVect;
                ShoulderL_PrevRVect = ShoulderL_rVect;
            //				ShoulderR_PrevRVect3 = ShoulderR_PrevRVect2;
            //				ShoulderL_PrevLVect3 = ShoulderL_PrevLVect2;
            //				ShoulderR_PrevRVect2 = ShoulderR_PrevRVect;
            //				ShoulderL_PrevLVect2 = ShoulderL_PrevLVect;
                ShoulderR_PrevRVect = ShoulderR_rVect;
                ShoulderL_PrevLVect = ShoulderL_lVect;
                RampR_PrevR = RampR_R;
                RampR_PrevL = RampR_L;
                RampL_PrevR = RampL_R;
                RampL_PrevL = RampL_L;
            //				i+=Step;
            }
        }
コード例 #3
0
        private static void RoadJob_DoPrelim(ref GSDRoad tRoad)
        {
            GSDSplineC tSpline = tRoad.GSDSpline;
            //Road,shoulder,ramp and lane widths:
            float RoadWidth = tRoad.RoadWidth();
            float ShoulderWidth = tRoad.opt_ShoulderWidth;
            float RoadSeperation = RoadWidth / 2f;
            float RoadSeperation_NoTurn = RoadWidth / 2f;
            float ShoulderSeperation = RoadSeperation + ShoulderWidth;
            float LaneWidth = tRoad.opt_LaneWidth;
            float RoadSep1Lane = (RoadSeperation + (LaneWidth*0.5f));
            float RoadSep2Lane = (RoadSeperation + (LaneWidth*1.5f));
            float ShoulderSep1Lane = (ShoulderSeperation + (LaneWidth*0.5f));
            float ShoulderSep2Lane = (ShoulderSeperation + (LaneWidth*1.5f));

            //Vector3 buffers used in construction:
            Vector3 rVect = default(Vector3);
            Vector3 lVect = default(Vector3);
            Vector3 ShoulderR_rVect = default(Vector3);
            Vector3 ShoulderR_lVect = default(Vector3);
            Vector3 ShoulderL_rVect = default(Vector3);
            Vector3 ShoulderL_lVect = default(Vector3);
            Vector3 RampR_R = default(Vector3);
            Vector3 RampR_L = default(Vector3);
            Vector3 RampL_R = default(Vector3);
            Vector3 RampL_L = default(Vector3);
            float ShoulderR_OuterAngle = 0f; if(ShoulderR_OuterAngle < 0f){ }
            float ShoulderL_OuterAngle = 0f; if(ShoulderL_OuterAngle < 0f){ }
            //			Vector3 ShoulderR_OuterDirection = default(Vector3);
            //			Vector3 ShoulderL_OuterDirection = default(Vector3);

            //Previous temp storage values:
            Vector3 tVect_Prev = default(Vector3);				if(tVect_Prev == default(Vector3)){ } //Prev step storage of road variable.
            Vector3 rVect_Prev = default(Vector3);				if(rVect_Prev == default(Vector3)){ }//Prev step storage of road variable.
            Vector3 lVect_Prev = default(Vector3);				if(lVect_Prev == default(Vector3)){ }//Prev step storage of road variable.
            Vector3 ShoulderR_PrevLVect = default(Vector3);		if(ShoulderR_PrevLVect == default(Vector3)){ }//Prev step storage of shoulder variable.
            Vector3 ShoulderL_PrevRVect = default(Vector3);		if(ShoulderL_PrevRVect == default(Vector3)){ }//Prev step storage of shoulder variable.
            Vector3 ShoulderR_PrevRVect = default(Vector3);		if(ShoulderR_PrevRVect == default(Vector3)){ }//Prev step storage of shoulder variable.
            Vector3 ShoulderL_PrevLVect = default(Vector3);		if(ShoulderL_PrevLVect == default(Vector3)){ }//Prev step storage of shoulder variable.
            //			Vector3 ShoulderR_PrevRVect2 = default(Vector3);	//Prev storage of shoulder variable (2 step history).
            //			Vector3 ShoulderL_PrevLVect2 = default(Vector3);	//Prev storage of shoulder variable (2 step history).
            //			Vector3 ShoulderR_PrevRVect3 = default(Vector3);	//Prev storage of shoulder variable (3 step history).
            //			Vector3 ShoulderL_PrevLVect3 = default(Vector3);	//Prev storage of shoulder variable (3 step history).
            Vector3 RampR_PrevR = default(Vector3);				if(RampR_PrevR == default(Vector3)){ }//Prev storage of ramp variables (outer shoulder).
            Vector3 RampR_PrevL = default(Vector3);				if(RampR_PrevL == default(Vector3)){ }//Prev storage of ramp variables (outer shoulder).
            Vector3 RampL_PrevR = default(Vector3);				if(RampL_PrevR == default(Vector3)){ }//Prev storage of ramp variables (outer shoulder).
            Vector3 RampL_PrevL = default(Vector3);				if(RampL_PrevL == default(Vector3)){ }//Prev storage of ramp variables (outer shoulder).
            //			Vector3 ShoulderR_OuterDirectionPrev = default(Vector3);	//Prev storage of outer shoulder direction (euler).
            //			Vector3 ShoulderL_OuterDirectionPrev = default(Vector3);	//Prev storage of outer shoulder direction (euler).

            //Height and angle variables, used to change certain parameters of road depending on past & future angle and height changes.
            //			float tAngle = 0f;
            //			float OrigStep = 0.06f;
            float Step = tRoad.opt_RoadDefinition / tSpline.distance;
            //			float AngleStep = 5f;
            Vector3 tHeight0 = new Vector3(0f,0.1f,0f);
            //			Vector3 tHeight2 = new Vector3(0f,0.15f,0f);
            //			Vector3 tHeight1 = new Vector3(0f,0.2f,0f);
            float OuterShoulderWidthR = 0f;
            float OuterShoulderWidthL = 0f;
            float RampOuterWidthR = (OuterShoulderWidthR / 6f) + OuterShoulderWidthR;
            float RampOuterWidthL = (OuterShoulderWidthL / 6f) + OuterShoulderWidthL;
            Vector3 tVect = default(Vector3);
            Vector3 POS = default(Vector3);
            float TempY = 0f;
            //			bool bTempYWasNegative = false;
            //			Vector3 tY = new Vector3(0f,0f,0f);
            float tHeightAdded = 0f;		if(tHeightAdded < 0f){ }
            //			float[] HeightChecks = new float[5];
            Vector3 gHeight = default(Vector3);

            //Bridge variables:
            bool bIsBridge = false;			if(bIsBridge == false){ }
            bool bTempbridge = false;		if(bTempbridge == false){ }
            bool bBridgeInitial = false;	if(bBridgeInitial == false){ }
            bool bBridgeLast = false;		if(bBridgeLast == false){ }
            float BridgeUpComing;
            //			int BridgeLIndex;
            //			int BridgeRIndex;

            //Tunnel variables:
            bool bIsTunnel = false;			if(bIsTunnel == false){ }
            bool bTempTunnel = false;		if(bTempTunnel == false){ }
            bool bTunnelInitial = false; 	if(bTunnelInitial == false){ }
            bool bTunnelLast = false; 		if(bTunnelLast == false){ }
            float TunnelUpComing = 0f;		if(TunnelUpComing < 0f){ }
            //			int TunnelLIndex;
            //			int TunnelRIndex;

            //Intersection variables and buffers:
            float tIntHeight = 0f;			if(tIntHeight < 0f){ }
            float tIntStrength = 0f;		if(tIntStrength < 0f){ }
            float tIntStrength_temp = 0f; 	if(tIntStrength_temp < 0f){ }
            //			float tIntDistCheck = 75f;
            GSDRoadIntersection GSDRI = null;
            bool bIsPastInter = false;
            bool bMaxIntersection = false;
            bool bWasPrevMaxInter = false;
            GSDSplineN xNode = null;
            float tInterSubtract = 4f;
            float tLastInterHeight = -4f;
            bool bOverrideRampR = false;
            bool bOverrideRampL = false;
            Vector3 RampR_Override = default(Vector3);
            Vector3 RampL_Override = default(Vector3);
            bool bFirstInterNode = false;
            bool bInter_PrevWasCorner = false; if(bInter_PrevWasCorner == false){ }
            bool bInter_CurreIsCorner = false;
            bool bInter_CurreIsCornerRR = false;
            bool bInter_CurreIsCornerRL = false;
            bool bInter_CurreIsCornerLL = false;
            bool bInter_CurreIsCornerLR = false;
            bool bInter_PrevWasCornerRR = false;
            bool bInter_PrevWasCornerRL = false;
            bool bInter_PrevWasCornerLL = false;
            bool bInter_PrevWasCornerLR = false;
            Vector3 iTemp_HeightVect = default(Vector3);
            Vector3 rVect_iTemp = default(Vector3);
            Vector3 lVect_iTemp = default(Vector3);
            Vector3 ShoulderR_R_iTemp = default(Vector3);
            Vector3 ShoulderL_L_iTemp = default(Vector3);
            Vector3 RampR_R_iTemp = default(Vector3);
            Vector3 RampR_L_iTemp = default(Vector3);
            Vector3 RampL_R_iTemp = default(Vector3);
            Vector3 RampL_L_iTemp = default(Vector3);
            Vector3 tempIVect_Prev = default(Vector3);
            Vector3 tempIVect = tVect;
            bool b0LAdded = false; if(b0LAdded == false){ }
            bool b1LAdded = false; if(b1LAdded == false){ }
            bool b2LAdded = false; if(b2LAdded == false){ }
            bool b3LAdded = false; if(b3LAdded == false){ }
            bool f0LAdded = false; if(f0LAdded == false){ }
            bool f1LAdded = false; if(f1LAdded == false){ }
            bool f2LAdded = false; if(f2LAdded == false){ }
            bool f3LAdded = false; if(f3LAdded == false){ }
            bool b0RAdded = false; if(b0RAdded == false){ }
            bool b1RAdded = false; if(b1RAdded == false){ }
            bool b2RAdded = false; if(b2RAdded == false){ }
            bool b3RAdded = false; if(b3RAdded == false){ }
            bool f0RAdded = false; if(f0RAdded == false){ }
            bool f1RAdded = false; if(f1RAdded == false){ }
            bool f2RAdded = false; if(f2RAdded == false){ }
            bool f3RAdded = false; if(f3RAdded == false){ }
            bool bInterTestAddAfterR = false; if(bInterTestAddAfterR == false){ }
            bool bInterTestAddAfterL = false; if(bInterTestAddAfterL == false){ }
            //			Vector3 InterTestVect1 = default(Vector3);
            //			Vector3 InterTestVect2 = default(Vector3);
            //			Vector3 InterTestVect3 = default(Vector3);
            //			Vector3 InterTestVect4 = default(Vector3);
            bool bShoulderSkipR = false;
            bool bShoulderSkipL = false;
            bool bShrinkRoadB = false;
            bool bShrinkRoadFNext = false;
            bool bShrinkRoadF = false;
            bool bIsNextInter = false;
            GSDSplineN cNode = null;
            int NodeID = -1;
            int NodeIDPrev = -1;
            int NodeCount = tSpline.GetNodeCount();
            bool bDynamicCut = false;
            float CullDistanceSQ = (3f * RoadWidth) * (3f * RoadWidth);
            float mCornerDist = 0f;
            Vector2 CornerRR = default(Vector2);		if(CornerRR == default(Vector2)){ }
            Vector2 CornerRL = default(Vector2);		if(CornerRL == default(Vector2)){ }
            Vector2 CornerLR = default(Vector2);		if(CornerLR == default(Vector2)){ }
            Vector2 CornerLL = default(Vector2);		if(CornerLL == default(Vector2)){ }
            Vector2 rVect2D = default(Vector2);			if(rVect2D == default(Vector2)){ }
            Vector2 lVect2D = default(Vector2);			if(lVect2D == default(Vector2)){ }
            Vector3 tempIVect_prev = default(Vector3);	if(tempIVect_prev == default(Vector3)){ }
            Vector3 POS_Next = default(Vector3);		if(POS_Next == default(Vector3)){ }
            Vector3 tVect_Next = default(Vector3);		if(tVect_Next == default(Vector3)){ }
            Vector3 rVect_Next = default(Vector3);		if(rVect_Next == default(Vector3)){ }
            Vector3 lVect_Next = default(Vector3);		if(lVect_Next == default(Vector3)){ }
            Vector3 xHeight = default(Vector3); 		if(xHeight == default(Vector3)){ }
            bool bLRtoRR = false;
            bool bLLtoLR = false;
            bool bLine = false;
            bool bImmuneR = false;
            bool bImmuneL = false;
            bool bSpecAddedL = false; if(bSpecAddedL == false){ }
            bool bSpecAddedR = false; if(bSpecAddedR == false){ }
            bool bTriggerInterAddition = false;
            bool bSpecialThreeWayIgnoreR = false;
            bool bSpecialThreeWayIgnoreL = false;
            //			int eCount = -1;
            //			int eIndex = -1;
            //			int uCount = -1;
            //			int uIndex = -1;
            float bMod1 = 1.75f;
            float bMod2 = 1.25f;
            float t2DDist = -1f;
            List<Vector3> vList = null;
            List<int> eList = null;
            float tParam2 = 0f;
            float tParam1 = 0f;
            bool bRecordShoulderForNormals = false;
            bool bRecordShoulderLForNormals = false;

            //Unused for now, for later partial construction methods:
            bool bInterseOn = tRoad.RCS.bInterseOn;
            //			bool bBridgesOn = tRoad.RCS.bBridgesOn;
            //			if(tRoad.RCS.bRoadOn){
                bInterseOn = true;
            //			}

            //Prelim intersection construction and profiling:
            if(tRoad.bProfiling){ Profiler.BeginSample("RoadJob_Prelim_Inter"); }
            if(bInterseOn){
                RoadJob_Prelim_Inter(ref tRoad);
            }

            if(tRoad.bProfiling){ Profiler.EndSample(); }

            if(tRoad.bProfiling){ Profiler.BeginSample("RoadPrelimForLoop"); }

            //Road/shoulder cuts: Init necessary since a road cut is added for the last segment after this function:
            if(tRoad.opt_bRoadCuts || tRoad.opt_bDynamicCuts){
                tRoad.RCS.RoadCutNodes.Add(tSpline.mNodes[0]);
            }
            if(tRoad.opt_bShoulderCuts || tRoad.opt_bDynamicCuts){
                tRoad.RCS.ShoulderCutsLNodes.Add(tSpline.mNodes[0]);
                tRoad.RCS.ShoulderCutsRNodes.Add(tSpline.mNodes[0]);
            }

            //Start initializing the loop. Convuluted to handle special control nodes, so roads don't get rendered where they aren't supposed to, while still preserving the proper curvature.
            float FinalMax = 1f;
            float StartMin = 0f;
            if(tSpline.bSpecialEndControlNode){	//If control node, start after the control node:
                FinalMax = tSpline.mNodes[tSpline.GetNodeCount()-2].tTime;
            }
            if(tSpline.bSpecialStartControlNode){	//If ends in control node, end construction before the control node:
                StartMin = tSpline.mNodes[1].tTime;
            }
            bool bFinalEnd = false;
            float RoadConnection_StartMin1 = StartMin;	//Storage of incremental start values for the road connection mesh construction at the end of this function.
            float RoadConnection_FinalMax1 = FinalMax; 	//Storage of incremental end values for the road connection mesh construction at the end of this function.
            if(tSpline.bSpecialEndNode_IsStart_Delay){
                StartMin += (tSpline.SpecialEndNodeDelay_Start / tSpline.distance);	//If there's a start delay (in meters), delay the start of road construction: Due to special control nodes for road connections or 3 way intersections.
            }else if(tSpline.bSpecialEndNode_IsEnd_Delay){
                FinalMax -= (tSpline.SpecialEndNodeDelay_End / tSpline.distance);	//If there's a end delay (in meters), cut early the end of road construction: Due to special control nodes for road connections or 3 way intersections.
            }
            //			float RoadConnection_StartMin2 = StartMin;	//Storage of incremental start values for the road connection mesh construction at the end of this function.
            //			float RoadConnection_FinalMax2 = FinalMax; 	//Storage of incremental end values for the road connection mesh construction at the end of this function.
            float i=StartMin;

            //			int StartIndex = tSpline.GetClosestRoadDefIndex(StartMin,true,false);
            //			int EndIndex = tSpline.GetClosestRoadDefIndex(FinalMax,false,true);
            //			float cDist = 0f;
            bool kSkip = true;
            bool kSkipFinal = false;
            int kCount = 0;
            int vCount = kCount;
            int kFinalCount = tSpline.RoadDefKeysArray.Length;
            int spamcheckmax1 = 18000;
            int spamcheck1 = 0;

            if(IsApproximately(StartMin,0f,0.0001f)){
                kSkip = false;
            }
            if(IsApproximately(FinalMax,1f,0.0001f)){
                kSkipFinal = true;
            }

            //If startmin > 0 then kcount needs to start at proper road def
            //			bool bStartMinEnabled = false;
            int StartMinIndex1 = 0;

            if(StartMin > 0f){
                kCount = tSpline.GetClosestRoadDefIndex(StartMin,true,false);
            //				bStartMinEnabled = true;
                StartMinIndex1 = 1;
            }

            while(!bFinalEnd && spamcheck1 < spamcheckmax1){
                spamcheck1++;

                if(kSkip){
                    i = StartMin;
                    kSkip = false;
                }else{
                    if(kCount >= kFinalCount){
                        i = FinalMax;
                        if(kSkipFinal){ break; }
                    }else{
                        i = tSpline.TranslateInverseParamToFloat(tSpline.RoadDefKeysArray[kCount]);
                        kCount+=1;
                    }
                }

                if(i > 1f){
                    break;
                }
                if(i < 0f){
                    i = 0f;
                }

                if(IsApproximately(i,FinalMax,0.00001f)){
                    bFinalEnd = true;
                }else if(i > FinalMax){
                    if(tSpline.bSpecialEndControlNode){
                        i = FinalMax;
                        bFinalEnd = true;
                    }else{
                        bFinalEnd = true;
                        break;
                    }
                }
                cNode = tSpline.GetCurrentNode(i);	//Set the current node.
                NodeID = cNode.idOnSpline;			//Set the current node ID.
                if(NodeID != NodeIDPrev && (tRoad.opt_bRoadCuts || tRoad.opt_bDynamicCuts)){	//If different than the previous node id, time to make a cut, if necessary:
                    //Don't ever cut the first node, last node, intersection node, special control nodes, bridge nodes or bridge control nodes:
                    if(NodeID > StartMinIndex1 && NodeID < (NodeCount-1) && !cNode.bIsIntersection && !cNode.bSpecialEndNode){ // && !cNode.bIsBridge_PreNode && !cNode.bIsBridge_PostNode){
                        if(tRoad.opt_bDynamicCuts){
                            bDynamicCut = cNode.bRoadCut;
                        }else{
                            bDynamicCut = true;
                        }

                        if(bDynamicCut){
                            tRoad.RCS.RoadCuts.Add(tRoad.RCS.RoadVectors.Count);			//Add the vector index to cut later.
                            tRoad.RCS.RoadCutNodes.Add(cNode);								//Store the node which was at the beginning of this cut.
                        }
                        if(tRoad.opt_bShoulderCuts && bDynamicCut){	//If option shoulder cuts is on.
                            tRoad.RCS.ShoulderCutsL.Add(tRoad.RCS.ShoulderL_Vectors.Count);	//Add the vector index to cut later.
                            tRoad.RCS.ShoulderCutsLNodes.Add(cNode);						//Store the node which was at the beginning of this cut.
                            tRoad.RCS.ShoulderCutsR.Add(tRoad.RCS.ShoulderR_Vectors.Count);	//Add the vector index to cut later.
                            tRoad.RCS.ShoulderCutsRNodes.Add(cNode);						//Store the node which was at the beginning of this cut.
                        }
                    }
                }
                if(NodeID != NodeIDPrev){
                    if(tRoad.RCS.RoadVectors.Count > 0){
                        cNode.bInitialRoadHeight = tRoad.RCS.RoadVectors[tRoad.RCS.RoadVectors.Count-1].y;
                    }
                }
                NodeIDPrev = NodeID;				//Store the previous node ID for the next round. Done now with road cuts as far as this function is concerned.

                //Set all necessary intersection triggers to false:
                bInter_CurreIsCorner = false;
                bInter_CurreIsCornerRR = false;
                bInter_CurreIsCornerRL = false;
                bInter_CurreIsCornerLL = false;
                bInter_CurreIsCornerLR = false;
                b0LAdded = false;
                b1LAdded = false;
                b2LAdded = false;
                b3LAdded = false;
                f0LAdded = false;
                f1LAdded = false;
                f2LAdded = false;
                f3LAdded = false;
                b0RAdded = false;
                b1RAdded = false;
                b2RAdded = false;
                b3RAdded = false;
                f0RAdded = false;
                f1RAdded = false;
                f2RAdded = false;
                f3RAdded = false;
                bInterTestAddAfterR=false;
                bInterTestAddAfterL=false;
                bShoulderSkipR = false;
                bShoulderSkipL = false;
                bShrinkRoadB = false;
                bShrinkRoadF = false;
                bIsNextInter = false;
                if(bShrinkRoadFNext){
                    bShrinkRoadFNext = false;
                    bShrinkRoadF = true;
                }
                bRecordShoulderForNormals = false;
                bRecordShoulderLForNormals = false;

                //Bridges: Note: This is convoluted due to need for triggers:
                bBridgeInitial = false;
                bBridgeLast = false;
                bTempbridge = tSpline.IsInBridge(i);
                if(!bIsBridge && bTempbridge){
                    bIsBridge = true;
                    bBridgeInitial = true;
                }else if(bIsBridge && !bTempbridge){
                    bIsBridge = false;
                }
                //Check if this is the last bridge run for this bridge:
                if(bIsBridge){
                    bTempbridge = tSpline.IsInBridge(i+Step);
                    if(!bTempbridge){
                        bBridgeLast = true;
                    }
                }

                //Tunnels: Note: This is convoluted due to need for triggers:
                bTunnelInitial = false;
                bTunnelLast = false;
                bTempTunnel = tSpline.IsInTunnel(i);
                if(!bIsTunnel && bTempTunnel){
                    bIsTunnel = true;
                    bTunnelInitial = true;
                }else if(bIsTunnel && !bTempTunnel){
                    bIsTunnel = false;
                }
                //Check if this is the last Tunnel run for this Tunnel:
                if(bIsTunnel){
                    bTempTunnel = tSpline.IsInTunnel(i+Step);
                    if(!bTempTunnel){
                        bTunnelLast = true;
                    }
                }

                //Master Vector3 for the current road construction location:
                tSpline.GetSplineValue_Both(i,out tVect,out POS);

            //				Profiler.EndSample();
            //				Profiler.BeginSample("Test2");

                //Detect downward or upward slope:
                TempY = POS.y;
            //				bTempYWasNegative = false;
                if(TempY < 0f){
            //					bTempYWasNegative = true;
                    TempY *= -1f;
                }
                if(tVect.y < 0f){
                    tVect.y = 0f;
                }

                //Determine if intersection:
                if(bInterseOn){
                    bIsPastInter = false;	//If past intersection
                    tIntStrength = tRoad.GSDSpline.IntersectionStrength(ref tVect,ref tIntHeight, ref GSDRI, ref bIsPastInter, ref i, ref xNode);
                    bMaxIntersection = (tIntStrength >= 1f);	//1f strength = max intersection
                    bFirstInterNode = false;
                }

                //Outer widths:
                if(bMaxIntersection && bInterseOn){
                    GSDRI.SignHeight = tIntHeight;
                    xNode.iConstruction.bBLane0Done_Final_ThisRound = false;
                    xNode.iConstruction.bBLane1Done_Final_ThisRound = false;
                    xNode.iConstruction.bBLane2Done_Final_ThisRound = false;
                    xNode.iConstruction.bBLane3Done_Final_ThisRound = false;
                    xNode.iConstruction.bFLane0Done_Final_ThisRound = false;
                    xNode.iConstruction.bFLane1Done_Final_ThisRound = false;
                    xNode.iConstruction.bFLane2Done_Final_ThisRound = false;
                    xNode.iConstruction.bFLane3Done_Final_ThisRound = false;
                    xNode.iConstruction.bIsFrontFirstRound = false;

                    if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.NoTurnLane){
                        OuterShoulderWidthR = ShoulderSeperation;
                        OuterShoulderWidthL = ShoulderSeperation;
                    }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.TurnLane){
                        OuterShoulderWidthR = ShoulderSep1Lane;
                        OuterShoulderWidthL = ShoulderSep1Lane;
                    }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.BothTurnLanes){
                        if(bIsPastInter){
                            OuterShoulderWidthR = ShoulderSep1Lane;
                            OuterShoulderWidthL = ShoulderSep2Lane;
                        }else{
                            OuterShoulderWidthR = ShoulderSep2Lane;
                            OuterShoulderWidthL = ShoulderSep1Lane;
                        }
                    }
                }else{
                    if(TempY < 0.5f || bIsBridge || bIsTunnel){
                        OuterShoulderWidthR = ShoulderSeperation;
                        OuterShoulderWidthL = ShoulderSeperation;
                    }else{
                        OuterShoulderWidthR = ShoulderSeperation + (TempY*0.05f);
                        OuterShoulderWidthL = ShoulderSeperation + (TempY*0.05f);
                    }
                }

                if(bIsBridge){ //No ramps for bridges:
                    RampOuterWidthR = OuterShoulderWidthR;
                    RampOuterWidthL = OuterShoulderWidthL;
                }else{
                    RampOuterWidthR = (OuterShoulderWidthR / 4f) + OuterShoulderWidthR;
                    RampOuterWidthL = (OuterShoulderWidthL / 4f) + OuterShoulderWidthL;
                }

                //The master outer road edges vector locations:
                if(bMaxIntersection && bInterseOn){	//If in maximum intersection, adjust road edge (also the shoulder inner edges):
                    if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.NoTurnLane){
                        rVect = (tVect + new Vector3(RoadSeperation_NoTurn*POS.normalized.z,0,RoadSeperation_NoTurn*-POS.normalized.x));
                        lVect = (tVect + new Vector3(RoadSeperation_NoTurn*-POS.normalized.z,0,RoadSeperation_NoTurn*POS.normalized.x));
                    }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.TurnLane){
                        rVect = (tVect + new Vector3(RoadSep1Lane*POS.normalized.z,0,RoadSep1Lane*-POS.normalized.x));
                        lVect = (tVect + new Vector3(RoadSep1Lane*-POS.normalized.z,0,RoadSep1Lane*POS.normalized.x));
                    }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.BothTurnLanes){
                        if(bIsPastInter){
                            rVect = (tVect + new Vector3(RoadSep1Lane*POS.normalized.z,0,RoadSep1Lane*-POS.normalized.x));
                            lVect = (tVect + new Vector3(RoadSep2Lane*-POS.normalized.z,0,RoadSep2Lane*POS.normalized.x));;
                        }else{
                            rVect = (tVect + new Vector3(RoadSep2Lane*POS.normalized.z,0,RoadSep2Lane*-POS.normalized.x));
                            lVect = (tVect + new Vector3(RoadSep1Lane*-POS.normalized.z,0,RoadSep1Lane*POS.normalized.x));
                        }
                    }else{
                        rVect = (tVect + new Vector3(RoadSeperation*POS.normalized.z,0,RoadSeperation*-POS.normalized.x));
                        lVect = (tVect + new Vector3(RoadSeperation*-POS.normalized.z,0,RoadSeperation*POS.normalized.x));
                    }
                }else{
                    //Typical road/shoulder inner edge location:
                    rVect = (tVect + new Vector3(RoadSeperation*POS.normalized.z,0,RoadSeperation*-POS.normalized.x));
                    lVect = (tVect + new Vector3(RoadSeperation*-POS.normalized.z,0,RoadSeperation*POS.normalized.x));
                }

                //Shoulder right vectors:
                ShoulderR_rVect = (tVect + new Vector3(OuterShoulderWidthR*POS.normalized.z,0,OuterShoulderWidthR*-POS.normalized.x));
                ShoulderR_lVect = rVect;	//Note that the shoulder inner edge is the same as the road edge vector.
                //Shoulder left vectors:
                ShoulderL_rVect = lVect;	//Note that the shoulder inner edge is the same as the road edge vector.
                ShoulderL_lVect = (tVect + new Vector3(OuterShoulderWidthL*-POS.normalized.z,0,OuterShoulderWidthL*POS.normalized.x));

            //				Profiler.EndSample();
            //				Profiler.BeginSample("Test3");

                //Now to start the main lane construction for the intersection:
                if(bMaxIntersection && bInterseOn){
            //					if(kCount >= tSpline.RoadDefKeysArray.Length){
            //						vCount = tSpline.RoadDefKeysArray.Length-1;
            //					}else{
            //						vCount = kCount-1;
            //					}
                    vCount = kCount;

                    tParam2 = tSpline.TranslateInverseParamToFloat(tSpline.RoadDefKeysArray[vCount]);
                    float tInterStrNext = tRoad.GSDSpline.IntersectionStrength_Next(tSpline.GetSplineValue(tParam2,false));
                    if(IsApproximately(tInterStrNext,1f,0.001f) || tInterStrNext > 1f){
                        bIsNextInter = true;
                    }else{
                        bIsNextInter = false;
                    }

                    if(string.Compare(xNode.UID,GSDRI.Node1.UID) == 0){
                        bFirstInterNode = true;
                    }else{
                        bFirstInterNode = false;
                    }

                    tempIVect = tVect;
                    if(bIsPastInter){
                        bool bLLtoRL = bFirstInterNode;
                        bool bRLtoRR = !bFirstInterNode;
                        if(xNode.iConstruction.iFLane0L.Count == 0){
                            xNode.iConstruction.bIsFrontFirstRound = true;
                            xNode.iConstruction.bIsFrontFirstRoundTriggered = true;
                            xNode.iConstruction.bFLane0Done_Final_ThisRound = true;
                            xNode.iConstruction.bFLane1Done_Final_ThisRound = true;
                            xNode.iConstruction.bFLane2Done_Final_ThisRound = true;
                            xNode.iConstruction.bFLane3Done_Final_ThisRound = true;

                            if(GSDRI.bFlipped && !bFirstInterNode){
                                if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.BothTurnLanes){
                                    xNode.iConstruction.iFLane0L.Add(GVC(GSDRI.fCornerLL_CornerLR[0],tIntHeight));
                                    xNode.iConstruction.iFLane0R.Add(GVC(GSDRI.fCornerLL_CornerLR[1],tIntHeight));
                                    xNode.iConstruction.iFLane1L.Add(GVC(GSDRI.fCornerLL_CornerLR[1],tIntHeight));
                                    xNode.iConstruction.iFLane1R.Add(GVC(GSDRI.fCornerLL_CornerLR[2],tIntHeight));
                                    xNode.iConstruction.iFLane2L.Add(GVC(GSDRI.fCornerLL_CornerLR[2],tIntHeight));
                                    xNode.iConstruction.iFLane2R.Add(GVC(GSDRI.fCornerLL_CornerLR[3],tIntHeight));
                                    xNode.iConstruction.iFLane3L.Add(GVC(GSDRI.fCornerLL_CornerLR[3],tIntHeight));
                                    xNode.iConstruction.iFLane3R.Add(GVC(GSDRI.fCornerLL_CornerLR[4],tIntHeight));
                                }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.TurnLane){
                                    xNode.iConstruction.iFLane0L.Add(GVC(GSDRI.fCornerLL_CornerLR[0],tIntHeight));
                                    xNode.iConstruction.iFLane0R.Add(GVC(GSDRI.fCornerLL_CornerLR[1],tIntHeight));
                                    xNode.iConstruction.iFLane1L.Add(GVC(GSDRI.fCornerLL_CornerLR[1],tIntHeight));
                                    xNode.iConstruction.iFLane1R.Add(GVC(GSDRI.fCornerLL_CornerLR[2],tIntHeight));
                                    xNode.iConstruction.iFLane2L.Add(GVC(GSDRI.fCornerLL_CornerLR[2],tIntHeight));
                                    xNode.iConstruction.iFLane2R.Add(GVC(GSDRI.fCornerLL_CornerLR[3],tIntHeight));
                                }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.NoTurnLane){
                                    xNode.iConstruction.iFLane0L.Add(GVC(GSDRI.fCornerLL_CornerLR[0],tIntHeight));
                                    xNode.iConstruction.iFLane0R.Add(GVC(GSDRI.fCornerLL_CornerLR[1],tIntHeight));
                                    xNode.iConstruction.iFLane1L.Add(GVC(GSDRI.fCornerLL_CornerLR[1],tIntHeight));
                                    xNode.iConstruction.iFLane1R.Add(GVC(GSDRI.fCornerLL_CornerLR[2],tIntHeight));
                                }
                            }else{
                                if(bLLtoRL){
                                    if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.BothTurnLanes){
                                        xNode.iConstruction.iFLane0L.Add(GVC(GSDRI.fCornerLL_CornerRL[4],tIntHeight));
                                        xNode.iConstruction.iFLane0R.Add(GVC(GSDRI.fCornerLL_CornerRL[3],tIntHeight));
                                        xNode.iConstruction.iFLane1L.Add(GVC(GSDRI.fCornerLL_CornerRL[3],tIntHeight));
                                        xNode.iConstruction.iFLane1R.Add(GVC(GSDRI.fCornerLL_CornerRL[2],tIntHeight));
                                        xNode.iConstruction.iFLane2L.Add(GVC(GSDRI.fCornerLL_CornerRL[2],tIntHeight));
                                        xNode.iConstruction.iFLane2R.Add(GVC(GSDRI.fCornerLL_CornerRL[1],tIntHeight));
                                        xNode.iConstruction.iFLane3L.Add(GVC(GSDRI.fCornerLL_CornerRL[1],tIntHeight));
                                        xNode.iConstruction.iFLane3R.Add(GVC(GSDRI.fCornerLL_CornerRL[0],tIntHeight));
                                    }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.TurnLane){
                                        xNode.iConstruction.iFLane0L.Add(GVC(GSDRI.fCornerLL_CornerRL[3],tIntHeight));
                                        xNode.iConstruction.iFLane0R.Add(GVC(GSDRI.fCornerLL_CornerRL[2],tIntHeight));
                                        xNode.iConstruction.iFLane1L.Add(GVC(GSDRI.fCornerLL_CornerRL[2],tIntHeight));
                                        xNode.iConstruction.iFLane1R.Add(GVC(GSDRI.fCornerLL_CornerRL[1],tIntHeight));
                                        xNode.iConstruction.iFLane2L.Add(GVC(GSDRI.fCornerLL_CornerRL[1],tIntHeight));
                                        xNode.iConstruction.iFLane2R.Add(GVC(GSDRI.fCornerLL_CornerRL[0],tIntHeight));
                                    }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.NoTurnLane){
                                        xNode.iConstruction.iFLane0L.Add(GVC(GSDRI.fCornerLL_CornerRL[2],tIntHeight));
                                        xNode.iConstruction.iFLane0R.Add(GVC(GSDRI.fCornerLL_CornerRL[1],tIntHeight));
                                        xNode.iConstruction.iFLane1L.Add(GVC(GSDRI.fCornerLL_CornerRL[1],tIntHeight));
                                        xNode.iConstruction.iFLane1R.Add(GVC(GSDRI.fCornerLL_CornerRL[0],tIntHeight));
                                    }
                                }else if(bRLtoRR){
                                    if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.BothTurnLanes){
                                        xNode.iConstruction.iFLane0L.Add(GVC(GSDRI.fCornerRL_CornerRR[4],tIntHeight));
                                        xNode.iConstruction.iFLane0R.Add(GVC(GSDRI.fCornerRL_CornerRR[3],tIntHeight));
                                        xNode.iConstruction.iFLane1L.Add(GVC(GSDRI.fCornerRL_CornerRR[3],tIntHeight));
                                        xNode.iConstruction.iFLane1R.Add(GVC(GSDRI.fCornerRL_CornerRR[2],tIntHeight));
                                        xNode.iConstruction.iFLane2L.Add(GVC(GSDRI.fCornerRL_CornerRR[2],tIntHeight));
                                        xNode.iConstruction.iFLane2R.Add(GVC(GSDRI.fCornerRL_CornerRR[1],tIntHeight));
                                        xNode.iConstruction.iFLane3L.Add(GVC(GSDRI.fCornerRL_CornerRR[1],tIntHeight));
                                        xNode.iConstruction.iFLane3R.Add(GVC(GSDRI.fCornerRL_CornerRR[0],tIntHeight));
                                    }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.TurnLane){
                                        xNode.iConstruction.iFLane0L.Add(GVC(GSDRI.fCornerRL_CornerRR[3],tIntHeight));
                                        xNode.iConstruction.iFLane0R.Add(GVC(GSDRI.fCornerRL_CornerRR[2],tIntHeight));
                                        xNode.iConstruction.iFLane1L.Add(GVC(GSDRI.fCornerRL_CornerRR[2],tIntHeight));
                                        xNode.iConstruction.iFLane1R.Add(GVC(GSDRI.fCornerRL_CornerRR[1],tIntHeight));
                                        xNode.iConstruction.iFLane2L.Add(GVC(GSDRI.fCornerRL_CornerRR[1],tIntHeight));
                                        xNode.iConstruction.iFLane2R.Add(GVC(GSDRI.fCornerRL_CornerRR[0],tIntHeight));
                                    }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.NoTurnLane){
                                        xNode.iConstruction.iFLane0L.Add(GVC(GSDRI.fCornerRL_CornerRR[2],tIntHeight));
                                        xNode.iConstruction.iFLane0R.Add(GVC(GSDRI.fCornerRL_CornerRR[1],tIntHeight));
                                        xNode.iConstruction.iFLane1L.Add(GVC(GSDRI.fCornerRL_CornerRR[1],tIntHeight));
                                        xNode.iConstruction.iFLane1R.Add(GVC(GSDRI.fCornerRL_CornerRR[0],tIntHeight));
                                    }
                                }
                            }

                            xNode.iConstruction.ShoulderFR_End = xNode.iConstruction.iFLane0L[0];
                            if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.BothTurnLanes){
                                xNode.iConstruction.ShoulderFL_End = xNode.iConstruction.iFLane3R[0];
                            }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.TurnLane){
                                xNode.iConstruction.ShoulderFL_End = xNode.iConstruction.iFLane2R[0];
                            }else{
                                xNode.iConstruction.ShoulderFL_End = xNode.iConstruction.iFLane1R[0];
                            }
                            xNode.iConstruction.ShoulderFL_StartIndex = tRoad.RCS.ShoulderL_Vectors.Count-2;
                            xNode.iConstruction.ShoulderFR_StartIndex = tRoad.RCS.ShoulderR_Vectors.Count-2;
                        }

                        //Line 0:
                        xNode.iConstruction.f0LAttempt = rVect;
                        if(!xNode.iConstruction.bFLane0Done && !GSDRI.Contains(ref rVect)){
                            xNode.iConstruction.iFLane0L.Add(GVC(rVect,tIntHeight)); f0LAdded = true;
                        }

                        //Line 1:
                    //	if(f0LAdded){
                        if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.NoTurnLane){
                            tempIVect = tVect;
                            if(!xNode.iConstruction.bFLane1Done && !GSDRI.Contains(ref tempIVect) && !GSDRI.ContainsLine(tempIVect,rVect)){
                                if(f0LAdded){ xNode.iConstruction.iFLane0R.Add(GVC(tempIVect,tIntHeight)); f0RAdded = true; }
                                xNode.iConstruction.iFLane1L.Add(GVC(tempIVect,tIntHeight)); f1LAdded = true;
                            }else{
                                if(f0LAdded){ xNode.iConstruction.iFLane0L.RemoveAt(xNode.iConstruction.iFLane0L.Count-1); f0LAdded = false; }
                            }
                        }else{
                            tempIVect = (tVect + new Vector3((LaneWidth*0.5f)*POS.normalized.z,0f,(LaneWidth*0.5f)*-POS.normalized.x));
                            if(!xNode.iConstruction.bFLane1Done && !GSDRI.Contains(ref tempIVect) && !GSDRI.ContainsLine(tempIVect,rVect)){
                                if(f0LAdded){ xNode.iConstruction.iFLane0R.Add(GVC(tempIVect,tIntHeight));f0RAdded = true; }
                                xNode.iConstruction.iFLane1L.Add(GVC(tempIVect,tIntHeight)); f1LAdded = true;
                            }else{
                                if(f0LAdded){ xNode.iConstruction.iFLane0L.RemoveAt(xNode.iConstruction.iFLane0L.Count-1); f0LAdded = false; }
                            }
                        }
                        //}
                        xNode.iConstruction.f0RAttempt = tempIVect;
                        xNode.iConstruction.f1LAttempt = tempIVect;

                        //Line 2:
                        //if(f1LAdded){
                        if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.NoTurnLane){
                            tempIVect = lVect;
                            if(!xNode.iConstruction.bFLane2Done && !GSDRI.Contains(ref tempIVect) && !GSDRI.ContainsLine(tempIVect,rVect)){
                                if(f1LAdded){ xNode.iConstruction.iFLane1R.Add(GVC(tempIVect,tIntHeight)); f1RAdded = true; }
                            }else{
                                if(f1LAdded && xNode.iConstruction.iFLane1L.Count > 1){ xNode.iConstruction.iFLane1L.RemoveAt(xNode.iConstruction.iFLane1L.Count-1); f1LAdded = false; }
                            }
                        }else{
                            tempIVect = (tVect + new Vector3((LaneWidth*0.5f)*-POS.normalized.z,0f,(LaneWidth*0.5f)*POS.normalized.x));
                            tempIVect_prev = tempIVect;
                            if(!xNode.iConstruction.bFLane2Done && !GSDRI.Contains(ref tempIVect) && !GSDRI.ContainsLine(tempIVect,rVect)){
                                if(f1LAdded){ xNode.iConstruction.iFLane1R.Add(GVC(tempIVect,tIntHeight)); f1RAdded = true; }
                                xNode.iConstruction.iFLane2L.Add(GVC(tempIVect,tIntHeight)); f2LAdded = true;
                            }else{
                                if(f1LAdded){ xNode.iConstruction.iFLane1L.RemoveAt(xNode.iConstruction.iFLane1L.Count-1); f1LAdded = false; f1RAdded=false; }
                            }
                        }
                        //}
                        xNode.iConstruction.f1RAttempt = tempIVect;
                        xNode.iConstruction.f2LAttempt = tempIVect;

                        //Line 3 / 4:
                        //if(f2LAdded){

                        if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.BothTurnLanes){
                            tempIVect = (tVect + new Vector3(((LaneWidth*0.5f)+RoadSeperation)*-POS.normalized.z,0,((LaneWidth*0.5f)+RoadSeperation)*POS.normalized.x));
                            if(!xNode.iConstruction.bFLane3Done && !GSDRI.Contains(ref tempIVect) && !GSDRI.ContainsLine(lVect,tempIVect)){

                                xNode.iConstruction.iFLane3L.Add(GVC(tempIVect,tIntHeight));  f3LAdded = true;
                                xNode.iConstruction.iFLane3R.Add(GVC(lVect,tIntHeight)); f3RAdded = true;
            //								if(bIsNextInter && GSDRI.iType == GSDRoadIntersection.IntersectionTypeEnum.FourWay){
                                    if(f2LAdded){ xNode.iConstruction.iFLane2R.Add(GVC(tempIVect,tIntHeight)); f2RAdded = true; }
            //								}
                            }else{
                                if(f2LAdded){
                                    xNode.iConstruction.iFLane2L.RemoveAt(xNode.iConstruction.iFLane2L.Count-1); f2LAdded = false;
                                }
                            }

                        }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.TurnLane){
                            tempIVect = (tVect + new Vector3(((LaneWidth*0.5f)+RoadSeperation)*-POS.normalized.z,0,((LaneWidth*0.5f)+RoadSeperation)*POS.normalized.x));
                            if(f2LAdded && !GSDRI.Contains(ref tempIVect) && !GSDRI.ContainsLine(rVect,tempIVect)){
                                xNode.iConstruction.iFLane2R.Add(GVC(tempIVect,tIntHeight)); f2RAdded = true;
                            }else if(f2LAdded){
                                xNode.iConstruction.iFLane2L.RemoveAt(xNode.iConstruction.iFLane2L.Count-1);  f2LAdded = false;
                            }
                        }

                    //	}
                        xNode.iConstruction.f2RAttempt = tempIVect;
                        xNode.iConstruction.f3LAttempt = tempIVect;
                        xNode.iConstruction.f3RAttempt = lVect;

                        if(!bIsNextInter && !xNode.iConstruction.bFDone){
            //							xNode.iConstruction.bFDone = true;
                            xNode.iConstruction.bFLane0Done = true;
                            xNode.iConstruction.bFLane1Done = true;
                            xNode.iConstruction.bFLane2Done = true;
                            xNode.iConstruction.bFLane3Done = true;

                            POS_Next = default(Vector3);
                            tVect_Next = default(Vector3);

                            tParam1 = tSpline.TranslateInverseParamToFloat(tSpline.RoadDefKeysArray[kCount]);
                            tSpline.GetSplineValue_Both(tParam1,out tVect_Next,out POS_Next);
                            rVect_Next = (tVect_Next + new Vector3(RoadSeperation*POS_Next.normalized.z,0,RoadSeperation*-POS_Next.normalized.x));
                            lVect_Next = (tVect_Next + new Vector3(RoadSeperation*-POS_Next.normalized.z,0,RoadSeperation*POS_Next.normalized.x));

                            xNode.iConstruction.iFLane0L.Add(GVC(rVect_Next,tIntHeight));
                            xNode.iConstruction.iFLane0R.Add(GVC(tVect_Next,tIntHeight));
                            if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.BothTurnLanes){
                                xNode.iConstruction.iFLane1L.Add(GVC(tVect_Next,tIntHeight));
                                if(tRoad.opt_Lanes == 2){
                                    xNode.iConstruction.iFLane1R.Add(GVC(((rVect_Next-lVect_Next)*0.475f)+lVect_Next,tIntHeight));
                                }else if(tRoad.opt_Lanes == 4){
                                    xNode.iConstruction.iFLane1R.Add(GVC(((rVect_Next-lVect_Next)*0.488f)+lVect_Next,tIntHeight));
                                }else if(tRoad.opt_Lanes == 6){
                                    xNode.iConstruction.iFLane1R.Add(GVC(((rVect_Next-lVect_Next)*0.492f)+lVect_Next,tIntHeight));
                                }

                                if(tRoad.opt_Lanes == 2){
                                    xNode.iConstruction.iFLane3L.Add(GVC(((rVect_Next-lVect_Next)*0.03f)+lVect_Next,tIntHeight));
                                }else if(tRoad.opt_Lanes == 4){
                                    xNode.iConstruction.iFLane3L.Add(GVC(((rVect_Next-lVect_Next)*0.015f)+lVect_Next,tIntHeight));
                                }else if(tRoad.opt_Lanes == 6){
                                    xNode.iConstruction.iFLane3L.Add(GVC(((rVect_Next-lVect_Next)*0.01f)+lVect_Next,tIntHeight));
                                }

                                xNode.iConstruction.iFLane3R.Add(GVC(lVect_Next,tIntHeight));
            //								xNode.iConstruction.iFLane2L.Add(GVC(tVect_Next,tIntHeight));
            //								xNode.iConstruction.iFLane2R.Add(GVC(lVect_Next,tIntHeight));

                            }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.TurnLane){
                                xNode.iConstruction.iFLane1L.Add(GVC(tVect_Next,tIntHeight));
                                if(tRoad.opt_Lanes == 2){
                                    xNode.iConstruction.iFLane1R.Add(GVC(((rVect_Next-lVect_Next)*0.475f)+lVect_Next,tIntHeight));
                                }else if(tRoad.opt_Lanes == 4){
                                    xNode.iConstruction.iFLane1R.Add(GVC(((rVect_Next-lVect_Next)*0.488f)+lVect_Next,tIntHeight));
                                }else if(tRoad.opt_Lanes == 6){
                                    xNode.iConstruction.iFLane1R.Add(GVC(((rVect_Next-lVect_Next)*0.492f)+lVect_Next,tIntHeight));
                                }
                                xNode.iConstruction.iFLane2L.Add(GVC(tVect_Next,tIntHeight));
                                xNode.iConstruction.iFLane2R.Add(GVC(lVect_Next,tIntHeight));

                            }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.NoTurnLane){
                                xNode.iConstruction.iFLane1L.Add(GVC(tVect_Next,tIntHeight));
                                xNode.iConstruction.iFLane1R.Add(GVC(lVect_Next,tIntHeight));
                            }
                            bShrinkRoadFNext = true;
            //							bShrinkRoadF = true;
                        }

                    }else{
                        bLRtoRR = bFirstInterNode;
                        bLLtoLR = !bFirstInterNode;
                        //B:
                        //Line 0:
                        tempIVect = lVect;
                        bool bFirst123 = false;
                        if(xNode.iConstruction.iBLane0R.Count == 0){
                            xNode.iConstruction.iBLane0L.Add(lVect_Prev);
                            xNode.iConstruction.iBLane0R.Add(tVect_Prev);
                            bShrinkRoadB = true;

                            if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.BothTurnLanes){
                                xNode.iConstruction.iBLane1L.Add(tVect_Prev);
                                xNode.iConstruction.iBLane1R.Add((tVect_Prev + new Vector3((LaneWidth*0.05f)*POS.normalized.z,0,(LaneWidth*0.05f)*-POS.normalized.x)));
                                xNode.iConstruction.iBLane3L.Add(((lVect_Prev-rVect_Prev)*0.03f)+rVect_Prev);
                                xNode.iConstruction.iBLane3R.Add(rVect_Prev);

                            }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.TurnLane){
                                xNode.iConstruction.iBLane1L.Add(tVect_Prev);
                                xNode.iConstruction.iBLane1R.Add((tVect_Prev + new Vector3((LaneWidth*0.05f)*POS.normalized.z,0,(LaneWidth*0.05f)*-POS.normalized.x)));
                                xNode.iConstruction.iBLane2L.Add(xNode.iConstruction.iBLane1R[0]);
                                xNode.iConstruction.iBLane2R.Add(rVect_Prev);

                            }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.NoTurnLane){
                                xNode.iConstruction.iBLane1L.Add(tVect_Prev);
                                xNode.iConstruction.iBLane1R.Add(rVect_Prev);
                            }

                            if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.BothTurnLanes){
                                xNode.iConstruction.ShoulderBL_Start = xNode.iConstruction.iBLane0L[0];
                                xNode.iConstruction.ShoulderBR_Start = xNode.iConstruction.iBLane3R[0];
                            }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.TurnLane){
                                xNode.iConstruction.ShoulderBL_Start = xNode.iConstruction.iBLane0L[0];
                                xNode.iConstruction.ShoulderBR_Start = xNode.iConstruction.iBLane2R[0];
                            }else{
                                xNode.iConstruction.ShoulderBL_Start = xNode.iConstruction.iBLane0L[0];
                                xNode.iConstruction.ShoulderBR_Start = xNode.iConstruction.iBLane1R[0];
                            }

                            xNode.iConstruction.ShoulderBL_StartIndex = tRoad.RCS.ShoulderL_Vectors.Count-2;
                            xNode.iConstruction.ShoulderBR_StartIndex = tRoad.RCS.ShoulderR_Vectors.Count-2;
            //							bFirst123 = true;
            //							goto InterSkip;
                        }

                        bLine = false;
                        if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.BothTurnLanes){
                            bLine = !GSDRI.ContainsLine(tempIVect,(tVect + new Vector3((LaneWidth*0.5f)*-POS.normalized.z,0,(LaneWidth*0.5f)*POS.normalized.x)));
                        }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.TurnLane){
                            bLine = !GSDRI.ContainsLine(tempIVect,(tVect + new Vector3((LaneWidth*0.5f)*-POS.normalized.z,0,(LaneWidth*0.5f)*POS.normalized.x)));
                        }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.NoTurnLane){
                            bLine = !GSDRI.ContainsLine(lVect,tVect);
                        }
                        if(!xNode.iConstruction.bBLane0Done && !GSDRI.Contains(ref tempIVect) && bLine){
                            xNode.iConstruction.iBLane0L.Add(GVC(tempIVect,tIntHeight)); b0LAdded = true;
                        }else if(!xNode.iConstruction.bBLane0Done_Final){
                            //Finalize lane 0:
                            InterFinalizeiBLane0(ref xNode, ref GSDRI, ref tIntHeight, bLRtoRR, bLLtoLR,bFirstInterNode);
                        }

                        //Line 1:
                        if(xNode.GSDRI.rType != GSDRoadIntersection.RoadTypeEnum.NoTurnLane){
                            if(xNode.iConstruction.iBLane0L.Count == 2){
                                tempIVect = (tVect + new Vector3((LaneWidth*0.5f)*-POS.normalized.z,0,(LaneWidth*0.5f)*POS.normalized.x));
                                xNode.iConstruction.iBLane0R.Add(GVC(tempIVect,tIntHeight));  		b0RAdded = true;
                            }
                        }
                        tempIVect_Prev = tempIVect;
                        tempIVect = (tVect + new Vector3((LaneWidth*0.5f)*-POS.normalized.z,0,(LaneWidth*0.5f)*POS.normalized.x));
                        if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.NoTurnLane){ tempIVect = tVect; }
                        bLine = false;
                        if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.BothTurnLanes){
                            bLine = !GSDRI.ContainsLine(tempIVect,(tVect + new Vector3((LaneWidth*0.5f)*POS.normalized.z,0,(LaneWidth*0.5f)*-POS.normalized.x)));
                        }if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.TurnLane){
                            bLine = !GSDRI.ContainsLine(tempIVect,rVect);
                        }else{
                            bLine = !GSDRI.ContainsLine(tempIVect,rVect);
                        }
                        tempIVect_Prev = tempIVect;
                        if(b0LAdded && !xNode.iConstruction.bBLane1Done && !GSDRI.Contains(ref tempIVect) && bLine){
                            if(b0LAdded && (xNode.iConstruction.iBLane0L.Count != 2 || GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.NoTurnLane)){
                                xNode.iConstruction.iBLane0R.Add(GVC(tempIVect,tIntHeight));   	b0RAdded = true;
                            }
                            xNode.iConstruction.iBLane1L.Add(GVC(tempIVect,tIntHeight));		b1LAdded = true;
                        }else if(!xNode.iConstruction.bBLane1Done_Final){
                            //Finalize lane 1:
                            InterFinalizeiBLane1(ref xNode, ref GSDRI, ref tIntHeight, bLRtoRR, bLLtoLR, bFirstInterNode, ref b0LAdded, ref b1RAdded);
                        }

                        //Line 2:
                        if(xNode.iConstruction.iBLane1R.Count == 0 && xNode.GSDRI.rType != GSDRoadIntersection.RoadTypeEnum.NoTurnLane){
                            xNode.iConstruction.iBLane1R.Add(GVC(tVect,tIntHeight));		b1RAdded = true;
                            xNode.iConstruction.iBLane2L.Add(GVC(tVect,tIntHeight));		b2LAdded = true;
                            b2LAdded = true;
                        }else{
                            tempIVect = (tVect + new Vector3((LaneWidth*0.5f)*POS.normalized.z,0,(LaneWidth*0.5f)*-POS.normalized.x));
                            if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.NoTurnLane){ tempIVect = rVect; }
                            if(b1LAdded){
                                bLine = !GSDRI.ContainsLine(tempIVect,tempIVect_Prev);
                            }else{
                                bLine = !GSDRI.ContainsLine(tempIVect,rVect);
                            }
                            if(!xNode.iConstruction.bBLane2Done && !GSDRI.Contains(ref tempIVect) && bLine){
                                if(b1LAdded){ xNode.iConstruction.iBLane1R.Add(GVC(tempIVect,tIntHeight)); b1RAdded = true; }
                                xNode.iConstruction.iBLane2L.Add(GVC(tempIVect,tIntHeight)); b2LAdded = true;
                            }else if(!xNode.iConstruction.bBLane2Done_Final){
                                InterFinalizeiBLane2(ref xNode, ref GSDRI, ref tIntHeight, bLRtoRR, bLLtoLR, bFirstInterNode, ref b2LAdded, ref b1LAdded, ref b0LAdded, ref b1RAdded);
                            }
                        }

                        //Line 3 / 4:
                        tempIVect = (tVect + new Vector3(((LaneWidth*0.5f)+RoadSeperation)*POS.normalized.z,0,((LaneWidth*0.5f)+RoadSeperation)*-POS.normalized.x));
                        if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.NoTurnLane){ tempIVect = rVect; }
                        if(!xNode.iConstruction.bBLane3Done && !GSDRI.ContainsLine(rVect,tempIVect) && !GSDRI.ContainsLine(rVect,lVect)){
                            xNode.iConstruction.iBLane3L.Add(GVC(tempIVect,tIntHeight)); b3LAdded = true;
                            xNode.iConstruction.iBLane3R.Add(GVC(rVect,tIntHeight)); b3RAdded = true;
                            if(!bFirst123 && GSDRI.iType == GSDRoadIntersection.IntersectionTypeEnum.FourWay){
                                if(b2LAdded){ xNode.iConstruction.iBLane2R.Add(GVC(tempIVect,tIntHeight));	 b2RAdded = true; }
                            }
                        }else if(!xNode.iConstruction.bBLane3Done_Final){
                            InterFinalizeiBLane3(ref xNode, ref GSDRI, ref tIntHeight, bLRtoRR, bLLtoLR, bFirstInterNode, ref b2LAdded, ref b1LAdded, ref b0LAdded, ref b1RAdded);
                        }

                    }
                }

            //			InterSkip:

                if(!bIsBridge){
                    BridgeUpComing = tRoad.GSDSpline.BridgeUpComing(i);
            //					if(TempY < 0.5f){
            //						gHeight = tHeight0;
            //					}else if(TempY < 2f){
            //						gHeight = tHeight2;
            //					}else{
            //						if(bTempYWasNegative){
            //							tY = new Vector3(0f,(TempY*0.035f),0f);
            //						}
            //						if(tY.y < tHeight1.y){
            //							tY = tHeight1;
            //						}
            //						gHeight = tY;
            //					}
                    if(BridgeUpComing < 0.2f){
                        BridgeUpComing = 0.2f;
                    }
            //					gHeight.y = gHeight.y * BridgeUpComing;

            //					if(tRoad.opt_MatchTerrain){
                        gHeight.y = 0f;
            //					}

                    lVect += gHeight;
                    rVect += gHeight;
                    ShoulderR_lVect += gHeight;
                    ShoulderL_rVect += gHeight;
                    ShoulderL_lVect += gHeight;
                    ShoulderR_rVect += gHeight;
                    tHeightAdded = gHeight.y;
                }

                if(tIntStrength >= 1f){
                    tVect.y -= tInterSubtract;
                    tLastInterHeight = tVect.y;
                    rVect.y -= tInterSubtract;
                    lVect.y -= tInterSubtract;

                    ShoulderL_rVect.y = tIntHeight;
                    ShoulderR_lVect.y = tIntHeight;
                    ShoulderR_rVect.y = tIntHeight;
                    ShoulderL_lVect.y = tIntHeight;

            //					tIntStrength_temp = tRoad.GSDSpline.IntersectionStrength(ref ShoulderL_rVect,ref tIntHeight, ref GSDRI,ref bIsPastInter,ref i, ref xNode);
            //					if(!Mathf.Approximately(tIntStrength_temp,0f)){ ShoulderL_rVect.y = (tIntStrength_temp*tIntHeight) + ((1-tIntStrength_temp)*ShoulderL_rVect.y); }
            //
            //					tIntStrength_temp = tRoad.GSDSpline.IntersectionStrength(ref ShoulderR_lVect,ref tIntHeight, ref GSDRI,ref bIsPastInter,ref i, ref xNode);
            //					if(!Mathf.Approximately(tIntStrength_temp,0f)){ ShoulderR_lVect.y = (tIntStrength_temp*tIntHeight) + ((1-tIntStrength_temp)*ShoulderR_lVect.y); }
            //
            //					tIntStrength_temp = tRoad.GSDSpline.IntersectionStrength(ref ShoulderR_rVect,ref tIntHeight, ref GSDRI,ref bIsPastInter,ref i, ref xNode);
            //					if(!Mathf.Approximately(tIntStrength_temp,0f)){ ShoulderR_rVect.y = (tIntStrength_temp*tIntHeight) + ((1-tIntStrength_temp)*ShoulderR_rVect.y); }
            //
            //					tIntStrength_temp = tRoad.GSDSpline.IntersectionStrength(ref ShoulderL_lVect,ref tIntHeight, ref GSDRI,ref bIsPastInter,ref i, ref xNode);
            //					if(!Mathf.Approximately(tIntStrength_temp,0f)){ ShoulderL_lVect.y = (tIntStrength_temp*tIntHeight) + ((1-tIntStrength_temp)*ShoulderL_lVect.y); }
                }else if(tIntStrength > 0f){

                    rVect.y = (tIntStrength*tIntHeight) + ((1-tIntStrength)*rVect.y);
                    ShoulderR_lVect = rVect;
                    lVect.y = (tIntStrength*tIntHeight) + ((1-tIntStrength)*lVect.y);
                    ShoulderL_rVect = lVect;
                    ShoulderR_rVect.y = (tIntStrength*tIntHeight) + ((1-tIntStrength)*ShoulderR_rVect.y);
                    ShoulderL_lVect.y = (tIntStrength*tIntHeight) + ((1-tIntStrength)*ShoulderL_lVect.y);

            //					if(!Mathf.Approximately(tIntStrength,0f)){ tVect.y = (tIntStrength*tIntHeight) + ((1-tIntStrength)*tVect.y); }
            //					tIntStrength_temp = tRoad.GSDSpline.IntersectionStrength(ref rVect,ref tIntHeight, ref GSDRI,ref bIsPastInter,ref i, ref xNode);
            //					if(!Mathf.Approximately(tIntStrength_temp,0f)){ rVect.y = (tIntStrength_temp*tIntHeight) + ((1-tIntStrength_temp)*rVect.y); ShoulderR_lVect = rVect; }
            //
            //					tIntStrength_temp = tRoad.GSDSpline.IntersectionStrength(ref lVect,ref tIntHeight, ref GSDRI,ref bIsPastInter,ref i, ref xNode);
            //					if(!Mathf.Approximately(tIntStrength_temp,0f)){ lVect.y = (tIntStrength_temp*tIntHeight) + ((1-tIntStrength_temp)*lVect.y); ShoulderL_rVect = lVect; }
            //
            //					tIntStrength_temp = tRoad.GSDSpline.IntersectionStrength(ref ShoulderR_rVect,ref tIntHeight, ref GSDRI,ref bIsPastInter,ref i, ref xNode);
            //					if(!Mathf.Approximately(tIntStrength_temp,0f)){ ShoulderR_rVect.y = (tIntStrength_temp*tIntHeight) + ((1-tIntStrength_temp)*ShoulderR_rVect.y); }
            //
            //					tIntStrength_temp = tRoad.GSDSpline.IntersectionStrength(ref ShoulderL_lVect,ref tIntHeight, ref GSDRI,ref bIsPastInter,ref i, ref xNode);
            //					if(!Mathf.Approximately(tIntStrength_temp,0f)){ ShoulderL_lVect.y = (tIntStrength_temp*tIntHeight) + ((1-tIntStrength_temp)*ShoulderL_lVect.y); }
                }

                //Ramp:
                RampR_L = ShoulderR_rVect;
                RampL_R = ShoulderL_lVect;
                if(bIsBridge){
                    RampR_R = RampR_L;
                    RampL_L = RampL_R;
                }else{
                    RampR_R = (tVect + new Vector3(RampOuterWidthR*POS.normalized.z,0,RampOuterWidthR*-POS.normalized.x)) + gHeight;
                    SetVectorHeight2(ref RampR_R,ref i, ref tSpline.HeightHistory, ref tSpline);
                    RampR_R.y -= 0.35f;

                    RampL_L = (tVect + new Vector3(RampOuterWidthL*-POS.normalized.z,0,RampOuterWidthL*POS.normalized.x)) + gHeight;
                    SetVectorHeight2(ref RampL_L,ref i, ref tSpline.HeightHistory, ref tSpline);
                    RampL_L.y -= 0.35f;
                }

                //Merge points to intersection corners if necessary:
                if(bMaxIntersection && !bIsBridge && !bIsTunnel && bInterseOn){
                    mCornerDist = tRoad.opt_RoadDefinition* 1.35f;
                    mCornerDist *= mCornerDist;

                    CornerRR = new Vector2(GSDRI.CornerRR.x, GSDRI.CornerRR.z);
                    CornerRL = new Vector2(GSDRI.CornerRL.x, GSDRI.CornerRL.z);
                    CornerLR = new Vector2(GSDRI.CornerLR.x, GSDRI.CornerLR.z);
                    CornerLL = new Vector2(GSDRI.CornerLL.x, GSDRI.CornerLL.z);
                    rVect2D = new Vector2(rVect.x,rVect.z);
                    lVect2D = new Vector2(lVect.x,lVect.z);
                    bOverrideRampR = false;
                    bOverrideRampL = false;
                    bImmuneR = false;
                    bImmuneL = false;
                    bMod1 = 1.75f;
                    bMod2 = 1.25f;
                    t2DDist = -1f;

                    //Find equatable lane vect and move it too
            //					eCount = -1;
            //					eIndex = -1;
            //					uCount = -1;
            //					uIndex = -1;

                    xHeight = new Vector3(0f,-0.1f,0f);
                    bSpecAddedL = false;
                    bSpecAddedR = false;

                    if(bFirstInterNode){
                        bSpecAddedL = (b0LAdded || f0LAdded);
                        if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.NoTurnLane){
                            bSpecAddedR = (b1RAdded || f1LAdded);
                        }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.TurnLane){
                            bSpecAddedR = (b2RAdded || f2LAdded);
                        }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.BothTurnLanes){
                            bSpecAddedR = (b3RAdded || f3LAdded);
                        }
                    }

                    float tempRoadDef = Mathf.Clamp(tRoad.opt_LaneWidth, 3f, 5f);

                    if (GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.NoTurnLane) {

                    } else if (GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.TurnLane) {

                    } else if (GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.BothTurnLanes) {

                    }

                    //RR:
                    if(GSDRI.EvenAngle > 90f){ mCornerDist = tempRoadDef*bMod1; } else { mCornerDist = tempRoadDef*bMod2; }
                    mCornerDist *= mCornerDist;
                    t2DDist = Vector2.SqrMagnitude(CornerRR-rVect2D);
                    if(t2DDist < mCornerDist){
                        bImmuneR = true; bInter_CurreIsCorner = true; bInter_CurreIsCornerRR = true;

                        if(bFirstInterNode){
                            vList = null;
                            if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.NoTurnLane){
                                vList = xNode.iConstruction.iBLane1R;
                                if(xNode.iConstruction.bBLane1Done_Final_ThisRound){ vList = null; }
                            }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.TurnLane){
                                vList = xNode.iConstruction.iBLane2R;
                                if(xNode.iConstruction.bBLane2Done_Final_ThisRound){ vList = null; }
                            }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.BothTurnLanes){
                                vList = xNode.iConstruction.iBLane3R;
                                if(xNode.iConstruction.bBLane3Done_Final_ThisRound){ vList = null; }
                            }

                            eList = new List<int>();
                            if(vList != null){
                                for(int m=0;m<vList.Count;m++){
                                    if(Vector3.SqrMagnitude(vList[m]-ShoulderR_lVect) < 0.01f){
                                        if(!(IsApproximately(vList[m].x,GSDRI.CornerRR.x,0.01f) && IsApproximately(vList[m].z,GSDRI.CornerRR.z,0.01f))){
                                            eList.Add(m);
                                        }
                                    }
                                }
                                for(int m=(eList.Count-1);m>=0;m--){
                                    vList.RemoveAt(eList[m]);
                                }
                            }
                            eList = null;
                        }else{
                            //2nd node can only come through RR as front with R
                            vList = null;
                            vList = xNode.iConstruction.iFLane0L;
                            eList = new List<int>();
                            if(vList != null){
                                for(int m=1;m<vList.Count;m++){
                                    if(Vector3.SqrMagnitude(vList[m]-ShoulderR_lVect) < 0.01f){
                                        if(!(IsApproximately(vList[m].x,GSDRI.CornerRR.x,0.01f) && IsApproximately(vList[m].z,GSDRI.CornerRR.z,0.01f))){
                                            eList.Add(m);
                                        }
                                    }
                                }
                                for(int m=(eList.Count-1);m>=0;m--){
                                    vList.RemoveAt(eList[m]);
                                }
                            }
                            eList = null;
                        }

                        ShoulderR_lVect = new Vector3(CornerRR.x,tIntHeight,CornerRR.y);
                        ShoulderR_rVect = new Vector3(GSDRI.CornerRR_Outer.x,tIntHeight,GSDRI.CornerRR_Outer.z);
                        RampR_Override = new Vector3(GSDRI.CornerRR_RampOuter.x,tIntHeight,GSDRI.CornerRR_RampOuter.z);
                        bRecordShoulderForNormals = true;
                    }else{
                        t2DDist = Vector2.SqrMagnitude(CornerRR-lVect2D);
                        if(t2DDist < mCornerDist){
                            bImmuneL = true; bInter_CurreIsCorner = true; bInter_CurreIsCornerRR = true;

                            //2nd node can come in via left
                            if(!bFirstInterNode){
                                vList = null;
                                vList = xNode.iConstruction.iBLane0L;
                                if(xNode.iConstruction.bBLane0Done_Final_ThisRound){ vList = null; }
                                eList = new List<int>();
                                if(vList != null){
                                    for(int m=0;m<vList.Count;m++){
                                        if(Vector3.SqrMagnitude(vList[m]-ShoulderL_rVect) < 0.01f){
                                            if(!(IsApproximately(vList[m].x,GSDRI.CornerRR.x) && IsApproximately(vList[m].z,GSDRI.CornerRR.z))){
                                                eList.Add(m);
                                            }
                                        }
                                    }
                                    for(int m=(eList.Count-1);m>=0;m--){
                                        vList.RemoveAt(eList[m]);
                                    }
                                }
                                eList = null;
                            }

                            ShoulderL_rVect = new Vector3(CornerRR.x,tIntHeight,CornerRR.y);
                            ShoulderL_lVect = new Vector3(GSDRI.CornerRR_Outer.x,tIntHeight,GSDRI.CornerRR_Outer.z);
                            RampL_Override = new Vector3(GSDRI.CornerRR_RampOuter.x,tIntHeight,GSDRI.CornerRR_RampOuter.z);
                            bRecordShoulderLForNormals = true;
                        }
                    }
                    //RL:
                    if(GSDRI.OddAngle > 90f){ mCornerDist = tempRoadDef*bMod1; } else { mCornerDist = tempRoadDef*bMod2; }
                    mCornerDist *= mCornerDist;
                    t2DDist = Vector2.SqrMagnitude(CornerRL-rVect2D);
                    if(t2DDist < mCornerDist){
                        bImmuneR = true; bInter_CurreIsCorner = true; bInter_CurreIsCornerRL = true;

                        if(bFirstInterNode){
                            vList = null;
                            vList = xNode.iConstruction.iFLane0L;
                            eList = new List<int>();
                            if(vList != null){
                                for(int m=1;m<vList.Count;m++){
                                    if(Vector3.SqrMagnitude(vList[m]-ShoulderR_lVect) < 0.01f){
                                        if(!(IsApproximately(vList[m].x,GSDRI.CornerRL.x) && IsApproximately(vList[m].z,GSDRI.CornerRL.z))){
                                            eList.Add(m);
                                        }
                                    }
                                }
                                for(int m=(eList.Count-1);m>=0;m--){
                                    vList.RemoveAt(eList[m]);
                                }
                            }
                            eList = null;
                        }else{
                            vList = null;
                            if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.NoTurnLane){
                                vList = xNode.iConstruction.iBLane1R;
                            }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.TurnLane){
                                vList = xNode.iConstruction.iBLane2R;
                            }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.BothTurnLanes){
                                vList = xNode.iConstruction.iBLane3R;
                            }

                            //Hitting RL from backside with second node:
                            if(!bFirstInterNode){
                                eList = new List<int>();
                                if(vList != null){
                                    for(int m=0;m<vList.Count;m++){
                                        if(Vector3.SqrMagnitude(vList[m]-ShoulderR_lVect) < 0.01f){
                                            if(!(IsApproximately(vList[m].x,GSDRI.CornerRL.x) && IsApproximately(vList[m].z,GSDRI.CornerRL.z))){
                                                eList.Add(m);
                                                if(m == vList.Count-1){
                                                    if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.NoTurnLane){
                                                        b1RAdded = false;
                                                    }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.TurnLane){
                                                        b2RAdded = false;
                                                    }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.BothTurnLanes){
                                                        b3RAdded = false;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                    for(int m=(eList.Count-1);m>=0;m--){
                                        vList.RemoveAt(eList[m]);
                                    }
                                }
                            }
                            eList = null;
                        }

                        ShoulderR_lVect = new Vector3(CornerRL.x,tIntHeight,CornerRL.y);
                        ShoulderR_rVect = new Vector3(GSDRI.CornerRL_Outer.x,tIntHeight,GSDRI.CornerRL_Outer.z);
                        RampR_Override = new Vector3(GSDRI.CornerRL_RampOuter.x,tIntHeight,GSDRI.CornerRL_RampOuter.z);
                        bRecordShoulderForNormals = true;
                    }else{
                        t2DDist = Vector2.SqrMagnitude(CornerRL-lVect2D);
                        if(t2DDist < mCornerDist){
                            bImmuneL = true; bInter_CurreIsCorner = true; bInter_CurreIsCornerRL = true;

                            if(!bFirstInterNode){
                                vList = null;
                                if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.NoTurnLane){
                                    vList = xNode.iConstruction.iFLane1R;
                                    if(xNode.iConstruction.bFLane1Done_Final_ThisRound){ vList = null; }
                                }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.TurnLane){
                                    vList = xNode.iConstruction.iFLane2R;
                                    if(xNode.iConstruction.bFLane2Done_Final_ThisRound){ vList = null; }
                                }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.BothTurnLanes){
                                    vList = xNode.iConstruction.iFLane3R;
                                    if(xNode.iConstruction.bFLane3Done_Final_ThisRound){ vList = null; }
                                }
                                eList = new List<int>();
                                if(vList != null){
                                    for(int m=1;m<vList.Count;m++){
                                        if(Vector3.SqrMagnitude(vList[m]-ShoulderL_rVect) < 0.01f){
                                            if(!(IsApproximately(vList[m].x,GSDRI.CornerRL.x) && IsApproximately(vList[m].z,GSDRI.CornerRL.z))){
                                                eList.Add(m);
                                            }
                                        }
                                    }
                                    for(int m=(eList.Count-1);m>=0;m--){
                                        vList.RemoveAt(eList[m]);
                                    }
                                }
                                eList = null;
                            }

                            ShoulderL_rVect = new Vector3(CornerRL.x,tIntHeight,CornerRL.y);
                            ShoulderL_lVect = new Vector3(GSDRI.CornerRL_Outer.x,tIntHeight,GSDRI.CornerRL_Outer.z);
                            RampL_Override = new Vector3(GSDRI.CornerRL_RampOuter.x,tIntHeight,GSDRI.CornerRL_RampOuter.z);
                            bRecordShoulderLForNormals = true;
                        }
                    }
                    //LR:
                    if(GSDRI.OddAngle > 90f){ mCornerDist = tempRoadDef*bMod1; } else { mCornerDist = tempRoadDef*bMod2; }
                    mCornerDist *= mCornerDist;
                    t2DDist = Vector2.SqrMagnitude(CornerLR-rVect2D);
                    if(t2DDist < mCornerDist){
                        bImmuneR = true; bInter_CurreIsCorner = true; bInter_CurreIsCornerLR = true;

                        if(!bFirstInterNode){
                            vList = null;
                            if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.NoTurnLane){
                                vList = xNode.iConstruction.iBLane1R;
                                if(xNode.iConstruction.bBLane1Done_Final_ThisRound){ vList = null; }
                            }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.TurnLane){
                                vList = xNode.iConstruction.iBLane2R;
                                if(xNode.iConstruction.bBLane2Done_Final_ThisRound){ vList = null; }
                            }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.BothTurnLanes){
                                vList = xNode.iConstruction.iBLane3R;
                                if(xNode.iConstruction.bBLane3Done_Final_ThisRound){ vList = null; }
                            }

                            eList = new List<int>();
                            if(vList != null){
                                for(int m=0;m<vList.Count;m++){
                                    if(Vector3.SqrMagnitude(vList[m]-ShoulderR_lVect) < 0.01f){
                                        if(!(IsApproximately(vList[m].x,GSDRI.CornerLR.x) && IsApproximately(vList[m].z,GSDRI.CornerLR.z))){
                                            eList.Add(m);
                                        }
                                    }
                                }
                                for(int m=(eList.Count-1);m>=0;m--){
                                    vList.RemoveAt(eList[m]);
                                }
                            }
                            eList = null;
                        }

                        ShoulderR_lVect = new Vector3(CornerLR.x,tIntHeight,CornerLR.y);
                        ShoulderR_rVect = new Vector3(GSDRI.CornerLR_Outer.x,tIntHeight,GSDRI.CornerLR_Outer.z);
                        RampR_Override = new Vector3(GSDRI.CornerLR_RampOuter.x,tIntHeight,GSDRI.CornerLR_RampOuter.z);
                        bRecordShoulderForNormals = true;
                    }else{
                        t2DDist = Vector2.SqrMagnitude(CornerLR-lVect2D);
                        if(t2DDist < mCornerDist){
                            bImmuneL = true; bInter_CurreIsCorner = true; bInter_CurreIsCornerLR = true;

                            if(bFirstInterNode){
                                vList = null;
                                vList = xNode.iConstruction.iBLane0L;
                                if(xNode.iConstruction.bBLane0Done_Final_ThisRound){ vList = null; }
                                eList = new List<int>();
                                if(vList != null){
                                    for(int m=0;m<vList.Count;m++){
                                        if(Vector3.SqrMagnitude(vList[m]-ShoulderL_rVect) < 0.01f){
                                            if(!(IsApproximately(vList[m].x,GSDRI.CornerLR.x) && IsApproximately(vList[m].z,GSDRI.CornerLR.z))){
                                                eList.Add(m);
                                            }
                                        }
                                    }
                                    for(int m=(eList.Count-1);m>=0;m--){
                                        vList.RemoveAt(eList[m]);
                                    }
                                }
                                eList = null;
                            }else{
                                //2nd node can only come through LR as front with L
                                vList = null;
                                if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.NoTurnLane){
                                    vList = xNode.iConstruction.iFLane1R;
                                }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.TurnLane){
                                    vList = xNode.iConstruction.iFLane2R;
                                }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.BothTurnLanes){
                                    vList = xNode.iConstruction.iFLane3R;
                                }
                                eList = new List<int>();
                                if(vList != null){
                                    for(int m=1;m<vList.Count;m++){
                                        if(Vector3.SqrMagnitude(vList[m]-ShoulderL_rVect) < 0.01f){
                                            if(!(IsApproximately(vList[m].x,GSDRI.CornerLR.x) && IsApproximately(vList[m].z,GSDRI.CornerLR.z))){
                                                eList.Add(m);
                                            }
                                        }
                                    }
                                    for(int m=(eList.Count-1);m>=0;m--){
                                        vList.RemoveAt(eList[m]);
                                    }
                                }
                                eList = null;
                            }

                            ShoulderL_rVect = new Vector3(CornerLR.x,tIntHeight,CornerLR.y);
                            ShoulderL_lVect = new Vector3(GSDRI.CornerLR_Outer.x,tIntHeight,GSDRI.CornerLR_Outer.z);
                            RampL_Override = new Vector3(GSDRI.CornerLR_RampOuter.x,tIntHeight,GSDRI.CornerLR_RampOuter.z);
                            bRecordShoulderLForNormals = true;
                        }
                    }
                    //LL:
                    if(GSDRI.EvenAngle > 90f){ mCornerDist = tempRoadDef*bMod1; } else { mCornerDist = tempRoadDef*bMod2; }
                    mCornerDist *= mCornerDist;
                    t2DDist = Vector2.SqrMagnitude(CornerLL-rVect2D);
                    if(t2DDist < mCornerDist){
                        bImmuneR = true; bInter_CurreIsCorner = true; bInter_CurreIsCornerLL = true;

                        if(!bFirstInterNode){
                            vList = null;
                            vList = xNode.iConstruction.iFLane0L;
                            eList = new List<int>();
                            if(vList != null){
                                for(int m=1;m<vList.Count;m++){
                                    if(Vector3.SqrMagnitude(vList[m]-ShoulderR_lVect) < 0.01f){
                                        if(!(IsApproximately(vList[m].x,GSDRI.CornerLL.x) && IsApproximately(vList[m].z,GSDRI.CornerLL.z))){
                                            eList.Add(m);
                                        }
                                    }
                                }
                                for(int m=(eList.Count-1);m>=0;m--){
                                    vList.RemoveAt(eList[m]);
                                }
                            }
                            eList = null;
                        }

                        ShoulderR_lVect = new Vector3(CornerLL.x,tIntHeight,CornerLL.y);
                        ShoulderR_rVect = new Vector3(GSDRI.CornerLL_Outer.x,tIntHeight,GSDRI.CornerLL_Outer.z);
                        RampR_Override = new Vector3(GSDRI.CornerLL_RampOuter.x,tIntHeight,GSDRI.CornerLL_RampOuter.z);
                        bRecordShoulderForNormals = true;
                    }else{
                        t2DDist = Vector2.SqrMagnitude(CornerLL-lVect2D);
                        if(t2DDist < mCornerDist){
                            bImmuneL = true; bInter_CurreIsCorner = true; bInter_CurreIsCornerLL = true;

                            if(bFirstInterNode){
                                vList = null;
                                if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.NoTurnLane){
                                    vList = xNode.iConstruction.iFLane1R;
                                }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.TurnLane){
                                    vList = xNode.iConstruction.iFLane2R;
                                }else if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.BothTurnLanes){
                                    vList = xNode.iConstruction.iFLane3R;
                                }
                                eList = new List<int>();
                                if(vList != null){
                                    for(int m=1;m<vList.Count;m++){
                                        if(Vector3.SqrMagnitude(vList[m]-ShoulderL_rVect) < 0.01f){
                                            if(!(IsApproximately(vList[m].x,GSDRI.CornerLL.x) && IsApproximately(vList[m].z,GSDRI.CornerLL.z))){
                                                eList.Add(m);
                                            }
                                        }
                                    }
                                    for(int m=(eList.Count-1);m>=0;m--){
                                        vList.RemoveAt(eList[m]);
                                    }
                                }
                                eList = null;
                            }else{
                                vList = null;
                                vList = xNode.iConstruction.iBLane0L;
                                if(xNode.iConstruction.bBLane0Done_Final_ThisRound){ vList = null; }
                                eList = new List<int>();
                                if(vList != null){
                                    for(int m=0;m<vList.Count;m++){
                                        if(Vector3.SqrMagnitude(vList[m]-ShoulderL_rVect) < 0.01f){
                                            if(!(IsApproximately(vList[m].x,GSDRI.CornerLL.x) && IsApproximately(vList[m].z,GSDRI.CornerLL.z))){
                                                eList.Add(m);
                                            }
                                        }
                                    }
                                    for(int m=(eList.Count-1);m>=0;m--){
                                        vList.RemoveAt(eList[m]);
                                    }
                                }
                                eList = null;
                            }

                            ShoulderL_rVect = new Vector3(CornerLL.x,tIntHeight,CornerLL.y);
                            ShoulderL_lVect = new Vector3(GSDRI.CornerLL_Outer.x,tIntHeight,GSDRI.CornerLL_Outer.z);
                            RampL_Override = new Vector3(GSDRI.CornerLL_RampOuter.x,tIntHeight,GSDRI.CornerLL_RampOuter.z);
                            bRecordShoulderLForNormals = true;
                        }
                    }

                    if(bImmuneR){
                        bOverrideRampR = true;
                        if(!tRoad.RCS.ImmuneVects.Contains(ShoulderR_lVect)){ tRoad.RCS.ImmuneVects.Add(ShoulderR_lVect); }
                        if(!tRoad.RCS.ImmuneVects.Contains(ShoulderR_rVect)){ tRoad.RCS.ImmuneVects.Add(ShoulderR_rVect); }
                    }
                    if(bImmuneL){
                        bOverrideRampL = true;
                        if(!tRoad.RCS.ImmuneVects.Contains(ShoulderL_rVect)){ tRoad.RCS.ImmuneVects.Add(ShoulderL_rVect); }
                        if(!tRoad.RCS.ImmuneVects.Contains(ShoulderL_lVect)){ tRoad.RCS.ImmuneVects.Add(ShoulderL_lVect); }
                    }
                }

                if(bShrinkRoadB){

                    if (lVect_Prev != new Vector3(0f, 0f, 0f)) {
                        tRoad.RCS.RoadVectors.Add(lVect_Prev);
                        tRoad.RCS.RoadVectors.Add(lVect_Prev);
                        tRoad.RCS.RoadVectors.Add(lVect_Prev);
                        tRoad.RCS.RoadVectors.Add(lVect_Prev);
                    }
                }
                if(bShrinkRoadF){
                    if (lVect != new Vector3(0f, 0f, 0f)) {
                        tRoad.RCS.RoadVectors.Add(lVect);
                        tRoad.RCS.RoadVectors.Add(lVect);
                        tRoad.RCS.RoadVectors.Add(lVect);
                        tRoad.RCS.RoadVectors.Add(lVect);
                    }
                }

                tRoad.RCS.RoadVectors.Add(lVect);
                tRoad.RCS.RoadVectors.Add(lVect);
                tRoad.RCS.RoadVectors.Add(rVect);
                tRoad.RCS.RoadVectors.Add(rVect);

                //Add bounds for later removal:
                if(!bIsBridge && !bIsTunnel && bMaxIntersection && bWasPrevMaxInter && bInterseOn){
                    bool bGoAhead = true;
                    if(xNode.bIsEndPoint){
                        if(xNode.idOnSpline == 1){
                            if(i < xNode.tTime){
                                bGoAhead = false;
                            }
                        }else{
                            if(i > xNode.tTime){
                                bGoAhead = false;
                            }
                        }
                    }

                    //Get this and prev lvect rvect rects:
                    if((Vector3.SqrMagnitude(xNode.pos-tVect) < CullDistanceSQ) && bGoAhead){
                            GSD.Roads.GSDRoadUtil.Construction2DRect vRect = new GSD.Roads.GSDRoadUtil.Construction2DRect(
                                new Vector2(lVect.x,lVect.z),
                                new Vector2(rVect.x,rVect.z),
                                new Vector2(lVect_Prev.x,lVect_Prev.z),
                                new Vector2(rVect_Prev.x,rVect_Prev.z),
                                tLastInterHeight
                                );

                        tRoad.RCS.tIntersectionBounds.Add(vRect);
            //						GameObject tObj = GameObject.CreatePrimitive(PrimitiveType.Cube);
            //						tObj.transform.position = lVect;
            //						tObj.transform.localScale = new Vector3(0.2f,20f,0.2f);
            //						tObj.transform.name = "temp22";
            //
            //						tObj = GameObject.CreatePrimitive(PrimitiveType.Cube);
            //						tObj.transform.position = rVect;
            //						tObj.transform.localScale = new Vector3(0.2f,20f,0.2f);
            //						tObj.transform.name = "temp22";
                    }
                }

                //Ramp construction:
                RampR_L = ShoulderR_rVect;
                RampL_R = ShoulderL_lVect;
                if(bIsBridge){
                    RampR_R = RampR_L;
                    RampL_L = RampL_R;
                }else{
                    RampR_R = (tVect + new Vector3(RampOuterWidthR*POS.normalized.z,0,RampOuterWidthR*-POS.normalized.x)) + gHeight;;
                    if(bOverrideRampR){ RampR_R = RampR_Override; }	//Overrides will come from intersection.
                    SetVectorHeight2(ref RampR_R,ref i, ref tSpline.HeightHistory, ref tSpline);
                    RampR_R.y -= 0.35f;

                    RampL_L = (tVect + new Vector3(RampOuterWidthL*-POS.normalized.z,0,RampOuterWidthL*POS.normalized.x)) + gHeight;;
                    if(bOverrideRampL){ RampL_L = RampL_Override; }	//Overrides will come from intersection.
                    SetVectorHeight2(ref RampL_L,ref i, ref tSpline.HeightHistory, ref tSpline);
                    RampL_L.y -= 0.35f;
                    bOverrideRampR = false;
                    bOverrideRampL = false;
                }

                //If necessary during intersection construction, sometimes an addition will be created inbetween intersection corner points.
                //This addition will create a dip between corner points to 100% ensure there is no shoulder visible on the roads between corner points.
                bTriggerInterAddition = false;
                if(bMaxIntersection && bInterseOn){
                    if(bFirstInterNode){
                        if((bInter_PrevWasCornerLR && bInter_CurreIsCornerLL) || (bInter_PrevWasCornerRR && bInter_CurreIsCornerRL)){
                            bTriggerInterAddition = true;
                        }
                    }else{
                        if(!GSDRI.bFlipped){
                            if((bInter_PrevWasCornerLL && bInter_CurreIsCornerRL) || (bInter_PrevWasCornerLR && bInter_CurreIsCornerRR) || (bInter_PrevWasCornerRR && bInter_CurreIsCornerLR)){
                                bTriggerInterAddition = true;
                            }
                        }else{
                            if((bInter_PrevWasCornerRR && bInter_CurreIsCornerLR) || (bInter_PrevWasCornerLR && bInter_CurreIsCornerRR) || (bInter_PrevWasCornerRL && bInter_CurreIsCornerLL)){
                                bTriggerInterAddition = true;
                            }
                        }
                    }

                    if(GSDRI.rType == GSDRoadIntersection.RoadTypeEnum.BothTurnLanes){
                        bTriggerInterAddition = false;
                    }

                    //For 3-way intersections:
                    bSpecialThreeWayIgnoreR = false;
                    bSpecialThreeWayIgnoreL = false;
                    if(GSDRI.IgnoreSide > -1){
                        if(GSDRI.IgnoreSide == 0){
                            //RR to RL:
                            if(bFirstInterNode && (bInter_PrevWasCornerRR && bInter_CurreIsCornerRL)){
                                bTriggerInterAddition = false;
                            }
                        }else if(GSDRI.IgnoreSide == 1){
                            //RL to LL:
                            if(!bFirstInterNode && ((bInter_PrevWasCornerRL && bInter_CurreIsCornerLL) || (bInter_PrevWasCornerLL && bInter_CurreIsCornerRL))){
                                //bTriggerInterAddition = false;
                                if(GSDRI.bFlipped){
                                    bSpecialThreeWayIgnoreR = true;
                                }else{
                                    bSpecialThreeWayIgnoreL = true;
                                }
                            }
                        }else if(GSDRI.IgnoreSide == 2){
                            //LL to LR:
                            if(bFirstInterNode && (bInter_PrevWasCornerLR && bInter_CurreIsCornerLL)){
                                bTriggerInterAddition = false;
                            }
                        }else if(GSDRI.IgnoreSide == 3){
                            //LR to RR:
                            if(!bFirstInterNode && ((bInter_PrevWasCornerRR && bInter_CurreIsCornerLR) || (bInter_PrevWasCornerLR && bInter_CurreIsCornerRR))){
                                //bTriggerInterAddition = false;
                                if(GSDRI.bFlipped){
                                    bSpecialThreeWayIgnoreL = true;
                                }else{
                                    bSpecialThreeWayIgnoreR = true;
                                }
                            }
                        }
                    }

                    if(bTriggerInterAddition){
                        iTemp_HeightVect = new Vector3(0f,0f,0f);
                        rVect_iTemp = (((rVect_Prev-rVect)*0.5f)+rVect) + iTemp_HeightVect;
                        lVect_iTemp = (((lVect_Prev-lVect)*0.5f)+lVect) + iTemp_HeightVect;
                        ShoulderR_R_iTemp = (((ShoulderR_PrevRVect-ShoulderR_rVect)*0.5f)+ShoulderR_rVect) + iTemp_HeightVect;
                        ShoulderL_L_iTemp = (((ShoulderL_PrevLVect-ShoulderL_lVect)*0.5f)+ShoulderL_lVect) + iTemp_HeightVect;
                        RampR_R_iTemp = (((RampR_PrevR-RampR_R)*0.5f)+RampR_R) + iTemp_HeightVect;
                        RampR_L_iTemp = (((RampR_PrevL-RampR_L)*0.5f)+RampR_L) + iTemp_HeightVect;
                        RampL_R_iTemp = (((RampL_PrevR-RampL_R)*0.5f)+RampL_R) + iTemp_HeightVect;
                        RampL_L_iTemp = (((RampL_PrevL-RampL_L)*0.5f)+RampL_L) + iTemp_HeightVect;

            //						ShoulderL_L_iTemp = lVect_iTemp;
            //						RampL_R_iTemp = lVect_iTemp;
            //						RampL_L_iTemp = lVect_iTemp;
            //
            //						ShoulderR_R_iTemp = rVect_iTemp;
            //						RampR_R_iTemp = rVect_iTemp;
            //						RampR_L_iTemp = rVect_iTemp;
                    }

                    if(bTriggerInterAddition && !(GSDRI.bFlipped && !bFirstInterNode)){
                        if(bFirstInterNode){
                            if((bInter_PrevWasCornerRR && bInter_CurreIsCornerRL && !bSpecialThreeWayIgnoreR)){
                                //Right shoulder:
                                tRoad.RCS.ShoulderR_Vectors.Add(rVect_iTemp);
                                tRoad.RCS.ShoulderR_Vectors.Add(rVect_iTemp);
                                tRoad.RCS.ShoulderR_Vectors.Add(ShoulderR_R_iTemp);
                                tRoad.RCS.ShoulderR_Vectors.Add(ShoulderR_R_iTemp);
                                //Ramps:
                                tRoad.RCS.ShoulderR_Vectors.Add(RampR_L_iTemp);
                                tRoad.RCS.ShoulderR_Vectors.Add(RampR_L_iTemp);
                                tRoad.RCS.ShoulderR_Vectors.Add(RampR_R_iTemp);
                                tRoad.RCS.ShoulderR_Vectors.Add(RampR_R_iTemp);
                            }
                            if((bInter_PrevWasCornerLR && bInter_CurreIsCornerLL && !bSpecialThreeWayIgnoreL)){
                                //Left shoulder:
                                tRoad.RCS.ShoulderL_Vectors.Add(ShoulderL_L_iTemp);
                                tRoad.RCS.ShoulderL_Vectors.Add(ShoulderL_L_iTemp);
                                tRoad.RCS.ShoulderL_Vectors.Add(lVect_iTemp);
                                tRoad.RCS.ShoulderL_Vectors.Add(lVect_iTemp);
                                //Ramp:
                                tRoad.RCS.ShoulderL_Vectors.Add(RampL_L_iTemp);
                                tRoad.RCS.ShoulderL_Vectors.Add(RampL_L_iTemp);
                                tRoad.RCS.ShoulderL_Vectors.Add(RampL_R_iTemp);
                                tRoad.RCS.ShoulderL_Vectors.Add(RampL_R_iTemp);
                            }
                        }else{
                            if((bInter_PrevWasCornerLR && bInter_CurreIsCornerRR && !bSpecialThreeWayIgnoreR)){
                                //Right shoulder:
                                tRoad.RCS.ShoulderR_Vectors.Add(rVect_iTemp);
                                tRoad.RCS.ShoulderR_Vectors.Add(rVect_iTemp);
                                tRoad.RCS.ShoulderR_Vectors.Add(ShoulderR_R_iTemp);
                                tRoad.RCS.ShoulderR_Vectors.Add(ShoulderR_R_iTemp);
                                //Ramps:
                                tRoad.RCS.ShoulderR_Vectors.Add(RampR_L_iTemp);
                                tRoad.RCS.ShoulderR_Vectors.Add(RampR_L_iTemp);
                                tRoad.RCS.ShoulderR_Vectors.Add(RampR_R_iTemp);
                                tRoad.RCS.ShoulderR_Vectors.Add(RampR_R_iTemp);
                            }
                            if((bInter_PrevWasCornerLL && bInter_CurreIsCornerRL && !bSpecialThreeWayIgnoreL)){
                                //Left shoulder:
                                tRoad.RCS.ShoulderL_Vectors.Add(ShoulderL_L_iTemp);
                                tRoad.RCS.ShoulderL_Vectors.Add(ShoulderL_L_iTemp);
                                tRoad.RCS.ShoulderL_Vectors.Add(lVect_iTemp);
                                tRoad.RCS.ShoulderL_Vectors.Add(lVect_iTemp);
                                //Ramp:
                                tRoad.RCS.ShoulderL_Vectors.Add(RampL_L_iTemp);
                                tRoad.RCS.ShoulderL_Vectors.Add(RampL_L_iTemp);
                                tRoad.RCS.ShoulderL_Vectors.Add(RampL_R_iTemp);
                                tRoad.RCS.ShoulderL_Vectors.Add(RampL_R_iTemp);
                            }
                        }
                    }else if(bTriggerInterAddition && (GSDRI.bFlipped && !bFirstInterNode)){
                        if((bInter_PrevWasCornerRR && bInter_CurreIsCornerLR && !bSpecialThreeWayIgnoreL)){
                            //Left shoulder:
                            tRoad.RCS.ShoulderL_Vectors.Add(ShoulderL_L_iTemp);
                            tRoad.RCS.ShoulderL_Vectors.Add(ShoulderL_L_iTemp);
                            tRoad.RCS.ShoulderL_Vectors.Add(lVect_iTemp);
                            tRoad.RCS.ShoulderL_Vectors.Add(lVect_iTemp);
                            //Ramp:
                            tRoad.RCS.ShoulderL_Vectors.Add(RampL_L_iTemp);
                            tRoad.RCS.ShoulderL_Vectors.Add(RampL_L_iTemp);
                            tRoad.RCS.ShoulderL_Vectors.Add(RampL_R_iTemp);
                            tRoad.RCS.ShoulderL_Vectors.Add(RampL_R_iTemp);
                        }
                        if((bInter_PrevWasCornerRL && bInter_CurreIsCornerLL && !bSpecialThreeWayIgnoreR)){
                            //Right shoulder:
                            tRoad.RCS.ShoulderR_Vectors.Add(rVect_iTemp);
                            tRoad.RCS.ShoulderR_Vectors.Add(rVect_iTemp);
                            tRoad.RCS.ShoulderR_Vectors.Add(ShoulderR_R_iTemp);
                            tRoad.RCS.ShoulderR_Vectors.Add(ShoulderR_R_iTemp);
                            //Ramps:
                            tRoad.RCS.ShoulderR_Vectors.Add(RampR_L_iTemp);
                            tRoad.RCS.ShoulderR_Vectors.Add(RampR_L_iTemp);
                            tRoad.RCS.ShoulderR_Vectors.Add(RampR_R_iTemp);
                            tRoad.RCS.ShoulderR_Vectors.Add(RampR_R_iTemp);
                        }
                    }
                }

                //Right shoulder:
                if(!bShoulderSkipR){
                    if(bRecordShoulderForNormals){
                        tRoad.RCS.normals_ShoulderR_averageStartIndexes.Add(tRoad.RCS.ShoulderR_Vectors.Count);
                    }

                    tRoad.RCS.ShoulderR_Vectors.Add(ShoulderR_lVect);
                    tRoad.RCS.ShoulderR_Vectors.Add(ShoulderR_lVect);
                    tRoad.RCS.ShoulderR_Vectors.Add(ShoulderR_rVect);
                    tRoad.RCS.ShoulderR_Vectors.Add(ShoulderR_rVect);
                    tRoad.RCS.ShoulderR_Vectors.Add(RampR_L);
                    tRoad.RCS.ShoulderR_Vectors.Add(RampR_L);
                    tRoad.RCS.ShoulderR_Vectors.Add(RampR_R);
                    tRoad.RCS.ShoulderR_Vectors.Add(RampR_R);

                    //Double up to prevent normal errors from intersection subtraction:
                    if(bImmuneR && bRecordShoulderForNormals){
                        tRoad.RCS.ShoulderR_Vectors.Add(ShoulderR_lVect);
                        tRoad.RCS.ShoulderR_Vectors.Add(ShoulderR_lVect);
                        tRoad.RCS.ShoulderR_Vectors.Add(ShoulderR_rVect);
                        tRoad.RCS.ShoulderR_Vectors.Add(ShoulderR_rVect);
                        tRoad.RCS.ShoulderR_Vectors.Add(RampR_L);
                        tRoad.RCS.ShoulderR_Vectors.Add(RampR_L);
                        tRoad.RCS.ShoulderR_Vectors.Add(RampR_R);
                        tRoad.RCS.ShoulderR_Vectors.Add(RampR_R);
                    }
                }

                //Left shoulder:
                if(!bShoulderSkipL){
                    if(bRecordShoulderLForNormals){
                        tRoad.RCS.normals_ShoulderL_averageStartIndexes.Add(tRoad.RCS.ShoulderL_Vectors.Count);
                    }
                    tRoad.RCS.ShoulderL_Vectors.Add(ShoulderL_lVect);
                    tRoad.RCS.ShoulderL_Vectors.Add(ShoulderL_lVect);
                    tRoad.RCS.ShoulderL_Vectors.Add(ShoulderL_rVect);
                    tRoad.RCS.ShoulderL_Vectors.Add(ShoulderL_rVect);
                    tRoad.RCS.ShoulderL_Vectors.Add(RampL_L);
                    tRoad.RCS.ShoulderL_Vectors.Add(RampL_L);
                    tRoad.RCS.ShoulderL_Vectors.Add(RampL_R);
                    tRoad.RCS.ShoulderL_Vectors.Add(RampL_R);

                    //Double up to prevent normal errors from intersection subtraction:
                    if(bImmuneL && bRecordShoulderForNormals){
                        tRoad.RCS.ShoulderL_Vectors.Add(ShoulderL_lVect);
                        tRoad.RCS.ShoulderL_Vectors.Add(ShoulderL_lVect);
                        tRoad.RCS.ShoulderL_Vectors.Add(ShoulderL_rVect);
                        tRoad.RCS.ShoulderL_Vectors.Add(ShoulderL_rVect);
                        tRoad.RCS.ShoulderL_Vectors.Add(RampL_L);
                        tRoad.RCS.ShoulderL_Vectors.Add(RampL_L);
                        tRoad.RCS.ShoulderL_Vectors.Add(RampL_R);
                        tRoad.RCS.ShoulderL_Vectors.Add(RampL_R);
                    }
                }

                //Previous storage:
                tVect_Prev = tVect;
                rVect_Prev = rVect;
                lVect_Prev = lVect;
                ShoulderR_PrevLVect = ShoulderR_lVect;
                ShoulderL_PrevRVect = ShoulderL_rVect;
            //				ShoulderR_PrevRVect3 = ShoulderR_PrevRVect2;
            //				ShoulderL_PrevLVect3 = ShoulderL_PrevLVect2;
            //				ShoulderR_PrevRVect2 = ShoulderR_PrevRVect;
            //				ShoulderL_PrevLVect2 = ShoulderL_PrevLVect;
                ShoulderR_PrevRVect = ShoulderR_rVect;
                ShoulderL_PrevLVect = ShoulderL_lVect;
                RampR_PrevR = RampR_R;
                RampR_PrevL = RampR_L;
                RampL_PrevR = RampL_R;
                RampL_PrevL = RampL_L;

                //Store more prev variables:
                bWasPrevMaxInter = bMaxIntersection;
                bInter_PrevWasCorner = bInter_CurreIsCorner;
                bInter_PrevWasCornerRR = bInter_CurreIsCornerRR;
                bInter_PrevWasCornerRL = bInter_CurreIsCornerRL;
                bInter_PrevWasCornerLL = bInter_CurreIsCornerLL;
                bInter_PrevWasCornerLR = bInter_CurreIsCornerLR;

            //				i+=Step;//Master step incrementer.
            }
            if(tRoad.bProfiling){ Profiler.EndSample(); }

            if(tRoad.bProfiling){ Profiler.BeginSample("RoadJob_Prelim_FinalizeInter"); }
            //Finalize intersection vectors:
            if(bInterseOn){
                RoadJob_Prelim_FinalizeInter(ref tRoad);
            }
            if(tRoad.bProfiling){ Profiler.EndSample(); }

            if(tRoad.bProfiling){ Profiler.BeginSample("RoadJob_Prelim_RoadConnections"); }
            //Creates road connections if necessary:
            //			float ExtraHeight = 0f;
            //			float RampPercent = 0.2f;
            if(tSpline.bSpecialEndNode_IsStart_Delay){
                Vector3[] RoadConn_verts = new Vector3[4];

                RampR_R = tRoad.RCS.ShoulderR_Vectors[7];
                ShoulderR_rVect = tRoad.RCS.ShoulderR_Vectors[3];
                rVect = tRoad.RCS.ShoulderR_Vectors[0];

                tRoad.RCS.ShoulderR_Vectors.Insert(0,RampR_R);
                tRoad.RCS.ShoulderR_Vectors.Insert(0,RampR_R);
                tRoad.RCS.ShoulderR_Vectors.Insert(0,ShoulderR_rVect);
                tRoad.RCS.ShoulderR_Vectors.Insert(0,ShoulderR_rVect);
                tRoad.RCS.ShoulderR_Vectors.Insert(0,ShoulderR_rVect);
                tRoad.RCS.ShoulderR_Vectors.Insert(0,ShoulderR_rVect);
                tRoad.RCS.ShoulderR_Vectors.Insert(0,rVect);
                tRoad.RCS.ShoulderR_Vectors.Insert(0,rVect);

                RampL_L = tRoad.RCS.ShoulderL_Vectors[4];
                ShoulderL_lVect = tRoad.RCS.ShoulderL_Vectors[0];
                lVect = tRoad.RCS.ShoulderL_Vectors[3];

                tRoad.RCS.ShoulderL_Vectors.Insert(0,ShoulderL_lVect);
                tRoad.RCS.ShoulderL_Vectors.Insert(0,ShoulderL_lVect);
                tRoad.RCS.ShoulderL_Vectors.Insert(0,RampL_L);
                tRoad.RCS.ShoulderL_Vectors.Insert(0,RampL_L);
                tRoad.RCS.ShoulderL_Vectors.Insert(0,lVect);
                tRoad.RCS.ShoulderL_Vectors.Insert(0,lVect);
                tRoad.RCS.ShoulderL_Vectors.Insert(0,ShoulderL_lVect);
                tRoad.RCS.ShoulderL_Vectors.Insert(0,ShoulderL_lVect);

                RoadConn_verts[0] = lVect;
                RoadConn_verts[1] = rVect;
                tSpline.GetSplineValue_Both(RoadConnection_StartMin1,out tVect,out POS);
                RoadSeperation = tSpline.SpecialEndNodeDelay_Start_Result / 2f;
                rVect = (tVect + new Vector3(RoadSeperation*POS.normalized.z,0,RoadSeperation*-POS.normalized.x));
                lVect = (tVect + new Vector3(RoadSeperation*-POS.normalized.z,0,RoadSeperation*POS.normalized.x));
                ShoulderSeperation = RoadSeperation + ShoulderWidth;
                OuterShoulderWidthR = ShoulderSeperation;
                OuterShoulderWidthL = ShoulderSeperation;
                RampOuterWidthR = (OuterShoulderWidthR / 4f) + OuterShoulderWidthR;
                RampOuterWidthL = (OuterShoulderWidthL / 4f) + OuterShoulderWidthL;
                ShoulderR_rVect = (tVect + new Vector3(ShoulderSeperation*POS.normalized.z,0,ShoulderSeperation*-POS.normalized.x));
                ShoulderL_lVect = (tVect + new Vector3(ShoulderSeperation*-POS.normalized.z,0,ShoulderSeperation*POS.normalized.x));
                RampR_R = (tVect + new Vector3(RampOuterWidthR*POS.normalized.z,0,RampOuterWidthR*-POS.normalized.x));
                SetVectorHeight2(ref RampR_R,ref i, ref tSpline.HeightHistory, ref tSpline);
                RampR_R.y -= 0.45f;
                RampL_L = (tVect + new Vector3(RampOuterWidthL*-POS.normalized.z,0,RampOuterWidthL*POS.normalized.x));
                SetVectorHeight2(ref RampL_L,ref i, ref tSpline.HeightHistory, ref tSpline);
                RampL_L.y -= 0.45f;

                tRoad.RCS.ShoulderR_Vectors.Insert(0,RampR_R + tHeight0);
                tRoad.RCS.ShoulderR_Vectors.Insert(0,RampR_R + tHeight0);
                tRoad.RCS.ShoulderR_Vectors.Insert(0,ShoulderR_rVect + tHeight0);
                tRoad.RCS.ShoulderR_Vectors.Insert(0,ShoulderR_rVect + tHeight0);
                tRoad.RCS.ShoulderR_Vectors.Insert(0,ShoulderR_rVect + tHeight0);
                tRoad.RCS.ShoulderR_Vectors.Insert(0,ShoulderR_rVect + tHeight0);
                tRoad.RCS.ShoulderR_Vectors.Insert(0,rVect + tHeight0);
                tRoad.RCS.ShoulderR_Vectors.Insert(0,rVect + tHeight0);

                tRoad.RCS.ShoulderL_Vectors.Insert(0,ShoulderL_lVect + tHeight0);
                tRoad.RCS.ShoulderL_Vectors.Insert(0,ShoulderL_lVect + tHeight0);
                tRoad.RCS.ShoulderL_Vectors.Insert(0,RampL_L + tHeight0);
                tRoad.RCS.ShoulderL_Vectors.Insert(0,RampL_L + tHeight0);
                tRoad.RCS.ShoulderL_Vectors.Insert(0,lVect + tHeight0);
                tRoad.RCS.ShoulderL_Vectors.Insert(0,lVect + tHeight0);
                tRoad.RCS.ShoulderL_Vectors.Insert(0,ShoulderL_lVect + tHeight0);
                tRoad.RCS.ShoulderL_Vectors.Insert(0,ShoulderL_lVect + tHeight0);

                RoadConn_verts[2] = lVect + tHeight0;
                RoadConn_verts[3] = rVect + tHeight0;
                //Tris:
                int[] RoadConn_tris = new int[6];
                RoadConn_tris[0] = 2;
                RoadConn_tris[1] = 0;
                RoadConn_tris[2] = 3;
                RoadConn_tris[3] = 0;
                RoadConn_tris[4] = 1;
                RoadConn_tris[5] = 3;

                Vector3[] RoadConn_normals = new Vector3[4];
                RoadConn_normals[0] = -Vector3.forward;
                RoadConn_normals[1] = -Vector3.forward;
                RoadConn_normals[2] = -Vector3.forward;
                RoadConn_normals[3] = -Vector3.forward;
                Vector2[] RoadConn_uv = new Vector2[4];
                float tMod1 = -1;
                float tMod2 = -1;

                if(tRoad.opt_Lanes == 2){
                    tMod1 = 0.5f - (LaneWidth / tSpline.SpecialEndNodeDelay_Start_Result);
                    tMod2 = 0.5f + (LaneWidth / tSpline.SpecialEndNodeDelay_Start_Result);
                }else if(tRoad.opt_Lanes == 4){
                    tMod1 = 0.5f - ((LaneWidth*2f) / tSpline.SpecialEndNodeDelay_Start_Result);
                    tMod2 = 0.5f + ((LaneWidth*2f) / tSpline.SpecialEndNodeDelay_Start_Result);
                }
                RoadConn_uv[0] = new Vector2(tMod1,0f);
                RoadConn_uv[1] = new Vector2(tMod2,0f);
                RoadConn_uv[2] = new Vector2(0f,1f);
                RoadConn_uv[3] = new Vector2(1f,1f);

                tRoad.RCS.RoadConnections_verts.Add(RoadConn_verts);
                tRoad.RCS.RoadConnections_tris.Add(RoadConn_tris);
                tRoad.RCS.RoadConnections_normals.Add(RoadConn_normals);
                tRoad.RCS.RoadConnections_uv.Add(RoadConn_uv);
            }else if(tSpline.bSpecialEndNode_IsEnd_Delay){
                Vector3[] RoadConn_verts = new Vector3[4];
                int rrCount = tRoad.RCS.ShoulderR_Vectors.Count;
                RampR_R = tRoad.RCS.ShoulderR_Vectors[rrCount-1];
                ShoulderR_rVect = tRoad.RCS.ShoulderR_Vectors[rrCount-3];
                rVect = tRoad.RCS.ShoulderR_Vectors[rrCount-7];

                //Right shoulder:
                tRoad.RCS.ShoulderR_Vectors.Add(rVect);
                tRoad.RCS.ShoulderR_Vectors.Add(rVect);
                tRoad.RCS.ShoulderR_Vectors.Add(ShoulderR_rVect);
                tRoad.RCS.ShoulderR_Vectors.Add(ShoulderR_rVect);
                tRoad.RCS.ShoulderR_Vectors.Add(ShoulderR_rVect);
                tRoad.RCS.ShoulderR_Vectors.Add(ShoulderR_rVect);
                tRoad.RCS.ShoulderR_Vectors.Add(RampR_R);
                tRoad.RCS.ShoulderR_Vectors.Add(RampR_R);

                rrCount = tRoad.RCS.ShoulderL_Vectors.Count;
                RampL_L = tRoad.RCS.ShoulderL_Vectors[rrCount-3];
                ShoulderL_lVect = tRoad.RCS.ShoulderL_Vectors[rrCount-1];
                lVect = tRoad.RCS.ShoulderL_Vectors[rrCount-5];

                //Left shoulder:
                tRoad.RCS.ShoulderL_Vectors.Add(ShoulderL_lVect);
                tRoad.RCS.ShoulderL_Vectors.Add(ShoulderL_lVect);
                tRoad.RCS.ShoulderL_Vectors.Add(lVect);
                tRoad.RCS.ShoulderL_Vectors.Add(lVect);
                tRoad.RCS.ShoulderL_Vectors.Add(RampL_L);
                tRoad.RCS.ShoulderL_Vectors.Add(RampL_L);
                tRoad.RCS.ShoulderL_Vectors.Add(ShoulderL_lVect);
                tRoad.RCS.ShoulderL_Vectors.Add(ShoulderL_lVect);

                RoadConn_verts[0] = lVect;
                RoadConn_verts[1] = rVect;
                tSpline.GetSplineValue_Both(RoadConnection_FinalMax1,out tVect,out POS);
                RoadSeperation = tSpline.SpecialEndNodeDelay_End_Result / 2f;
                rVect = (tVect + new Vector3(RoadSeperation*POS.normalized.z,0,RoadSeperation*-POS.normalized.x));
                lVect = (tVect + new Vector3(RoadSeperation*-POS.normalized.z,0,RoadSeperation*POS.normalized.x));
                ShoulderSeperation = RoadSeperation + ShoulderWidth;
                OuterShoulderWidthR = ShoulderSeperation;
                OuterShoulderWidthL = ShoulderSeperation;
                RampOuterWidthR = (OuterShoulderWidthR / 4f) + OuterShoulderWidthR;
                RampOuterWidthL = (OuterShoulderWidthL / 4f) + OuterShoulderWidthL;
                ShoulderR_rVect = (tVect + new Vector3(ShoulderSeperation*POS.normalized.z,0,ShoulderSeperation*-POS.normalized.x));
                ShoulderL_lVect = (tVect + new Vector3(ShoulderSeperation*-POS.normalized.z,0,ShoulderSeperation*POS.normalized.x));
                RampR_R = (tVect + new Vector3(RampOuterWidthR*POS.normalized.z,0,RampOuterWidthR*-POS.normalized.x));
                SetVectorHeight2(ref RampR_R,ref i, ref tSpline.HeightHistory, ref tSpline);
                RampR_R.y -= 0.35f;
                RampL_L = (tVect + new Vector3(RampOuterWidthL*-POS.normalized.z,0,RampOuterWidthL*POS.normalized.x));
                SetVectorHeight2(ref RampL_L,ref i, ref tSpline.HeightHistory, ref tSpline);
                RampL_L.y -= 0.35f;

                //Right shoulder:
                tRoad.RCS.ShoulderR_Vectors.Add(rVect);
                tRoad.RCS.ShoulderR_Vectors.Add(rVect);
                tRoad.RCS.ShoulderR_Vectors.Add(ShoulderR_rVect);
                tRoad.RCS.ShoulderR_Vectors.Add(ShoulderR_rVect);
                tRoad.RCS.ShoulderR_Vectors.Add(ShoulderR_rVect);
                tRoad.RCS.ShoulderR_Vectors.Add(ShoulderR_rVect);
                tRoad.RCS.ShoulderR_Vectors.Add(RampR_R);
                tRoad.RCS.ShoulderR_Vectors.Add(RampR_R);

                //Left shoulder:
                tRoad.RCS.ShoulderL_Vectors.Add(ShoulderL_lVect);
                tRoad.RCS.ShoulderL_Vectors.Add(ShoulderL_lVect);
                tRoad.RCS.ShoulderL_Vectors.Add(lVect);
                tRoad.RCS.ShoulderL_Vectors.Add(lVect);
                tRoad.RCS.ShoulderL_Vectors.Add(RampL_L);
                tRoad.RCS.ShoulderL_Vectors.Add(RampL_L);
                tRoad.RCS.ShoulderL_Vectors.Add(ShoulderL_lVect);
                tRoad.RCS.ShoulderL_Vectors.Add(ShoulderL_lVect);

                RoadConn_verts[2] = lVect;
                RoadConn_verts[3] = rVect;
                //Tris:
                int[] RoadConn_tris = new int[6];
                RoadConn_tris[0] = 0;
                RoadConn_tris[1] = 2;
                RoadConn_tris[2] = 1;
                RoadConn_tris[3] = 2;
                RoadConn_tris[4] = 3;
                RoadConn_tris[5] = 1;

                Vector3[] RoadConn_normals = new Vector3[4];
                RoadConn_normals[0] = -Vector3.forward;
                RoadConn_normals[1] = -Vector3.forward;
                RoadConn_normals[2] = -Vector3.forward;
                RoadConn_normals[3] = -Vector3.forward;
                Vector2[] RoadConn_uv = new Vector2[4];
                float tMod = (RoadWidth / tSpline.SpecialEndNodeDelay_End_Result)/2f;
                RoadConn_uv[0] = new Vector2(tMod,0f);
                RoadConn_uv[1] = new Vector2(tMod*3f,0f);
                RoadConn_uv[2] = new Vector2(0f,1f);
                RoadConn_uv[3] = new Vector2(1f,1f);
                tRoad.RCS.RoadConnections_verts.Add(RoadConn_verts);
                tRoad.RCS.RoadConnections_tris.Add(RoadConn_tris);
                tRoad.RCS.RoadConnections_normals.Add(RoadConn_normals);
                tRoad.RCS.RoadConnections_uv.Add(RoadConn_uv);
            }
            if(tRoad.bProfiling){ Profiler.EndSample(); }
        }
コード例 #4
0
 public void ConstructBoundsRect()
 {
     BoundsRect = null;
     BoundsRect = new GSD.Roads.GSDRoadUtil.Construction2DRect(new Vector2(CornerRR.x, CornerRR.z), new Vector2(CornerRL.x, CornerRL.z), new Vector2(CornerLR.x, CornerLR.z), new Vector2(CornerLL.x, CornerLL.z));
 }