Browse Source

Merge pull request #16890 from vyv03354/fix14875

GLTFLoader: Support multi-type nodes
Mr.doob 6 years ago
parent
commit
4db07eafc5
1 changed files with 46 additions and 18 deletions
  1. 46 18
      examples/js/loaders/GLTFLoader.js

+ 46 - 18
examples/js/loaders/GLTFLoader.js

@@ -2914,14 +2914,11 @@ THREE.GLTFLoader = ( function () {
 
 		return ( function () {
 
-			// .isBone isn't in glTF spec. See .markDefs
-			if ( nodeDef.isBone === true ) {
-
-				return Promise.resolve( new THREE.Bone() );
+			var pending = [];
 
-			} else if ( nodeDef.mesh !== undefined ) {
+			if ( nodeDef.mesh !== undefined ) {
 
-				return parser.getDependency( 'mesh', nodeDef.mesh ).then( function ( mesh ) {
+				pending.push( parser.getDependency( 'mesh', nodeDef.mesh ).then( function ( mesh ) {
 
 					var node;
 
@@ -2967,25 +2964,58 @@ THREE.GLTFLoader = ( function () {
 
 					return node;
 
-				} );
+				} ) );
+
+			}
 
-			} else if ( nodeDef.camera !== undefined ) {
+			if ( nodeDef.camera !== undefined ) {
 
-				return parser.getDependency( 'camera', nodeDef.camera );
+				pending.push( parser.getDependency( 'camera', nodeDef.camera ) );
 
-			} else if ( nodeDef.extensions
+			}
+
+			if ( nodeDef.extensions
 				&& nodeDef.extensions[ EXTENSIONS.KHR_LIGHTS_PUNCTUAL ]
 				&& nodeDef.extensions[ EXTENSIONS.KHR_LIGHTS_PUNCTUAL ].light !== undefined ) {
 
-				return parser.getDependency( 'light', nodeDef.extensions[ EXTENSIONS.KHR_LIGHTS_PUNCTUAL ].light );
+				pending.push( parser.getDependency( 'light', nodeDef.extensions[ EXTENSIONS.KHR_LIGHTS_PUNCTUAL ].light ) );
+
+			}
+
+			return Promise.all( pending );
+
+		}() ).then( function ( objects ) {
+
+			var node;
+
+			// .isBone isn't in glTF spec. See .markDefs
+			if ( nodeDef.isBone === true ) {
+
+				node = new THREE.Bone();
+
+			} else if ( objects.length > 1 ) {
+
+				node = new THREE.Group();
+
+			} else if ( objects.length === 1 ) {
+
+				node = objects[ 0 ];
 
 			} else {
 
-				return Promise.resolve( new THREE.Object3D() );
+				node = new THREE.Object3D();
 
 			}
 
-		}() ).then( function ( node ) {
+			if ( node !== objects[ 0 ] ) {
+
+				for ( var i = 0, il = objects.length; i < il; i ++ ) {
+
+					node.add( objects[ i ] );
+
+				}
+
+			}
 
 			if ( nodeDef.name !== undefined ) {
 
@@ -3069,11 +3099,9 @@ THREE.GLTFLoader = ( function () {
 
 				} ).then( function ( jointNodes ) {
 
-					var meshes = node.isGroup === true ? node.children : [ node ];
-
-					for ( var i = 0, il = meshes.length; i < il; i ++ ) {
+					node.traverse( function ( mesh ) {
 
-						var mesh = meshes[ i ];
+						if ( ! mesh.isMesh ) return;
 
 						var bones = [];
 						var boneInverses = [];
@@ -3106,7 +3134,7 @@ THREE.GLTFLoader = ( function () {
 
 						mesh.bind( new THREE.Skeleton( bones, boneInverses ), mesh.matrixWorld );
 
-					}
+					} );
 
 					return node;