23876
23876
23877
23877
// build geometry
23878
23878
23879
- this.setIndex( Uint16Attribute( indices, 1 ) );
23879
+ this.setIndex( ( indices.length > 65535 ? Uint32Attribute : Uint16Attribute ) ( indices, 1 ) );
23880
23880
this.addAttribute( 'position', Float32Attribute( vertices, 3 ) );
23881
23881
this.addAttribute( 'uv', Float32Attribute( uvs, 2 ) );
23882
23882
28824
28824
28825
28825
load: function ( url, onLoad, onProgress, onError ) {
28826
28826
28827
+ if ( url === undefined ) url = '';
28828
+
28827
28829
if ( this.path !== undefined ) url = this.path + url;
28828
28830
28829
28831
var scope = this;
@@ -28846,66 +28848,156 @@
28846
28848
28847
28849
}
28848
28850
28849
- var request = new XMLHttpRequest();
28850
- request.open( 'GET', url, true );
28851
+ // Check for data: URI
28852
+ var dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/;
28853
+ var dataUriRegexResult = url.match( dataUriRegex );
28851
28854
28852
- request.addEventListener( 'load', function ( event ) {
28855
+ // Safari can not handle Data URIs through XMLHttpRequest so process manually
28856
+ if ( dataUriRegexResult ) {
28853
28857
28854
- var response = event.target.response;
28858
+ var mimeType = dataUriRegexResult[1];
28859
+ var isBase64 = !!dataUriRegexResult[2];
28860
+ var data = dataUriRegexResult[3];
28855
28861
28856
- exports.Cache.add( url, response );
28862
+ data = window.decodeURIComponent(data );
28857
28863
28858
- if ( this.status === 200 ) {
28864
+ if( isBase64 ) {
28865
+ data = window.atob(data);
28866
+ }
28859
28867
28860
- if ( onLoad ) onLoad( response );
28868
+ try {
28861
28869
28862
- scope.manager.itemEnd( url );
28870
+ var response;
28871
+ var responseType = ( this.responseType || '' ).toLowerCase();
28863
28872
28864
- } else if ( this.status === 0 ) {
28873
+ switch ( responseType ) {
28865
28874
28866
- // Some browsers return HTTP Status 0 when using non-http protocol
28867
- // e.g. 'file://' or 'data://'. Handle as success.
28875
+ case 'arraybuffer':
28876
+ case 'blob':
28868
28877
28869
- console.warn( 'THREE.XHRLoader: HTTP Status 0 received.' );
28878
+ response = new ArrayBuffer( data.length );
28879
+ var view = new Uint8Array( response );
28880
+ for ( var i = 0; i < data.length; i ++ ) {
28870
28881
28871
- if ( onLoad ) onLoad( response );
28882
+ view[ i ] = data.charCodeAt( i );
28872
28883
28873
- scope.manager.itemEnd( url );
28884
+ }
28874
28885
28875
- } else {
28886
+ if ( responseType === 'blob' ) {
28876
28887
28877
- if ( onError ) onError( event );
28888
+ response = new Blob( [ response ], { "type" : mimeType } );
28878
28889
28879
- scope.manager.itemError( url );
28890
+ }
28891
+
28892
+ break;
28893
+
28894
+ case 'document':
28895
+
28896
+ var parser = new DOMParser();
28897
+ response = parser.parseFromString( data, mimeType );
28898
+
28899
+ break;
28900
+
28901
+ case 'json':
28902
+
28903
+ response = JSON.parse( data );
28904
+
28905
+ break;
28906
+
28907
+ default: // 'text' or other
28908
+
28909
+ response = data;
28910
+
28911
+ break;
28912
+
28913
+ }
28914
+
28915
+ // Wait for next browser tick
28916
+ window.setTimeout( function() {
28917
+
28918
+ if ( onLoad ) onLoad( response );
28919
+
28920
+ scope.manager.itemEnd( url );
28921
+
28922
+ }, 0);
28923
+
28924
+ } catch ( error ) {
28925
+
28926
+ // Wait for next browser tick
28927
+ window.setTimeout( function() {
28928
+
28929
+ if ( onError ) onError( error );
28930
+
28931
+ scope.manager.itemError( url );
28932
+
28933
+ }, 0);
28880
28934
28881
28935
}
28882
28936
28883
- }, false );
28937
+ } else {
28938
+
28939
+ var request = new XMLHttpRequest();
28940
+ request.open( 'GET', url, true );
28941
+
28942
+ request.addEventListener( 'load', function ( event ) {
28943
+
28944
+ var response = event.target.response;
28884
28945
28885
- if ( onProgress !== undefined ) {
28946
+ exports.Cache.add( url, response );
28886
28947
28887
- request.addEventListener( 'progress', function ( event ) {
28948
+ if ( this.status === 200 ) {
28888
28949
28889
- onProgress( event );
28950
+ if ( onLoad ) onLoad( response );
28951
+
28952
+ scope.manager.itemEnd( url );
28953
+
28954
+ } else if ( this.status === 0 ) {
28955
+
28956
+ // Some browsers return HTTP Status 0 when using non-http protocol
28957
+ // e.g. 'file://' or 'data://'. Handle as success.
28958
+
28959
+ console.warn( 'THREE.XHRLoader: HTTP Status 0 received.' );
28960
+
28961
+ if ( onLoad ) onLoad( response );
28962
+
28963
+ scope.manager.itemEnd( url );
28964
+
28965
+ } else {
28966
+
28967
+ if ( onError ) onError( event );
28968
+
28969
+ scope.manager.itemError( url );
28970
+
28971
+ }
28890
28972
28891
28973
}, false );
28892
28974
28893
- }
28975
+ if ( onProgress !== undefined ) {
28894
28976
28895
- request.addEventListener( 'error ', function ( event ) {
28977
+ request.addEventListener( 'progress ', function ( event ) {
28896
28978
28897
- if ( onError ) onError ( event );
28979
+ onProgress ( event );
28898
28980
28899
- scope.manager.itemError( url );
28981
+ }, false );
28900
28982
28901
- }, false );
28983
+ }
28902
28984
28903
- if ( this.responseType !== undefined ) request.responseType = this.responseType;
28904
- if ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials;
28985
+ request.addEventListener( 'error', function ( event ) {
28905
28986
28906
- if ( request.overrideMimeType ) request.overrideMimeType( 'text/plain' );
28987
+ if ( onError ) onError( event );
28907
28988
28908
- request.send( null );
28989
+ scope.manager.itemError( url );
28990
+
28991
+ }, false );
28992
+
28993
+ if ( this.responseType !== undefined ) request.responseType = this.responseType;
28994
+ if ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials;
28995
+
28996
+ if ( request.overrideMimeType ) request.overrideMimeType( 'text/plain' );
28997
+
28998
+ request.send( null );
28999
+
29000
+ }
28909
29001
28910
29002
scope.manager.itemStart( url );
28911
29003
29187
29279
scope.manager.itemEnd( url );
29188
29280
29189
29281
};
29282
+ image.onerror = onError;
29190
29283
29191
29284
if ( url.indexOf( 'data:' ) === 0 ) {
29192
29285
0 commit comments