diff --git a/examples/js/loaders/GLTFLoader.js b/examples/js/loaders/GLTFLoader.js index 0bb40fe18e44149da317c58da8569682f8a5338e..85a5403563cb49f9b4e7246e7df0c716cb6ccb1e 100644 --- a/examples/js/loaders/GLTFLoader.js +++ b/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;