|
@@ -2912,14 +2912,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;
|
|
|
|
|
@@ -2965,25 +2962,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 ) {
|
|
|
|
|
@@ -3067,11 +3097,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 = [];
|
|
@@ -3104,7 +3132,7 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
mesh.bind( new THREE.Skeleton( bones, boneInverses ), mesh.matrixWorld );
|
|
|
|
|
|
- }
|
|
|
+ } );
|
|
|
|
|
|
return node;
|
|
|
|