|
@@ -24906,108 +24906,116 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
};
|
|
|
|
|
|
- this.setTexture = function ( texture, slot ) {
|
|
|
+ this.uploadTexture = function ( texture ) {
|
|
|
|
|
|
- if ( texture.needsUpdate ) {
|
|
|
+ if ( ! texture.__webglInit ) {
|
|
|
|
|
|
- if ( ! texture.__webglInit ) {
|
|
|
+ texture.__webglInit = true;
|
|
|
|
|
|
- texture.__webglInit = true;
|
|
|
+ texture.addEventListener( 'dispose', onTextureDispose );
|
|
|
|
|
|
- texture.addEventListener( 'dispose', onTextureDispose );
|
|
|
+ texture.__webglTexture = _gl.createTexture();
|
|
|
|
|
|
- texture.__webglTexture = _gl.createTexture();
|
|
|
+ _this.info.memory.textures ++;
|
|
|
|
|
|
- _this.info.memory.textures ++;
|
|
|
+ }
|
|
|
|
|
|
- }
|
|
|
+ _gl.bindTexture( _gl.TEXTURE_2D, texture.__webglTexture );
|
|
|
|
|
|
- _gl.activeTexture( _gl.TEXTURE0 + slot );
|
|
|
- _gl.bindTexture( _gl.TEXTURE_2D, texture.__webglTexture );
|
|
|
+ _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );
|
|
|
+ _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );
|
|
|
+ _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );
|
|
|
|
|
|
- _gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );
|
|
|
- _gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );
|
|
|
- _gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );
|
|
|
+ texture.image = clampToMaxSize( texture.image, _maxTextureSize );
|
|
|
|
|
|
- var image = texture.image,
|
|
|
- isImagePowerOfTwo = THREE.Math.isPowerOfTwo( image.width ) && THREE.Math.isPowerOfTwo( image.height ),
|
|
|
- glFormat = paramThreeToGL( texture.format ),
|
|
|
- glType = paramThreeToGL( texture.type );
|
|
|
+ var image = texture.image,
|
|
|
+ isImagePowerOfTwo = THREE.Math.isPowerOfTwo( image.width ) && THREE.Math.isPowerOfTwo( image.height ),
|
|
|
+ glFormat = paramThreeToGL( texture.format ),
|
|
|
+ glType = paramThreeToGL( texture.type );
|
|
|
|
|
|
- setTextureParameters( _gl.TEXTURE_2D, texture, isImagePowerOfTwo );
|
|
|
+ setTextureParameters( _gl.TEXTURE_2D, texture, isImagePowerOfTwo );
|
|
|
|
|
|
- var mipmap, mipmaps = texture.mipmaps;
|
|
|
+ var mipmap, mipmaps = texture.mipmaps;
|
|
|
|
|
|
- if ( texture instanceof THREE.DataTexture ) {
|
|
|
+ if ( texture instanceof THREE.DataTexture ) {
|
|
|
|
|
|
- // use manually created mipmaps if available
|
|
|
- // if there are no manual mipmaps
|
|
|
- // set 0 level mipmap and then use GL to generate other mipmap levels
|
|
|
+ // use manually created mipmaps if available
|
|
|
+ // if there are no manual mipmaps
|
|
|
+ // set 0 level mipmap and then use GL to generate other mipmap levels
|
|
|
|
|
|
- if ( mipmaps.length > 0 && isImagePowerOfTwo ) {
|
|
|
+ if ( mipmaps.length > 0 && isImagePowerOfTwo ) {
|
|
|
|
|
|
- for ( var i = 0, il = mipmaps.length; i < il; i ++ ) {
|
|
|
+ for ( var i = 0, il = mipmaps.length; i < il; i ++ ) {
|
|
|
|
|
|
- mipmap = mipmaps[ i ];
|
|
|
- _gl.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
|
|
|
+ mipmap = mipmaps[ i ];
|
|
|
+ _gl.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- texture.generateMipmaps = false;
|
|
|
+ texture.generateMipmaps = false;
|
|
|
|
|
|
- } else {
|
|
|
+ } else {
|
|
|
+
|
|
|
+ _gl.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ } else if ( texture instanceof THREE.CompressedTexture ) {
|
|
|
|
|
|
- _gl.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data );
|
|
|
+ for ( var i = 0, il = mipmaps.length; i < il; i ++ ) {
|
|
|
|
|
|
+ mipmap = mipmaps[ i ];
|
|
|
+ if ( texture.format !== THREE.RGBAFormat ) {
|
|
|
+ _gl.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );
|
|
|
+ } else {
|
|
|
+ _gl.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
|
|
|
}
|
|
|
|
|
|
- } else if ( texture instanceof THREE.CompressedTexture ) {
|
|
|
+ }
|
|
|
+
|
|
|
+ } else { // regular Texture (image, video, canvas)
|
|
|
+
|
|
|
+ // use manually created mipmaps if available
|
|
|
+ // if there are no manual mipmaps
|
|
|
+ // set 0 level mipmap and then use GL to generate other mipmap levels
|
|
|
+
|
|
|
+ if ( mipmaps.length > 0 && isImagePowerOfTwo ) {
|
|
|
|
|
|
for ( var i = 0, il = mipmaps.length; i < il; i ++ ) {
|
|
|
|
|
|
mipmap = mipmaps[ i ];
|
|
|
- if ( texture.format !== THREE.RGBAFormat ) {
|
|
|
- _gl.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );
|
|
|
- } else {
|
|
|
- _gl.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );
|
|
|
- }
|
|
|
+ _gl.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap );
|
|
|
|
|
|
}
|
|
|
|
|
|
- } else { // regular Texture (image, video, canvas)
|
|
|
-
|
|
|
- // use manually created mipmaps if available
|
|
|
- // if there are no manual mipmaps
|
|
|
- // set 0 level mipmap and then use GL to generate other mipmap levels
|
|
|
+ texture.generateMipmaps = false;
|
|
|
|
|
|
- if ( mipmaps.length > 0 && isImagePowerOfTwo ) {
|
|
|
+ } else {
|
|
|
|
|
|
- for ( var i = 0, il = mipmaps.length; i < il; i ++ ) {
|
|
|
+ _gl.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, texture.image );
|
|
|
|
|
|
- mipmap = mipmaps[ i ];
|
|
|
- _gl.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap );
|
|
|
+ }
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- texture.generateMipmaps = false;
|
|
|
+ if ( texture.generateMipmaps && isImagePowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D );
|
|
|
|
|
|
- } else {
|
|
|
+ texture.needsUpdate = false;
|
|
|
|
|
|
- _gl.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, texture.image );
|
|
|
+ if ( texture.onUpdate ) texture.onUpdate();
|
|
|
|
|
|
- }
|
|
|
+ };
|
|
|
|
|
|
- }
|
|
|
+ this.setTexture = function ( texture, slot ) {
|
|
|
|
|
|
- if ( texture.generateMipmaps && isImagePowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D );
|
|
|
+ _gl.activeTexture( _gl.TEXTURE0 + slot );
|
|
|
|
|
|
- texture.needsUpdate = false;
|
|
|
+ if ( texture.needsUpdate ) {
|
|
|
|
|
|
- if ( texture.onUpdate ) texture.onUpdate();
|
|
|
+ _this.uploadTexture( texture );
|
|
|
|
|
|
} else {
|
|
|
|
|
|
- _gl.activeTexture( _gl.TEXTURE0 + slot );
|
|
|
_gl.bindTexture( _gl.TEXTURE_2D, texture.__webglTexture );
|
|
|
|
|
|
}
|
|
@@ -25016,27 +25024,27 @@ THREE.WebGLRenderer = function ( parameters ) {
|
|
|
|
|
|
function clampToMaxSize ( image, maxSize ) {
|
|
|
|
|
|
- if ( image.width <= maxSize && image.height <= maxSize ) {
|
|
|
+ if ( image.width > maxSize || image.height > maxSize ) {
|
|
|
|
|
|
- return image;
|
|
|
+ // Warning: Scaling through the canvas will only work with images that use
|
|
|
+ // premultiplied alpha.
|
|
|
|
|
|
- }
|
|
|
+ var scale = maxSize / Math.max( image.width, image.height );
|
|
|
|
|
|
- // Warning: Scaling through the canvas will only work with images that use
|
|
|
- // premultiplied alpha.
|
|
|
+ var canvas = document.createElement( 'canvas' );
|
|
|
+ canvas.width = Math.floor( image.width * scale );
|
|
|
+ canvas.height = Math.floor( image.height * scale );
|
|
|
|
|
|
- var maxDimension = Math.max( image.width, image.height );
|
|
|
- var newWidth = Math.floor( image.width * maxSize / maxDimension );
|
|
|
- var newHeight = Math.floor( image.height * maxSize / maxDimension );
|
|
|
+ var context = canvas.getContext( '2d' );
|
|
|
+ context.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height );
|
|
|
|
|
|
- var canvas = document.createElement( 'canvas' );
|
|
|
- canvas.width = newWidth;
|
|
|
- canvas.height = newHeight;
|
|
|
+ console.log( 'THREE.WebGLRenderer:', image, 'is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height + '.' );
|
|
|
|
|
|
- var ctx = canvas.getContext( '2d' );
|
|
|
- ctx.drawImage( image, 0, 0, image.width, image.height, 0, 0, newWidth, newHeight );
|
|
|
+ return canvas;
|
|
|
|
|
|
- return canvas;
|
|
|
+ }
|
|
|
+
|
|
|
+ return image;
|
|
|
|
|
|
}
|
|
|
|