/// <summary> /// Reads one 3D scene from a given stream (containing text variant of Wavefront OBJ format). /// </summary> /// <param name="reader">Already open text reader</param> /// <param name="scene">Scene to be modified</param> /// <returns>Number of faces read</returns> public int ReadBrep( StreamReader reader, SceneBrep scene ) { if ( reader == null ) return SceneBrep.NULL; Debug.Assert( scene != null ); scene.Reset(); return ReadBrep( reader, scene, Matrix4.Identity ); }
/// <summary> /// Reads one 3D scene from a given stream (containing text variant of Wavefront OBJ format). /// </summary> /// <param name="reader">Already open text reader</param> /// <param name="scene">Scene to be modified</param> /// <returns>Number of faces read</returns> public int ReadBrep(StreamReader reader, SceneBrep scene) { if (reader == null) { return(SceneBrep.NULL); } Debug.Assert(scene != null); scene.Reset(); return(ReadBrep(reader, scene, Matrix4.Identity)); }
public int ReadBrep(string fileName, SceneBrep scene) { Debug.Assert(scene != null); this.scene = scene; scene.Reset(); if (fileName == null || fileName.Length == 0) { throw new IOException("Invalid file name"); } if (fileName.EndsWith(".gz")) { headerReader = new StreamReader(new GZipStream(new FileStream(fileName, FileMode.Open), CompressionMode.Decompress)); } else { var fs = new FileStream(fileName, FileMode.Open); headerReader = new StreamReader(fs); } // prepare buffers for data filling if (!ParseHeader()) { return(-1); } // read vertices var vertexReader = GetReader("vertex"); var element = vertexReader.ReadElement(); List <Vector2> txtCoords = new List <Vector2>(256); int[] f = new int[3]; int v0 = scene.Vertices; int lastVertex = v0 - 1; while (element != null) { lastVertex = scene.AddVertex(Vector3.TransformPosition(element.GetVertex(), matrix)); if (DoNormals) { Vector3.TransformNormal(element.GetNormal(), matrix); scene.SetNormal(lastVertex, element.GetNormal()); } if (DoTxtCoords) { scene.SetTxtCoord(lastVertex, element.GetTextureCoordinate()); } if (DoColors) { scene.SetColor(lastVertex, element.GetVertexColor()); } element = vertexReader.ReadElement(); } // read triangles var faceReader = GetReader("face"); element = faceReader.ReadElement(); while (element != null) { int A, B, C; element.GetTriangleVertices(out A, out B, out C); scene.AddTriangle(A, B, C); element = faceReader.ReadElement(); } headerReader.Close(); vertexReader.Close(); faceReader.Close(); return(scene.Triangles); }