示例#1
0
        public Mesh Build(MeshSmoothingMethod method, int times = 5, float alpha = 0.2f, float beta = 0.5f)
        {
            var mesh = triangulation.Build(
                (Vertex2D v) => {
                float z = 0f;
                if (heightTable.ContainsKey(v))
                {
                    z = heightTable[v];
                }
                return(new Vector3(v.Coordinate.x, v.Coordinate.y, -z));
            }
                );

            mesh = Symmetrize(mesh);

            switch (method)
            {
            case MeshSmoothingMethod.Laplacian:
                mesh = MeshSmoothing.LaplacianFilter(mesh, times);
                break;

            case MeshSmoothingMethod.HC:
                mesh = MeshSmoothing.HCFilter(mesh, times, alpha, beta);
                break;
            }

            network = VertexConnection.BuildNetwork(mesh.triangles);
            return(mesh);
        }
示例#2
0
    public static Vector3[] LaplacianFilter(Vector3[] vertices, int[] triangles, int times)
    {
        var network = VertexConnection.BuildNetwork(triangles);

        for (int i = 0; i < times; i++)
        {
            vertices = LaplacianFilter(network, vertices, triangles);
        }
        return(vertices);
    }
示例#3
0
    static Vector3[] HCFilter(Vector3[] vertices, int[] triangles, int times, float alpha, float beta)
    {
        alpha = Mathf.Clamp01(alpha);
        beta  = Mathf.Clamp01(beta);

        var network = VertexConnection.BuildNetwork(triangles);

        Vector3[] origin = new Vector3[vertices.Length];
        Array.Copy(vertices, origin, vertices.Length);
        for (int i = 0; i < times; i++)
        {
            vertices = HCFilter(network, origin, vertices, triangles, alpha, beta);
        }
        return(vertices);
    }
示例#4
0
    static Vector3[] HCFilter(Vector3[] vertices, List <int> limitedTriangles, int times, float alpha, float beta)
    {
        alpha = Mathf.Clamp01(alpha);
        beta  = Mathf.Clamp01(beta);

        var limitedTrianglesArray = limitedTriangles.ToArray();

        var network            = VertexConnection.BuildNetwork(limitedTrianglesArray);
        var limitedVertexCount = limitedTriangles.Max();

        Vector3[] origin = new Vector3[limitedVertexCount];
        Array.Copy(vertices, origin, limitedVertexCount);
        for (int i = 0; i < times; i++)
        {
            vertices = HCFilter(network, origin, vertices, limitedTrianglesArray, alpha, beta);
        }
        return(vertices);
    }
示例#5
0
    public static Vector3[] LaplacianFilter(Vector3[] sourceVertices, int[] sourceTriangles, int times, JobHandle initialJobHandlerDependency)
    {
        var filterJobHandlers = new List <JobHandle>();
        int batchSize         = 250;

        Network        = VertexConnection.BuildNetwork(sourceTriangles);
        LatestVertices = sourceVertices;

        for (int i = 0; i < times; i++)
        {
            var vertexArray    = new NativeArray <Vector3>(LatestVertices, Allocator.TempJob);
            var trianglesArray = new NativeArray <int>(sourceTriangles, Allocator.TempJob);

            var job = new LaplactianFilterJob
            {
                vertices  = vertexArray,
                triangles = trianglesArray
            };

            if (i == 0)
            {
                filterJobHandlers.Add(job.Schedule(vertexArray.Length, batchSize, initialJobHandlerDependency));
            }
            else
            {
                filterJobHandlers.Add(job.Schedule(vertexArray.Length, batchSize, filterJobHandlers[i - 1]));
            }

            filterJobHandlers.Last().Complete();

            // set vertices
            LatestVertices = new Vector3[vertexArray.Length];
            vertexArray.CopyTo(LatestVertices);

            vertexArray.Dispose();
            trianglesArray.Dispose();
        }

        return(LatestVertices);
    }