IEnumerator BuildSegments() { do { if (BuildIdx > 0) { for (Int32 P = Bez.CtrlPts[BuildIdx].SegStartIdx; P < Bez.CtrlPts[BuildIdx].SegStartIdx + Bez.CtrlPts[BuildIdx].SegCount; P++) { if (P < Bez.Path.Count - 1 || (Rd.IsCircular && P == Bez.Path.Count - 1)) { try { SegVerts Verts = XSecCalculator.SegmentVertices(P); RoadSegment seg = Road.Instance.Segments[P]; seg.BuildMeshes(Verts); seg.GetTerrainHeights(); seg.AdjustTerrain(); seg.AddMeshes(); seg.SetMaterial(); if (P == Rd.StartingLineSegIdx) { PlaceStartingLine(P); } if (P == Bez.CtrlPts[BuildIdx].SegStartIdx + Bez.CtrlPts[BuildIdx].SegCount - 1) { Road.Instance.Sectns[BuildIdx].DeleteFence(); Road.Instance.Sectns[BuildIdx].CreateFence(); } } catch (Exception e) { Debug.Log("BuildSegments Error BuildIndex = " + BuildIdx.ToString() + " P = " + P + " TotSegs = " + Road.Instance.Segments.Count + " Source = " + e.ToString()); } yield return(0); //TerrCtl.SetHeight(Bez.Path[P], Bez.Path[P - 1]); } } } if (BuildQueue.Count == 0) { BuildIdx = 0; } else { BuildIdx = BuildQueue.Dequeue(); } yield return(0); } while (true); }
public void Decode() { Road Rd = Road.Instance; Rd.Segments.Clear(); Rd.XSecs.Clear(); Rd.Sectns.Clear(); if (XSecs == null) { //in case we are loading a blank track Rd.Init(); } else { Rd.StartingLineSegIdx = StartingLineSegIdx; if (BuilderPos != null) { Rd.BuilderPos = BuilderPos.V3; } else { Rd.BuilderPos = new Vector3(0, 50f, 0); } if (BuilderRot != null) { Rd.BuilderRot = BuilderRot.Decode; } Rd.IsCircular = IsCircular; foreach (XSecSerial XS in XSecs) { XSec X = XS.Decode(); Rd.XSecs.Add(X); } foreach (RoadSectionSerial RSS in Sectns) { RoadSectn RS = RSS.Decode(); Rd.Sectns.Add(RS); } foreach (RoadSegmentSerial SegS in Segs) { RoadSegment Seg = SegS.Decode(); Rd.Segments.Add(Seg); } //Build the meshes for all the segments for (int Idx = 0; Idx < Segs.Length; Idx++) { RoadSegment seg = Road.Instance.Segments[Idx]; if (seg.HasMesh) { SegVerts Verts = XSecCalculator.SegmentVertices(Idx); seg.BuildMeshes(Verts); } //seg.GetTerrainHeights(); //seg.AdjustTerrain(); //seg.SetMaterial(); //seg.DeleteFence(); //seg.CreateFence(); } Rd.CalculateBends(); } }