| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 | ( function () {	class KMZLoader extends THREE.Loader {		constructor( manager ) {			super( manager );		}		load( url, onLoad, onProgress, onError ) {			const scope = this;			const loader = new THREE.FileLoader( scope.manager );			loader.setPath( scope.path );			loader.setResponseType( 'arraybuffer' );			loader.setRequestHeader( scope.requestHeader );			loader.setWithCredentials( scope.withCredentials );			loader.load( url, function ( text ) {				try {					onLoad( scope.parse( text ) );				} catch ( e ) {					if ( onError ) {						onError( e );					} else {						console.error( e );					}					scope.manager.itemError( url );				}			}, onProgress, onError );		}		parse( data ) {			function findFile( url ) {				for ( const path in zip ) {					if ( path.substr( - url.length ) === url ) {						return zip[ path ];					}				}			}			const manager = new THREE.LoadingManager();			manager.setURLModifier( function ( url ) {				const image = findFile( url );				if ( image ) {					console.log( 'Loading', url );					const blob = new Blob( [ image.buffer ], {						type: 'application/octet-stream'					} );					return URL.createObjectURL( blob );				}				return url;			} ); //			const zip = fflate.unzipSync( new Uint8Array( data ) ); // eslint-disable-line no-undef			if ( zip[ 'doc.kml' ] ) {				const xml = new DOMParser().parseFromString( fflate.strFromU8( zip[ 'doc.kml' ] ), 'application/xml' ); // eslint-disable-line no-undef				const model = xml.querySelector( 'Placemark Model Link href' );				if ( model ) {					const loader = new THREE.ColladaLoader( manager );					return loader.parse( fflate.strFromU8( zip[ model.textContent ] ) ); // eslint-disable-line no-undef				}			} else {				console.warn( 'KMZLoader: Missing doc.kml file.' );				for ( const path in zip ) {					const extension = path.split( '.' ).pop().toLowerCase();					if ( extension === 'dae' ) {						const loader = new THREE.ColladaLoader( manager );						return loader.parse( fflate.strFromU8( zip[ path ] ) ); // eslint-disable-line no-undef					}				}			}			console.error( 'KMZLoader: Couldn\'t find .dae file.' );			return {				scene: new THREE.Group()			};		}	}	THREE.KMZLoader = KMZLoader;} )();
 |