Пример #1
0
        /// <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);
        }
Пример #2
0
        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);
        }