Пример #1
0
        /// <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);
        }
Пример #2
0
 /// <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);
 }
Пример #3
0
        /// <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);
        }
Пример #4
0
 /// <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;
 }
Пример #5
0
        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,
                    });
                }
            }
        }