瀏覽代碼

Merge pull request #19118 from looeee/add_loadAsync

Added Loader.loadAsync
Mr.doob 5 年之前
父節點
當前提交
63f5d5deda

+ 12 - 0
docs/api/en/loaders/Loader.html

@@ -57,6 +57,18 @@
 			This method needs to be implement by all concrete loaders. It holds the logic for loading the asset from the backend.
 			This method needs to be implement by all concrete loaders. It holds the logic for loading the asset from the backend.
 		</p>
 		</p>
 
 
+		<h3>[method:Promise loadAsync]( [param:String url], [param:Function onProgress] )</h3>
+		<p>
+		[page:String url] — A string containing the path/URL of the <em>.gltf</em> or <em>.glb</em> file.<br />
+		[page:Function onProgress] — (optional) A function to be called while the loading is in progress. The argument will be the XMLHttpRequest instance, that contains .[page:Integer total] and .[page:Integer loaded] bytes.<br />
+		</p>
+		<p>
+		This method is equivalent to [page:.load], but returns a [link:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise Promise].
+		</p>
+		<p>
+		[page:Function onLoad] is handled by [link:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve Promise.resolve] and [page:Function onError] is handled by [link:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/reject Promise.reject].
+		</p>
+
 		<h3>[method:void parse]()</h3>
 		<h3>[method:void parse]()</h3>
 		<p>
 		<p>
 			This method needs to be implement by all concrete loaders. It holds the logic for parsing the asset into three.js entities.
 			This method needs to be implement by all concrete loaders. It holds the logic for parsing the asset into three.js entities.

+ 12 - 0
docs/api/zh/loaders/Loader.html

@@ -57,6 +57,18 @@
 			This method needs to be implement by all concrete loaders. It holds the logic for loading the asset from the backend.
 			This method needs to be implement by all concrete loaders. It holds the logic for loading the asset from the backend.
 		</p>
 		</p>
 
 
+		<h3>[method:Promise loadAsync]( [param:String url], [param:Function onProgress] )</h3>
+		<p>
+		[page:String url] — A string containing the path/URL of the <em>.gltf</em> or <em>.glb</em> file.<br />
+		[page:Function onProgress] — (optional) A function to be called while the loading is in progress. The argument will be the XMLHttpRequest instance, that contains .[page:Integer total] and .[page:Integer loaded] bytes.<br />
+		</p>
+		<p>
+		This method is equivalent to [page:.load], but returns a [link:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise Promise].
+		</p>
+		<p>
+		[page:Function onLoad] is handled by [link:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve Promise.resolve] and [page:Function onError] is handled by [link:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/reject Promise.reject].
+		</p>
+
 		<h3>[method:void parse]()</h3>
 		<h3>[method:void parse]()</h3>
 		<p>
 		<p>
 			This method needs to be implement by all concrete loaders. It holds the logic for parsing the asset into three.js entities.
 			This method needs to be implement by all concrete loaders. It holds the logic for parsing the asset into three.js entities.

+ 1 - 0
docs/examples/en/loaders/GLTFLoader.html

@@ -190,6 +190,7 @@
 		Refer to this [link:https://github.com/mrdoob/three.js/tree/dev/examples/js/libs/draco#readme readme] for the details of Draco and its decoder.
 		Refer to this [link:https://github.com/mrdoob/three.js/tree/dev/examples/js/libs/draco#readme readme] for the details of Draco and its decoder.
 		</p>
 		</p>
 
 
+
 		<h3>[method:null setDDSLoader]( [param:DDSLoader ddsLoader] )</h3>
 		<h3>[method:null setDDSLoader]( [param:DDSLoader ddsLoader] )</h3>
 		<p>
 		<p>
 		[page:DDSLoader ddsLoader] — Instance of THREE.DDSLoader, to be used for loading compressed textures with the MSFT_TEXTURE_DDS extension.
 		[page:DDSLoader ddsLoader] — Instance of THREE.DDSLoader, to be used for loading compressed textures with the MSFT_TEXTURE_DDS extension.

二進制
examples/screenshots/webgl_tonemapping.png


+ 27 - 25
examples/webgl_tonemapping.html

@@ -44,10 +44,13 @@
 				ACESFilmic: THREE.ACESFilmicToneMapping
 				ACESFilmic: THREE.ACESFilmicToneMapping
 			};
 			};
 
 
