async write( input, onDone, options ) {

    		this.options = Object.assign( {}, {
    			// default options
    			binary: false,
    			trs: false,
    			onlyVisible: true,
    			truncateDrawRange: true,
    			embedImages: true,
    			maxTextureSize: Infinity,
    			animations: [],
    			includeCustomExtensions: false
    		}, options );

    		if ( this.options.animations.length > 0 ) {

    			// Only TRS properties, and not matrices, may be targeted by animation.
    			this.options.trs = true;

    		}

    		this.processInput( input );

    		await Promise.all( this.pending );

    		const writer = this;
    		const buffers = writer.buffers;
    		const json = writer.json;
    		options = writer.options;
    		const extensionsUsed = writer.extensionsUsed;

    		// Merge buffers.
    		const blob = new Blob( buffers, { type: 'application/octet-stream' } );

    		// Declare extensions.
    		const extensionsUsedList = Object.keys( extensionsUsed );

    		if ( extensionsUsedList.length > 0 ) json.extensionsUsed = extensionsUsedList;

    		// Update bytelength of the single buffer.
    		if ( json.buffers && json.buffers.length > 0 ) json.buffers[ 0 ].byteLength = blob.size;

    		if ( options.binary === true ) {

    			// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification

    			const reader = new window.FileReader();
    			reader.readAsArrayBuffer( blob );
    			reader.onloadend = function () {

    				// Binary chunk.
    				const binaryChunk = getPaddedArrayBuffer( reader.result );
    				const binaryChunkPrefix = new DataView( new ArrayBuffer( GLB_CHUNK_PREFIX_BYTES ) );
    				binaryChunkPrefix.setUint32( 0, binaryChunk.byteLength, true );
    				binaryChunkPrefix.setUint32( 4, GLB_CHUNK_TYPE_BIN, true );

    				// JSON chunk.
    				const jsonChunk = getPaddedArrayBuffer( stringToArrayBuffer( JSON.stringify( json ) ), 0x20 );
    				const jsonChunkPrefix = new DataView( new ArrayBuffer( GLB_CHUNK_PREFIX_BYTES ) );
    				jsonChunkPrefix.setUint32( 0, jsonChunk.byteLength, true );
    				jsonChunkPrefix.setUint32( 4, GLB_CHUNK_TYPE_JSON, true );

    				// GLB header.
    				const header = new ArrayBuffer( GLB_HEADER_BYTES );
    				const headerView = new DataView( header );
    				headerView.setUint32( 0, GLB_HEADER_MAGIC, true );
    				headerView.setUint32( 4, GLB_VERSION, true );
    				const totalByteLength = GLB_HEADER_BYTES
    					+ jsonChunkPrefix.byteLength + jsonChunk.byteLength
    					+ binaryChunkPrefix.byteLength + binaryChunk.byteLength;
    				headerView.setUint32( 8, totalByteLength, true );

    				const glbBlob = new Blob( [
    					header,
    					jsonChunkPrefix,
    					jsonChunk,
    					binaryChunkPrefix,
    					binaryChunk
    				], { type: 'application/octet-stream' } );

    				const glbReader = new window.FileReader();
    				glbReader.readAsArrayBuffer( glbBlob );
    				glbReader.onloadend = function () {

    					onDone( glbReader.result );

    				};

    			};

    		} else {

    			if ( json.buffers && json.buffers.length > 0 ) {

    				const reader = new window.FileReader();
    				reader.readAsDataURL( blob );
    				reader.onloadend = function () {

    					const base64data = reader.result;
    					json.buffers[ 0 ].uri = base64data;
    					onDone( json );

    				};

    			} else {

    				onDone( json );

    			}

    		}


    	}
Parse scenes and generate GLTF output
@param  {Scene or [THREE.Scenes]} input   Scene or Array of THREE.Scenes
@param  {Function} onDone  Callback on completed
@param  {Object} options options