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); }
/// <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); }
public void BuildMeshes(SegVerts V) { TopSideMesh = BuildMesh2(V); if (roadMaterial == "Dirt" || roadMaterial == "Air") { ColliderMesh = BuildMesh3(V); } else { ColliderMesh = TopSideMesh; } }
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); }
/// <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); }
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(); } }