コード例 #1
0
 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);
 }
コード例 #2
0
    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();
        }
    }