Browse Source

Editor: Import loaders dynamically.

Mr.doob 4 years ago
parent
commit
fa7b40c27c
1 changed files with 69 additions and 39 deletions
  1. 69 39
      editor/js/Loader.js

+ 69 - 39
editor/js/Loader.js

@@ -1,24 +1,5 @@
 import * as THREE from '../../build/three.module.js';
 
-import { Rhino3dmLoader } from '../../examples/jsm/loaders/3DMLoader.js';
-import { ThreeMFLoader } from '../../examples/jsm/loaders/3MFLoader.js';
-import { AMFLoader } from '../../examples/jsm/loaders/AMFLoader.js';
-import { ColladaLoader } from '../../examples/jsm/loaders/ColladaLoader.js';
-import { DRACOLoader } from '../../examples/jsm/loaders/DRACOLoader.js';
-import { FBXLoader } from '../../examples/jsm/loaders/FBXLoader.js';
-import { GLTFLoader } from '../../examples/jsm/loaders/GLTFLoader.js';
-import { KMZLoader } from '../../examples/jsm/loaders/KMZLoader.js';
-import { MD2Loader } from '../../examples/jsm/loaders/MD2Loader.js';
-import { MTLLoader } from '../../examples/jsm/loaders/MTLLoader.js';
-import { OBJLoader } from '../../examples/jsm/loaders/OBJLoader.js';
-import { PLYLoader } from '../../examples/jsm/loaders/PLYLoader.js';
-import { STLLoader } from '../../examples/jsm/loaders/STLLoader.js';
-import { SVGLoader } from '../../examples/jsm/loaders/SVGLoader.js';
-import { TDSLoader } from '../../examples/jsm/loaders/TDSLoader.js';
-import { VTKLoader } from '../../examples/jsm/loaders/VTKLoader.js';
-import { VRMLLoader } from '../../examples/jsm/loaders/VRMLLoader.js';
-import { XYZLoader } from '../../examples/jsm/loaders/XYZLoader.js';
-
 import { TGALoader } from '../../examples/jsm/loaders/TGALoader.js';
 
 import { AddObjectCommand } from './commands/AddObjectCommand.js';
