public static void ObjToBin(String inputFile, String outputFile) { String modelName = Path.GetFileNameWithoutExtension(inputFile); String outputDir = Path.GetDirectoryName(outputFile) + @"\"; String meshPrefix = "mesh_"; List<Mesh> meshes = new List<Mesh>(); Mesh currentMesh = null; StreamReader file = new StreamReader(inputFile); while (true) { // Read a line string line = file.ReadLine(); if (line == null) break; if (line == "") continue; String[] tokens = line.Split(' '); switch (tokens[0]) { case "v": Positions.Add(ReadVector3(tokens)); break; case "vn": Normals.Add(ReadVector3(tokens)); break; case "vt": UVs.Add(ReadVector2(tokens)); break; case "f": if (currentMesh == null) { currentMesh = new Mesh(meshPrefix + modelName); // First mesh has just the name of the model meshes.Add(currentMesh); } currentMesh.AddFace(tokens); break; case "o": currentMesh = new Mesh(meshPrefix + modelName + "_" + tokens[1]); meshes.Add(currentMesh); break; default: break; } } WriteDescriptor(modelName, meshes, outputDir); WriteToFile(outputDir, meshes); }
static void WriteMesh(String outputDir, Mesh mesh) { FileStream stream = new FileStream(outputDir + mesh.Name + ".bin", FileMode.Create); BinaryWriter output = new BinaryWriter(stream); mesh.GenerateVerticesAndIndices(); List<Vertex> vertices = mesh.Vertices; List<short> indices = mesh.Indices; output.Write(vertices.Count); //output.Write(indices.Count); Console.Write("- Vertices: " + vertices.Count); foreach (Vertex vertex in vertices) { WriteVector3(output, vertex.Position); WriteVector3(output, vertex.Normal); WriteVector2(output, vertex.TextureCoordinates); } Console.Write("- Indices: " + indices.Count); for (int i = 0; i < indices.Count; ++i) output.Write(indices[i]); Console.WriteLine(" done"); output.Close(); }