public Mesh CreateMeshFromPoints(bool combine) { if (spriteRenderer != null && points.Length > 2) { int pointNum = points.Length; if (combine && combineMesh != null) { pointNum = points.Length + combineMesh.vertices.Length; } //Create triangle.NET geometry TriangleNet.Geometry.InputGeometry geometry = new TriangleNet.Geometry.InputGeometry(pointNum); geometry.AddPolygon(points); if (combine && combineMesh != null) { geometry.AddPolygon(combineMesh.vertices.Select(x => (Vector2)x).ToArray()); } //Triangulate TriangleNet.Mesh triangleMesh = new TriangleNet.Mesh(); triangleMesh.Triangulate(geometry); //transform vertices points = new Vector2[triangleMesh.Vertices.Count]; Vector3[] vertices = new Vector3[triangleMesh.Vertices.Count]; Vector3[] normals = new Vector3[triangleMesh.Vertices.Count]; int n = 0; foreach(TriangleNet.Data.Vertex v in triangleMesh.Vertices) { points[n] = new Vector2((float)v.X, (float)v.Y); vertices[n] = new Vector3((float)v.X, (float)v.Y, 0); normals[n]=new Vector3(0,0,-1); n++; } //transform triangles int[] triangles = triangleMesh.Triangles.ToUnityMeshTriangleIndices(); mesh.Clear(); mesh = new Mesh(); mesh.vertices = vertices; mesh.triangles = triangles; mesh.uv = genUV(mesh.vertices); mesh.normals = normals; return mesh; } else { return null; } }
public Mesh CreateMeshFromPoints(bool combine) { if (spriteRenderer != null && points.Length > 2) { int pointNum = points.Length; if (combine && combineMesh != null) { pointNum = points.Length + combineMesh.vertices.Length; } //Create triangle.NET geometry TriangleNet.Geometry.InputGeometry geometry = new TriangleNet.Geometry.InputGeometry(pointNum); geometry.AddPolygon(points); if (combine && combineMesh != null) { geometry.AddPolygon(combineMesh.vertices.Select(x => (Vector2)x).ToArray()); } //Triangulate TriangleNet.Mesh triangleMesh = new TriangleNet.Mesh(); triangleMesh.Triangulate(geometry); //transform vertices points = new Vector2[triangleMesh.Vertices.Count]; Vector3[] vertices = new Vector3[triangleMesh.Vertices.Count]; Vector2[] uvs = new Vector2[triangleMesh.Vertices.Count]; Vector3[] normals = new Vector3[triangleMesh.Vertices.Count]; int n = 0; foreach (TriangleNet.Data.Vertex v in triangleMesh.Vertices) { points[n] = new Vector2((float)v.X, (float)v.Y); vertices[n] = new Vector3((float)v.X, (float)v.Y, 0); normals[n] = new Vector3(0, 0, -1); n++; } //transform triangles int[] triangles = triangleMesh.Triangles.ToUnityMeshTriangleIndices(); mesh.Clear(); mesh = new Mesh(); mesh.vertices = vertices; mesh.triangles = triangles; mesh.uv = genUV(mesh.vertices); mesh.normals = normals; return(mesh); } else { return(null); } }
private void CreateMesh() { Sprite sprite = spriteRenderer.sprite; Rect bounds = GetBounds(polygon); TriangleNet.Mesh tnMesh = new TriangleNet.Mesh(); TriangleNet.Geometry.InputGeometry input = new TriangleNet.Geometry.InputGeometry(); input.AddPolygon(polygon); tnMesh.Triangulate(input); Mesh mesh = new Mesh(); mesh.vertices = tnMesh.Vertices.Select(p => new Vector3((float)p.X, (float)p.Y, 0)).ToArray(); // Not sure about winding // If there is an interesting error, It is probably because of cw/ccw windings int[] tris = tnMesh.Triangles.ToUnityMeshTriangleIndices(); mesh.triangles = tris; List<Vector2> uv = new List<Vector2>(); Vector3 lower = new Vector3(bounds.x, bounds.y); Vector3 size = new Vector3(bounds.xMax, bounds.yMax) - lower; Rect uv_bounds = new Rect(sprite.rect.x / sprite.texture.width, sprite.rect.y / sprite.texture.height, sprite.rect.width / sprite.texture.width, sprite.rect.height / sprite.texture.height); float scalex = sprite.bounds.size.x / bounds.width; float scaley = sprite.bounds.size.y / bounds.height; Vector3[] scaled = mesh.vertices; for (int i = 0; i < mesh.vertices.Length; i++) { Vector3 v = scaled[i]; Vector3 rel = v - lower; uv.Add(new Vector2(rel.x / size.x * uv_bounds.width, rel.y / size.y * uv_bounds.height) + new Vector2(uv_bounds.x, uv_bounds.y)); scaled[i] = new Vector3(v.x * scalex, v.y * scaley, v.z) - ((Vector3)bounds.center * scalex) + sprite.bounds.center; } mesh.MarkDynamic(); mesh.vertices = scaled; mesh.uv = uv.ToArray(); mesh.RecalculateNormals(); mesh.RecalculateBounds(); //GameObject go = new GameObject(); //MeshFilter mf = go.AddComponent<MeshFilter>(); //mf.sharedMesh = mesh; //MeshRenderer mr = go.AddComponent<MeshRenderer>(); //mr.sharedMaterial = spriteRenderer.sharedMaterial; // Check if the Meshes directory exists, if not, create it. DirectoryInfo meshDir = new DirectoryInfo("Assets/Meshes"); if (Directory.Exists(meshDir.FullName) == false) { Directory.CreateDirectory(meshDir.FullName); } ScriptableObjectUtility.CreateAsset(mesh, "Meshes/" + spriteRenderer.gameObject.name + ".Mesh"); }
private void CreateMesh() { Sprite sprite = spriteRenderer.sprite; Rect bounds = GetBounds(polygon); TriangleNet.Mesh tnMesh = new TriangleNet.Mesh(); TriangleNet.Geometry.InputGeometry input = new TriangleNet.Geometry.InputGeometry(); input.AddPolygon(polygon); tnMesh.Triangulate(input); Mesh mesh = new Mesh(); mesh.vertices = tnMesh.Vertices.Select(p => new Vector3((float)p.X, (float)p.Y, 0)).ToArray(); // Not sure about winding // If there is an interesting error, It is probably because of cw/ccw windings int[] tris = tnMesh.Triangles.ToUnityMeshTriangleIndices(); mesh.triangles = tris; List <Vector2> uv = new List <Vector2>(); Vector3 lower = new Vector3(bounds.x, bounds.y); Vector3 size = new Vector3(bounds.xMax, bounds.yMax) - lower; Rect uv_bounds = new Rect(sprite.rect.x / sprite.texture.width, sprite.rect.y / sprite.texture.height, sprite.rect.width / sprite.texture.width, sprite.rect.height / sprite.texture.height); float scalex = sprite.bounds.size.x / bounds.width; float scaley = sprite.bounds.size.y / bounds.height; Vector3[] scaled = mesh.vertices; for (int i = 0; i < mesh.vertices.Length; i++) { Vector3 v = scaled[i]; Vector3 rel = v - lower; uv.Add(new Vector2(rel.x / size.x * uv_bounds.width, rel.y / size.y * uv_bounds.height) + new Vector2(uv_bounds.x, uv_bounds.y)); scaled[i] = new Vector3(v.x * scalex, v.y * scaley, v.z) - ((Vector3)bounds.center * scalex) + sprite.bounds.center; } mesh.MarkDynamic(); mesh.vertices = scaled; mesh.uv = uv.ToArray(); mesh.RecalculateNormals(); mesh.RecalculateBounds(); mesh.Optimize(); //GameObject go = new GameObject(); //MeshFilter mf = go.AddComponent<MeshFilter>(); //mf.sharedMesh = mesh; //MeshRenderer mr = go.AddComponent<MeshRenderer>(); //mr.sharedMaterial = spriteRenderer.sharedMaterial; // Check if the Meshes directory exists, if not, create it. DirectoryInfo meshDir = new DirectoryInfo("Assets/Meshes"); if (Directory.Exists(meshDir.FullName) == false) { Directory.CreateDirectory(meshDir.FullName); } ScriptableObjectUtility.CreateAsset(mesh, "Meshes/" + spriteRenderer.gameObject.name + ".Mesh"); }