-			init();
-			render();
+			init().catch( function ( err ) {
 
 
-			function init() {
+				console.error( err );
+
+			} );
+
+			async function init() {
 
 
 				renderer = new THREE.WebGLRenderer( { antialias: true } );
 				renderer = new THREE.WebGLRenderer( { antialias: true } );
 				renderer.setPixelRatio( window.devicePixelRatio );
 				renderer.setPixelRatio( window.devicePixelRatio );
@@ -75,42 +78,41 @@
 				var pmremGenerator = new THREE.PMREMGenerator( renderer );
 				var pmremGenerator = new THREE.PMREMGenerator( renderer );
 				pmremGenerator.compileEquirectangularShader();
 				pmremGenerator.compileEquirectangularShader();
 
 
-				new RGBELoader()
+				var rgbeLoader = new RGBELoader()
 					.setDataType( THREE.UnsignedByteType )
 					.setDataType( THREE.UnsignedByteType )
-					.setPath( 'textures/equirectangular/' )
-					.load( 'venice_sunset_1k.hdr', function ( texture ) {
+					.setPath( 'textures/equirectangular/' );
 
 
-						var envMap = pmremGenerator.fromEquirectangular( texture ).texture;
+				var gltfLoader = new GLTFLoader().setPath( 'models/gltf/DamagedHelmet/glTF/' );
 
 
-						scene.background = envMap;
-						scene.environment = envMap;
+				var [ texture, gltf ] = await Promise.all( [
+					rgbeLoader.loadAsync( 'venice_sunset_1k.hdr' ),
+					gltfLoader.loadAsync( 'DamagedHelmet.gltf' ),
+				] );
 
 
-						texture.dispose();
-						pmremGenerator.dispose();
-
-						render();
+				// environment
 
 
-						// model
+				var envMap = pmremGenerator.fromEquirectangular( texture ).texture;
 
 
-						var loader = new GLTFLoader().setPath( 'models/gltf/DamagedHelmet/glTF/' );
-						loader.load( 'DamagedHelmet.gltf', function ( gltf ) {
+				scene.background = envMap;
+				scene.environment = envMap;
 
 
-							gltf.scene.traverse( function ( child ) {
+				texture.dispose();
+				pmremGenerator.dispose();
 
 
-								if ( child.isMesh ) {
+				// model
 
 
-									mesh = child;
-									scene.add( mesh );
+				gltf.scene.traverse( function ( child ) {
 
 
-								}
+					if ( child.isMesh ) {
 
 
-							} );
+						mesh = child;
+						scene.add( mesh );
 
 
-							render();
+					}
 
 
-						} );
+				} );
 
 
-					} );
+				render();
 
 
 				window.addEventListener( 'resize', onWindowResize, false );
 				window.addEventListener( 'resize', onWindowResize, false );
 
 

+ 2 - 0
src/loaders/Loader.d.ts

@@ -17,6 +17,8 @@ export class Loader {
 	parse(): void;
 	parse(): void;
 	*/
 	*/
 
 
+	loadAsync( url: string, onProgress?: ( event: ProgressEvent ) => void ): Promise<any>;
+
 	setCrossOrigin( crossOrigin: string ): this;
 	setCrossOrigin( crossOrigin: string ): this;
 	setPath( path: string ): this;
 	setPath( path: string ): this;
 	setResourcePath( resourcePath: string ): this;
 	setResourcePath( resourcePath: string ): this;

+ 10 - 0
src/loaders/Loader.js

@@ -18,6 +18,16 @@ Object.assign( Loader.prototype, {
 
 
 	load: function ( /* url, onLoad, onProgress, onError */ ) {},
 	load: function ( /* url, onLoad, onProgress, onError */ ) {},
 
 
+	loadAsync: function ( url, onProgress ) {
+
+		return new Promise( ( resolve, reject ) => {
+
+			this.load( url, resolve, onProgress, reject );
+
+		} );
+
+	},
+
 	parse: function ( /* data */ ) {},
 	parse: function ( /* data */ ) {},
 
 
 	setCrossOrigin: function ( crossOrigin ) {
 	setCrossOrigin: function ( crossOrigin ) {