|
@@ -25,6 +25,7 @@ THREE.GLTFLoader = ( function () {
|
|
|
return new GLTFMaterialsClearcoatExtension( parser );
|
|
|
|
|
|
} );
|
|
|
+
|
|
|
this.register( function ( parser ) {
|
|
|
|
|
|
return new GLTFTextureBasisUExtension( parser );
|
|
@@ -37,6 +38,12 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
} );
|
|
|
|
|
|
+ this.register( function ( parser ) {
|
|
|
+
|
|
|
+ return new GLTFLightsExtension( parser );
|
|
|
+
|
|
|
+ } );
|
|
|
+
|
|
|
}
|
|
|
|
|
|
GLTFLoader.prototype = Object.assign( Object.create( THREE.Loader.prototype ), {
|
|
@@ -243,10 +250,6 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
switch ( extensionName ) {
|
|
|
|
|
|
- case EXTENSIONS.KHR_LIGHTS_PUNCTUAL:
|
|
|
- extensions[ extensionName ] = new GLTFLightsExtension( json );
|
|
|
- break;
|
|
|
-
|
|
|
case EXTENSIONS.KHR_MATERIALS_UNLIT:
|
|
|
extensions[ extensionName ] = new GLTFMaterialsUnlitExtension();
|
|
|
break;
|
|
@@ -371,21 +374,53 @@ THREE.GLTFLoader = ( function () {
|
|
|
*
|
|
|
* Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual
|
|
|
*/
|
|
|
- function GLTFLightsExtension( json ) {
|
|
|
+ function GLTFLightsExtension( parser ) {
|
|
|
|
|
|
+ this.parser = parser;
|
|
|
this.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL;
|
|
|
|
|
|
- var extension = ( json.extensions && json.extensions[ EXTENSIONS.KHR_LIGHTS_PUNCTUAL ] ) || {};
|
|
|
- this.lightDefs = extension.lights || [];
|
|
|
+ // Object3D instance caches
|
|
|
+ this.cache = { refs: {}, uses: {} };
|
|
|
|
|
|
}
|
|
|
|
|
|
- GLTFLightsExtension.prototype.loadLight = function ( lightIndex ) {
|
|
|
+ GLTFLightsExtension.prototype._markDefs = function () {
|
|
|
+
|
|
|
+ var parser = this.parser;
|
|
|
+ var nodeDefs = this.parser.json.nodes || [];
|
|
|
+
|
|
|
+ for ( var nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {
|
|
|
+
|
|
|
+ var nodeDef = nodeDefs[ nodeIndex ];
|
|
|
|
|
|
- var lightDef = this.lightDefs[ lightIndex ];
|
|
|
+ if ( nodeDef.extensions
|
|
|
+ && nodeDef.extensions[ this.name ]
|
|
|
+ && nodeDef.extensions[ this.name ].light !== undefined ) {
|
|
|
+
|
|
|
+ parser._addNodeRef( this.cache, nodeDef.extensions[ this.name ].light );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ };
|
|
|
+
|
|
|
+ GLTFLightsExtension.prototype._loadLight = function ( lightIndex ) {
|
|
|
+
|
|
|
+ var parser = this.parser;
|
|
|
+ var cacheKey = 'light:' + lightIndex;
|
|
|
+ var dependency = parser.cache.get( cacheKey );
|
|
|
+
|
|
|
+ if ( dependency ) return dependency;
|
|
|
+
|
|
|
+ var json = parser.json;
|
|
|
+ var extensions = ( json.extensions && json.extensions[ this.name ] ) || {};
|
|
|
+ var lightDefs = extensions.lights || [];
|
|
|
+ var lightDef = lightDefs[ lightIndex ];
|
|
|
var lightNode;
|
|
|
|
|
|
var color = new THREE.Color( 0xffffff );
|
|
|
+
|
|
|
if ( lightDef.color !== undefined ) color.fromArray( lightDef.color );
|
|
|
|
|
|
var range = lightDef.range !== undefined ? lightDef.range : 0;
|
|
@@ -431,7 +466,30 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
lightNode.name = lightDef.name || ( 'light_' + lightIndex );
|
|
|
|
|
|
- return Promise.resolve( lightNode );
|
|
|
+ dependency = Promise.resolve( lightNode );
|
|
|
+
|
|
|
+ parser.cache.add( cacheKey, dependency );
|
|
|
+
|
|
|
+ return dependency;
|
|
|
+
|
|
|
+ };
|
|
|
+
|
|
|
+ GLTFLightsExtension.prototype.createNode = function ( nodeIndex ) {
|
|
|
+
|
|
|
+ var self = this;
|
|
|
+ var parser = this.parser;
|
|
|
+ var json = parser.json;
|
|
|
+ var nodeDef = json.nodes[ nodeIndex ];
|
|
|
+ var lightDef = ( nodeDef.extensions && nodeDef.extensions[ this.name ] ) || {};
|
|
|
+ var lightIndex = lightDef.light;
|
|
|
+
|
|
|
+ if ( lightIndex === undefined ) return null;
|
|
|
+
|
|
|
+ return this._loadLight( lightIndex ).then( function ( light ) {
|
|
|
+
|
|
|
+ return parser._getNodeRef( self.cache, lightIndex, light );
|
|
|
+
|
|
|
+ } );
|
|
|
|
|
|
};
|
|
|
|
|
@@ -1634,7 +1692,11 @@ THREE.GLTFLoader = ( function () {
|
|
|
this.cache.removeAll();
|
|
|
|
|
|
// Mark the special nodes/meshes in json for efficient parse
|
|
|
- this._markDefs();
|
|
|
+ this._invokeAll( function ( ext ) {
|
|
|
+
|
|
|
+ return ext._markDefs && ext._markDefs();
|
|
|
+
|
|
|
+ } );
|
|
|
|
|
|
Promise.all( [
|
|
|
|
|
@@ -1714,14 +1776,6 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
}
|
|
|
|
|
|
- if ( nodeDef.extensions
|
|
|
- && nodeDef.extensions[ EXTENSIONS.KHR_LIGHTS_PUNCTUAL ]
|
|
|
- && nodeDef.extensions[ EXTENSIONS.KHR_LIGHTS_PUNCTUAL ].light !== undefined ) {
|
|
|
-
|
|
|
- this._addNodeRef( this.lightCache, nodeDef.extensions[ EXTENSIONS.KHR_LIGHTS_PUNCTUAL ].light );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
}
|
|
|
|
|
|
};
|
|
@@ -1786,11 +1840,13 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
for ( var i = 0; i < extensions.length; i ++ ) {
|
|
|
|
|
|
- pending.push( func( extensions[ i ] ) );
|
|
|
+ var result = func( extensions[ i ] );
|
|
|
+
|
|
|
+ if ( result ) pending.push( result );
|
|
|
|
|
|
}
|
|
|
|
|
|
- return Promise.all( pending );
|
|
|
+ return pending;
|
|
|
|
|
|
};
|
|
|
|
|
@@ -1869,10 +1925,6 @@ THREE.GLTFLoader = ( function () {
|
|
|
dependency = this.loadCamera( index );
|
|
|
break;
|
|
|
|
|
|
- case 'light':
|
|
|
- dependency = this.extensions[ EXTENSIONS.KHR_LIGHTS_PUNCTUAL ].loadLight( index );
|
|
|
- break;
|
|
|
-
|
|
|
default:
|
|
|
throw new Error( 'Unknown type: ' + type );
|
|
|
|
|
@@ -2492,11 +2544,11 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
} );
|
|
|
|
|
|
- pending.push( this._invokeAll( function ( ext ) {
|
|
|
+ pending.push( Promise.all( this._invokeAll( function ( ext ) {
|
|
|
|
|
|
return ext.extendMaterialParams && ext.extendMaterialParams( materialIndex, materialParams );
|
|
|
|
|
|
- } ) );
|
|
|
+ } ) ) );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -3365,19 +3417,15 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
}
|
|
|
|
|
|
- if ( nodeDef.extensions
|
|
|
- && nodeDef.extensions[ EXTENSIONS.KHR_LIGHTS_PUNCTUAL ]
|
|
|
- && nodeDef.extensions[ EXTENSIONS.KHR_LIGHTS_PUNCTUAL ].light !== undefined ) {
|
|
|
-
|
|
|
- var lightIndex = nodeDef.extensions[ EXTENSIONS.KHR_LIGHTS_PUNCTUAL ].light;
|
|
|
+ parser._invokeAll( function ( ext ) {
|
|
|
|
|
|
- pending.push( parser.getDependency( 'light', lightIndex ).then( function ( light ) {
|
|
|
+ return ext.createNode && ext.createNode( nodeIndex );
|
|
|
|
|
|
- return parser._getNodeRef( parser.lightCache, lightIndex, light );
|
|
|
+ } ).forEach( function ( promise ) {
|
|
|
|
|
|
- } ) );
|
|
|
+ pending.push( promise );
|
|
|
|
|
|
- }
|
|
|
+ } );
|
|
|
|
|
|
return Promise.all( pending );
|
|
|
|