|
@@ -5,6 +5,7 @@ console.warn( "THREE.GLTFLoader: As part of the transition to ES6 Modules, the f
|
|
|
* @author Tony Parisi / http://www.tonyparisi.com/
|
|
|
* @author Takahiro / https://github.com/takahirox
|
|
|
* @author Don McCurdy / https://www.donmccurdy.com
|
|
|
+ * @author Arseny Kapoulkine / https://github.com/zeux
|
|
|
*/
|
|
|
|
|
|
THREE.GLTFLoader = ( function () {
|
|
@@ -15,6 +16,7 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
this.dracoLoader = null;
|
|
|
this.ddsLoader = null;
|
|
|
+ this.ktx2Loader = null;
|
|
|
|
|
|
this.pluginCallbacks = [];
|
|
|
this.register( function ( parser ) {
|
|
@@ -22,6 +24,11 @@ THREE.GLTFLoader = ( function () {
|
|
|
return new GLTFMaterialsClearcoatExtension( parser );
|
|
|
|
|
|
} );
|
|
|
+ this.register( function ( parser ) {
|
|
|
+
|
|
|
+ return new GLTFTextureBasisUExtension( parser );
|
|
|
+
|
|
|
+ } );
|
|
|
|
|
|
}
|
|
|
|
|
@@ -119,6 +126,13 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
},
|
|
|
|
|
|
+ setKTX2Loader: function ( ktx2Loader ) {
|
|
|
+
|
|
|
+ this.ktx2Loader = ktx2Loader;
|
|
|
+ return this;
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
register: function ( callback ) {
|
|
|
|
|
|
if ( this.pluginCallbacks.indexOf( callback ) === - 1 ) {
|
|
@@ -193,7 +207,8 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
path: path || this.resourcePath || '',
|
|
|
crossOrigin: this.crossOrigin,
|
|
|
- manager: this.manager
|
|
|
+ manager: this.manager,
|
|
|
+ ktx2Loader: this.ktx2Loader
|
|
|
|
|
|
} );
|
|
|
|
|
@@ -318,6 +333,7 @@ THREE.GLTFLoader = ( function () {
|
|
|
KHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat',
|
|
|
KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: 'KHR_materials_pbrSpecularGlossiness',
|
|
|
KHR_MATERIALS_UNLIT: 'KHR_materials_unlit',
|
|
|
+ KHR_TEXTURE_BASISU: 'KHR_texture_basisu',
|
|
|
KHR_TEXTURE_TRANSFORM: 'KHR_texture_transform',
|
|
|
KHR_MESH_QUANTIZATION: 'KHR_mesh_quantization',
|
|
|
MSFT_TEXTURE_DDS: 'MSFT_texture_dds'
|
|
@@ -535,6 +551,46 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
};
|
|
|
|
|
|
+ /**
|
|
|
+ * BasisU Texture Extension
|
|
|
+ *
|
|
|
+ * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu
|
|
|
+ * (draft PR https://github.com/KhronosGroup/glTF/pull/1751)
|
|
|
+ */
|
|
|
+ function GLTFTextureBasisUExtension( parser ) {
|
|
|
+
|
|
|
+ this.parser = parser;
|
|
|
+ this.name = EXTENSIONS.KHR_TEXTURE_BASISU;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ GLTFTextureBasisUExtension.prototype.loadTexture = function ( textureIndex ) {
|
|
|
+
|
|
|
+ var parser = this.parser;
|
|
|
+ var json = parser.json;
|
|
|
+
|
|
|
+ var textureDef = json.textures[ textureIndex ];
|
|
|
+
|
|
|
+ if ( ! textureDef.extensions || ! textureDef.extensions[ this.name ] ) {
|
|
|
+
|
|
|
+ return null;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ var extension = textureDef.extensions[ this.name ];
|
|
|
+ var source = json.images[ extension.source ];
|
|
|
+ var loader = parser.options.ktx2Loader;
|
|
|
+
|
|
|
+ if ( !loader ) {
|
|
|
+
|
|
|
+ throw new Error( 'THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures' );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return parser.loadTextureImage( textureIndex, source, loader );
|
|
|
+
|
|
|
+ };
|
|
|
+
|
|
|
/* BINARY EXTENSION */
|
|
|
var BINARY_EXTENSION_HEADER_MAGIC = 'glTF';
|
|
|
var BINARY_EXTENSION_HEADER_LENGTH = 12;
|
|
@@ -1736,7 +1792,11 @@ THREE.GLTFLoader = ( function () {
|
|
|
break;
|
|
|
|
|
|
case 'texture':
|
|
|
- dependency = this.loadTexture( index );
|
|
|
+ dependency = this._invokeOne( function ( ext ) {
|
|
|
+
|
|
|
+ return ext.loadTexture && ext.loadTexture( index );
|
|
|
+
|
|
|
+ } );
|
|
|
break;
|
|
|
|
|
|
case 'skin':
|
|
@@ -1994,9 +2054,6 @@ THREE.GLTFLoader = ( function () {
|
|
|
var parser = this;
|
|
|
var json = this.json;
|
|
|
var options = this.options;
|
|
|
- var textureLoader = this.textureLoader;
|
|
|
-
|
|
|
- var URL = self.URL || self.webkitURL;
|
|
|
|
|
|
var textureDef = json.textures[ textureIndex ];
|
|
|
|
|
@@ -2014,6 +2071,36 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ var loader;
|
|
|
+
|
|
|
+ if ( source.uri ) {
|
|
|
+
|
|
|
+ loader = options.manager.getHandler( source.uri );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( ! loader ) {
|
|
|
+
|
|
|
+ loader = textureExtensions[ EXTENSIONS.MSFT_TEXTURE_DDS ]
|
|
|
+ ? parser.extensions[ EXTENSIONS.MSFT_TEXTURE_DDS ].ddsLoader
|
|
|
+ : this.textureLoader;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return this.loadTextureImage( textureIndex, source, loader );
|
|
|
+ };
|
|
|
+
|
|
|
+ GLTFParser.prototype.loadTextureImage = function ( textureIndex, source, loader ) {
|
|
|
+
|
|
|
+ var parser = this;
|
|
|
+ var json = this.json;
|
|
|
+ var options = this.options;
|
|
|
+
|
|
|
+ var textureDef = json.textures[ textureIndex ];
|
|
|
+ var textureExtensions = textureDef.extensions || {};
|
|
|
+
|
|
|
+ var URL = self.URL || self.webkitURL;
|
|
|
+
|
|
|
var sourceURI = source.uri;
|
|
|
var isObjectURL = false;
|
|
|
|
|
@@ -2034,18 +2121,6 @@ THREE.GLTFLoader = ( function () {
|
|
|
|
|
|
return Promise.resolve( sourceURI ).then( function ( sourceURI ) {
|
|
|
|
|
|
- // Load Texture resource.
|
|
|
-
|
|
|
- var loader = options.manager.getHandler( sourceURI );
|
|
|
-
|
|
|
- if ( ! loader ) {
|
|
|
-
|
|
|
- loader = textureExtensions[ EXTENSIONS.MSFT_TEXTURE_DDS ]
|
|
|
- ? parser.extensions[ EXTENSIONS.MSFT_TEXTURE_DDS ].ddsLoader
|
|
|
- : textureLoader;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
return new Promise( function ( resolve, reject ) {
|
|
|
|
|
|
var onLoad = resolve;
|