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

Merge pull request #14075 from kickblade/GLTFExporterImageCache

GLTFExporter image caching.
......@@ -106,7 +106,8 @@ THREE.GLTFExporter.prototype = {
attributes: new Map(),
materials: new Map(),
textures: new Map()
textures: new Map(),
images: new Map()
};
......@@ -622,12 +623,28 @@ THREE.GLTFExporter.prototype = {
/**
* Process image
* @param {Texture} map Texture to process
* @param {Image} image to process
* @param {Integer} format of the image (e.g. THREE.RGBFormat, THREE.RGBAFormat etc)
* @param {Boolean} flipY before writing out the image
* @return {Integer} Index of the processed texture in the "images" array
*/
function processImage( map ) {
function processImage( image, format, flipY ) {
if ( ! cachedData.images.has( image ) ) {
cachedData.images.set( image, {} );
}
var cachedImages = cachedData.images.get( image );
var mimeType = format === THREE.RGBAFormat ? 'image/png' : 'image/jpeg';
var key = mimeType + ":flipY/" + flipY.toString();
// @TODO Cache
if ( cachedImages[ key ] !== undefined ) {
return cachedImages[ key ];
}
if ( ! outputJSON.images ) {
......@@ -635,19 +652,18 @@ THREE.GLTFExporter.prototype = {
}
var mimeType = map.format === THREE.RGBAFormat ? 'image/png' : 'image/jpeg';
var gltfImage = { mimeType: mimeType };
if ( options.embedImages ) {
var canvas = cachedCanvas = cachedCanvas || document.createElement( 'canvas' );
canvas.width = map.image.width;
canvas.height = map.image.height;
canvas.width = image.width;
canvas.height = image.height;
if ( options.forcePowerOfTwoTextures && ! isPowerOfTwo( map.image ) ) {
if ( options.forcePowerOfTwoTextures && ! isPowerOfTwo( image ) ) {
console.warn( 'GLTFExporter: Resized non-power-of-two image.', map.image );
console.warn( 'GLTFExporter: Resized non-power-of-two image.', image );
canvas.width = THREE.Math.floorPowerOfTwo( canvas.width );
canvas.height = THREE.Math.floorPowerOfTwo( canvas.height );
......@@ -656,14 +672,14 @@ THREE.GLTFExporter.prototype = {
var ctx = canvas.getContext( '2d' );
if ( map.flipY === true ) {
if ( flipY === true ) {
ctx.translate( 0, canvas.height );
ctx.scale( 1, - 1 );
}
ctx.drawImage( map.image, 0, 0, canvas.width, canvas.height );
ctx.drawImage( image, 0, 0, canvas.width, canvas.height );
if ( options.binary === true ) {
......@@ -691,13 +707,16 @@ THREE.GLTFExporter.prototype = {
} else {
gltfImage.uri = map.image.src;
gltfImage.uri = image.src;
}
outputJSON.images.push( gltfImage );
return outputJSON.images.length - 1;
var index = outputJSON.images.length - 1;
cachedImages[ key ] = index;
return index;
}
......@@ -751,7 +770,7 @@ THREE.GLTFExporter.prototype = {
var gltfTexture = {
sampler: processSampler( map ),
source: processImage( map )
source: processImage( map.image, map.format, map.flipY )
};
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册