< Summary

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

Feature is only available for sponsors

Upgrade to PRO version

Metrics

File(s)

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

#LineLine coverage
 1// <copyright file="ObjFileWriterContext.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 class ObjFileWriterContext
 13{
 14    private readonly ObjFile _obj;
 15
 416    public ObjFileWriterContext(ObjFile obj)
 17    {
 418        _obj = obj;
 419        GroupNames = string.Empty;
 420    }
 21
 422    public string GroupNames { get; private set; }
 23
 424    public string? ObjectName { get; private set; }
 25
 426    public int LevelOfDetail { get; private set; }
 27
 428    public string? MapName { get; private set; }
 29
 430    public string? MaterialName { get; private set; }
 31
 432    public long SmoothingGroupNumber { get; private set; }
 33
 434    public bool IsBevelInterpolationEnabled { get; private set; }
 35
 436    public bool IsColorInterpolationEnabled { get; private set; }
 37
 438    public bool IsDissolveInterpolationEnabled { get; private set; }
 39
 440    public int MergingGroupNumber { get; private set; }
 41
 42    public void WriteGroupNames<T>(StreamWriter stream, T element, Func<ObjGroup, List<T>> func)
 43        where T : ObjElement
 44    {
 445        string groupNames = GetGroupNames(element, func);
 46
 447        if (groupNames != this.GroupNames)
 48        {
 449            this.GroupNames = groupNames;
 50
 451            if (string.IsNullOrEmpty(groupNames))
 52            {
 453                stream.WriteLine("g default");
 54            }
 55            else
 56            {
 457                stream.WriteLine("g {0}", groupNames);
 58            }
 59        }
 460    }
 61
 62    public void WriteAttributesOfElement(StreamWriter stream, ObjElement element)
 63    {
 464        if (element.ObjectName != this.ObjectName)
 65        {
 466            this.ObjectName = element.ObjectName;
 67
 468            if (string.IsNullOrEmpty(this.ObjectName))
 69            {
 470                stream.WriteLine("o");
 71            }
 72            else
 73            {
 474                stream.WriteLine("o {0}", this.ObjectName);
 75            }
 76        }
 77
 478        if (element.LevelOfDetail != this.LevelOfDetail)
 79        {
 480            this.LevelOfDetail = element.LevelOfDetail;
 81
 482            stream.WriteLine("lod {0}", this.LevelOfDetail);
 83        }
 84
 485        if (element.MapName != this.MapName)
 86        {
 487            this.MapName = element.MapName;
 88
 489            if (string.IsNullOrEmpty(this.MapName))
 90            {
 491                stream.WriteLine("usemap off");
 92            }
 93            else
 94            {
 495                stream.WriteLine("usemap {0}", this.MapName);
 96            }
 97        }
 98
 499        if (element.MaterialName != this.MaterialName)
 100        {
 4101            this.MaterialName = element.MaterialName;
 102
 4103            if (string.IsNullOrEmpty(this.MaterialName))
 104            {
 4105                stream.WriteLine("usemtl off");
 106            }
 107            else
 108            {
 4109                stream.WriteLine("usemtl {0}", this.MaterialName);
 110            }
 111        }
 4112    }
 113
 114    public void WriteAttributesOfPolygonalElement(StreamWriter stream, ObjPolygonalElement element)
 115    {
 4116        if (element.SmoothingGroupNumber != this.SmoothingGroupNumber)
 117        {
 4118            this.SmoothingGroupNumber = element.SmoothingGroupNumber;
 119
 4120            if (this.SmoothingGroupNumber == 0)
 121            {
 4122                stream.WriteLine("s off");
 123            }
 124            else
 125            {
 4126                stream.WriteLine("s {0}", this.SmoothingGroupNumber);
 127            }
 128        }
 129
 4130        if (element.IsBevelInterpolationEnabled != this.IsBevelInterpolationEnabled)
 131        {
 4132            this.IsBevelInterpolationEnabled = element.IsBevelInterpolationEnabled;
 133
 4134            if (this.IsBevelInterpolationEnabled)
 135            {
 4136                stream.WriteLine("bevel on");
 137            }
 138            else
 139            {
 4140                stream.WriteLine("bevel off");
 141            }
 142        }
 143
 4144        if (element.IsColorInterpolationEnabled != this.IsColorInterpolationEnabled)
 145        {
 4146            this.IsColorInterpolationEnabled = element.IsColorInterpolationEnabled;
 147
 4148            if (this.IsColorInterpolationEnabled)
 149            {
 4150                stream.WriteLine("c_interp on");
 151            }
 152            else
 153            {
 4154                stream.WriteLine("c_interp off");
 155            }
 156        }
 157
 4158        if (element.IsDissolveInterpolationEnabled != this.IsDissolveInterpolationEnabled)
 159        {
 4160            this.IsDissolveInterpolationEnabled = element.IsDissolveInterpolationEnabled;
 161
 4162            if (this.IsDissolveInterpolationEnabled)
 163            {
 4164                stream.WriteLine("d_interp on");
 165            }
 166            else
 167            {
 4168                stream.WriteLine("d_interp off");
 169            }
 170        }
 4171    }
 172
 173    public void WriteAttributesOfFreeFormElement(StreamWriter stream, ObjFreeFormElement element)
 174    {
 4175        if (element.MergingGroupNumber != this.MergingGroupNumber)
 176        {
 4177            this.MergingGroupNumber = element.MergingGroupNumber;
 178
 4179            if (this.MergingGroupNumber == 0)
 180            {
 4181                stream.WriteLine("mg off");
 182            }
 183            else
 184            {
 4185                float res = _obj.MergingGroupResolutions[this.MergingGroupNumber];
 4186                stream.WriteLine("mg {0} {1}", this.MergingGroupNumber, res.ToString("F6", CultureInfo.InvariantCulture)
 187            }
 188        }
 189
 4190        switch (element.FreeFormType)
 191        {
 192            case ObjFreeFormType.BasisMatrix:
 4193                stream.Write("cstype");
 194
 4195                if (element.IsRationalForm)
 196                {
 4197                    stream.Write(" rat");
 198                }
 199
 4200                stream.WriteLine(" bmatrix");
 4201                break;
 202
 203            case ObjFreeFormType.Bezier:
 4204                stream.Write("cstype");
 205
 4206                if (element.IsRationalForm)
 207                {
 4208                    stream.Write(" rat");
 209                }
 210
 4211                stream.WriteLine(" bezier");
 4212                break;
 213
 214            case ObjFreeFormType.BSpline:
 4215                stream.Write("cstype");
 216
 4217                if (element.IsRationalForm)
 218                {
 4219                    stream.Write(" rat");
 220                }
 221
 4222                stream.WriteLine(" bspline");
 4223                break;
 224
 225            case ObjFreeFormType.Cardinal:
 4226                stream.Write("cstype");
 227
 4228                if (element.IsRationalForm)
 229                {
 4230                    stream.Write(" rat");
 231                }
 232
 4233                stream.WriteLine(" cardinal");
 4234                break;
 235
 236            case ObjFreeFormType.Taylor:
 4237                stream.Write("cstype");
 238
 4239                if (element.IsRationalForm)
 240                {
 4241                    stream.Write(" rat");
 242                }
 243
 4244                stream.WriteLine(" taylor");
 245                break;
 246        }
 247
 4248        if (element.DegreeV == 0)
 249        {
 4250            stream.WriteLine("deg {0}", element.DegreeU);
 251        }
 252        else
 253        {
 4254            stream.WriteLine("deg {0} {1}", element.DegreeU, element.DegreeV);
 255        }
 256
 4257        if (element.BasicMatrixU != null)
 258        {
 4259            stream.Write("bmat u");
 260
 4261            foreach (float value in element.BasicMatrixU)
 262            {
 4263                stream.Write(' ');
 4264                stream.Write(value.ToString("F6", CultureInfo.InvariantCulture));
 265            }
 266
 4267            stream.WriteLine();
 268        }
 269
 4270        if (element.BasicMatrixV != null)
 271        {
 4272            stream.Write("bmat v");
 273
 4274            foreach (float value in element.BasicMatrixV)
 275            {
 4276                stream.Write(' ');
 4277                stream.Write(value.ToString("F6", CultureInfo.InvariantCulture));
 278            }
 279
 4280            stream.WriteLine();
 281        }
 282
 4283        if (element.StepV == 1.0f)
 284        {
 4285            stream.WriteLine(
 4286                "step {0}",
 4287                element.StepU.ToString("F6", CultureInfo.InvariantCulture));
 288        }
 289        else
 290        {
 4291            stream.WriteLine(
 4292                "step {0} {1}",
 4293                element.StepU.ToString("F6", CultureInfo.InvariantCulture),
 4294                element.StepV.ToString("F6", CultureInfo.InvariantCulture));
 295        }
 296
 4297        if (element.CurveApproximationTechnique != null)
 298        {
 4299            if (element.CurveApproximationTechnique is ObjConstantParametricSubdivisionTechnique)
 300            {
 4301                var technique = (ObjConstantParametricSubdivisionTechnique)element.CurveApproximationTechnique;
 4302                stream.WriteLine("ctech cparm {0}", technique.ResolutionU.ToString("F6", CultureInfo.InvariantCulture));
 303            }
 4304            else if (element.CurveApproximationTechnique is ObjConstantSpatialSubdivisionTechnique)
 305            {
 4306                var technique = (ObjConstantSpatialSubdivisionTechnique)element.CurveApproximationTechnique;
 4307                stream.WriteLine("ctech cspace {0}", technique.MaximumLength.ToString("F6", CultureInfo.InvariantCulture
 308            }
 4309            else if (element.CurveApproximationTechnique is ObjCurvatureDependentSubdivisionTechnique)
 310            {
 4311                var technique = (ObjCurvatureDependentSubdivisionTechnique)element.CurveApproximationTechnique;
 4312                stream.WriteLine(
 4313                    "ctech curv {0} {1}",
 4314                    technique.MaximumDistance.ToString("F6", CultureInfo.InvariantCulture),
 4315                    technique.MaximumAngle.ToString("F6", CultureInfo.InvariantCulture));
 316            }
 317        }
 318
 4319        if (element.SurfaceApproximationTechnique != null)
 320        {
 4321            if (element.SurfaceApproximationTechnique is ObjConstantParametricSubdivisionTechnique)
 322            {
 4323                var technique = (ObjConstantParametricSubdivisionTechnique)element.SurfaceApproximationTechnique;
 324
 4325                if (technique.ResolutionU == technique.ResolutionV)
 326                {
 4327                    stream.WriteLine(
 4328                        "stech cparmb {0}",
 4329                        technique.ResolutionU.ToString("F6", CultureInfo.InvariantCulture));
 330                }
 331                else
 332                {
 4333                    stream.WriteLine(
 4334                        "stech cparma {0} {1}",
 4335                        technique.ResolutionU.ToString("F6", CultureInfo.InvariantCulture),
 4336                        technique.ResolutionV.ToString("F6", CultureInfo.InvariantCulture));
 337                }
 338            }
 4339            else if (element.SurfaceApproximationTechnique is ObjConstantSpatialSubdivisionTechnique)
 340            {
 4341                var technique = (ObjConstantSpatialSubdivisionTechnique)element.SurfaceApproximationTechnique;
 4342                stream.WriteLine("stech cspace {0}", technique.MaximumLength.ToString("F6", CultureInfo.InvariantCulture
 343            }
 4344            else if (element.SurfaceApproximationTechnique is ObjCurvatureDependentSubdivisionTechnique)
 345            {
 4346                var technique = (ObjCurvatureDependentSubdivisionTechnique)element.SurfaceApproximationTechnique;
 4347                stream.WriteLine(
 4348                    "stech curv {0} {1}",
 4349                    technique.MaximumDistance.ToString("F6", CultureInfo.InvariantCulture),
 4350                    technique.MaximumAngle.ToString("F6", CultureInfo.InvariantCulture));
 351            }
 352        }
 4353    }
 354
 355    private string GetGroupNames<T>(T element, Func<ObjGroup, List<T>> func)
 356        where T : ObjElement
 357    {
 4358        var groups = new List<string>();
 359
 4360        foreach (ObjGroup group in _obj.Groups)
 361        {
 4362            List<T> elements = func(group);
 363
 4364            if (elements.Contains(element))
 365            {
 4366                groups.Add(group.Name);
 367            }
 368        }
 369
 4370        return string.Join(" ", groups);
 371    }
 372}