< Summary

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

https://raw.githubusercontent.com/JeremyAnsel/JeremyAnsel.Media.WavefrontObj/636b700b450d7d3262bf9218a7cc67966be4ced8/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{
 12    internal class ObjFileWriterContext
 13    {
 14        private ObjFile obj;
 15
 28816        public ObjFileWriterContext(ObjFile obj)
 17        {
 28818            this.obj = obj;
 28819            this.GroupNames = string.Empty;
 28820        }
 21
 58822        public string GroupNames { get; private set; }
 23
 35224        public string? ObjectName { get; private set; }
 25
 31626        public int LevelOfDetail { get; private set; }
 27
 37628        public string? MapName { get; private set; }
 29
 37630        public string? MaterialName { get; private set; }
 31
 19632        public long SmoothingGroupNumber { get; private set; }
 33
 15634        public bool IsBevelInterpolationEnabled { get; private set; }
 35
 15636        public bool IsColorInterpolationEnabled { get; private set; }
 37
 15638        public bool IsDissolveInterpolationEnabled { get; private set; }
 39
 21640        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        {
 26045            string groupNames = GetGroupNames(element, func);
 46
 26047            if (groupNames != this.GroupNames)
 48            {
 4049                this.GroupNames = groupNames;
 50
 4051                if (string.IsNullOrEmpty(groupNames))
 52                {
 453                    stream.WriteLine("g default");
 54                }
 55                else
 56                {
 3657                    stream.WriteLine("g {0}", groupNames);
 58                }
 59            }
 25660        }
 61
 62        public void WriteAttributesOfElement(StreamWriter stream, ObjElement element)
 63        {
 26064            if (element.ObjectName != this.ObjectName)
 65            {
 3266                this.ObjectName = element.ObjectName;
 67
 3268                if (string.IsNullOrEmpty(this.ObjectName))
 69                {
 470                    stream.WriteLine("o");
 71                }
 72                else
 73                {
 2874                    stream.WriteLine("o {0}", this.ObjectName);
 75                }
 76            }
 77
 26078            if (element.LevelOfDetail != this.LevelOfDetail)
 79            {
 2880                this.LevelOfDetail = element.LevelOfDetail;
 81
 2882                stream.WriteLine("lod {0}", this.LevelOfDetail);
 83            }
 84
 26085            if (element.MapName != this.MapName)
 86            {
 4087                this.MapName = element.MapName;
 88
 4089                if (string.IsNullOrEmpty(this.MapName))
 90                {
 491                    stream.WriteLine("usemap off");
 92                }
 93                else
 94                {
 3695                    stream.WriteLine("usemap {0}", this.MapName);
 96                }
 97            }
 98
 26099            if (element.MaterialName != this.MaterialName)
 100            {
 40101                this.MaterialName = element.MaterialName;
 102
 40103                if (string.IsNullOrEmpty(this.MaterialName))
 104                {
 4105                    stream.WriteLine("usemtl off");
 106                }
 107                else
 108                {
 36109                    stream.WriteLine("usemtl {0}", this.MaterialName);
 110                }
 111            }
 256112        }
 113
 114        public void WriteAttributesOfPolygonalElement(StreamWriter stream, ObjPolygonalElement element)
 115        {
 116116            if (element.SmoothingGroupNumber != this.SmoothingGroupNumber)
 117            {
 28118                this.SmoothingGroupNumber = element.SmoothingGroupNumber;
 119
 28120                if (this.SmoothingGroupNumber == 0)
 121                {
 4122                    stream.WriteLine("s off");
 123                }
 124                else
 125                {
 24126                    stream.WriteLine("s {0}", this.SmoothingGroupNumber);
 127                }
 128            }
 129
 116130            if (element.IsBevelInterpolationEnabled != this.IsBevelInterpolationEnabled)
 131            {
 20132                this.IsBevelInterpolationEnabled = element.IsBevelInterpolationEnabled;
 133
 20134                if (this.IsBevelInterpolationEnabled)
 135                {
 16136                    stream.WriteLine("bevel on");
 137                }
 138                else
 139                {
 4140                    stream.WriteLine("bevel off");
 141                }
 142            }
 143
 116144            if (element.IsColorInterpolationEnabled != this.IsColorInterpolationEnabled)
 145            {
 20146                this.IsColorInterpolationEnabled = element.IsColorInterpolationEnabled;
 147
 20148                if (this.IsColorInterpolationEnabled)
 149                {
 16150                    stream.WriteLine("c_interp on");
 151                }
 152                else
 153                {
 4154                    stream.WriteLine("c_interp off");
 155                }
 156            }
 157
 116158            if (element.IsDissolveInterpolationEnabled != this.IsDissolveInterpolationEnabled)
 159            {
 20160                this.IsDissolveInterpolationEnabled = element.IsDissolveInterpolationEnabled;
 161
 20162                if (this.IsDissolveInterpolationEnabled)
 163                {
 16164                    stream.WriteLine("d_interp on");
 165                }
 166                else
 167                {
 4168                    stream.WriteLine("d_interp off");
 169                }
 170            }
 100171        }
 172
 173        public void WriteAttributesOfFreeFormElement(StreamWriter stream, ObjFreeFormElement element)
 174        {
 144175            if (element.MergingGroupNumber != this.MergingGroupNumber)
 176            {
 20177                this.MergingGroupNumber = element.MergingGroupNumber;
 178
 20179                if (this.MergingGroupNumber == 0)
 180                {
 4181                    stream.WriteLine("mg off");
 182                }
 183                else
 184                {
 16185                    float res = obj.MergingGroupResolutions[this.MergingGroupNumber];
 16186                    stream.WriteLine("mg {0} {1}", this.MergingGroupNumber, res.ToString("F6", CultureInfo.InvariantCult
 187                }
 188            }
 189
 144190            switch (element.FreeFormType)
 191            {
 192                case ObjFreeFormType.BasisMatrix:
 108193                    stream.Write("cstype");
 194
 108195                    if (element.IsRationalForm)
 196                    {
 104197                        stream.Write(" rat");
 198                    }
 199
 108200                    stream.WriteLine(" bmatrix");
 108201                    break;
 202
 203                case ObjFreeFormType.Bezier:
 8204                    stream.Write("cstype");
 205
 8206                    if (element.IsRationalForm)
 207                    {
 4208                        stream.Write(" rat");
 209                    }
 210
 8211                    stream.WriteLine(" bezier");
 8212                    break;
 213
 214                case ObjFreeFormType.BSpline:
 8215                    stream.Write("cstype");
 216
 8217                    if (element.IsRationalForm)
 218                    {
 4219                        stream.Write(" rat");
 220                    }
 221
 8222                    stream.WriteLine(" bspline");
 8223                    break;
 224
 225                case ObjFreeFormType.Cardinal:
 8226                    stream.Write("cstype");
 227
 8228                    if (element.IsRationalForm)
 229                    {
 4230                        stream.Write(" rat");
 231                    }
 232
 8233                    stream.WriteLine(" cardinal");
 8234                    break;
 235
 236                case ObjFreeFormType.Taylor:
 8237                    stream.Write("cstype");
 238
 8239                    if (element.IsRationalForm)
 240                    {
 4241                        stream.Write(" rat");
 242                    }
 243
 8244                    stream.WriteLine(" taylor");
 245                    break;
 246            }
 247
 144248            if (element.DegreeV == 0)
 249            {
 4250                stream.WriteLine("deg {0}", element.DegreeU);
 251            }
 252            else
 253            {
 140254                stream.WriteLine("deg {0} {1}", element.DegreeU, element.DegreeV);
 255            }
 256
 144257            if (element.BasicMatrixU != null)
 258            {
 140259                stream.Write("bmat u");
 260
 1400261                foreach (float value in element.BasicMatrixU)
 262                {
 560263                    stream.Write(' ');
 560264                    stream.Write(value.ToString("F6", CultureInfo.InvariantCulture));
 265                }
 266
 140267                stream.WriteLine();
 268            }
 269
 144270            if (element.BasicMatrixV != null)
 271            {
 140272                stream.Write("bmat v");
 273
 1400274                foreach (float value in element.BasicMatrixV)
 275                {
 560276                    stream.Write(' ');
 560277                    stream.Write(value.ToString("F6", CultureInfo.InvariantCulture));
 278                }
 279
 140280                stream.WriteLine();
 281            }
 282
 144283            if (element.StepV == 1.0f)
 284            {
 4285                stream.WriteLine(
 4286                    "step {0}",
 4287                    element.StepU.ToString("F6", CultureInfo.InvariantCulture));
 288            }
 289            else
 290            {
 140291                stream.WriteLine(
 140292                    "step {0} {1}",
 140293                    element.StepU.ToString("F6", CultureInfo.InvariantCulture),
 140294                    element.StepV.ToString("F6", CultureInfo.InvariantCulture));
 295            }
 296
 144297            if (element.CurveApproximationTechnique != null)
 298            {
 140299                if (element.CurveApproximationTechnique is ObjConstantParametricSubdivisionTechnique)
 300                {
 132301                    var technique = (ObjConstantParametricSubdivisionTechnique)element.CurveApproximationTechnique;
 132302                    stream.WriteLine("ctech cparm {0}", technique.ResolutionU.ToString("F6", CultureInfo.InvariantCultur
 303                }
 8304                else if (element.CurveApproximationTechnique is ObjConstantSpatialSubdivisionTechnique)
 305                {
 4306                    var technique = (ObjConstantSpatialSubdivisionTechnique)element.CurveApproximationTechnique;
 4307                    stream.WriteLine("ctech cspace {0}", technique.MaximumLength.ToString("F6", CultureInfo.InvariantCul
 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
 144319            if (element.SurfaceApproximationTechnique != null)
 320            {
 140321                if (element.SurfaceApproximationTechnique is ObjConstantParametricSubdivisionTechnique)
 322                {
 132323                    var technique = (ObjConstantParametricSubdivisionTechnique)element.SurfaceApproximationTechnique;
 324
 132325                    if (technique.ResolutionU == technique.ResolutionV)
 326                    {
 4327                        stream.WriteLine(
 4328                            "stech cparmb {0}",
 4329                            technique.ResolutionU.ToString("F6", CultureInfo.InvariantCulture));
 330                    }
 331                    else
 332                    {
 128333                        stream.WriteLine(
 128334                            "stech cparma {0} {1}",
 128335                            technique.ResolutionU.ToString("F6", CultureInfo.InvariantCulture),
 128336                            technique.ResolutionV.ToString("F6", CultureInfo.InvariantCulture));
 337                    }
 338                }
 8339                else if (element.SurfaceApproximationTechnique is ObjConstantSpatialSubdivisionTechnique)
 340                {
 4341                    var technique = (ObjConstantSpatialSubdivisionTechnique)element.SurfaceApproximationTechnique;
 4342                    stream.WriteLine("stech cspace {0}", technique.MaximumLength.ToString("F6", CultureInfo.InvariantCul
 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            }
 8353        }
 354
 355        private string GetGroupNames<T>(T element, Func<ObjGroup, List<T>> func)
 356            where T : ObjElement
 357        {
 260358            var groups = new List<string>();
 359
 616360            foreach (ObjGroup group in obj.Groups)
 361            {
 48362                List<T> elements = func(group);
 363
 48364                if (elements.Contains(element))
 365                {
 44366                    groups.Add(group.Name);
 367                }
 368            }
 369
 260370            return string.Join(" ", groups);
 371        }
 372    }
 373}
 374