123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- /**
- * @author mrdoob / http://mrdoob.com/
- */
- import { Cache } from './Cache';
- import { DefaultLoadingManager } from './LoadingManager';
- function FileLoader( manager ) {
- this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;
- }
- Object.assign( FileLoader.prototype, {
- load: function ( url, onLoad, onProgress, onError ) {
- if ( url === undefined ) url = '';
- if ( this.path !== undefined ) url = this.path + url;
- var scope = this;
- var cached = Cache.get( url );
- if ( cached !== undefined ) {
- scope.manager.itemStart( url );
- setTimeout( function () {
- if ( onLoad ) onLoad( cached );
- scope.manager.itemEnd( url );
- }, 0 );
- return cached;
- }
- // Check for data: URI
- var dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/;
- var dataUriRegexResult = url.match( dataUriRegex );
- // Safari can not handle Data URIs through XMLHttpRequest so process manually
- if ( dataUriRegexResult ) {
- var mimeType = dataUriRegexResult[ 1 ];
- var isBase64 = !! dataUriRegexResult[ 2 ];
- var data = dataUriRegexResult[ 3 ];
- data = window.decodeURIComponent( data );
- if ( isBase64 ) data = window.atob( data );
- try {
- var response;
- var responseType = ( this.responseType || '' ).toLowerCase();
- switch ( responseType ) {
- case 'arraybuffer':
- case 'blob':
- response = new ArrayBuffer( data.length );
- var view = new Uint8Array( response );
- for ( var i = 0; i < data.length; i ++ ) {
- view[ i ] = data.charCodeAt( i );
- }
- if ( responseType === 'blob' ) {
- response = new Blob( [ response ], { type: mimeType } );
- }
- break;
- case 'document':
- var parser = new DOMParser();
- response = parser.parseFromString( data, mimeType );
- break;
- case 'json':
- response = JSON.parse( data );
- break;
- default: // 'text' or other
- response = data;
- break;
- }
- // Wait for next browser tick
- window.setTimeout( function () {
- if ( onLoad ) onLoad( response );
- scope.manager.itemEnd( url );
- }, 0 );
- } catch ( error ) {
- // Wait for next browser tick
- window.setTimeout( function () {
- if ( onError ) onError( error );
- scope.manager.itemError( url );
- }, 0 );
- }
- } else {
- var request = new XMLHttpRequest();
- request.open( 'GET', url, true );
- request.addEventListener( 'load', function ( event ) {
- var response = event.target.response;
- Cache.add( url, response );
- if ( this.status === 200 ) {
- if ( onLoad ) onLoad( response );
- scope.manager.itemEnd( url );
- } else if ( this.status === 0 ) {
- // Some browsers return HTTP Status 0 when using non-http protocol
- // e.g. 'file://' or 'data://'. Handle as success.
- console.warn( 'THREE.FileLoader: HTTP Status 0 received.' );
- if ( onLoad ) onLoad( response );
- scope.manager.itemEnd( url );
- } else {
- if ( onError ) onError( event );
- scope.manager.itemError( url );
- }
- }, false );
- if ( onProgress !== undefined ) {
- request.addEventListener( 'progress', function ( event ) {
- onProgress( event );
- }, false );
- }
- request.addEventListener( 'error', function ( event ) {
- if ( onError ) onError( event );
- scope.manager.itemError( url );
- }, false );
- if ( this.responseType !== undefined ) request.responseType = this.responseType;
- if ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials;
- if ( this.mimeType && request.overrideMimeType ) request.overrideMimeType( this.mimeType );
- request.send( null );
- }
- scope.manager.itemStart( url );
- return request;
- },
- setPath: function ( value ) {
- this.path = value;
- return this;
- },
- setResponseType: function ( value ) {
- this.responseType = value;
- return this;
- },
- setWithCredentials: function ( value ) {
- this.withCredentials = value;
- return this;
- },
- setMimeType: function ( value ) {
- this.mimeType = value;
- return this;
- }
- } );
- export { FileLoader };
|