Пример #1
0
    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();
    }
Пример #2
0
    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();
    }