|
@@ -39183,6 +39183,34 @@ class ObjectLoader extends Loader {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ async loadAsync( url, onProgress ) {
|
|
|
+
|
|
|
+ const scope = this;
|
|
|
+
|
|
|
+ const path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;
|
|
|
+ this.resourcePath = this.resourcePath || path;
|
|
|
+
|
|
|
+ const loader = new FileLoader( this.manager );
|
|
|
+ loader.setPath( this.path );
|
|
|
+ loader.setRequestHeader( this.requestHeader );
|
|
|
+ loader.setWithCredentials( this.withCredentials );
|
|
|
+
|
|
|
+ const text = await loader.loadAsync( url, onProgress );
|
|
|
+
|
|
|
+ const json = JSON.parse( text );
|
|
|
+
|
|
|
+ const metadata = json.metadata;
|
|
|
+
|
|
|
+ if ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {
|
|
|
+
|
|
|
+ throw new Error( 'THREE.ObjectLoader: Can\'t load ' + url );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return await scope.parseAsync( json );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
parse( json, onLoad ) {
|
|
|
|
|
|
const animations = this.parseAnimations( json.animations );
|
|
@@ -39228,6 +39256,26 @@ class ObjectLoader extends Loader {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ async parseAsync( json ) {
|
|
|
+
|
|
|
+ const animations = this.parseAnimations( json.animations );
|
|
|
+ const shapes = this.parseShapes( json.shapes );
|
|
|
+ const geometries = this.parseGeometries( json.geometries, shapes );
|
|
|
+
|
|
|
+ const images = await this.parseImagesAsync( json.images );
|
|
|
+
|
|
|
+ const textures = this.parseTextures( json.textures, images );
|
|
|
+ const materials = this.parseMaterials( json.materials, textures );
|
|
|
+
|
|
|
+ const object = this.parseObject( json.object, geometries, materials, textures, animations );
|
|
|
+ const skeletons = this.parseSkeletons( json.skeletons, object );
|
|
|
+
|
|
|
+ this.bindSkeletons( object, skeletons );
|
|
|
+
|
|
|
+ return object;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
parseShapes( json ) {
|
|
|
|
|
|
const shapes = {};
|
|
@@ -39756,6 +39804,105 @@ class ObjectLoader extends Loader {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ async parseImagesAsync( json ) {
|
|
|
+
|
|
|
+ const scope = this;
|
|
|
+ const images = {};
|
|
|
+
|
|
|
+ let loader;
|
|
|
+
|
|
|
+ async function deserializeImage( image ) {
|
|
|
+
|
|
|
+ if ( typeof image === 'string' ) {
|
|
|
+
|
|
|
+ const url = image;
|
|
|
+
|
|
|
+ const path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( url ) ? url : scope.resourcePath + url;
|
|
|
+
|
|
|
+ return await loader.loadAsync( path );
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ if ( image.data ) {
|
|
|
+
|
|
|
+ return {
|
|
|
+ data: getTypedArray( image.type, image.data ),
|
|
|
+ width: image.width,
|
|
|
+ height: image.height
|
|
|
+ };
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ return null;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( json !== undefined && json.length > 0 ) {
|
|
|
+
|
|
|
+ loader = new ImageLoader( this.manager );
|
|
|
+ loader.setCrossOrigin( this.crossOrigin );
|
|
|
+
|
|
|
+ for ( let i = 0, il = json.length; i < il; i ++ ) {
|
|
|
+
|
|
|
+ const image = json[ i ];
|
|
|
+ const url = image.url;
|
|
|
+
|
|
|
+ if ( Array.isArray( url ) ) {
|
|
|
+
|
|
|
+ // load array of images e.g CubeTexture
|
|
|
+
|
|
|
+ images[ image.uuid ] = [];
|
|
|
+
|
|
|
+ for ( let j = 0, jl = url.length; j < jl; j ++ ) {
|
|
|
+
|
|
|
+ const currentUrl = url[ j ];
|
|
|
+
|
|
|
+ const deserializedImage = await deserializeImage( currentUrl );
|
|
|
+
|
|
|
+ if ( deserializedImage !== null ) {
|
|
|
+
|
|
|
+ if ( deserializedImage instanceof HTMLImageElement ) {
|
|
|
+
|
|
|
+ images[ image.uuid ].push( deserializedImage );
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ // special case: handle array of data textures for cube textures
|
|
|
+
|
|
|
+ images[ image.uuid ].push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ // load single image
|
|
|
+
|
|
|
+ const deserializedImage = await deserializeImage( image.url );
|
|
|
+
|
|
|
+ if ( deserializedImage !== null ) {
|
|
|
+
|
|
|
+ images[ image.uuid ] = deserializedImage;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return images;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
parseTextures( json, images ) {
|
|
|
|
|
|
function parseConstant( value, type ) {
|