コード例 #1
0
        private static void MergeMeshes(SBMLoader loader, out Mesh result, out string[] materials)
        {
            if (loader.MeshCount == 0)
            {
                result = null;
                materials = null;
                return;
            }
            if (loader.MeshCount == 1)
            {
                loader.GetMesh(0, out result, out materials);
                return;
            }

            List<string> finalmaterials = new List<string>();

            MeshBuilder merged = new MeshBuilder();
            merged.UseNormals = true;
            merged.UseTangents = true;
            merged.UseTexCoords = true;

            int totalsubmeshes = 0;

            for (int i = 0; i < loader.MeshCount; i++)
            {
                Mesh cmesh;
                string[] curmats;
                loader.GetMesh(i, out cmesh, out curmats);

                totalsubmeshes += cmesh.Submeshes.Length;

                int baseindex = merged.CurrentVertexCount;
                merged.AddPositions(cmesh.Positions);
                merged.AddNormals(cmesh.Normals);
                merged.AddTextureCoords(cmesh.TextureCoordinates);
                merged.AddTangents(cmesh.Tangents);

                for (int j = 0; j < cmesh.Submeshes.Length; j++)
                {
                    int submeshindex;
                    if (finalmaterials.Contains(curmats[j]))
                        submeshindex = finalmaterials.IndexOf(curmats[j]);
                    else
                    {
                        submeshindex = finalmaterials.Count;
                        finalmaterials.Add(curmats[j]);
                    }

                    merged.AddIndices(submeshindex, cmesh.Submeshes[j], (uint)baseindex);
                }

            }

            Console.WriteLine("Merged {0} meshes with a total of {1} submeshes into 1 mesh with a total of {2} submeshes.", loader.MeshCount, totalsubmeshes, finalmaterials.Count);

            result = merged.Build();
            materials = finalmaterials.ToArray();
        }
コード例 #2
0
 public static Mesh CombineMeshes(params Mesh[] meshes)
 {
     MeshBuilder builder = new MeshBuilder();
     if (meshes[0].TextureCoordinates != null) builder.UseTexCoords = true;
     if (meshes[0].Normals != null) builder.UseNormals = true;
     uint indexpos = 0;
     for (int i = 0; i < meshes.Length; i++)
     {
         var mesh = meshes[i];
         if (builder.UseTexCoords) builder.AddTextureCoords(mesh.TextureCoordinates);
         if (builder.UseNormals) builder.AddNormals(mesh.Normals);
         for (int j = 0; j < mesh.Submeshes.Length; j++)
             builder.AddIndices(j, mesh.Submeshes[j]);
         builder.AddPositions(mesh.Positions);
         indexpos += (uint)mesh.Positions.Length;
     }
     return builder.Build();
 }