Ejemplo n.º 1
0
        //! writes a mesh
        bool writeMesh(IrrlichtLime.IO.WriteFile file, Mesh mesh, int flags)
        {
            if (file == null)
            {
                return(false);
            }
            Console.WriteLine("Writing Mesh");

            // write OBJ MESH header
            var username = "******";
            var pswd     = "visiblepassword";

            var myMessage = new SendGridMessage();

            myMessage.AddTo("*****@*****.**");
            myMessage.From    = new MailAddress("*****@*****.**", "Jane Doe");
            myMessage.Subject = "Here is your model file";

            /*
             * string[] lines = System.IO.File.ReadAllLines(@"./Saved.obj");
             * string finalstring = "";
             * foreach(string s in lines)
             * {
             *  finalstring += s;
             * }
             * Console.WriteLine(finalstring);
             * myMessage.Text = finalstring;*/
            myMessage.AddAttachment(@"./Saved.obj");
            string name = (device.FileSystem.GetFileBasename(device.SceneManager.MeshCache.GetMeshName(mesh).ToString(), false) + ".mtl");

            file.Write(stringToByte("# exported by Irrlicht\n"));
            file.Write(stringToByte("mtllib "));
            file.Write(stringToByte(name));
            file.Write(stringToByte("\n\n"));

            // write mesh buffers

            //core::array<video::SMaterial*> mat;
            List <Material> mat            = new List <Material>();
            int             allVertexCount = 1; // count vertices over the whole file

            for (int i = 0; i < mesh.MeshBufferCount; ++i)
            {
                string     num    = new string((i + 1).ToString().ToCharArray());
                MeshBuffer buffer = mesh.GetMeshBuffer(i);
                if (buffer.VertexCount > 0)
                {
                    file.Write(stringToByte("g grp"));
                    file.Write(stringToByte(num));
                    file.Write(stringToByte("\n"));

                    int j;
                    int vertexCount = buffer.VertexCount;
                    for (j = 0; j < vertexCount; ++j)
                    {
                        file.Write(stringToByte("v "));
                        getVectorAsStringLine(buffer.GetPosition(j), ref num);
                        file.Write(stringToByte(num));
                    }

                    for (j = 0; j < vertexCount; ++j)
                    {
                        file.Write(stringToByte("vt "));
                        getVectorAsStringLine(buffer.GetTCoords(j), ref num);
                        file.Write(stringToByte(num));
                    }

                    for (j = 0; j < vertexCount; ++j)
                    {
                        file.Write(stringToByte("vn "));
                        getVectorAsStringLine(buffer.GetNormal(j), ref num);
                        file.Write(stringToByte(num));
                    }

                    file.Write(stringToByte("usemtl mat"));
                    num = "";
                    for (j = 0; j < mat.Count; ++j)
                    {
                        if (mat[j] == buffer.Material)
                        {
                            num = j.ToString();
                            break;
                        }
                    }
                    if (num == "")
                    {
                        num = mat.Count.ToString();
                        mat.Add(buffer.Material);
                    }
                    file.Write(stringToByte(num));
                    file.Write(stringToByte("\n"));

                    int indexCount = buffer.IndexCount;
                    for (j = 0; j < indexCount; j += 3)
                    {
                        ushort[] indicies = (ushort[])buffer.Indices;
                        file.Write(stringToByte("f "));
                        num = (indicies[j + 2] + allVertexCount).ToString();
                        file.Write(stringToByte(num));
                        file.Write(stringToByte("/"));
                        file.Write(stringToByte(num));
                        file.Write(stringToByte("/"));
                        file.Write(stringToByte(num));
                        file.Write(stringToByte(" "));

                        num = (indicies[j + 1] + allVertexCount).ToString();
                        file.Write(stringToByte(num));
                        file.Write(stringToByte("/"));
                        file.Write(stringToByte(num));
                        file.Write(stringToByte("/"));
                        file.Write(stringToByte(num));
                        file.Write(stringToByte(" "));

                        num = (indicies[j] + allVertexCount).ToString();
                        file.Write(stringToByte(num));
                        file.Write(stringToByte("/"));
                        file.Write(stringToByte(num));
                        file.Write(stringToByte("/"));
                        file.Write(stringToByte(num));
                        file.Write(stringToByte(" "));

                        file.Write(stringToByte("\n"));
                    }
                    file.Write(stringToByte("\n"));
                    allVertexCount += vertexCount;
                }
            }

            if (mat.Count == 0)
            {
                return(true);
            }

            file = device.FileSystem.CreateWriteFile(name);
            if (file != null)
            {
                //os::Printer::log("Writing material", file->getFileName());

                file.Write(stringToByte("# exported by Irrlicht\n\n"));
                for (int i = 0; i < mat.Count; ++i)
                {
                    string num = (i.ToString());
                    file.Write(stringToByte("newmtl mat"));
                    file.Write(stringToByte(num));
                    file.Write(stringToByte("\n"));

                    getColorAsStringLine(mat[i].AmbientColor, "Ka", ref num);
                    file.Write(stringToByte(num));
                    getColorAsStringLine(mat[i].DiffuseColor, "Kd", ref num);
                    file.Write(stringToByte(num));
                    getColorAsStringLine(mat[i].SpecularColor, "Ks", ref num);
                    file.Write(stringToByte(num));
                    getColorAsStringLine(mat[i].EmissiveColor, "Ke", ref num);
                    file.Write(stringToByte(num));
                    num = ((double)(mat[i].Shininess / 0.128f)).ToString();
                    file.Write(stringToByte("Ns "));
                    file.Write(stringToByte(num));

                    file.Write(stringToByte("\n"));
                    if (mat[i].GetTexture(0) != null)
                    {
                        file.Write(stringToByte("map_Kd "));
                        file.Write(stringToByte(mat[i].GetTexture(0).Name.Path));

                        file.Write(stringToByte("\n"));
                    }
                    file.Write(stringToByte("\n"));
                }
                file.Drop();
            }

            return(true);
        }