using UnityEngine; using System.Collections.Generic; namespace AwesomeTechnologies.Utility { public static class MeshExtension { private class Vertices { List verts = null; List uv1 = null; List uv2 = null; List uv3 = null; List uv4 = null; List normals = null; List tangents = null; List colors = null; List boneWeights = null; public Vertices() { verts = new List(); } public Vertices(Mesh aMesh) { verts = CreateList(aMesh.vertices); uv1 = CreateList(aMesh.uv); uv2 = CreateList(aMesh.uv2); uv3 = CreateList(aMesh.uv3); uv4 = CreateList(aMesh.uv4); normals = CreateList(aMesh.normals); tangents = CreateList(aMesh.tangents); colors = CreateList(aMesh.colors32); boneWeights = CreateList(aMesh.boneWeights); } private List CreateList(T[] aSource) { if (aSource == null || aSource.Length == 0) return null; return new List(aSource); } private void Copy(ref List aDest, List aSource, int aIndex) { if (aSource == null) return; if (aDest == null) aDest = new List(); aDest.Add(aSource[aIndex]); } public int Add(Vertices aOther, int aIndex) { int i = verts.Count; Copy(ref verts, aOther.verts, aIndex); Copy(ref uv1, aOther.uv1, aIndex); Copy(ref uv2, aOther.uv2, aIndex); Copy(ref uv3, aOther.uv3, aIndex); Copy(ref uv4, aOther.uv4, aIndex); Copy(ref normals, aOther.normals, aIndex); Copy(ref tangents, aOther.tangents, aIndex); Copy(ref colors, aOther.colors, aIndex); Copy(ref boneWeights, aOther.boneWeights, aIndex); return i; } public void AssignTo(Mesh aTarget) { aTarget.SetVertices(verts); if (uv1 != null) aTarget.SetUVs(0, uv1); if (uv2 != null) aTarget.SetUVs(1, uv2); if (uv3 != null) aTarget.SetUVs(2, uv3); if (uv4 != null) aTarget.SetUVs(3, uv4); if (normals != null) aTarget.SetNormals(normals); if (tangents != null) aTarget.SetTangents(tangents); if (colors != null) aTarget.SetColors(colors); if (boneWeights != null) aTarget.boneWeights = boneWeights.ToArray(); } } public static Mesh GetSubmesh(this Mesh aMesh, int aSubMeshIndex) { if (aSubMeshIndex < 0 || aSubMeshIndex >= aMesh.subMeshCount) return null; int[] indices = aMesh.GetTriangles(aSubMeshIndex); Vertices source = new Vertices(aMesh); Vertices dest = new Vertices(); Dictionary map = new Dictionary(); int[] newIndices = new int[indices.Length]; for (int i = 0; i < indices.Length; i++) { int o = indices[i]; int n; if (!map.TryGetValue(o, out n)) { n = dest.Add(source, o); map.Add(o, n); } newIndices[i] = n; } Mesh m = new Mesh(); dest.AssignTo(m); m.triangles = newIndices; return m; } } }