/// <summary> /// Exports the collected scenes/content as glTF and disposes this object. /// After the export this instance cannot be re-used! /// </summary> /// <param name="path">glTF destination file path</param> /// <returns>True if the glTF file was created successfully, false otherwise</returns> public async Task <bool> SaveToFileAndDispose(string path) { CertifyNotDisposed(); var success = await m_Writer.SaveToFileAndDispose(path); m_Writer = null; return(success); }
/// <summary> /// Provides glTF export of GameObject based scenes and hierarchies. /// </summary> /// <param name="exportSettings">Export settings</param> /// <param name="deferAgent">Defer agent; decides when/if to preempt /// export to preserve a stable frame rate <seealso cref="IDeferAgent"/></param> /// <param name="logger">Interface for logging (error) messages /// <seealso cref="ConsoleLogger"/></param> public GameObjectExport( ExportSettings exportSettings = null, IDeferAgent deferAgent = null, ICodeLogger logger = null ) { m_Writer = new GltfWriter(exportSettings, deferAgent, logger); }
/// <summary> /// Exports the collected scenes/content as glTF, writes it to a Stream /// and disposes this object. Only works for self-contained glTF-Binary. /// After the export this instance cannot be re-used! /// </summary> /// <param name="stream">glTF destination stream</param> /// <returns>True if the glTF file was written successfully, false otherwise</returns> public async Task <bool> SaveToStreamAndDispose(Stream stream) { CertifyNotDisposed(); var success = await m_Writer.SaveToStreamAndDispose(stream); m_Writer = null; return(success); }
/// <summary> /// Provides glTF export of GameObject based scenes and hierarchies. /// </summary> /// <param name="exportSettings">Export settings</param> /// <param name="gameObjectExportSettings">GameObject export settings</param> /// <param name="materialExport">Provides material conversion</param> /// <param name="deferAgent">Defer agent; decides when/if to preempt /// export to preserve a stable frame rate <seealso cref="IDeferAgent"/></param> /// <param name="logger">Interface for logging (error) messages /// <seealso cref="ConsoleLogger"/></param> public GameObjectExport( ExportSettings exportSettings = null, GameObjectExportSettings gameObjectExportSettings = null, IMaterialExport materialExport = null, IDeferAgent deferAgent = null, ICodeLogger logger = null ) { m_Settings = gameObjectExportSettings ?? new GameObjectExportSettings(); m_Writer = new GltfWriter(exportSettings, deferAgent, logger); m_MaterialExport = materialExport ?? MaterialExport.GetDefaultMaterialExport(); m_Logger = logger; }
public static void WriteFromContainer(Stream s, GltfContainer container) { const uint HeaderSize = 12; const uint ChunkHeaderSize = 8; using (var w = new Writer(s)) { uint chunksTotalSize = 0; // TODO: make this processes as streamable byte[] gltf = null; if (container.Gltf == null) { throw new NotImplementedException("Json is empty"); // TODO: change type } using (var cs = new MemoryStream()) { GltfWriter.Write(cs, container.Gltf); gltf = cs.ToArray(); } chunksTotalSize += ChunkHeaderSize + (uint)gltf.Length; var padding = Align.CalcPadding(chunksTotalSize, 4); // Must be 4Bytes aligned chunksTotalSize += padding; byte[] buffer = null; if (container.Buffer != null) { using (var cs = new MemoryStream()) { var payload = container.Buffer.Payload; cs.Write(payload.Array, payload.Offset, payload.Count); buffer = cs.ToArray(); } chunksTotalSize += ChunkHeaderSize + (uint)buffer.Length; } // Start writing w.WriteHeader(new Header { Magic = 0x46546C67, Version = 2, Length = HeaderSize + chunksTotalSize, }); w.WriteChunk(new Chunk { ChunkLength = (uint)gltf.Length + padding, ChunkType = 0x4E4F534A, // JSON ChunkData = gltf, }); w._w.Write(new byte[] { 0x20, 0x20, 0x20, 0x20 }, 0, (int)padding); // Add space padding if needed. 0x20 == ' '. if (buffer != null) { w.WriteChunk(new Chunk { ChunkLength = (uint)buffer.Length, ChunkType = 0x004E4942, // BIN ChunkData = buffer, }); } } }