< Summary

Information
Class: JeremyAnsel.Media.WavefrontObj.ObjMaterialFileWriter
Assembly: JeremyAnsel.Media.WavefrontObj
File(s): C:\projects\jeremyansel-media-wavefrontobj\JeremyAnsel.Media.WavefrontObj\JeremyAnsel.Media.WavefrontObj\ObjMaterialFileWriter.cs
Line coverage
100%
Covered lines: 179
Uncovered lines: 0
Coverable lines: 179
Total lines: 394
Line coverage: 100%
Branch coverage
100%
Covered branches: 125
Total branches: 125
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
Write(...)100%22100%
WriteHeaderText(...)100%44100%
WriteMaterial(...)100%6868100%
WriteColor(...)100%66100%
WriteMap(...)100%4545100%

File(s)

C:\projects\jeremyansel-media-wavefrontobj\JeremyAnsel.Media.WavefrontObj\JeremyAnsel.Media.WavefrontObj\ObjMaterialFileWriter.cs

#LineLine coverage
 1// <copyright file="ObjMaterialFileWriter.cs" company="Jérémy Ansel">
 2// Copyright (c) 2017, 2019 Jérémy Ansel
 3// </copyright>
 4// <license>
 5// Licensed under the MIT license. See LICENSE.txt
 6// </license>
 7
 8using System.Globalization;
 9
 10namespace JeremyAnsel.Media.WavefrontObj;
 11
 12internal static class ObjMaterialFileWriter
 13{
 14    public static void Write(ObjMaterialFile mtl, StreamWriter stream)
 15    {
 416        WriteHeaderText(mtl, stream);
 17
 418        foreach (ObjMaterial material in mtl.Materials)
 19        {
 420            WriteMaterial(material, stream);
 21        }
 422    }
 23
 24    private static void WriteHeaderText(ObjMaterialFile mtl, StreamWriter stream)
 25    {
 426        if (string.IsNullOrEmpty(mtl.HeaderText))
 27        {
 428            return;
 29        }
 30
 431        string[] headerLines = mtl.HeaderText!.Split('\n');
 32
 433        foreach (string line in headerLines)
 34        {
 435            stream.Write('#');
 436            stream.WriteLine(line);
 37        }
 438    }
 39
 40    private static void WriteMaterial(ObjMaterial material, StreamWriter stream)
 41    {
 442        stream.WriteLine("newmtl {0}", material.Name);
 43
 444        if (material.AmbientColor != null)
 45        {
 446            WriteColor("Ka", material.AmbientColor, stream);
 47        }
 48
 449        if (material.DiffuseColor != null)
 50        {
 451            WriteColor("Kd", material.DiffuseColor, stream);
 52        }
 53
 454        if (material.EmissiveColor != null)
 55        {
 456            WriteColor("Ke", material.EmissiveColor, stream);
 57        }
 58
 459        if (material.SpecularColor != null)
 60        {
 461            WriteColor("Ks", material.SpecularColor, stream);
 62        }
 63
 464        if (material.TransmissionColor != null)
 65        {
 466            WriteColor("Tf", material.TransmissionColor, stream);
 67        }
 68
 469        stream.WriteLine("illum {0}", material.IlluminationModel);
 70
 471        stream.Write("d");
 472        if (material.IsHaloDissolve)
 73        {
 474            stream.Write(" -halo");
 75        }
 76
 477        stream.Write(' ');
 478        stream.WriteLine(material.DissolveFactor.ToString("F6", CultureInfo.InvariantCulture));
 79
 480        stream.Write("Ns ");
 481        stream.WriteLine(material.SpecularExponent.ToString("F6", CultureInfo.InvariantCulture));
 82
 483        stream.WriteLine("sharpness {0}", material.Sharpness);
 84
 485        stream.Write("Ni ");
 486        stream.WriteLine(material.OpticalDensity.ToString("F6", CultureInfo.InvariantCulture));
 87
 488        stream.Write("map_aat ");
 489        if (material.IsAntiAliasingEnabled)
 90        {
 491            stream.WriteLine("on");
 92        }
 93        else
 94        {
 495            stream.WriteLine("off");
 96        }
 97
 498        if (material.AmbientMap != null)
 99        {
 4100            WriteMap("map_Ka", material.AmbientMap, stream);
 101        }
 102
 4103        if (material.DiffuseMap != null)
 104        {
 4105            WriteMap("map_Kd", material.DiffuseMap, stream);
 106        }
 107
 4108        if (material.EmissiveMap != null)
 109        {
 4110            WriteMap("map_Ke", material.EmissiveMap, stream);
 111        }
 112
 4113        if (material.SpecularMap != null)
 114        {
 4115            WriteMap("map_Ks", material.SpecularMap, stream);
 116        }
 117
 4118        if (material.SpecularExponentMap != null)
 119        {
 4120            WriteMap("map_Ns", material.SpecularExponentMap, stream);
 121        }
 122
 4123        if (material.DissolveMap != null)
 124        {
 4125            WriteMap("map_d", material.DissolveMap, stream);
 126        }
 127
 4128        if (material.DecalMap != null)
 129        {
 4130            WriteMap("decal", material.DecalMap, stream);
 131        }
 132
 4133        if (material.DispMap != null)
 134        {
 4135            WriteMap("disp", material.DispMap, stream);
 136        }
 137
 4138        if (material.BumpMap != null)
 139        {
 4140            WriteMap("bump", material.BumpMap, stream);
 141        }
 142
 4143        if (material.ReflectionMap.Sphere != null)
 144        {
 4145            WriteMap("refl -type sphere", material.ReflectionMap.Sphere, stream);
 146        }
 147
 4148        if (material.ReflectionMap.CubeTop != null)
 149        {
 4150            WriteMap("refl -type cube_top", material.ReflectionMap.CubeTop, stream);
 151        }
 152
 4153        if (material.ReflectionMap.CubeBottom != null)
 154        {
 4155            WriteMap("refl -type cube_bottom", material.ReflectionMap.CubeBottom, stream);
 156        }
 157
 4158        if (material.ReflectionMap.CubeFront != null)
 159        {
 4160            WriteMap("refl -type cube_front", material.ReflectionMap.CubeFront, stream);
 161        }
 162
 4163        if (material.ReflectionMap.CubeBack != null)
 164        {
 4165            WriteMap("refl -type cube_back", material.ReflectionMap.CubeBack, stream);
 166        }
 167
 4168        if (material.ReflectionMap.CubeLeft != null)
 169        {
 4170            WriteMap("refl -type cube_left", material.ReflectionMap.CubeLeft, stream);
 171        }
 172
 4173        if (material.ReflectionMap.CubeRight != null)
 174        {
 4175            WriteMap("refl -type cube_right", material.ReflectionMap.CubeRight, stream);
 176        }
 177
 4178        if (material.Roughness != 0.0f)
 179        {
 4180            stream.Write("Pr ");
 4181            stream.WriteLine(material.Roughness.ToString("F6", CultureInfo.InvariantCulture));
 182        }
 183
 4184        if (material.RoughnessMap != null)
 185        {
 4186            WriteMap("map_Pr", material.RoughnessMap, stream);
 187        }
 188
 4189        if (material.Metallic != 0.0f)
 190        {
 4191            stream.Write("Pm ");
 4192            stream.WriteLine(material.Metallic.ToString("F6", CultureInfo.InvariantCulture));
 193        }
 194
 4195        if (material.MetallicMap != null)
 196        {
 4197            WriteMap("map_Pm", material.MetallicMap, stream);
 198        }
 199
 4200        if (material.Sheen != 0.0f)
 201        {
 4202            stream.Write("Ps ");
 4203            stream.WriteLine(material.Sheen.ToString("F6", CultureInfo.InvariantCulture));
 204        }
 205
 4206        if (material.SheenMap != null)
 207        {
 4208            WriteMap("map_Ps", material.SheenMap, stream);
 209        }
 210
 4211        if (material.ClearCoatThickness != 0.0f)
 212        {
 4213            stream.Write("Pc ");
 4214            stream.WriteLine(material.ClearCoatThickness.ToString("F6", CultureInfo.InvariantCulture));
 215        }
 216
 4217        if (material.ClearCoatRoughness != 0.0f)
 218        {
 4219            stream.Write("Pcr ");
 4220            stream.WriteLine(material.ClearCoatRoughness.ToString("F6", CultureInfo.InvariantCulture));
 221        }
 222
 4223        if (material.Anisotropy != 0.0f)
 224        {
 4225            stream.Write("aniso ");
 4226            stream.WriteLine(material.Anisotropy.ToString("F6", CultureInfo.InvariantCulture));
 227        }
 228
 4229        if (material.AnisotropyRotation != 0.0f)
 230        {
 4231            stream.Write("anisor ");
 4232            stream.WriteLine(material.AnisotropyRotation.ToString("F6", CultureInfo.InvariantCulture));
 233        }
 234
 4235        if (material.Norm != null)
 236        {
 4237            WriteMap("norm", material.Norm, stream);
 238        }
 4239    }
 240
 241    private static void WriteColor(string statement, ObjMaterialColor color, StreamWriter stream)
 242    {
 4243        stream.Write(statement);
 244
 4245        if (color.IsSpectral)
 246        {
 4247            stream.Write(" spectral ");
 4248            stream.Write(color.SpectralFileName);
 249
 4250            if (color.SpectralFactor != 1.0f)
 251            {
 4252                stream.Write(' ');
 4253                stream.Write(color.SpectralFactor.ToString("F6", CultureInfo.InvariantCulture));
 254            }
 255
 4256            stream.WriteLine();
 257        }
 258        else
 259        {
 4260            if (color.UseXYZColorSpace)
 261            {
 4262                stream.Write(" xyz");
 263            }
 264
 4265            stream.WriteLine(
 4266                " {0} {1} {2}",
 4267                color.Color.X.ToString("F6", CultureInfo.InvariantCulture),
 4268                color.Color.Y.ToString("F6", CultureInfo.InvariantCulture),
 4269                color.Color.Z.ToString("F6", CultureInfo.InvariantCulture));
 270        }
 4271    }
 272
 273    private static void WriteMap(string statement, ObjMaterialMap map, StreamWriter stream)
 274    {
 4275        stream.Write(statement);
 276
 4277        if (!map.IsHorizontalBlendingEnabled)
 278        {
 4279            stream.Write(" -blenu off");
 280        }
 281
 4282        if (!map.IsVerticalBlendingEnabled)
 283        {
 4284            stream.Write(" -blenv off");
 285        }
 286
 4287        if (map.BumpMultiplier != 0.0f)
 288        {
 4289            stream.Write(" -bm ");
 4290            stream.Write(map.BumpMultiplier.ToString("F6", CultureInfo.InvariantCulture));
 291        }
 292
 4293        if (map.Boost != 0.0f)
 294        {
 4295            stream.Write(" -boost ");
 4296            stream.Write(map.Boost.ToString("F6", CultureInfo.InvariantCulture));
 297        }
 298
 4299        if (map.IsColorCorrectionEnabled)
 300        {
 4301            stream.Write(" -cc on");
 302        }
 303
 4304        if (map.IsClampingEnabled)
 305        {
 4306            stream.Write(" -clamp on");
 307        }
 308
 4309        if (map.ScalarChannel != ObjMapChannel.Luminance)
 310        {
 4311            stream.Write(" -imfchan ");
 312
 4313            switch (map.ScalarChannel)
 314            {
 315                case ObjMapChannel.Red:
 4316                    stream.Write("r");
 4317                    break;
 318
 319                case ObjMapChannel.Green:
 4320                    stream.Write("g");
 4321                    break;
 322
 323                case ObjMapChannel.Blue:
 4324                    stream.Write("b");
 4325                    break;
 326
 327                case ObjMapChannel.Matte:
 4328                    stream.Write("m");
 4329                    break;
 330
 331                case ObjMapChannel.Depth:
 4332                    stream.Write("z");
 4333                    break;
 334
 335                default:
 4336                    stream.Write("l");
 337                    break;
 338            }
 339        }
 340
 4341        if (map.ModifierBase != 0.0f || map.ModifierGain != 1.0f)
 342        {
 4343            stream.Write(" -mm ");
 4344            stream.Write(map.ModifierBase.ToString("F6", CultureInfo.InvariantCulture));
 4345            stream.Write(' ');
 4346            stream.Write(map.ModifierGain.ToString("F6", CultureInfo.InvariantCulture));
 347        }
 348
 4349        ObjVector3 offset = map.Offset;
 350
 4351        if (offset.X != 0.0f || offset.Y != 0.0f || offset.Z != 0.0f)
 352        {
 4353            stream.Write(" -o ");
 4354            stream.Write(offset.X.ToString("F6", CultureInfo.InvariantCulture));
 4355            stream.Write(' ');
 4356            stream.Write(offset.Y.ToString("F6", CultureInfo.InvariantCulture));
 4357            stream.Write(' ');
 4358            stream.Write(offset.Z.ToString("F6", CultureInfo.InvariantCulture));
 359        }
 360
 4361        ObjVector3 scale = map.Scale;
 362
 4363        if (scale.X != 1.0f || scale.Y != 1.0f || scale.Z != 1.0f)
 364        {
 4365            stream.Write(" -s ");
 4366            stream.Write(scale.X.ToString("F6", CultureInfo.InvariantCulture));
 4367            stream.Write(' ');
 4368            stream.Write(scale.Y.ToString("F6", CultureInfo.InvariantCulture));
 4369            stream.Write(' ');
 4370            stream.Write(scale.Z.ToString("F6", CultureInfo.InvariantCulture));
 371        }
 372
 4373        ObjVector3 turbulence = map.Turbulence;
 374
 4375        if (turbulence.X != 0.0f || turbulence.Y != 0.0f || turbulence.Z != 0.0f)
 376        {
 4377            stream.Write(" -t ");
 4378            stream.Write(turbulence.X.ToString("F6", CultureInfo.InvariantCulture));
 4379            stream.Write(' ');
 4380            stream.Write(turbulence.Y.ToString("F6", CultureInfo.InvariantCulture));
 4381            stream.Write(' ');
 4382            stream.Write(turbulence.Z.ToString("F6", CultureInfo.InvariantCulture));
 383        }
 384
 4385        if (map.TextureResolution != 0)
 386        {
 4387            stream.Write(" -texres ");
 4388            stream.Write(map.TextureResolution);
 389        }
 390
 4391        stream.Write(' ');
 4392        stream.WriteLine(map.FileName);
 4393    }
 394}