private async Task WriteObj(WavefrontMesh mesh) { using var stream = new FileStream(_objFile, FileMode.Create, FileAccess.Write, FileShare.None, 4096, true); using var writer = new StreamWriter(stream, Encoding.ASCII); var objDirectory = Path.GetDirectoryName(_objFile); var mtlRelative = objDirectory != null?Path.GetRelativePath(objDirectory, _mtlFile) : _mtlFile; await writer.WriteLineAsync($"mtllib {mtlRelative}").ConfigureAwait(false); foreach (var position in mesh.Positions) { await writer.WriteLineAsync($"v {position}").ConfigureAwait(false); } foreach (var texCoord in mesh.TexCoords) { await writer.WriteLineAsync($"vt {texCoord}").ConfigureAwait(false); } foreach (var normal in mesh.Normals) { await writer.WriteLineAsync($"vn {normal}").ConfigureAwait(false); } foreach (var group in mesh.PrimitiveGroups) { await writer.WriteLineAsync($"usemtl material{group.Key}").ConfigureAwait(false); foreach (var primitive in group.Value) { await writer.WriteLineAsync($"{primitive.Category.Command()} {string.Join(' ', primitive.Vertices)}").ConfigureAwait(false); } } }
private static async Task <int> Execute(FileInfo inputFile, FileInfo?outputFile, FileInfo?outputMtl) { try { var cmodPath = inputFile.FullName; var objPath = outputFile?.FullName ?? Path.ChangeExtension(outputMtl?.FullName ?? cmodPath, "obj"); var mtlPath = outputMtl?.FullName ?? Path.ChangeExtension(objPath, "mtl"); var model = await LoadModel(cmodPath).ConfigureAwait(false); var wavefrontMesh = WavefrontMesh.Create(model); var wavefrontWriter = new WavefrontWriter(objPath, mtlPath); await wavefrontWriter.Write(wavefrontMesh).ConfigureAwait(false); Console.WriteLine($"Wrote obj: {objPath}"); Console.WriteLine($"Wrote mtl: {mtlPath}"); return(0); } catch (CmodException e) { Console.Error.WriteLine($"Failed to read CMOD: {e.Message}"); return(1); } catch (Exception e) { Console.WriteLine($"An unexpected error occurred: {e.Message}", e); return(1); } }
public Task Write(WavefrontMesh mesh) => Task.WhenAll(WriteMtl(mesh.Materials), WriteObj(mesh));