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); }
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); }
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); }
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); }
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); }