diff --git a/src/pixi/extras/Strip.js b/src/pixi/extras/Strip.js index dcd9dd2..ebed079 100644 --- a/src/pixi/extras/Strip.js +++ b/src/pixi/extras/Strip.js @@ -140,7 +140,7 @@ gl.activeTexture(gl.TEXTURE0); // bind the current texture - gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || PIXI.createWebGLTexture(this.texture.baseTexture, gl)); + gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || renderSession.renderer.updateTexture(this.texture.baseTexture, gl)); // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer); @@ -161,7 +161,7 @@ gl.vertexAttribPointer(shader.aTextureCoord, 2, gl.FLOAT, false, 0, 0); gl.activeTexture(gl.TEXTURE0); - gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || PIXI.createWebGLTexture(this.texture.baseTexture, gl)); + gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || renderSession.renderer.updateTexture(this.texture.baseTexture, gl)); // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer); diff --git a/src/pixi/extras/Strip.js b/src/pixi/extras/Strip.js index dcd9dd2..ebed079 100644 --- a/src/pixi/extras/Strip.js +++ b/src/pixi/extras/Strip.js @@ -140,7 +140,7 @@ gl.activeTexture(gl.TEXTURE0); // bind the current texture - gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || PIXI.createWebGLTexture(this.texture.baseTexture, gl)); + gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || renderSession.renderer.updateTexture(this.texture.baseTexture, gl)); // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer); @@ -161,7 +161,7 @@ gl.vertexAttribPointer(shader.aTextureCoord, 2, gl.FLOAT, false, 0, 0); gl.activeTexture(gl.TEXTURE0); - gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || PIXI.createWebGLTexture(this.texture.baseTexture, gl)); + gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || renderSession.renderer.updateTexture(this.texture.baseTexture, gl)); // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer); diff --git a/src/pixi/renderers/canvas/CanvasRenderer.js b/src/pixi/renderers/canvas/CanvasRenderer.js index 5903827..6c6f728 100644 --- a/src/pixi/renderers/canvas/CanvasRenderer.js +++ b/src/pixi/renderers/canvas/CanvasRenderer.js @@ -203,9 +203,6 @@ */ PIXI.CanvasRenderer.prototype.render = function(stage) { - // update textures if need be - PIXI.texturesToDestroy.length = 0; - stage.updateTransform(); this.context.setTransform(1,0,0,1,0,0); diff --git a/src/pixi/extras/Strip.js b/src/pixi/extras/Strip.js index dcd9dd2..ebed079 100644 --- a/src/pixi/extras/Strip.js +++ b/src/pixi/extras/Strip.js @@ -140,7 +140,7 @@ gl.activeTexture(gl.TEXTURE0); // bind the current texture - gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || PIXI.createWebGLTexture(this.texture.baseTexture, gl)); + gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || renderSession.renderer.updateTexture(this.texture.baseTexture, gl)); // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer); @@ -161,7 +161,7 @@ gl.vertexAttribPointer(shader.aTextureCoord, 2, gl.FLOAT, false, 0, 0); gl.activeTexture(gl.TEXTURE0); - gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || PIXI.createWebGLTexture(this.texture.baseTexture, gl)); + gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || renderSession.renderer.updateTexture(this.texture.baseTexture, gl)); // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer); diff --git a/src/pixi/renderers/canvas/CanvasRenderer.js b/src/pixi/renderers/canvas/CanvasRenderer.js index 5903827..6c6f728 100644 --- a/src/pixi/renderers/canvas/CanvasRenderer.js +++ b/src/pixi/renderers/canvas/CanvasRenderer.js @@ -203,9 +203,6 @@ */ PIXI.CanvasRenderer.prototype.render = function(stage) { - // update textures if need be - PIXI.texturesToDestroy.length = 0; - stage.updateTransform(); this.context.setTransform(1,0,0,1,0,0); diff --git a/src/pixi/renderers/webgl/WebGLRenderer.js b/src/pixi/renderers/webgl/WebGLRenderer.js index adc9a90..e9e4658 100644 --- a/src/pixi/renderers/webgl/WebGLRenderer.js +++ b/src/pixi/renderers/webgl/WebGLRenderer.js @@ -214,9 +214,6 @@ this.__stage = stage; } - // update any textures this includes uvs and uploading them to the gpu - PIXI.WebGLRenderer.updateTextures(); - // update the scene graph stage.updateTransform(); @@ -327,48 +324,6 @@ }; /** - * Updates the textures loaded into this webgl renderer - * - * @static - * @method updateTextures - * @private - */ -PIXI.WebGLRenderer.updateTextures = function() -{ - var i = 0; - - for (i = 0; i < PIXI.texturesToDestroy.length; i++) - PIXI.WebGLRenderer.destroyTexture(PIXI.texturesToDestroy[i]); - - PIXI.texturesToDestroy.length = 0; -}; - -/** - * Destroys a loaded webgl texture - * - * @method destroyTexture - * @param texture {Texture} The texture to update - * @private - */ -PIXI.WebGLRenderer.destroyTexture = function(texture) -{ - //TODO break this out into a texture manager... - - for (var i = texture._glTextures.length - 1; i >= 0; i--) - { - var glTexture = texture._glTextures[i]; - var gl = PIXI.glContexts[i]; - - if(gl && glTexture) - { - gl.deleteTexture(glTexture); - } - } - - texture._glTextures.length = 0; -}; - -/** * resizes the webGL view to the specified width and height * * @method resize @@ -394,87 +349,46 @@ }; /** - * Creates a WebGL texture + * Updates and Creates a WebGL texture * - * @method createWebGLTexture + * @method updateTexture * @param texture {Texture} the texture to render - * @param gl {webglContext} the WebGL context - * @static */ -PIXI.createWebGLTexture = function(texture, gl) +PIXI.WebGLRenderer.prototype.updateTexture = function(texture) { + if(!texture.hasLoaded)return; + var gl = this.gl; - if(texture.hasLoaded) + if(!texture._glTextures[gl.id])texture._glTextures[gl.id] = gl.createTexture(); + + gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id]); + gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultipliedAlpha); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); + + // reguler... + if(!texture._powerOf2) { - texture._glTextures[gl.id] = gl.createTexture(); - - gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id]); - gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultipliedAlpha); - - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); - - // reguler... - - if(!texture._powerOf2) - { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - } - else - { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); - } - - gl.bindTexture(gl.TEXTURE_2D, null); - - texture._dirty[gl.id] = false; + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); } + else + { + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); + } + + gl.bindTexture(gl.TEXTURE_2D, null); + + texture._dirty[gl.id] = false; return texture._glTextures[gl.id]; }; /** - * Updates a WebGL texture - * - * @method updateWebGLTexture - * @param texture {Texture} the texture to update - * @param gl {webglContext} the WebGL context - * @private - */ -PIXI.updateWebGLTexture = function(texture, gl) -{ - if( texture._glTextures[gl.id] ) - { - gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id]); - gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultipliedAlpha); - - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); - - // reguler... - - if(!texture._powerOf2) - { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - } - else - { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); - } - - texture._dirty[gl.id] = false; - } - -}; - -/** * Handles a lost webgl context * * @method handleContextLost @@ -586,5 +500,4 @@ this.renderSession = null; }; - PIXI.WebGLRenderer.glContextId = 0; diff --git a/src/pixi/extras/Strip.js b/src/pixi/extras/Strip.js index dcd9dd2..ebed079 100644 --- a/src/pixi/extras/Strip.js +++ b/src/pixi/extras/Strip.js @@ -140,7 +140,7 @@ gl.activeTexture(gl.TEXTURE0); // bind the current texture - gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || PIXI.createWebGLTexture(this.texture.baseTexture, gl)); + gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || renderSession.renderer.updateTexture(this.texture.baseTexture, gl)); // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer); @@ -161,7 +161,7 @@ gl.vertexAttribPointer(shader.aTextureCoord, 2, gl.FLOAT, false, 0, 0); gl.activeTexture(gl.TEXTURE0); - gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || PIXI.createWebGLTexture(this.texture.baseTexture, gl)); + gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || renderSession.renderer.updateTexture(this.texture.baseTexture, gl)); // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer); diff --git a/src/pixi/renderers/canvas/CanvasRenderer.js b/src/pixi/renderers/canvas/CanvasRenderer.js index 5903827..6c6f728 100644 --- a/src/pixi/renderers/canvas/CanvasRenderer.js +++ b/src/pixi/renderers/canvas/CanvasRenderer.js @@ -203,9 +203,6 @@ */ PIXI.CanvasRenderer.prototype.render = function(stage) { - // update textures if need be - PIXI.texturesToDestroy.length = 0; - stage.updateTransform(); this.context.setTransform(1,0,0,1,0,0); diff --git a/src/pixi/renderers/webgl/WebGLRenderer.js b/src/pixi/renderers/webgl/WebGLRenderer.js index adc9a90..e9e4658 100644 --- a/src/pixi/renderers/webgl/WebGLRenderer.js +++ b/src/pixi/renderers/webgl/WebGLRenderer.js @@ -214,9 +214,6 @@ this.__stage = stage; } - // update any textures this includes uvs and uploading them to the gpu - PIXI.WebGLRenderer.updateTextures(); - // update the scene graph stage.updateTransform(); @@ -327,48 +324,6 @@ }; /** - * Updates the textures loaded into this webgl renderer - * - * @static - * @method updateTextures - * @private - */ -PIXI.WebGLRenderer.updateTextures = function() -{ - var i = 0; - - for (i = 0; i < PIXI.texturesToDestroy.length; i++) - PIXI.WebGLRenderer.destroyTexture(PIXI.texturesToDestroy[i]); - - PIXI.texturesToDestroy.length = 0; -}; - -/** - * Destroys a loaded webgl texture - * - * @method destroyTexture - * @param texture {Texture} The texture to update - * @private - */ -PIXI.WebGLRenderer.destroyTexture = function(texture) -{ - //TODO break this out into a texture manager... - - for (var i = texture._glTextures.length - 1; i >= 0; i--) - { - var glTexture = texture._glTextures[i]; - var gl = PIXI.glContexts[i]; - - if(gl && glTexture) - { - gl.deleteTexture(glTexture); - } - } - - texture._glTextures.length = 0; -}; - -/** * resizes the webGL view to the specified width and height * * @method resize @@ -394,87 +349,46 @@ }; /** - * Creates a WebGL texture + * Updates and Creates a WebGL texture * - * @method createWebGLTexture + * @method updateTexture * @param texture {Texture} the texture to render - * @param gl {webglContext} the WebGL context - * @static */ -PIXI.createWebGLTexture = function(texture, gl) +PIXI.WebGLRenderer.prototype.updateTexture = function(texture) { + if(!texture.hasLoaded)return; + var gl = this.gl; - if(texture.hasLoaded) + if(!texture._glTextures[gl.id])texture._glTextures[gl.id] = gl.createTexture(); + + gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id]); + gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultipliedAlpha); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); + + // reguler... + if(!texture._powerOf2) { - texture._glTextures[gl.id] = gl.createTexture(); - - gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id]); - gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultipliedAlpha); - - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); - - // reguler... - - if(!texture._powerOf2) - { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - } - else - { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); - } - - gl.bindTexture(gl.TEXTURE_2D, null); - - texture._dirty[gl.id] = false; + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); } + else + { + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); + } + + gl.bindTexture(gl.TEXTURE_2D, null); + + texture._dirty[gl.id] = false; return texture._glTextures[gl.id]; }; /** - * Updates a WebGL texture - * - * @method updateWebGLTexture - * @param texture {Texture} the texture to update - * @param gl {webglContext} the WebGL context - * @private - */ -PIXI.updateWebGLTexture = function(texture, gl) -{ - if( texture._glTextures[gl.id] ) - { - gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id]); - gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultipliedAlpha); - - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); - - // reguler... - - if(!texture._powerOf2) - { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - } - else - { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); - } - - texture._dirty[gl.id] = false; - } - -}; - -/** * Handles a lost webgl context * * @method handleContextLost @@ -586,5 +500,4 @@ this.renderSession = null; }; - PIXI.WebGLRenderer.glContextId = 0; diff --git a/src/pixi/renderers/webgl/utils/WebGLSpriteBatch.js b/src/pixi/renderers/webgl/utils/WebGLSpriteBatch.js index 4eebf8d..585c9cd 100755 --- a/src/pixi/renderers/webgl/utils/WebGLSpriteBatch.js +++ b/src/pixi/renderers/webgl/utils/WebGLSpriteBatch.js @@ -465,12 +465,12 @@ var gl = this.gl; // bind the current texture - gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id] || PIXI.createWebGLTexture(texture, gl)); + gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id] || this.renderSession.renderer.updateTexture(texture)); // check if a texture is dirty.. if(texture._dirty[gl.id]) { - PIXI.updateWebGLTexture(this.currentBaseTexture, gl); + this.renderSession.renderer.updateTexture(texture); } // now draw those suckas! diff --git a/src/pixi/extras/Strip.js b/src/pixi/extras/Strip.js index dcd9dd2..ebed079 100644 --- a/src/pixi/extras/Strip.js +++ b/src/pixi/extras/Strip.js @@ -140,7 +140,7 @@ gl.activeTexture(gl.TEXTURE0); // bind the current texture - gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || PIXI.createWebGLTexture(this.texture.baseTexture, gl)); + gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || renderSession.renderer.updateTexture(this.texture.baseTexture, gl)); // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer); @@ -161,7 +161,7 @@ gl.vertexAttribPointer(shader.aTextureCoord, 2, gl.FLOAT, false, 0, 0); gl.activeTexture(gl.TEXTURE0); - gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || PIXI.createWebGLTexture(this.texture.baseTexture, gl)); + gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || renderSession.renderer.updateTexture(this.texture.baseTexture, gl)); // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer); diff --git a/src/pixi/renderers/canvas/CanvasRenderer.js b/src/pixi/renderers/canvas/CanvasRenderer.js index 5903827..6c6f728 100644 --- a/src/pixi/renderers/canvas/CanvasRenderer.js +++ b/src/pixi/renderers/canvas/CanvasRenderer.js @@ -203,9 +203,6 @@ */ PIXI.CanvasRenderer.prototype.render = function(stage) { - // update textures if need be - PIXI.texturesToDestroy.length = 0; - stage.updateTransform(); this.context.setTransform(1,0,0,1,0,0); diff --git a/src/pixi/renderers/webgl/WebGLRenderer.js b/src/pixi/renderers/webgl/WebGLRenderer.js index adc9a90..e9e4658 100644 --- a/src/pixi/renderers/webgl/WebGLRenderer.js +++ b/src/pixi/renderers/webgl/WebGLRenderer.js @@ -214,9 +214,6 @@ this.__stage = stage; } - // update any textures this includes uvs and uploading them to the gpu - PIXI.WebGLRenderer.updateTextures(); - // update the scene graph stage.updateTransform(); @@ -327,48 +324,6 @@ }; /** - * Updates the textures loaded into this webgl renderer - * - * @static - * @method updateTextures - * @private - */ -PIXI.WebGLRenderer.updateTextures = function() -{ - var i = 0; - - for (i = 0; i < PIXI.texturesToDestroy.length; i++) - PIXI.WebGLRenderer.destroyTexture(PIXI.texturesToDestroy[i]); - - PIXI.texturesToDestroy.length = 0; -}; - -/** - * Destroys a loaded webgl texture - * - * @method destroyTexture - * @param texture {Texture} The texture to update - * @private - */ -PIXI.WebGLRenderer.destroyTexture = function(texture) -{ - //TODO break this out into a texture manager... - - for (var i = texture._glTextures.length - 1; i >= 0; i--) - { - var glTexture = texture._glTextures[i]; - var gl = PIXI.glContexts[i]; - - if(gl && glTexture) - { - gl.deleteTexture(glTexture); - } - } - - texture._glTextures.length = 0; -}; - -/** * resizes the webGL view to the specified width and height * * @method resize @@ -394,87 +349,46 @@ }; /** - * Creates a WebGL texture + * Updates and Creates a WebGL texture * - * @method createWebGLTexture + * @method updateTexture * @param texture {Texture} the texture to render - * @param gl {webglContext} the WebGL context - * @static */ -PIXI.createWebGLTexture = function(texture, gl) +PIXI.WebGLRenderer.prototype.updateTexture = function(texture) { + if(!texture.hasLoaded)return; + var gl = this.gl; - if(texture.hasLoaded) + if(!texture._glTextures[gl.id])texture._glTextures[gl.id] = gl.createTexture(); + + gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id]); + gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultipliedAlpha); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); + + // reguler... + if(!texture._powerOf2) { - texture._glTextures[gl.id] = gl.createTexture(); - - gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id]); - gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultipliedAlpha); - - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); - - // reguler... - - if(!texture._powerOf2) - { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - } - else - { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); - } - - gl.bindTexture(gl.TEXTURE_2D, null); - - texture._dirty[gl.id] = false; + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); } + else + { + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); + } + + gl.bindTexture(gl.TEXTURE_2D, null); + + texture._dirty[gl.id] = false; return texture._glTextures[gl.id]; }; /** - * Updates a WebGL texture - * - * @method updateWebGLTexture - * @param texture {Texture} the texture to update - * @param gl {webglContext} the WebGL context - * @private - */ -PIXI.updateWebGLTexture = function(texture, gl) -{ - if( texture._glTextures[gl.id] ) - { - gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id]); - gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultipliedAlpha); - - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); - - // reguler... - - if(!texture._powerOf2) - { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - } - else - { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); - } - - texture._dirty[gl.id] = false; - } - -}; - -/** * Handles a lost webgl context * * @method handleContextLost @@ -586,5 +500,4 @@ this.renderSession = null; }; - PIXI.WebGLRenderer.glContextId = 0; diff --git a/src/pixi/renderers/webgl/utils/WebGLSpriteBatch.js b/src/pixi/renderers/webgl/utils/WebGLSpriteBatch.js index 4eebf8d..585c9cd 100755 --- a/src/pixi/renderers/webgl/utils/WebGLSpriteBatch.js +++ b/src/pixi/renderers/webgl/utils/WebGLSpriteBatch.js @@ -465,12 +465,12 @@ var gl = this.gl; // bind the current texture - gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id] || PIXI.createWebGLTexture(texture, gl)); + gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id] || this.renderSession.renderer.updateTexture(texture)); // check if a texture is dirty.. if(texture._dirty[gl.id]) { - PIXI.updateWebGLTexture(this.currentBaseTexture, gl); + this.renderSession.renderer.updateTexture(texture); } // now draw those suckas! diff --git a/src/pixi/text/Text.js b/src/pixi/text/Text.js index 3f94b5d..ee9377a 100644 --- a/src/pixi/text/Text.js +++ b/src/pixi/text/Text.js @@ -313,7 +313,8 @@ this.updateText(); this.dirty = false; - PIXI.updateWebGLTexture(this.texture.baseTexture, renderSession.gl); + // update the dirty base textures + this.texture.baseTexture.dirty(); } PIXI.Sprite.prototype._renderWebGL.call(this, renderSession); diff --git a/src/pixi/extras/Strip.js b/src/pixi/extras/Strip.js index dcd9dd2..ebed079 100644 --- a/src/pixi/extras/Strip.js +++ b/src/pixi/extras/Strip.js @@ -140,7 +140,7 @@ gl.activeTexture(gl.TEXTURE0); // bind the current texture - gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || PIXI.createWebGLTexture(this.texture.baseTexture, gl)); + gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || renderSession.renderer.updateTexture(this.texture.baseTexture, gl)); // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer); @@ -161,7 +161,7 @@ gl.vertexAttribPointer(shader.aTextureCoord, 2, gl.FLOAT, false, 0, 0); gl.activeTexture(gl.TEXTURE0); - gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || PIXI.createWebGLTexture(this.texture.baseTexture, gl)); + gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || renderSession.renderer.updateTexture(this.texture.baseTexture, gl)); // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer); diff --git a/src/pixi/renderers/canvas/CanvasRenderer.js b/src/pixi/renderers/canvas/CanvasRenderer.js index 5903827..6c6f728 100644 --- a/src/pixi/renderers/canvas/CanvasRenderer.js +++ b/src/pixi/renderers/canvas/CanvasRenderer.js @@ -203,9 +203,6 @@ */ PIXI.CanvasRenderer.prototype.render = function(stage) { - // update textures if need be - PIXI.texturesToDestroy.length = 0; - stage.updateTransform(); this.context.setTransform(1,0,0,1,0,0); diff --git a/src/pixi/renderers/webgl/WebGLRenderer.js b/src/pixi/renderers/webgl/WebGLRenderer.js index adc9a90..e9e4658 100644 --- a/src/pixi/renderers/webgl/WebGLRenderer.js +++ b/src/pixi/renderers/webgl/WebGLRenderer.js @@ -214,9 +214,6 @@ this.__stage = stage; } - // update any textures this includes uvs and uploading them to the gpu - PIXI.WebGLRenderer.updateTextures(); - // update the scene graph stage.updateTransform(); @@ -327,48 +324,6 @@ }; /** - * Updates the textures loaded into this webgl renderer - * - * @static - * @method updateTextures - * @private - */ -PIXI.WebGLRenderer.updateTextures = function() -{ - var i = 0; - - for (i = 0; i < PIXI.texturesToDestroy.length; i++) - PIXI.WebGLRenderer.destroyTexture(PIXI.texturesToDestroy[i]); - - PIXI.texturesToDestroy.length = 0; -}; - -/** - * Destroys a loaded webgl texture - * - * @method destroyTexture - * @param texture {Texture} The texture to update - * @private - */ -PIXI.WebGLRenderer.destroyTexture = function(texture) -{ - //TODO break this out into a texture manager... - - for (var i = texture._glTextures.length - 1; i >= 0; i--) - { - var glTexture = texture._glTextures[i]; - var gl = PIXI.glContexts[i]; - - if(gl && glTexture) - { - gl.deleteTexture(glTexture); - } - } - - texture._glTextures.length = 0; -}; - -/** * resizes the webGL view to the specified width and height * * @method resize @@ -394,87 +349,46 @@ }; /** - * Creates a WebGL texture + * Updates and Creates a WebGL texture * - * @method createWebGLTexture + * @method updateTexture * @param texture {Texture} the texture to render - * @param gl {webglContext} the WebGL context - * @static */ -PIXI.createWebGLTexture = function(texture, gl) +PIXI.WebGLRenderer.prototype.updateTexture = function(texture) { + if(!texture.hasLoaded)return; + var gl = this.gl; - if(texture.hasLoaded) + if(!texture._glTextures[gl.id])texture._glTextures[gl.id] = gl.createTexture(); + + gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id]); + gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultipliedAlpha); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); + + // reguler... + if(!texture._powerOf2) { - texture._glTextures[gl.id] = gl.createTexture(); - - gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id]); - gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultipliedAlpha); - - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); - - // reguler... - - if(!texture._powerOf2) - { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - } - else - { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); - } - - gl.bindTexture(gl.TEXTURE_2D, null); - - texture._dirty[gl.id] = false; + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); } + else + { + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); + } + + gl.bindTexture(gl.TEXTURE_2D, null); + + texture._dirty[gl.id] = false; return texture._glTextures[gl.id]; }; /** - * Updates a WebGL texture - * - * @method updateWebGLTexture - * @param texture {Texture} the texture to update - * @param gl {webglContext} the WebGL context - * @private - */ -PIXI.updateWebGLTexture = function(texture, gl) -{ - if( texture._glTextures[gl.id] ) - { - gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id]); - gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultipliedAlpha); - - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); - - // reguler... - - if(!texture._powerOf2) - { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - } - else - { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); - } - - texture._dirty[gl.id] = false; - } - -}; - -/** * Handles a lost webgl context * * @method handleContextLost @@ -586,5 +500,4 @@ this.renderSession = null; }; - PIXI.WebGLRenderer.glContextId = 0; diff --git a/src/pixi/renderers/webgl/utils/WebGLSpriteBatch.js b/src/pixi/renderers/webgl/utils/WebGLSpriteBatch.js index 4eebf8d..585c9cd 100755 --- a/src/pixi/renderers/webgl/utils/WebGLSpriteBatch.js +++ b/src/pixi/renderers/webgl/utils/WebGLSpriteBatch.js @@ -465,12 +465,12 @@ var gl = this.gl; // bind the current texture - gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id] || PIXI.createWebGLTexture(texture, gl)); + gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id] || this.renderSession.renderer.updateTexture(texture)); // check if a texture is dirty.. if(texture._dirty[gl.id]) { - PIXI.updateWebGLTexture(this.currentBaseTexture, gl); + this.renderSession.renderer.updateTexture(texture); } // now draw those suckas! diff --git a/src/pixi/text/Text.js b/src/pixi/text/Text.js index 3f94b5d..ee9377a 100644 --- a/src/pixi/text/Text.js +++ b/src/pixi/text/Text.js @@ -313,7 +313,8 @@ this.updateText(); this.dirty = false; - PIXI.updateWebGLTexture(this.texture.baseTexture, renderSession.gl); + // update the dirty base textures + this.texture.baseTexture.dirty(); } PIXI.Sprite.prototype._renderWebGL.call(this, renderSession); diff --git a/src/pixi/textures/BaseTexture.js b/src/pixi/textures/BaseTexture.js index 86c9179..3e35ef7 100644 --- a/src/pixi/textures/BaseTexture.js +++ b/src/pixi/textures/BaseTexture.js @@ -3,7 +3,6 @@ */ PIXI.BaseTextureCache = {}; -PIXI.texturesToDestroy = []; PIXI.BaseTextureCacheIdGenerator = 0; @@ -108,10 +107,7 @@ scope.width = scope.source.naturalWidth || scope.source.width; scope.height = scope.source.naturalHeight || scope.source.height; - for (var i = 0; i < scope._glTextures.length; i++) - { - scope._dirty[i] = true; - } + scope.dirty(); // add it to somewhere... scope.dispatchEvent( { type: 'loaded', content: scope } ); @@ -150,7 +146,20 @@ delete PIXI.BaseTextureCache[this.source._pixiId]; } this.source = null; - PIXI.texturesToDestroy.push(this); + + // delete the webGL textures if any. + for (var i = this._glTextures.length - 1; i >= 0; i--) + { + var glTexture = this._glTextures[i]; + var gl = PIXI.glContexts[i]; + + if(gl && glTexture) + { + gl.deleteTexture(glTexture); + } + } + + this._glTextures.length = 0; }; /** @@ -166,6 +175,14 @@ this.source.src = newSrc; }; +PIXI.BaseTexture.prototype.dirty = function() +{ + for (var i = 0; i < this._glTextures.length; i++) + { + this._dirty[i] = true; + } +}; + /** * Helper function that returns a base texture based on an image url * If the image is not in the base texture cache it will be created and loaded diff --git a/src/pixi/extras/Strip.js b/src/pixi/extras/Strip.js index dcd9dd2..ebed079 100644 --- a/src/pixi/extras/Strip.js +++ b/src/pixi/extras/Strip.js @@ -140,7 +140,7 @@ gl.activeTexture(gl.TEXTURE0); // bind the current texture - gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || PIXI.createWebGLTexture(this.texture.baseTexture, gl)); + gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || renderSession.renderer.updateTexture(this.texture.baseTexture, gl)); // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer); @@ -161,7 +161,7 @@ gl.vertexAttribPointer(shader.aTextureCoord, 2, gl.FLOAT, false, 0, 0); gl.activeTexture(gl.TEXTURE0); - gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || PIXI.createWebGLTexture(this.texture.baseTexture, gl)); + gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || renderSession.renderer.updateTexture(this.texture.baseTexture, gl)); // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer); diff --git a/src/pixi/renderers/canvas/CanvasRenderer.js b/src/pixi/renderers/canvas/CanvasRenderer.js index 5903827..6c6f728 100644 --- a/src/pixi/renderers/canvas/CanvasRenderer.js +++ b/src/pixi/renderers/canvas/CanvasRenderer.js @@ -203,9 +203,6 @@ */ PIXI.CanvasRenderer.prototype.render = function(stage) { - // update textures if need be - PIXI.texturesToDestroy.length = 0; - stage.updateTransform(); this.context.setTransform(1,0,0,1,0,0); diff --git a/src/pixi/renderers/webgl/WebGLRenderer.js b/src/pixi/renderers/webgl/WebGLRenderer.js index adc9a90..e9e4658 100644 --- a/src/pixi/renderers/webgl/WebGLRenderer.js +++ b/src/pixi/renderers/webgl/WebGLRenderer.js @@ -214,9 +214,6 @@ this.__stage = stage; } - // update any textures this includes uvs and uploading them to the gpu - PIXI.WebGLRenderer.updateTextures(); - // update the scene graph stage.updateTransform(); @@ -327,48 +324,6 @@ }; /** - * Updates the textures loaded into this webgl renderer - * - * @static - * @method updateTextures - * @private - */ -PIXI.WebGLRenderer.updateTextures = function() -{ - var i = 0; - - for (i = 0; i < PIXI.texturesToDestroy.length; i++) - PIXI.WebGLRenderer.destroyTexture(PIXI.texturesToDestroy[i]); - - PIXI.texturesToDestroy.length = 0; -}; - -/** - * Destroys a loaded webgl texture - * - * @method destroyTexture - * @param texture {Texture} The texture to update - * @private - */ -PIXI.WebGLRenderer.destroyTexture = function(texture) -{ - //TODO break this out into a texture manager... - - for (var i = texture._glTextures.length - 1; i >= 0; i--) - { - var glTexture = texture._glTextures[i]; - var gl = PIXI.glContexts[i]; - - if(gl && glTexture) - { - gl.deleteTexture(glTexture); - } - } - - texture._glTextures.length = 0; -}; - -/** * resizes the webGL view to the specified width and height * * @method resize @@ -394,87 +349,46 @@ }; /** - * Creates a WebGL texture + * Updates and Creates a WebGL texture * - * @method createWebGLTexture + * @method updateTexture * @param texture {Texture} the texture to render - * @param gl {webglContext} the WebGL context - * @static */ -PIXI.createWebGLTexture = function(texture, gl) +PIXI.WebGLRenderer.prototype.updateTexture = function(texture) { + if(!texture.hasLoaded)return; + var gl = this.gl; - if(texture.hasLoaded) + if(!texture._glTextures[gl.id])texture._glTextures[gl.id] = gl.createTexture(); + + gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id]); + gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultipliedAlpha); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); + + // reguler... + if(!texture._powerOf2) { - texture._glTextures[gl.id] = gl.createTexture(); - - gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id]); - gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultipliedAlpha); - - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); - - // reguler... - - if(!texture._powerOf2) - { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - } - else - { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); - } - - gl.bindTexture(gl.TEXTURE_2D, null); - - texture._dirty[gl.id] = false; + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); } + else + { + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); + } + + gl.bindTexture(gl.TEXTURE_2D, null); + + texture._dirty[gl.id] = false; return texture._glTextures[gl.id]; }; /** - * Updates a WebGL texture - * - * @method updateWebGLTexture - * @param texture {Texture} the texture to update - * @param gl {webglContext} the WebGL context - * @private - */ -PIXI.updateWebGLTexture = function(texture, gl) -{ - if( texture._glTextures[gl.id] ) - { - gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id]); - gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultipliedAlpha); - - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); - - // reguler... - - if(!texture._powerOf2) - { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - } - else - { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); - } - - texture._dirty[gl.id] = false; - } - -}; - -/** * Handles a lost webgl context * * @method handleContextLost @@ -586,5 +500,4 @@ this.renderSession = null; }; - PIXI.WebGLRenderer.glContextId = 0; diff --git a/src/pixi/renderers/webgl/utils/WebGLSpriteBatch.js b/src/pixi/renderers/webgl/utils/WebGLSpriteBatch.js index 4eebf8d..585c9cd 100755 --- a/src/pixi/renderers/webgl/utils/WebGLSpriteBatch.js +++ b/src/pixi/renderers/webgl/utils/WebGLSpriteBatch.js @@ -465,12 +465,12 @@ var gl = this.gl; // bind the current texture - gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id] || PIXI.createWebGLTexture(texture, gl)); + gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id] || this.renderSession.renderer.updateTexture(texture)); // check if a texture is dirty.. if(texture._dirty[gl.id]) { - PIXI.updateWebGLTexture(this.currentBaseTexture, gl); + this.renderSession.renderer.updateTexture(texture); } // now draw those suckas! diff --git a/src/pixi/text/Text.js b/src/pixi/text/Text.js index 3f94b5d..ee9377a 100644 --- a/src/pixi/text/Text.js +++ b/src/pixi/text/Text.js @@ -313,7 +313,8 @@ this.updateText(); this.dirty = false; - PIXI.updateWebGLTexture(this.texture.baseTexture, renderSession.gl); + // update the dirty base textures + this.texture.baseTexture.dirty(); } PIXI.Sprite.prototype._renderWebGL.call(this, renderSession); diff --git a/src/pixi/textures/BaseTexture.js b/src/pixi/textures/BaseTexture.js index 86c9179..3e35ef7 100644 --- a/src/pixi/textures/BaseTexture.js +++ b/src/pixi/textures/BaseTexture.js @@ -3,7 +3,6 @@ */ PIXI.BaseTextureCache = {}; -PIXI.texturesToDestroy = []; PIXI.BaseTextureCacheIdGenerator = 0; @@ -108,10 +107,7 @@ scope.width = scope.source.naturalWidth || scope.source.width; scope.height = scope.source.naturalHeight || scope.source.height; - for (var i = 0; i < scope._glTextures.length; i++) - { - scope._dirty[i] = true; - } + scope.dirty(); // add it to somewhere... scope.dispatchEvent( { type: 'loaded', content: scope } ); @@ -150,7 +146,20 @@ delete PIXI.BaseTextureCache[this.source._pixiId]; } this.source = null; - PIXI.texturesToDestroy.push(this); + + // delete the webGL textures if any. + for (var i = this._glTextures.length - 1; i >= 0; i--) + { + var glTexture = this._glTextures[i]; + var gl = PIXI.glContexts[i]; + + if(gl && glTexture) + { + gl.deleteTexture(glTexture); + } + } + + this._glTextures.length = 0; }; /** @@ -166,6 +175,14 @@ this.source.src = newSrc; }; +PIXI.BaseTexture.prototype.dirty = function() +{ + for (var i = 0; i < this._glTextures.length; i++) + { + this._dirty[i] = true; + } +}; + /** * Helper function that returns a base texture based on an image url * If the image is not in the base texture cache it will be created and loaded diff --git a/src/pixi/textures/RenderTexture.js b/src/pixi/textures/RenderTexture.js index 7b3ba85..e0b2f96 100644 --- a/src/pixi/textures/RenderTexture.js +++ b/src/pixi/textures/RenderTexture.js @@ -222,8 +222,6 @@ if(clear)this.textureBuffer.clear(); - PIXI.WebGLRenderer.updateTextures(); - this.renderer.spriteBatch.dirty = true; this.renderer.renderDisplayObject(displayObject, this.projection, this.textureBuffer.frameBuffer); diff --git a/src/pixi/extras/Strip.js b/src/pixi/extras/Strip.js index dcd9dd2..ebed079 100644 --- a/src/pixi/extras/Strip.js +++ b/src/pixi/extras/Strip.js @@ -140,7 +140,7 @@ gl.activeTexture(gl.TEXTURE0); // bind the current texture - gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || PIXI.createWebGLTexture(this.texture.baseTexture, gl)); + gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || renderSession.renderer.updateTexture(this.texture.baseTexture, gl)); // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer); @@ -161,7 +161,7 @@ gl.vertexAttribPointer(shader.aTextureCoord, 2, gl.FLOAT, false, 0, 0); gl.activeTexture(gl.TEXTURE0); - gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || PIXI.createWebGLTexture(this.texture.baseTexture, gl)); + gl.bindTexture(gl.TEXTURE_2D, this.texture.baseTexture._glTextures[gl.id] || renderSession.renderer.updateTexture(this.texture.baseTexture, gl)); // dont need to upload! gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this._indexBuffer); diff --git a/src/pixi/renderers/canvas/CanvasRenderer.js b/src/pixi/renderers/canvas/CanvasRenderer.js index 5903827..6c6f728 100644 --- a/src/pixi/renderers/canvas/CanvasRenderer.js +++ b/src/pixi/renderers/canvas/CanvasRenderer.js @@ -203,9 +203,6 @@ */ PIXI.CanvasRenderer.prototype.render = function(stage) { - // update textures if need be - PIXI.texturesToDestroy.length = 0; - stage.updateTransform(); this.context.setTransform(1,0,0,1,0,0); diff --git a/src/pixi/renderers/webgl/WebGLRenderer.js b/src/pixi/renderers/webgl/WebGLRenderer.js index adc9a90..e9e4658 100644 --- a/src/pixi/renderers/webgl/WebGLRenderer.js +++ b/src/pixi/renderers/webgl/WebGLRenderer.js @@ -214,9 +214,6 @@ this.__stage = stage; } - // update any textures this includes uvs and uploading them to the gpu - PIXI.WebGLRenderer.updateTextures(); - // update the scene graph stage.updateTransform(); @@ -327,48 +324,6 @@ }; /** - * Updates the textures loaded into this webgl renderer - * - * @static - * @method updateTextures - * @private - */ -PIXI.WebGLRenderer.updateTextures = function() -{ - var i = 0; - - for (i = 0; i < PIXI.texturesToDestroy.length; i++) - PIXI.WebGLRenderer.destroyTexture(PIXI.texturesToDestroy[i]); - - PIXI.texturesToDestroy.length = 0; -}; - -/** - * Destroys a loaded webgl texture - * - * @method destroyTexture - * @param texture {Texture} The texture to update - * @private - */ -PIXI.WebGLRenderer.destroyTexture = function(texture) -{ - //TODO break this out into a texture manager... - - for (var i = texture._glTextures.length - 1; i >= 0; i--) - { - var glTexture = texture._glTextures[i]; - var gl = PIXI.glContexts[i]; - - if(gl && glTexture) - { - gl.deleteTexture(glTexture); - } - } - - texture._glTextures.length = 0; -}; - -/** * resizes the webGL view to the specified width and height * * @method resize @@ -394,87 +349,46 @@ }; /** - * Creates a WebGL texture + * Updates and Creates a WebGL texture * - * @method createWebGLTexture + * @method updateTexture * @param texture {Texture} the texture to render - * @param gl {webglContext} the WebGL context - * @static */ -PIXI.createWebGLTexture = function(texture, gl) +PIXI.WebGLRenderer.prototype.updateTexture = function(texture) { + if(!texture.hasLoaded)return; + var gl = this.gl; - if(texture.hasLoaded) + if(!texture._glTextures[gl.id])texture._glTextures[gl.id] = gl.createTexture(); + + gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id]); + gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultipliedAlpha); + + gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); + + // reguler... + if(!texture._powerOf2) { - texture._glTextures[gl.id] = gl.createTexture(); - - gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id]); - gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultipliedAlpha); - - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); - - // reguler... - - if(!texture._powerOf2) - { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - } - else - { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); - } - - gl.bindTexture(gl.TEXTURE_2D, null); - - texture._dirty[gl.id] = false; + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); } + else + { + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); + } + + gl.bindTexture(gl.TEXTURE_2D, null); + + texture._dirty[gl.id] = false; return texture._glTextures[gl.id]; }; /** - * Updates a WebGL texture - * - * @method updateWebGLTexture - * @param texture {Texture} the texture to update - * @param gl {webglContext} the WebGL context - * @private - */ -PIXI.updateWebGLTexture = function(texture, gl) -{ - if( texture._glTextures[gl.id] ) - { - gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id]); - gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultipliedAlpha); - - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, texture.scaleMode === PIXI.scaleModes.LINEAR ? gl.LINEAR : gl.NEAREST); - - // reguler... - - if(!texture._powerOf2) - { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - } - else - { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); - } - - texture._dirty[gl.id] = false; - } - -}; - -/** * Handles a lost webgl context * * @method handleContextLost @@ -586,5 +500,4 @@ this.renderSession = null; }; - PIXI.WebGLRenderer.glContextId = 0; diff --git a/src/pixi/renderers/webgl/utils/WebGLSpriteBatch.js b/src/pixi/renderers/webgl/utils/WebGLSpriteBatch.js index 4eebf8d..585c9cd 100755 --- a/src/pixi/renderers/webgl/utils/WebGLSpriteBatch.js +++ b/src/pixi/renderers/webgl/utils/WebGLSpriteBatch.js @@ -465,12 +465,12 @@ var gl = this.gl; // bind the current texture - gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id] || PIXI.createWebGLTexture(texture, gl)); + gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id] || this.renderSession.renderer.updateTexture(texture)); // check if a texture is dirty.. if(texture._dirty[gl.id]) { - PIXI.updateWebGLTexture(this.currentBaseTexture, gl); + this.renderSession.renderer.updateTexture(texture); } // now draw those suckas! diff --git a/src/pixi/text/Text.js b/src/pixi/text/Text.js index 3f94b5d..ee9377a 100644 --- a/src/pixi/text/Text.js +++ b/src/pixi/text/Text.js @@ -313,7 +313,8 @@ this.updateText(); this.dirty = false; - PIXI.updateWebGLTexture(this.texture.baseTexture, renderSession.gl); + // update the dirty base textures + this.texture.baseTexture.dirty(); } PIXI.Sprite.prototype._renderWebGL.call(this, renderSession); diff --git a/src/pixi/textures/BaseTexture.js b/src/pixi/textures/BaseTexture.js index 86c9179..3e35ef7 100644 --- a/src/pixi/textures/BaseTexture.js +++ b/src/pixi/textures/BaseTexture.js @@ -3,7 +3,6 @@ */ PIXI.BaseTextureCache = {}; -PIXI.texturesToDestroy = []; PIXI.BaseTextureCacheIdGenerator = 0; @@ -108,10 +107,7 @@ scope.width = scope.source.naturalWidth || scope.source.width; scope.height = scope.source.naturalHeight || scope.source.height; - for (var i = 0; i < scope._glTextures.length; i++) - { - scope._dirty[i] = true; - } + scope.dirty(); // add it to somewhere... scope.dispatchEvent( { type: 'loaded', content: scope } ); @@ -150,7 +146,20 @@ delete PIXI.BaseTextureCache[this.source._pixiId]; } this.source = null; - PIXI.texturesToDestroy.push(this); + + // delete the webGL textures if any. + for (var i = this._glTextures.length - 1; i >= 0; i--) + { + var glTexture = this._glTextures[i]; + var gl = PIXI.glContexts[i]; + + if(gl && glTexture) + { + gl.deleteTexture(glTexture); + } + } + + this._glTextures.length = 0; }; /** @@ -166,6 +175,14 @@ this.source.src = newSrc; }; +PIXI.BaseTexture.prototype.dirty = function() +{ + for (var i = 0; i < this._glTextures.length; i++) + { + this._dirty[i] = true; + } +}; + /** * Helper function that returns a base texture based on an image url * If the image is not in the base texture cache it will be created and loaded diff --git a/src/pixi/textures/RenderTexture.js b/src/pixi/textures/RenderTexture.js index 7b3ba85..e0b2f96 100644 --- a/src/pixi/textures/RenderTexture.js +++ b/src/pixi/textures/RenderTexture.js @@ -222,8 +222,6 @@ if(clear)this.textureBuffer.clear(); - PIXI.WebGLRenderer.updateTextures(); - this.renderer.spriteBatch.dirty = true; this.renderer.renderDisplayObject(displayObject, this.projection, this.textureBuffer.frameBuffer); diff --git a/test/unit/pixi/textures/BaseTexture.js b/test/unit/pixi/textures/BaseTexture.js index a902957..502b724 100644 --- a/test/unit/pixi/textures/BaseTexture.js +++ b/test/unit/pixi/textures/BaseTexture.js @@ -7,6 +7,5 @@ it('Module exists', function () { expect(BaseTexture).to.be.a('function'); expect(PIXI).to.have.property('BaseTextureCache').and.to.be.an('object'); - expect(PIXI).to.have.deep.property('texturesToDestroy.length', 0); }); });