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); }