Esempio n. 1
0
        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);
                }
            }
        }
Esempio n. 2
0
        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);
            }
        }
Esempio n. 3
0
 public Task Write(WavefrontMesh mesh) => Task.WhenAll(WriteMtl(mesh.Materials), WriteObj(mesh));