public void AddIntersection(Intersection inter) { List <Vector3[]> interPoints = new List <Vector3[]> (); foreach (Point point in inter.Points) { interPoints.Add(this.GetVerticeOffset(point, point.road.GetOther(point))); } if (addedIntersections.Exists(p => p.IsThisOne(inter))) { return; } addedIntersections.Add(inter); Mesh mesh = intersectionMeshFilter.sharedMesh; List <int> triangles = mesh.vertexCount == 0 ? new List <int>() : new List <int> (mesh.triangles); List <Vector3> vertices = new List <Vector3> (mesh.vertices); List <Vector3> normals = new List <Vector3> (mesh.normals); List <Vector2> uvs = new List <Vector2> (mesh.uv); int last = vertices.Count - 1; List <Vector3> interVecs = new List <Vector3> (); foreach (Vector3[] points in interPoints) { interVecs.AddRange(points); } Vector3 center = new Vector3(interVecs.Average(p => p.x), 0, interVecs.Average(p => p.z)); IComparer <Vector3> comparer = new CircleSort(center); interVecs.Sort(comparer); interVecs.Reverse(); interVecs.Add(interVecs [0]); for (int i = 0; i < interVecs.Count - 1; i++) { Vector3 vertA = interVecs[i]; Vector3 vertB = interVecs[i + 1]; Vector3 vertC = center; vertices.AddRange(new Vector3[] { vertA, vertB, vertC }); triangles.AddRange(new int[] { ++last, ++last, ++last }); normals.AddRange(new Vector3[] { Vector3.up, Vector3.up, Vector3.up }); uvs.AddRange(new Vector2[] { new Vector2(0, 1), new Vector2(1, 1), new Vector2(0.5f, 0.5f) }); } mesh.vertices = vertices.ToArray(); mesh.triangles = triangles.ToArray(); mesh.uv = uvs.ToArray();; mesh.RecalculateNormals(); }
public void AddIntersection(Intersection inter) { List <Vector3[]> interPoints = new List <Vector3[]> (); foreach (RoadPoint point in inter.Points) { interPoints.Add(this.getVerticeOffset(point, point.mySegement.GetOther(point))); } //intersection already exists if (this.IntersectionList.Exists(p => p.IsThisOne(inter))) { return; } //add this intersection to existing this.IntersectionList.Add(inter); Mesh mesh = this.Intersections.GetComponent <MeshFilter>().sharedMesh; //get mesh details List <int> triangles = mesh.vertexCount == 0 ? new List <int>() : new List <int> (mesh.triangles); List <Vector3> vertices = new List <Vector3> (mesh.vertices); List <Vector3> normals = new List <Vector3> (mesh.normals); List <Vector2> uvs = new List <Vector2> (mesh.uv); //get last triangle int last = vertices.Count - 1; List <Vector3> interVecs = new List <Vector3> (); foreach (Vector3[] points in interPoints) { interVecs.AddRange(points); } Vector3 center = new Vector3(interVecs.Average(p => p.x), 0, interVecs.Average(p => p.z)); IComparer <Vector3> comparer = new CircleSort(center); interVecs.Sort(comparer); interVecs.Reverse(); //interVecs.OrderBy (p => Mathf.Atan2 (p.z - center.z, p.x - center.x) * Mathf.Rad2Deg).ThenBy (p => Vector3.Distance (p, center)); interVecs.Add(interVecs [0]); for (int i = 0; i < interVecs.Count - 1; i++) { //create vertices Vector3 vertA = interVecs[i]; Vector3 vertB = interVecs[i + 1]; Vector3 vertC = center; //add vertices vertices.AddRange(new Vector3[] { vertA, vertB, vertC }); //add triangles triangles.AddRange(new int[] { ++last, ++last, ++last }); //add normals normals.AddRange(new Vector3[] { Vector3.up, Vector3.up, Vector3.up }); //add uvs uvs.AddRange(new Vector2[] { new Vector2(0, 1), new Vector2(1, 1), new Vector2(0.5f, 0.5f) }); } mesh.vertices = vertices.ToArray(); mesh.triangles = triangles.ToArray(); mesh.uv = uvs.ToArray(); //mesh.normals = normals.ToArray(); mesh.RecalculateNormals(); }