/// <summary> /// Reads the model in ASCII format from the specified stream. /// </summary> private ImportedModelContainer TryReadAscii(Stream stream, StlImportOptions importOptions) { using (var reader = new StreamReader(stream, ENCODING, false, 128, true)) { VertexStructure newStructure = new VertexStructure(); while (!reader.EndOfStream) { var line = reader.ReadLine(); if (line == null) { continue; } line = line.Trim(); if (line.Length == 0 || line.StartsWith("\0") || line.StartsWith("#") || line.StartsWith("!") || line.StartsWith("$")) { continue; } string id, values; ParseLine(line, out id, out values); switch (id) { // Header.. not needed here case "solid": break; // Geometry data case "facet": this.ReadFacet(reader, values, newStructure, importOptions); break; // End of file case "endsolid": break; } } // Generate result container ImportedModelContainer result = new ImportedModelContainer(importOptions); NamedOrGenericKey geoResourceKey = result.GetResourceKey( RES_KEY_GEO_CLASS, RES_KEY_GEO_NAME); result.ImportedResources.Add(new ImportedResourceInfo( geoResourceKey, () => new GeometryResource(newStructure))); GenericObject geoObject = new GenericObject(geoResourceKey); result.Objects.Add(geoObject); // Append an object which transform the whole coordinate system ScenePivotObject rootObject = result.CreateAndAddRootObject(); result.ParentChildRelationships.Add(new Tuple <SceneObject, SceneObject>(rootObject, geoObject)); return(result); } }
/// <summary> /// Reads the model from the specified binary stream. /// </summary> private ImportedModelContainer TryReadBinary(Stream stream, StlImportOptions importOptions) { // Check length long length = stream.Length; if (length < 84) { throw new SeeingSharpException("Incomplete file (smaller that 84 bytes)"); } // Read number of triangles uint numberTriangles = 0; using (var reader = new BinaryReader(stream, Encoding.GetEncoding("us-ascii"), true)) { // Read header (is not needed) // (solid stands for Ascii format) string header = ENCODING.GetString(reader.ReadBytes(80), 0, 80).Trim(); if (header.StartsWith("solid", StringComparison.OrdinalIgnoreCase)) { return(null); } // Read and check number of triangles numberTriangles = ReadUInt32(reader); if (length - 84 != numberTriangles * 50) { throw new SeeingSharpException("Incomplete file (smaller that expected byte count)"); } // Read geometry data VertexStructure newStructure = new VertexStructure((int)numberTriangles * 3); newStructure.CreateSurface((int)numberTriangles); for (int loop = 0; loop < numberTriangles; loop++) { this.ReadTriangle(reader, newStructure, importOptions); } // Generate result container ImportedModelContainer result = new ImportedModelContainer(importOptions); NamedOrGenericKey geoResourceKey = result.GetResourceKey( RES_KEY_GEO_CLASS, RES_KEY_GEO_NAME); result.ImportedResources.Add(new ImportedResourceInfo( geoResourceKey, () => new GeometryResource(newStructure))); GenericObject geoObject = new GenericObject(geoResourceKey); result.Objects.Add(geoObject); // Append an object which transform the whole coordinate system ScenePivotObject rootObject = result.CreateAndAddRootObject(); result.ParentChildRelationships.Add(new Tuple <SceneObject, SceneObject>(rootObject, geoObject)); return(result); } }
/// <summary> /// Imports the texture node where the xml reader is currently located. /// </summary> private void ImportObject(XmlReader inStreamXml, ImportedModelContainer container, SceneObject parentObject, XglImportOptions xglImportOptions) { Vector3 upVector = Vector3.UnitY; Vector3 forwardVector = Vector3.UnitZ; Vector3 positionVector = Vector3.UnitX; string meshID = string.Empty; // Define a action which finally create the new object // (may be called on two locations here.. so this action was defined SceneSpacialObject newObject = null; Action actionFinalizeObject = () => { if (newObject != null) { return; } if (string.IsNullOrEmpty(meshID)) { // Generate a Pivot on which other objects are orientated newObject = new ScenePivotObject(); } else { // Generate an instance of a 3d mesh newObject = new GenericObject( container.GetResourceKey(RES_CLASS_MESH, meshID)); } newObject.Position = positionVector; newObject.TransformationType = SpacialTransformationType.TranslationDirection; newObject.RotationForward = forwardVector; newObject.RotationUp = upVector; container.Objects.Add(newObject); // Add dependency (parent => child) if (parentObject != null) { container.ParentChildRelationships.Add(Tuple.Create <SceneObject, SceneObject>( parentObject, newObject)); } }; // Read xml contents while (inStreamXml.Read()) { // Ending condition if ((inStreamXml.NodeType == XmlNodeType.EndElement) && (inStreamXml.Name == NODE_NAME_OBJECT)) { break; } // Continue condition if (inStreamXml.NodeType != XmlNodeType.Element) { continue; } switch (inStreamXml.Name) { case NODE_NAME_OBJECT: actionFinalizeObject(); ImportObject(inStreamXml, container, newObject, xglImportOptions); break; case NODE_NAME_TRANS_FORWARD: inStreamXml.Read(); forwardVector = inStreamXml.ReadContentAsVector3(); break; case NODE_NAME_TRANS_UP: inStreamXml.Read(); upVector = inStreamXml.ReadContentAsVector3(); break; case NODE_NAME_TRANS_POSITION: inStreamXml.Read(); positionVector = inStreamXml.ReadContentAsVector3() * xglImportOptions.ResizeFactor; break; case NODE_NAME_MESHREF: inStreamXml.Read(); meshID = inStreamXml.ReadContentAsString(); break; case NODE_NAME_TRANSFORM: break; default: break; } } // finalize object here actionFinalizeObject(); }