Ejemplo n.º 1
0
    public static SegVerts SegmentVertices(int Idx)
    {
        SegVerts rtn = new SegVerts();

        try
        {
            if (Road.Instance.IsCircular && Idx == Road.Instance.XSecs.Count - 1)
            {
                rtn.MidPtF    = Road.Instance.XSecs[0].MidPt;
                rtn.KerbFL    = Road.Instance.XSecs[0].KerbL;
                rtn.KerbFR    = Road.Instance.XSecs[0].KerbR;
                rtn.TerrainFL = Road.Instance.XSecs[0].TerrainL;
                rtn.TerrainFR = Road.Instance.XSecs[0].TerrainR;
            }
            else
            {
                rtn.MidPtF    = Road.Instance.XSecs[Idx + 1].MidPt;
                rtn.KerbFL    = Road.Instance.XSecs[Idx + 1].KerbL;
                rtn.KerbFR    = Road.Instance.XSecs[Idx + 1].KerbR;
                rtn.TerrainFL = Road.Instance.XSecs[Idx + 1].TerrainL;
                rtn.TerrainFR = Road.Instance.XSecs[Idx + 1].TerrainR;
            }
            rtn.MidPtB    = Road.Instance.XSecs[Idx].MidPt;
            rtn.KerbBL    = Road.Instance.XSecs[Idx].KerbL;
            rtn.KerbBR    = Road.Instance.XSecs[Idx].KerbR;
            rtn.TerrainBL = Road.Instance.XSecs[Idx].TerrainL;
            rtn.TerrainBR = Road.Instance.XSecs[Idx].TerrainR;
        }
        catch (System.Exception e)
        {
            Debug.Log("Error " + e.ToString());
        }
        return(rtn);
    }
Ejemplo n.º 2
0
    /// <summary>
    /// For dirt and air roads - Creates a double cube mesh instead of a plane which cant be convex
    /// </summary>
    /// <param name="V"></param>
    Mesh BuildMesh3(SegVerts V)
    {
        Mesh mesh = new Mesh();

        Verts = V;
        Vector3[] vertsArray = new Vector3[12]  {
            Verts.KerbFL, Verts.MidPtF, Verts.KerbFR, Verts.KerbBL, Verts.MidPtB, Verts.KerbBR,
            Verts.KerbFR + Vector3.down, Verts.MidPtF + Vector3.down, Verts.KerbFL + Vector3.down, Verts.KerbBR + Vector3.down, Verts.MidPtB + Vector3.down, Verts.KerbBL + Vector3.down
        };
        int[] tris = new int[60] {
            0, 1, 3, 3, 1, 4, 1, 2, 4, 4, 2, 5, 5, 9, 4, 4, 9, 10, 5, 2, 9, 9, 2, 6, 2, 1, 7, 7, 6, 2, 6, 7, 9, 9, 7, 10, 10, 7, 8, 8, 11, 10, 8, 0, 3, 3, 11, 8, 8, 7, 1, 1, 0, 8, 10, 11, 3, 3, 4, 10
        };

        Vector3[] terrainVertsArray = new Vector3[6] {
            Verts.TerrainFL, Verts.MidPtF, Verts.TerrainFR, Verts.TerrainBL, Verts.MidPtB, Verts.TerrainBR
        };
        int[] _terrainTris = new int[12] {
            0, 1, 3, 3, 1, 4, 1, 2, 4, 4, 2, 5
        };



        /*
         * Vertex layout
         *
         * front       1-7           7-1
         |/|           |/|
         * 0-----1-----2-6-----7-----8-0
         |    /|    /| |    /|    /| |
         |  /T O P/  |\|  /B T M/  |\|
         |/    |/    | |/    |/    | |
         | 3-----4-----5-9----10----11-3
         |/|           |/|
         | back        4-10         10-4
         |
         */

        mesh.Clear();
        mesh.vertices  = vertsArray;
        mesh.triangles = tris;

        mesh.RecalculateBounds();
        mesh.RecalculateNormals();

        /*terrainMesh.Clear();
         * terrainMesh.vertices = terrainVertsArray;
         * terrainMesh.triangles = _terrainTris;
         * //terrainMesh.uv = uvs;
         * terrainMesh.RecalculateBounds();
         * terrainMesh.RecalculateNormals();*/

        //HasMesh = true;
        return(mesh);
    }
Ejemplo n.º 3
0
 public void BuildMeshes(SegVerts V)
 {
     TopSideMesh = BuildMesh2(V);
     if (roadMaterial == "Dirt" || roadMaterial == "Air")
     {
         ColliderMesh = BuildMesh3(V);
     }
     else
     {
         ColliderMesh = TopSideMesh;
     }
 }
Ejemplo n.º 4
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);
 }
Ejemplo n.º 5
0
    /// <summary>
    /// Builds meshes for visible roads which consist of a Top plane and underside plane
    /// </summary>
    /// <param name="V"></param>
    Mesh BuildMesh2(SegVerts V)
    {
        Mesh mesh = new Mesh();

        Verts = V;
        Vector3[] vertsArray = new Vector3[6] {
            Verts.KerbFL, Verts.MidPtF, Verts.KerbFR, Verts.KerbBL, Verts.MidPtB, Verts.KerbBR
        };
        Vector3[] terrainVertsArray = new Vector3[6] {
            Verts.TerrainFL, Verts.MidPtF, Verts.TerrainFR, Verts.TerrainBL, Verts.MidPtB, Verts.TerrainBR
        };
        Vector2[] uvs  = new Vector2[6];
        int[]     tris = new int[12] {
            0, 1, 3, 3, 1, 4, 1, 2, 4, 4, 2, 5
        };

        /*
         * Vertex layout
         * 0---1---2
         |  /|  /|
         | / | / |
         |/  |/  |
         | 3---4---5
         */
        float _offset = 0;

        if (roadMaterial == "Dirt")
        {
        }

        uvs[0] = new Vector2(0.0f + _offset, 1.0f);
        uvs[1] = new Vector2(0.5f + _offset, 1.0f);
        uvs[2] = new Vector2(1.0f + _offset, 1.0f);
        uvs[3] = new Vector2(0.0f + _offset, 0.0f);
        uvs[4] = new Vector2(0.5f + _offset, 0.0f);
        uvs[5] = new Vector2(1.0f + _offset, 0.0f);



        mesh.Clear();
        mesh.vertices  = vertsArray;
        mesh.triangles = tris;
        mesh.uv        = uvs;
        mesh.RecalculateBounds();
        mesh.RecalculateNormals();
        ;

        terrainMesh.Clear();
        terrainMesh.vertices  = terrainVertsArray;
        terrainMesh.triangles = tris;
        terrainMesh.uv        = uvs;
        terrainMesh.RecalculateBounds();
        terrainMesh.RecalculateNormals();
        ;

        UndersideMesh.Clear();
        Vector3[] UndersideVerts = new Vector3[vertsArray.Length];
        for (int n = 0; n < vertsArray.Length; n++)
        {
            UndersideVerts[n] = vertsArray[n] + Vector3.down;
        }
        UndersideMesh.vertices  = UndersideVerts;
        UndersideMesh.triangles = new int[12] {
            0, 3, 1, 3, 4, 1, 1, 4, 2, 4, 5, 2
        };
        UndersideMesh.uv = uvs;
        UndersideMesh.RecalculateBounds();
        UndersideMesh.RecalculateNormals();
        HasMesh = true;
        return(mesh);
    }
Ejemplo n.º 6
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();
        }
    }