/// <summary> /// 归类 /// </summary> /// <param name="meshDataList"></param> public static List <Dictionary <Material, List <MeshData> > > ClassifyMeshData(List <MeshData> meshDataList) { List <Material> allMaterials = new List <Material>(); if (Directory.Exists(MeshConfig.MaterialDir)) { string[] materialFiles = Directory.GetFiles(MeshConfig.MaterialDir, "*.mat", SearchOption.AllDirectories); for (int i = 0; i < materialFiles.Length; ++i) { allMaterials.Add(AssetDatabase.LoadAssetAtPath <Material>(materialFiles[i])); } } //根据lightmapIndex区分 Dictionary <int, List <MeshData> > meshDataDict = new Dictionary <int, List <MeshData> >(); for (int i = 0; i < meshDataList.Count; ++i) { MeshData meshData = meshDataList[i]; List <MeshData> meshDataElement; if (!meshDataDict.TryGetValue(meshData.lightmapIndex, out meshDataElement)) { meshDataElement = new List <MeshData>(); meshDataDict.Add(meshData.lightmapIndex, meshDataElement); } meshDataElement.Add(meshData); } List <Dictionary <Material, List <MeshData> > > meshNodeList = new List <Dictionary <Material, List <MeshData> > >(); Dictionary <int, List <MeshData> > .Enumerator enumerator = meshDataDict.GetEnumerator(); while (enumerator.MoveNext()) { //相同的lightmapIndex下,根据material区分 Dictionary <Material, List <MeshData> > meshNodeDict = new Dictionary <Material, List <MeshData> >(); for (int i = 0; i < enumerator.Current.Value.Count; ++i) { MeshData meshData = enumerator.Current.Value[i]; Material newMaterial = GeneratorCombineMaterial(meshData, allMaterials); if (null != newMaterial) { meshData.material = newMaterial; List <MeshData> meshNodeElement; if (!meshNodeDict.TryGetValue(newMaterial, out meshNodeElement)) { meshNodeElement = new List <MeshData>(); meshNodeDict.Add(newMaterial, meshNodeElement); } meshNodeElement.Add(meshData); } else { Debug.LogError("Generator material failed." + meshData.material.name); } } meshNodeList.Add(meshNodeDict); } return(meshNodeList); }
public static Mesh DoCombine(List <MeshData> meshDatas, string newMeshName) { Mesh combineMesh = new Mesh { name = newMeshName }; int vertexCount = 0; int triangleCount = 0; //只要有一个元素没有值,则设为没有值 bool hasUV2Data = true; bool hasNormalData = true; bool hasColorData = true; for (int i = 0; i < meshDatas.Count; ++i) { MeshData meshData = meshDatas[i]; int vertexLength = meshData.vertices.Length; vertexCount += vertexLength; triangleCount += meshData.triangles.Length; if (null == meshData.uv2 || meshData.uv2.Length != vertexLength) { hasUV2Data = false; } if (null == meshData.normals || meshData.normals.Length != vertexLength) { hasNormalData = false; } if (null == meshData.colors || meshData.colors.Length != vertexLength) { hasColorData = false; } } Vector3[] vertices = new Vector3[vertexCount]; int[] triangles = new int[triangleCount]; Vector2[] uvs = new Vector2[vertexCount]; Vector2[] uv2s = new Vector2[vertexCount]; Color[] colors = new Color[vertexCount]; Vector3[] normals = new Vector3[vertexCount]; int vertexArrayIndex = 0; int triangleArrayIndex = 0; for (int i = 0; i < meshDatas.Count; ++i) { MeshData meshData = meshDatas[i]; if (null != meshData) { meshData.vertices.CopyTo(vertices, vertexArrayIndex); for (int j = 0; j < meshData.triangles.Length; ++j) { triangles[triangleArrayIndex + j] = meshData.triangles[j] + vertexArrayIndex; } IntVector2 elementOffset = meshData.texData.Element.Offset; TextureAtlas atlas = meshData.texData.Atlas; int atlasWidth = atlas.Width; int atlasHeight = atlas.Height; Vector2 uvOffset = new Vector2(elementOffset.x / (float)atlasWidth, elementOffset.y / (float)atlasHeight); float atlasRealWidth = atlas.Atlas.width; float atlasRealHeight = atlas.Atlas.height; Vector2 atlasScale = new Vector2(atlasRealWidth / atlasWidth, atlasRealHeight / atlasHeight); IntVector2 texSize = meshData.texData.Element.Size; Vector2 texLocalOffset = new Vector2(texSize.x / (float)atlasWidth, texSize.y / (float)atlasHeight); for (int j = 0; j < meshData.uv.Length; ++j) { uvs[vertexArrayIndex + j] = new Vector2(meshData.uv[j].x * texLocalOffset.x, meshData.uv[j].y * texLocalOffset.y) + new Vector2(uvOffset.x * atlasScale.x, uvOffset.y * atlasScale.y); } if (hasUV2Data) { meshData.uv2.CopyTo(uv2s, vertexArrayIndex); } if (hasColorData) { meshData.colors.CopyTo(colors, vertexArrayIndex); } if (hasNormalData) { meshData.normals.CopyTo(normals, vertexArrayIndex); } vertexArrayIndex += meshData.vertices.Length; triangleArrayIndex += meshData.triangles.Length; } } combineMesh.vertices = vertices; combineMesh.SetTriangles(triangles, 0); combineMesh.uv = uvs; combineMesh.uv2 = uv2s; combineMesh.colors = colors; combineMesh.RecalculateNormals();// FIXME return(combineMesh); }