/// <summary> /// Query media informations. /// </summary> /// <param name="path"> /// A <see cref="String"/> that specify the media path. /// </param> /// <param name="criteria"> /// A <see cref="MediaCodecCriteria"/> that specify parameters for loading an media stream. /// </param> /// <returns> /// A <see cref="SceneObjectInfo"/> containing information about the specified media. /// </returns> /// <exception cref="ArgumentNullException"> /// Exception thrown if <paramref name="stream"/> or <paramref name="criteria"/> is null. /// </exception> public SceneObjectInfo QueryInfo(Stream stream, SceneObjectCodecCriteria criteria) { if (stream == null) { throw new ArgumentNullException("stream"); } if (criteria == null) { throw new ArgumentNullException("criteria"); } SceneObjectInfo info = new SceneObjectInfo(); return(info); }
/// <summary> /// Load media from stream. /// </summary> /// <param name="stream"> /// A <see cref="Stream"/> where the media data is stored. /// </param> /// <param name="criteria"> /// A <see cref="MediaCodecCriteria"/> that specify parameters for loading an media stream. /// </param> /// <returns> /// An <see cref="SceneObject"/> holding the media data. /// </returns> /// <exception cref="ArgumentNullException"> /// Exception thrown if <paramref name="stream"/> or <paramref name="criteria"/> is null. /// </exception> public SceneObject Load(Stream stream, SceneObjectCodecCriteria criteria) { if (stream == null) { throw new ArgumentNullException("stream"); } if (criteria == null) { throw new ArgumentNullException("criteria"); } // Load OBJ information ObjContext objContext = LoadOBJ(stream, criteria); // Process OBJ information return(ProcessOBJ(objContext)); }
private static ObjContext LoadOBJ(Stream stream, SceneObjectCodecCriteria criteria) { FileStream fileStream = stream as FileStream; if (fileStream == null) { throw new InvalidOperationException("only FileStream are supported"); } ObjContext objContext = new ObjContext(fileStream.Name); using (StreamReader sr = new StreamReader(stream)) { string objLine; while ((objLine = sr.ReadLine()) != null) { // Trim spaces objLine = objLine.Trim(); // Skip empty lines and comments if (objLine.Length == 0 || _CommentLine.IsMatch(objLine)) { continue; } Match commandMatch = _ObjCommandLine.Match(objLine); if (commandMatch.Success == false) { continue; } string command = commandMatch.Groups["Command"].Value; string tokens = commandMatch.Groups["Tokens"].Value.Trim(); string[] token = Regex.Split(tokens, " +"); switch (command) { case "mtllib": ParseMaterialLib(objContext, token); break; case "usemtl": if (objContext.Groups.Count == 0) { break; } ObjMaterial objMaterial; if (objContext.Materials.TryGetValue(token[0], out objMaterial) == false) { throw new InvalidOperationException(String.Format("unknown material '{0}'", token[0])); } objContext.Groups[objContext.Groups.Count - 1].Geometries.Add(new ObjGeometry(objMaterial)); break; case "v": ParseVertex(objContext, token); break; case "vn": ParseNormal(objContext, token); break; case "vt": ParseTexCoord(objContext, token); break; case "f": ParseFace(objContext, token); break; case "s": // ? break; case "g": if (token.Length < 1) { throw new InvalidOperationException(); } objContext.Groups.Add(new ObjGroup(token[0])); break; case "vl": case "vp": // Ignored break; default: throw new InvalidOperationException(String.Format("unknown OBJ command {0}", command)); } } } return(objContext); }
/// <summary> /// Save media to stream. /// </summary> /// <param name="stream"> /// A <see cref="IO.Stream"/> which stores the media data. /// </param> /// <param name="sceneObject"> /// A <see cref="SceneObject"/> holding the data to be stored. /// </param> /// <param name="format"> /// A <see cref="String"/> that specify the media format to used for saving <paramref name="sceneObject"/>. /// </param> /// <param name="criteria"> /// A <see cref="MediaCodecCriteria"/> that specify parameters for loading an sceneObject stream. /// </param> /// <exception cref="ArgumentNullException"> /// Exception thrown if <paramref name="stream"/>, <paramref name="sceneObject"/> or <paramref name="criteria"/> is null. /// </exception> public void Save(Stream stream, SceneObject sceneObject, string format, SceneObjectCodecCriteria criteria) { throw new NotImplementedException(); }
/// <summary> /// Save media to stream. /// </summary> /// <param name="path"> /// A <see cref="String"/> that specify the media path. /// </param> /// <param name="sceneObject"> /// A <see cref="SceneObject"/> holding the data to be stored. /// </param> /// <param name="format"> /// A <see cref="String"/> that specify the media format to used for saving <paramref name="sceneObject"/>. /// </param> /// <param name="criteria"> /// A <see cref="MediaCodecCriteria"/> that specify parameters for loading an sceneObject stream. /// </param> /// <exception cref="ArgumentNullException"> /// Exception thrown if <paramref name="stream"/>, <paramref name="sceneObject"/> or <paramref name="criteria"/> is null. /// </exception> public void Save(string path, SceneObject sceneObject, string format, SceneObjectCodecCriteria criteria) { using (FileStream fs = new FileStream(path, FileMode.CreateNew, FileAccess.Write)) { Save(fs, sceneObject, format, criteria); } }
/// <summary> /// Load media from stream. /// </summary> /// <param name="stream"> /// A <see cref="Stream"/> where the media data is stored. /// </param> /// <param name="criteria"> /// A <see cref="MediaCodecCriteria"/> that specify parameters for loading an media stream. /// </param> /// <returns> /// An <see cref="SceneObject"/> holding the media data. /// </returns> /// <exception cref="ArgumentNullException"> /// Exception thrown if <paramref name="stream"/> or <paramref name="criteria"/> is null. /// </exception> public SceneObject Load(string path, SceneObjectCodecCriteria criteria) { using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read)) { return(Load(fs, criteria)); } }