From 3c1c8318005efeea385ef641424c2e5cd6f4f6b7 Mon Sep 17 00:00:00 2001 From: Henri Astre Date: Sun, 17 Aug 2014 20:03:01 -0700 Subject: [PATCH] add uploadTexture to WebGLRenderer There should be no change in setTexture behavior. --- src/renderers/WebGLRenderer.js | 118 +++++++++++++++++---------------- 1 file changed, 62 insertions(+), 56 deletions(-) diff --git a/src/renderers/WebGLRenderer.js b/src/renderers/WebGLRenderer.js index 000cd4733f..2110a83c41 100644 --- a/src/renderers/WebGLRenderer.js +++ b/src/renderers/WebGLRenderer.js @@ -5610,108 +5610,114 @@ 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 ); + 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; + + } else { - texture.generateMipmaps = false; + _gl.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data ); - } else { + } + + } 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) + texture.generateMipmaps = false; - // 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 ) { + } 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 ); } -- GitLab