Exemplo n.º 1
0
        private void ReadVertex()
        {
            var parts = SplitLine();

            if (parts.Length < 4 || parts.Length > 5)
            {
                ThrowInvalidModelFormatException("Wrong vertex format");
            }

            if (!TryStrictDoubleParse(parts[1], out var x))
            {
                ThrowParseException("vertex X");
            }
            if (!TryStrictDoubleParse(parts[2], out var y))
            {
                ThrowParseException("vertex Y");
            }
            if (!TryStrictDoubleParse(parts[3], out var z))
            {
                ThrowParseException("vertex Z");
            }
            var w = 1.0;

            if (parts.Length > 4 && !TryStrictDoubleParse(parts[4], out w))
            {
                ThrowParseException("vertex W");
            }

            _model.AddVertex(new Vertex {
                X = x, Y = y, Z = z, W = w
            });
        }
        private IModel InternalRead(Stream input, CancellationToken token, IProgress <double> progress)
        {
            _input = input ?? throw new ArgumentNullException(nameof(input));

            if (!_input.CanRead)
            {
                throw new ArgumentException("Input stream must be readable");
            }

            _model = new Model.Model();

            using (var br = new BinaryReader(input))
            {
                br.ReadBytes(80);
                var faceNum = br.ReadUInt32();

                _lastReportedProgress = 0;
                for (var i = 0; i < faceNum; i++)
                {
                    ReportProgress(progress);

                    if (token.IsCancellationRequested)
                    {
                        break;
                    }

                    var normal    = ReadVector(br);
                    var vertexIdx = _model.Vertices.Count;
                    _model.AddVertex((Vertex)ReadVector(br));
                    _model.AddVertex((Vertex)ReadVector(br));
                    _model.AddVertex((Vertex)ReadVector(br));

                    br.ReadInt16();

                    var face = new Face
                    {
                        Normal        = normal,
                        VertexIndices = new[] { vertexIdx, vertexIdx + 1, vertexIdx + 2 }
                    };
                    _model.AddFace(face);
                }
            }
            return(_model);
        }