< Summary

Line coverage
100%
Covered lines: 179
Uncovered lines: 0
Coverable lines: 179
Total lines: 396
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)

https://raw.githubusercontent.com/JeremyAnsel/JeremyAnsel.Media.WavefrontObj/636b700b450d7d3262bf9218a7cc67966be4ced8/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{
 12    internal static class ObjMaterialFileWriter
 13    {
 14        public static void Write(ObjMaterialFile mtl, StreamWriter stream)
 15        {
 30816            WriteHeaderText(mtl, stream);
 17
 121618            foreach (ObjMaterial material in mtl.Materials)
 19            {
 30020                WriteMaterial(material, stream);
 21            }
 30822        }
 23
 24        private static void WriteHeaderText(ObjMaterialFile mtl, StreamWriter stream)
 25        {
 30826            if (string.IsNullOrEmpty(mtl.HeaderText))
 27            {
 30428                return;
 29            }
 30
 431            string[] headerLines = mtl.HeaderText!.Split('\n');
 32
 2433            foreach (string line in headerLines)
 34            {
 835                stream.Write('#');
 836                stream.WriteLine(line);
 37            }
 438        }
 39
 40        private static void WriteMaterial(ObjMaterial material, StreamWriter stream)
 41        {
 30042            stream.WriteLine("newmtl {0}", material.Name);
 43
 30044            if (material.AmbientColor != null)
 45            {
 1646                WriteColor("Ka", material.AmbientColor, stream);
 47            }
 48
 30049            if (material.DiffuseColor != null)
 50            {
 1651                WriteColor("Kd", material.DiffuseColor, stream);
 52            }
 53
 30054            if (material.EmissiveColor != null)
 55            {
 1656                WriteColor("Ke", material.EmissiveColor, stream);
 57            }
 58
 30059            if (material.SpecularColor != null)
 60            {
 1661                WriteColor("Ks", material.SpecularColor, stream);
 62            }
 63
 30064            if (material.TransmissionColor != null)
 65            {
 1666                WriteColor("Tf", material.TransmissionColor, stream);
 67            }
 68
 30069            stream.WriteLine("illum {0}", material.IlluminationModel);
 70
 30071            stream.Write("d");
 30072            if (material.IsHaloDissolve)
 73            {
 474                stream.Write(" -halo");
 75            }
 76
 30077            stream.Write(' ');
 30078            stream.WriteLine(material.DissolveFactor.ToString("F6", CultureInfo.InvariantCulture));
 79
 30080            stream.Write("Ns ");
 30081            stream.WriteLine(material.SpecularExponent.ToString("F6", CultureInfo.InvariantCulture));
 82
 30083            stream.WriteLine("sharpness {0}", material.Sharpness);
 84
 30085            stream.Write("Ni ");
 30086            stream.WriteLine(material.OpticalDensity.ToString("F6", CultureInfo.InvariantCulture));
 87
 30088            stream.Write("map_aat ");
 30089            if (material.IsAntiAliasingEnabled)
 90            {
 491                stream.WriteLine("on");
 92            }
 93            else
 94            {
 29695                stream.WriteLine("off");
 96            }
 97
 30098            if (material.AmbientMap != null)
 99            {
 72100                WriteMap("map_Ka", material.AmbientMap, stream);
 101            }
 102
 300103            if (material.DiffuseMap != null)
 104            {
 4105                WriteMap("map_Kd", material.DiffuseMap, stream);
 106            }
 107
 300108            if (material.EmissiveMap != null)
 109            {
 4110                WriteMap("map_Ke", material.EmissiveMap, stream);
 111            }
 112
 300113            if (material.SpecularMap != null)
 114            {
 4115                WriteMap("map_Ks", material.SpecularMap, stream);
 116            }
 117
 300118            if (material.SpecularExponentMap != null)
 119            {
 4120                WriteMap("map_Ns", material.SpecularExponentMap, stream);
 121            }
 122
 300123            if (material.DissolveMap != null)
 124            {
 4125                WriteMap("map_d", material.DissolveMap, stream);
 126            }
 127
 300128            if (material.DecalMap != null)
 129            {
 4130                WriteMap("decal", material.DecalMap, stream);
 131            }
 132
 300133            if (material.DispMap != null)
 134            {
 4135                WriteMap("disp", material.DispMap, stream);
 136            }
 137
 300138            if (material.BumpMap != null)
 139            {
 4140                WriteMap("bump", material.BumpMap, stream);
 141            }
 142
 300143            if (material.ReflectionMap.Sphere != null)
 144            {
 4145                WriteMap("refl -type sphere", material.ReflectionMap.Sphere, stream);
 146            }
 147
 300148            if (material.ReflectionMap.CubeTop != null)
 149            {
 4150                WriteMap("refl -type cube_top", material.ReflectionMap.CubeTop, stream);
 151            }
 152
 300153            if (material.ReflectionMap.CubeBottom != null)
 154            {
 4155                WriteMap("refl -type cube_bottom", material.ReflectionMap.CubeBottom, stream);
 156            }
 157
 300158            if (material.ReflectionMap.CubeFront != null)
 159            {
 4160                WriteMap("refl -type cube_front", material.ReflectionMap.CubeFront, stream);
 161            }
 162
 300163            if (material.ReflectionMap.CubeBack != null)
 164            {
 4165                WriteMap("refl -type cube_back", material.ReflectionMap.CubeBack, stream);
 166            }
 167
 300168            if (material.ReflectionMap.CubeLeft != null)
 169            {
 4170                WriteMap("refl -type cube_left", material.ReflectionMap.CubeLeft, stream);
 171            }
 172
 300173            if (material.ReflectionMap.CubeRight != null)
 174            {
 4175                WriteMap("refl -type cube_right", material.ReflectionMap.CubeRight, stream);
 176            }
 177
 300178            if (material.Roughness != 0.0f)
 179            {
 4180                stream.Write("Pr ");
 4181                stream.WriteLine(material.Roughness.ToString("F6", CultureInfo.InvariantCulture));
 182            }
 183
 300184            if (material.RoughnessMap != null)
 185            {
 4186                WriteMap("map_Pr", material.RoughnessMap, stream);
 187            }
 188
 300189            if (material.Metallic != 0.0f)
 190            {
 4191                stream.Write("Pm ");
 4192                stream.WriteLine(material.Metallic.ToString("F6", CultureInfo.InvariantCulture));
 193            }
 194
 300195            if (material.MetallicMap != null)
 196            {
 4197                WriteMap("map_Pm", material.MetallicMap, stream);
 198            }
 199
 300200            if (material.Sheen != 0.0f)
 201            {
 4202                stream.Write("Ps ");
 4203                stream.WriteLine(material.Sheen.ToString("F6", CultureInfo.InvariantCulture));
 204            }
 205
 300206            if (material.SheenMap != null)
 207            {
 4208                WriteMap("map_Ps", material.SheenMap, stream);
 209            }
 210
 300211            if (material.ClearCoatThickness != 0.0f)
 212            {
 4213                stream.Write("Pc ");
 4214                stream.WriteLine(material.ClearCoatThickness.ToString("F6", CultureInfo.InvariantCulture));
 215            }
 216
 300217            if (material.ClearCoatRoughness != 0.0f)
 218            {
 4219                stream.Write("Pcr ");
 4220                stream.WriteLine(material.ClearCoatRoughness.ToString("F6", CultureInfo.InvariantCulture));
 221            }
 222
 300223            if (material.Anisotropy != 0.0f)
 224            {
 4225                stream.Write("aniso ");
 4226                stream.WriteLine(material.Anisotropy.ToString("F6", CultureInfo.InvariantCulture));
 227            }
 228
 300229            if (material.AnisotropyRotation != 0.0f)
 230            {
 4231                stream.Write("anisor ");
 4232                stream.WriteLine(material.AnisotropyRotation.ToString("F6", CultureInfo.InvariantCulture));
 233            }
 234
 300235            if (material.Norm != null)
 236            {
 4237                WriteMap("norm", material.Norm, stream);
 238            }
 300239        }
 240
 241        private static void WriteColor(string statement, ObjMaterialColor color, StreamWriter stream)
 242        {
 80243            stream.Write(statement);
 244
 80245            if (color.IsSpectral)
 246            {
 40247                stream.Write(" spectral ");
 40248                stream.Write(color.SpectralFileName);
 249
 40250                if (color.SpectralFactor != 1.0f)
 251                {
 20252                    stream.Write(' ');
 20253                    stream.Write(color.SpectralFactor.ToString("F6", CultureInfo.InvariantCulture));
 254                }
 255
 40256                stream.WriteLine();
 257            }
 258            else
 259            {
 40260                if (color.UseXYZColorSpace)
 261                {
 20262                    stream.Write(" xyz");
 263                }
 264
 40265                stream.WriteLine(
 40266                    " {0} {1} {2}",
 40267                    color.Color.X.ToString("F6", CultureInfo.InvariantCulture),
 40268                    color.Color.Y.ToString("F6", CultureInfo.InvariantCulture),
 40269                    color.Color.Z.ToString("F6", CultureInfo.InvariantCulture));
 270            }
 40271        }
 272
 273        private static void WriteMap(string statement, ObjMaterialMap map, StreamWriter stream)
 274        {
 148275            stream.Write(statement);
 276
 148277            if (!map.IsHorizontalBlendingEnabled)
 278            {
 4279                stream.Write(" -blenu off");
 280            }
 281
 148282            if (!map.IsVerticalBlendingEnabled)
 283            {
 4284                stream.Write(" -blenv off");
 285            }
 286
 148287            if (map.BumpMultiplier != 0.0f)
 288            {
 4289                stream.Write(" -bm ");
 4290                stream.Write(map.BumpMultiplier.ToString("F6", CultureInfo.InvariantCulture));
 291            }
 292
 148293            if (map.Boost != 0.0f)
 294            {
 4295                stream.Write(" -boost ");
 4296                stream.Write(map.Boost.ToString("F6", CultureInfo.InvariantCulture));
 297            }
 298
 148299            if (map.IsColorCorrectionEnabled)
 300            {
 4301                stream.Write(" -cc on");
 302            }
 303
 148304            if (map.IsClampingEnabled)
 305            {
 4306                stream.Write(" -clamp on");
 307            }
 308
 148309            if (map.ScalarChannel != ObjMapChannel.Luminance)
 310            {
 24311                stream.Write(" -imfchan ");
 312
 24313                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
 148341            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
 148349            ObjVector3 offset = map.Offset;
 350
 148351            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
 148361            ObjVector3 scale = map.Scale;
 362
 148363            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
 148373            ObjVector3 turbulence = map.Turbulence;
 374
 148375            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
 148385            if (map.TextureResolution != 0)
 386            {
 4387                stream.Write(" -texres ");
 4388                stream.Write(map.TextureResolution);
 389            }
 390
 148391            stream.Write(' ');
 148392            stream.WriteLine(map.FileName);
 148393        }
 394    }
 395}
 396