@@ -100,10 +81,12 @@ function Loader( editor ) {
 
 			case '3dm':
 
-				reader.addEventListener( 'load', function ( event ) {
+				reader.addEventListener( 'load', async function ( event ) {
 
 					var contents = event.target.result;
 
+					var { Rhino3dmLoader } = await import( '../../examples/jsm/loaders/3DMLoader.js' );
+
 					var loader = new Rhino3dmLoader();
 					loader.setLibraryPath( '../examples/jsm/libs/rhino3dm/' );
 					loader.parse( contents, function ( object ) {
@@ -119,7 +102,9 @@ function Loader( editor ) {
 
 			case '3ds':
 
-				reader.addEventListener( 'load', function ( event ) {
+				reader.addEventListener( 'load', async function ( event ) {
+
+					var { TDSLoader } = await import( '../../examples/jsm/loaders/TDSLoader.js' );
 
 					var loader = new TDSLoader();
 					var object = loader.parse( event.target.result );
@@ -133,7 +118,9 @@ function Loader( editor ) {
 
 			case '3mf':
 
-				reader.addEventListener( 'load', function ( event ) {
+				reader.addEventListener( 'load', async function ( event ) {
+
+					var { ThreeMFLoader } = await import( '../../examples/jsm/loaders/3MFLoader.js' );
 
 					var loader = new ThreeMFLoader();
 					var object = loader.parse( event.target.result );
@@ -147,7 +134,9 @@ function Loader( editor ) {
 
 			case 'amf':
 
-				reader.addEventListener( 'load', function ( event ) {
+				reader.addEventListener( 'load', async function ( event ) {
+
+					var { AMFLoader } = await import( '../../examples/jsm/loaders/AMFLoader.js' );
 
 					var loader = new AMFLoader();
 					var amfobject = loader.parse( event.target.result );
@@ -161,10 +150,12 @@ function Loader( editor ) {
 
 			case 'dae':
 
-				reader.addEventListener( 'load', function ( event ) {
+				reader.addEventListener( 'load', async function ( event ) {
 
 					var contents = event.target.result;
 
+					var { ColladaLoader } = await import( '../../examples/jsm/loaders/ColladaLoader.js' );
+
 					var loader = new ColladaLoader( manager );
 					var collada = loader.parse( contents );
 
@@ -179,10 +170,12 @@ function Loader( editor ) {
 
 			case 'drc':
 
-				reader.addEventListener( 'load', function ( event ) {
+				reader.addEventListener( 'load', async function ( event ) {
 
 					var contents = event.target.result;
 
+					var { DRACOLoader } = await import( '../../examples/jsm/loaders/DRACOLoader.js' );
+
 					var loader = new DRACOLoader();
 					loader.setDecoderPath( '../examples/js/libs/draco/' );
 					loader.decodeDracoFile( contents, function ( geometry ) {
@@ -218,10 +211,12 @@ function Loader( editor ) {
 
 			case 'fbx':
 
-				reader.addEventListener( 'load', function ( event ) {
+				reader.addEventListener( 'load', async function ( event ) {
 
 					var contents = event.target.result;
 
+					var { FBXLoader } = await import( '../../examples/jsm/loaders/FBXLoader.js' );
+
 					var loader = new FBXLoader( manager );
 					var object = loader.parse( contents );
 
@@ -234,10 +229,13 @@ function Loader( editor ) {
 
 			case 'glb':
 
-				reader.addEventListener( 'load', function ( event ) {
+				reader.addEventListener( 'load', async function ( event ) {
 
 					var contents = event.target.result;
 
+					var { DRACOLoader } = await import( '../../examples/jsm/loaders/DRACOLoader.js' );
+					var { GLTFLoader } = await import( '../../examples/jsm/loaders/GLTFLoader.js' );
+
 					var dracoLoader = new DRACOLoader();
 					dracoLoader.setDecoderPath( '../examples/js/libs/draco/gltf/' );
 
@@ -260,7 +258,7 @@ function Loader( editor ) {
 
 			case 'gltf':
 
-				reader.addEventListener( 'load', function ( event ) {
+				reader.addEventListener( 'load', async function ( event ) {
 
 					var contents = event.target.result;
 
@@ -272,6 +270,9 @@ function Loader( editor ) {
 
 					} else {
 
+						var { DRACOLoader } = await import( '../../examples/jsm/loaders/DRACOLoader.js' );
+						var { GLTFLoader } = await import( '../../examples/jsm/loaders/GLTFLoader.js' );
+
 						var dracoLoader = new DRACOLoader();
 						dracoLoader.setDecoderPath( '../examples/js/libs/draco/gltf/' );
 
@@ -354,7 +355,9 @@ function Loader( editor ) {
 
 			case 'kmz':
 
-				reader.addEventListener( 'load', function ( event ) {
+				reader.addEventListener( 'load', async function ( event ) {
+
+					var { KMZLoader } = await import( '../../examples/jsm/loaders/KMZLoader.js' );
 
 					var loader = new KMZLoader();
 					var collada = loader.parse( event.target.result );
@@ -370,10 +373,12 @@ function Loader( editor ) {
 
 			case 'md2':
 
-				reader.addEventListener( 'load', function ( event ) {
+				reader.addEventListener( 'load', async function ( event ) {
 
 					var contents = event.target.result;
 
+					var { MD2Loader } = await import( '../../examples/jsm/loaders/MD2Loader.js' );
+
 					var geometry = new MD2Loader().parse( contents );
 					var material = new THREE.MeshStandardMaterial( {
 						morphTargets: true,
@@ -394,10 +399,12 @@ function Loader( editor ) {
 
 			case 'obj':
 
-				reader.addEventListener( 'load', function ( event ) {
+				reader.addEventListener( 'load', async function ( event ) {
 
 					var contents = event.target.result;
 
+					var { OBJLoader } = await import( '../../examples/jsm/loaders/OBJLoader.js' );
+
 					var object = new OBJLoader().parse( contents );
 					object.name = filename;
 
@@ -410,10 +417,12 @@ function Loader( editor ) {
 
 			case 'ply':
 
-				reader.addEventListener( 'load', function ( event ) {
+				reader.addEventListener( 'load', async function ( event ) {
 
 					var contents = event.target.result;
 
+					var { PLYLoader } = await import( '../../examples/jsm/loaders/PLYLoader.js' );
+
 					var geometry = new PLYLoader().parse( contents );
 					geometry.sourceType = "ply";
 					geometry.sourceFile = file.name;
@@ -432,10 +441,12 @@ function Loader( editor ) {
 
 			case 'stl':
 
-				reader.addEventListener( 'load', function ( event ) {
+				reader.addEventListener( 'load', async function ( event ) {
 
 					var contents = event.target.result;
 
+					var { STLLoader } = await import( '../../examples/jsm/loaders/STLLoader.js' );
+
 					var geometry = new STLLoader().parse( contents );
 					geometry.sourceType = "stl";
 					geometry.sourceFile = file.name;
@@ -463,10 +474,12 @@ function Loader( editor ) {
 
 			case 'svg':
 
-				reader.addEventListener( 'load', function ( event ) {
+				reader.addEventListener( 'load', async function ( event ) {
 
 					var contents = event.target.result;
 
+					var { SVGLoader } = await import( '../../examples/jsm/loaders/SVGLoader.js' );
+
 					var loader = new SVGLoader();
 					var paths = loader.parse( contents ).paths;
 
@@ -509,10 +522,12 @@ function Loader( editor ) {
 
 			case 'vtk':
 
-				reader.addEventListener( 'load', function ( event ) {
+				reader.addEventListener( 'load', async function ( event ) {
 
 					var contents = event.target.result;
 
+					var { VTKLoader } = await import( '../../examples/jsm/loaders/VTKLoader.js' );
+
 					var geometry = new VTKLoader().parse( contents );
 					geometry.sourceType = "vtk";
 					geometry.sourceFile = file.name;
@@ -531,10 +546,12 @@ function Loader( editor ) {
 
 			case 'wrl':
 
-				reader.addEventListener( 'load', function ( event ) {
+				reader.addEventListener( 'load', async function ( event ) {
 
 					var contents = event.target.result;
 
+					var { VRMLLoader } = await import( '../../examples/jsm/loaders/VRMLLoader.js' );
+
 					var result = new VRMLLoader().parse( contents );
 
 					editor.execute( new SetSceneCommand( editor, result ) );
@@ -546,10 +563,12 @@ function Loader( editor ) {
 
 			case 'xyz':
 
-				reader.addEventListener( 'load', function ( event ) {
+				reader.addEventListener( 'load', async function ( event ) {
 
 					var contents = event.target.result;
 
+					var { XYZLoader } = await import( '../../examples/jsm/loaders/XYZLoader.js' );
+
 					var geometry = new XYZLoader().parse( contents );
 
 					var material = new THREE.PointsMaterial();
@@ -657,7 +676,7 @@ function Loader( editor ) {
 
 	}
 
-	function handleZIP( contents ) {
+	async function handleZIP( contents ) {
 
 		var zip = new JSZip( contents );
 
@@ -665,6 +684,9 @@ function Loader( editor ) {
 
 		if ( zip.files[ 'model.obj' ] && zip.files[ 'materials.mtl' ] ) {
 
+			var { MTLLoader } = await import( '../../examples/jsm/loaders/MTLLoader.js' );
+			var { OBJLoader } = await import( '../../examples/jsm/loaders/OBJLoader.js' );
+
 			var materials = new MTLLoader().parse( zip.file( 'materials.mtl' ).asText() );
 			var object = new OBJLoader().setMaterials( materials ).parse( zip.file( 'model.obj' ).asText() );
 			editor.execute( new AddObjectCommand( editor, object ) );
@@ -673,7 +695,7 @@ function Loader( editor ) {
 
 		//
 
-		zip.filter( function ( path, file ) {
+		zip.filter( async function ( path, file ) {
 
 			var manager = new THREE.LoadingManager();
 			manager.setURLModifier( function ( url ) {
@@ -699,6 +721,8 @@ function Loader( editor ) {
 
 				case 'fbx':
 
+					var { FBXLoader } = await import( '../../examples/jsm/loaders/FBXLoader.js' );
+
 					var loader = new FBXLoader( manager );
 					var object = loader.parse( file.asArrayBuffer() );
 
@@ -708,6 +732,9 @@ function Loader( editor ) {
 
 				case 'glb':
 
+					var { DRACOLoader } = await import( '../../examples/jsm/loaders/DRACOLoader.js' );
+					var { GLTFLoader } = await import( '../../examples/jsm/loaders/GLTFLoader.js' );
+
 					var dracoLoader = new DRACOLoader();
 					dracoLoader.setDecoderPath( '../examples/js/libs/draco/gltf/' );
 
@@ -727,6 +754,9 @@ function Loader( editor ) {
 
 				case 'gltf':
 
+					var { DRACOLoader } = await import( '../../examples/jsm/loaders/DRACOLoader.js' );
+					var { GLTFLoader } = await import( '../../examples/jsm/loaders/GLTFLoader.js' );
+
 					var dracoLoader = new DRACOLoader();
 					dracoLoader.setDecoderPath( '../examples/js/libs/draco/gltf/' );