Просмотр исходного кода

Renamed USDZLoader to USDLoader and created USDAParser and USDCParser files.

Mr.doob 7 месяцев назад
Родитель
Сommit
32c4f23e12

+ 5 - 4
editor/js/Loader.js

@@ -630,9 +630,9 @@ function Loader( editor ) {
 
 					const contents = event.target.result;
 
-					const { USDZLoader } = await import( 'three/addons/loaders/USDZLoader.js' );
+					const { USDLoader } = await import( 'three/addons/loaders/USDLoader.js' );
 
-					const group = new USDZLoader().parse( contents );
+					const group = new USDLoader().parse( contents );
 					group.name = filename;
 
 					editor.execute( new AddObjectCommand( editor, group ) );
@@ -644,6 +644,7 @@ function Loader( editor ) {
 
 			}
 
+			case 'usdc':
 			case 'usdz':
 
 			{
@@ -652,9 +653,9 @@ function Loader( editor ) {
 
 					const contents = event.target.result;
 
-					const { USDZLoader } = await import( 'three/addons/loaders/USDZLoader.js' );
+					const { USDLoader } = await import( 'three/addons/loaders/USDLoader.js' );
 
-					const group = new USDZLoader().parse( contents );
+					const group = new USDLoader().parse( contents );
 					group.name = filename;
 
 					editor.execute( new AddObjectCommand( editor, group ) );

+ 3 - 1
editor/sw.js

@@ -52,7 +52,9 @@ const assets = [
 	'../examples/jsm/loaders/SVGLoader.js',
 	'../examples/jsm/loaders/TGALoader.js',
 	'../examples/jsm/loaders/TDSLoader.js',
-	'../examples/jsm/loaders/USDZLoader.js',
+	'../examples/jsm/loaders/USDLoader.js',
+	'../examples/jsm/loaders/usd/USDAParser.js',
+	'../examples/jsm/loaders/usd/USDCParser.js',
 	'../examples/jsm/loaders/VOXLoader.js',
 	'../examples/jsm/loaders/VRMLLoader.js',
 	'../examples/jsm/loaders/VTKLoader.js',

+ 1 - 1
examples/jsm/Addons.js

@@ -117,7 +117,7 @@ export * from './loaders/TDSLoader.js';
 export * from './loaders/TGALoader.js';
 export * from './loaders/TIFFLoader.js';
 export * from './loaders/TTFLoader.js';
-export * from './loaders/USDZLoader.js';
+export * from './loaders/USDLoader.js';
 export * from './loaders/VOXLoader.js';
 export * from './loaders/VRMLLoader.js';
 export * from './loaders/VTKLoader.js';

+ 219 - 0
examples/jsm/loaders/USDLoader.js

@@ -0,0 +1,219 @@
+import {
+	FileLoader,
+	Loader
+} from 'three';
+
+import * as fflate from '../libs/fflate.module.js';
+import { USDAParser } from './usd/USDAParser.js';
+import { USDCParser } from './usd/USDCParser.js';
+
+/**
+ * A loader for the USDZ format.
+ *
+ * USDZ files that use USDC internally are not yet supported, only USDA.
+ *
+ * ```js
+ * const loader = new USDZLoader();
+ * const model = await loader.loadAsync( 'saeukkang.usdz' );
+ * scene.add( model );
+ * ```
+ *
+ * @augments Loader
+ * @three_import import { USDLoader } from 'three/addons/loaders/USDLoader.js';
+ */
+class USDLoader extends Loader {
+
+	/**
+	 * Constructs a new USDZ loader.
+	 *
+	 * @param {LoadingManager} [manager] - The loading manager.
+	 */
+	constructor( manager ) {
+
+		super( manager );
+
+	}
+
+	/**
+	 * Starts loading from the given URL and passes the loaded USDZ asset
+	 * to the `onLoad()` callback.
+	 *
+	 * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.
+	 * @param {function(Group)} onLoad - Executed when the loading process has been finished.
+	 * @param {onProgressCallback} onProgress - Executed while the loading is in progress.
+	 * @param {onErrorCallback} onError - Executed when errors occur.
+	 */
+	load( url, onLoad, onProgress, onError ) {
+
+		const scope = this;
+
+		const loader = new 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 );
+
+	}
+
+	/**
+	 * Parses the given USDZ data and returns the resulting group.
+	 *
+	 * @param {ArrayBuffer|string} buffer - The raw USDZ data as an array buffer.
+	 * @return {Group} The parsed asset as a group.
+	 */
+	parse( buffer ) {
+
+		const usda = new USDAParser();
+		const usdc = new USDCParser();
+
+		function parseAssets( zip ) {
+
+			const data = {};
+			const loader = new FileLoader();
+			loader.setResponseType( 'arraybuffer' );
+
+			for ( const filename in zip ) {
+
+				if ( filename.endsWith( 'png' ) ) {
+
+					const blob = new Blob( [ zip[ filename ] ], { type: 'image/png' } );
+					data[ filename ] = URL.createObjectURL( blob );
+
+				}
+
+				if ( filename.endsWith( 'usd' ) || filename.endsWith( 'usda' ) || filename.endsWith( 'usdc' ) ) {
+
+					if ( isCrateFile( zip[ filename ] ) ) {
+
+						data[ filename ] = usdc.parse( zip[ filename ].buffer, data );
+
+					} else {
+
+						const text = fflate.strFromU8( zip[ filename ] );
+						data[ filename ] = usda.parse( text, data );
+
+					}
+
+				}
+
+			}
+
+			return data;
+
+		}
+
+		function isCrateFile( buffer ) {
+
+			const crateHeader = new Uint8Array( [ 0x50, 0x58, 0x52, 0x2D, 0x55, 0x53, 0x44, 0x43 ] ); // PXR-USDC
+
+			if ( buffer.byteLength < crateHeader.length ) return false;
+
+			const view = new Uint8Array( buffer, 0, crateHeader.length );
+
+			for ( let i = 0; i < crateHeader.length; i ++ ) {
+
+				if ( view[ i ] !== crateHeader[ i ] ) return false;
+
+			}
+
+			return true;
+
+		}
+
+		function findUSD( zip ) {
+
+			if ( zip.length < 1 ) return undefined;
+
+			const firstFileName = Object.keys( zip )[ 0 ];
+			let isCrate = false;
+
+			// As per the USD specification, the first entry in the zip archive is used as the main file ("UsdStage").
+			// ASCII files can end in either .usda or .usd.
+			// See https://openusd.org/release/spec_usdz.html#layout
+			if ( firstFileName.endsWith( 'usda' ) ) return zip[ firstFileName ];
+
+			if ( firstFileName.endsWith( 'usdc' ) ) {
+
+				isCrate = true;
+
+			} else if ( firstFileName.endsWith( 'usd' ) ) {
+
+				// If this is not a crate file, we assume it is a plain USDA file.
+				if ( ! isCrateFile( zip[ firstFileName ] ) ) {
+
+					return zip[ firstFileName ];
+
+				} else {
+
+					isCrate = true;
+
+				}
+
+			}
+
+			if ( isCrate ) {
+
+				return zip[ firstFileName ];
+
+			}
+
+		}
+
+		// USDA
+
+		if ( typeof buffer === 'string' ) {
+
+			return usda.parse( buffer, {} );
+
+		}
+
+		// USDC
+
+		if ( isCrateFile( buffer ) ) {
+
+			return usdc.parse( buffer );
+
+		}
+
+		// USDZ
+
+		const zip = fflate.unzipSync( new Uint8Array( buffer ) );
+
+		const assets = parseAssets( zip );
+
+		// console.log( assets );
+
+		const file = findUSD( zip );
+
+		const text = fflate.strFromU8( file );
+
+		return usda.parse( text, assets );
+
+	}
+
+}
+
+export { USDLoader };

+ 1 - 226
examples/jsm/loaders/USDZLoader.js → examples/jsm/loaders/usd/USDAParser.js

@@ -2,10 +2,8 @@ import {
 	BufferAttribute,
 	BufferGeometry,
 	ClampToEdgeWrapping,
-	FileLoader,
 	Group,
 	NoColorSpace,
-	Loader,
 	Mesh,
 	MeshPhysicalMaterial,
 	MirroredRepeatWrapping,
@@ -16,8 +14,6 @@ import {
 	Vector2
 } from 'three';
 
-import * as fflate from '../libs/fflate.module.js';
-
 class USDAParser {
 
 	parse( text, assets ) {
@@ -734,225 +730,4 @@ class USDAParser {
 
 }
 
-class USDCParser {
-
-	parse( buffer ) {
-
-		// TODO
-
-		return new Group();
-
-	}
-
-}
-
-/**
- * A loader for the USDZ format.
- *
- * USDZ files that use USDC internally are not yet supported, only USDA.
- *
- * ```js
- * const loader = new USDZLoader();
- * const model = await loader.loadAsync( 'saeukkang.usdz' );
- * scene.add( model );
- * ```
- *
- * @augments Loader
- * @three_import import { USDZLoader } from 'three/addons/loaders/USDZLoader.js';
- */
-class USDZLoader extends Loader {
-
-	/**
-	 * Constructs a new USDZ loader.
-	 *
-	 * @param {LoadingManager} [manager] - The loading manager.
-	 */
-	constructor( manager ) {
-
-		super( manager );
-
-	}
-
-	/**
-	 * Starts loading from the given URL and passes the loaded USDZ asset
-	 * to the `onLoad()` callback.
-	 *
-	 * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.
-	 * @param {function(Group)} onLoad - Executed when the loading process has been finished.
-	 * @param {onProgressCallback} onProgress - Executed while the loading is in progress.
-	 * @param {onErrorCallback} onError - Executed when errors occur.
-	 */
-	load( url, onLoad, onProgress, onError ) {
-
-		const scope = this;
-
-		const loader = new 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 );
-
-	}
-
-	/**
-	 * Parses the given USDZ data and returns the resulting group.
-	 *
-	 * @param {ArrayBuffer|string} buffer - The raw USDZ data as an array buffer.
-	 * @return {Group} The parsed asset as a group.
-	 */
-	parse( buffer ) {
-
-		const usda = new USDAParser();
-		const usdc = new USDCParser();
-
-		function parseAssets( zip ) {
-
-			const data = {};
-			const loader = new FileLoader();
-			loader.setResponseType( 'arraybuffer' );
-
-			for ( const filename in zip ) {
-
-				if ( filename.endsWith( 'png' ) ) {
-
-					const blob = new Blob( [ zip[ filename ] ], { type: 'image/png' } );
-					data[ filename ] = URL.createObjectURL( blob );
-
-				}
-
-				if ( filename.endsWith( 'usd' ) || filename.endsWith( 'usda' ) || filename.endsWith( 'usdc' ) ) {
-
-					if ( isCrateFile( zip[ filename ] ) ) {
-
-						data[ filename ] = usdc.parse( zip[ filename ].buffer, data );
-
-					} else {
-
-						const text = fflate.strFromU8( zip[ filename ] );
-						data[ filename ] = usda.parse( text, data );
-
-					}
-
-				}
-
-			}
-
-			return data;
-
-		}
-
-		function isCrateFile( buffer ) {
-
-			const crateHeader = new Uint8Array( [ 0x50, 0x58, 0x52, 0x2D, 0x55, 0x53, 0x44, 0x43 ] ); // PXR-USDC
-
-			if ( buffer.byteLength < crateHeader.length ) return false;
-
-			const view = new Uint8Array( buffer, 0, crateHeader.length );
-
-			for ( let i = 0; i < crateHeader.length; i ++ ) {
-
-				if ( view[ i ] !== crateHeader[ i ] ) return false;
-
-			}
-
-			return true;
-
-		}
-
-		function findUSD( zip ) {
-
-			if ( zip.length < 1 ) return undefined;
-
-			const firstFileName = Object.keys( zip )[ 0 ];
-			let isCrate = false;
-
-			// As per the USD specification, the first entry in the zip archive is used as the main file ("UsdStage").
-			// ASCII files can end in either .usda or .usd.
-			// See https://openusd.org/release/spec_usdz.html#layout
-			if ( firstFileName.endsWith( 'usda' ) ) return zip[ firstFileName ];
-
-			if ( firstFileName.endsWith( 'usdc' ) ) {
-
-				isCrate = true;
-
-			} else if ( firstFileName.endsWith( 'usd' ) ) {
-
-				// If this is not a crate file, we assume it is a plain USDA file.
-				if ( ! isCrateFile( zip[ firstFileName ] ) ) {
-
-					return zip[ firstFileName ];
-
-				} else {
-
-					isCrate = true;
-
-				}
-
-			}
-
-			if ( isCrate ) {
-
-				return zip[ firstFileName ];
-
-			}
-
-		}
-
-		// USDA
-
-		if ( typeof buffer === 'string' ) {
-
-			return usda.parse( buffer, {} );
-
-		}
-
-		// USDC
-
-		if ( isCrateFile( buffer ) ) {
-
-			return usdc.parse( buffer );
-
-		}
-
-		// USDZ
-
-		const zip = fflate.unzipSync( new Uint8Array( buffer ) );
-
-		const assets = parseAssets( zip );
-
-		// console.log( assets );
-
-		const file = findUSD( zip );
-
-		const text = fflate.strFromU8( file );
-
-		return usda.parse( text, assets );
-
-	}
-
-}
-
-export { USDZLoader };
+export { USDAParser };

+ 13 - 0
examples/jsm/loaders/usd/USDCParser.js

@@ -0,0 +1,13 @@
+class USDCParser {
+
+	parse( buffer ) {
+
+		// TODO
+
+		return new Group();
+
+	}
+
+}
+
+export { USDCParser };

+ 2 - 2
examples/webgl_loader_usdz.html

@@ -35,7 +35,7 @@
 
 			import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
 			import { RGBELoader } from 'three/addons/loaders/RGBELoader.js';
-			import { USDZLoader } from 'three/addons/loaders/USDZLoader.js';
+			import { USDLoader } from 'three/addons/loaders/USDLoader.js';
 
 			let camera, scene, renderer;
 
@@ -51,7 +51,7 @@
 				const rgbeLoader = new RGBELoader()
 					.setPath( 'textures/equirectangular/' );
 
-				const usdzLoader = new USDZLoader()
+				const usdzLoader = new USDLoader()
 					.setPath( 'models/usdz/' );
 
 				const [ texture, model ] = await Promise.all( [

粤ICP备19079148号