未验证 提交 be1a17dc 编写于 作者: M Mr.doob 提交者: GitHub

Merge pull request #19791 from zeux/gltf-ktx2

GLTFLoader: Implement KHR_texture_basisu support
......@@ -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;
......
......@@ -4,6 +4,7 @@
* @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
*/
import {
......@@ -80,6 +81,7 @@ var GLTFLoader = ( function () {
this.dracoLoader = null;
this.ddsLoader = null;
this.ktx2Loader = null;
this.pluginCallbacks = [];
this.register( function ( parser ) {
......@@ -87,6 +89,11 @@ var GLTFLoader = ( function () {
return new GLTFMaterialsClearcoatExtension( parser );
} );
this.register( function ( parser ) {
return new GLTFTextureBasisUExtension( parser );
} );
}
......@@ -184,6 +191,13 @@ var GLTFLoader = ( function () {
},
setKTX2Loader: function ( ktx2Loader ) {
this.ktx2Loader = ktx2Loader;
return this;
},
register: function ( callback ) {
if ( this.pluginCallbacks.indexOf( callback ) === - 1 ) {
......@@ -258,7 +272,8 @@ var GLTFLoader = ( function () {
path: path || this.resourcePath || '',
crossOrigin: this.crossOrigin,
manager: this.manager
manager: this.manager,
ktx2Loader: this.ktx2Loader
} );
......@@ -383,6 +398,7 @@ var 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'
......@@ -600,6 +616,46 @@ var 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;
......@@ -1801,7 +1857,11 @@ var GLTFLoader = ( function () {
break;
case 'texture':
dependency = this.loadTexture( index );
dependency = this._invokeOne( function ( ext ) {
return ext.loadTexture && ext.loadTexture( index );
} );
break;
case 'skin':
......@@ -2059,9 +2119,6 @@ var 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 ];
......@@ -2079,6 +2136,36 @@ var 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;
......@@ -2099,18 +2186,6 @@ var 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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册