diff --git a/src/core/renderers/webgl/managers/FilterManager.js b/src/core/renderers/webgl/managers/FilterManager.js index 08a45b6..9b51961 100644 --- a/src/core/renderers/webgl/managers/FilterManager.js +++ b/src/core/renderers/webgl/managers/FilterManager.js @@ -32,14 +32,6 @@ // know about sprites! this.quad = new Quad(this.gl, renderer.state.attribState); - var rootState = new FilterState(); - rootState.sourceFrame = rootState.destinationFrame = this.renderer.rootRenderTarget.size; - rootState.renderTarget = renderer.rootRenderTarget; - - this.stack = [rootState]; - - this.stackIndex = 0; - this.shaderCache = {}; // todo add default! this.pool = {}; @@ -53,11 +45,28 @@ { var renderer = this.renderer; + var filterData = this.renderer._activeRenderTarget.filterStack; + + if(!filterData) + { + // add new stack + var filterState = new FilterState(); + filterState.sourceFrame = filterState.destinationFrame = this.renderer._activeRenderTarget.size; + filterState.renderTarget = renderer._activeRenderTarget; + + this.renderer._activeRenderTarget.filterData = filterData = { + index:0, + stack:[filterState] + }; + } + + this.filterData = filterData; + // get the current filter state.. - var currentState = this.stack[++this.stackIndex]; + var currentState = filterData.stack[++filterData.index]; if(!currentState) { - currentState = this.stack[this.stackIndex] = new FilterState(); + currentState = filterData.stack[filterData.index] = new FilterState(); } // for now we go off the filter of the first resolution.. @@ -73,7 +82,7 @@ sourceFrame.width = (((targetBounds.width + padding*2) * resolution) | 0) / resolution; sourceFrame.height = (((targetBounds.height + padding*2)* resolution) | 0) / resolution; - sourceFrame.fit(this.stack[0].destinationFrame); + sourceFrame.fit(filterData.stack[0].destinationFrame); destinationFrame.width = sourceFrame.width; destinationFrame.height = sourceFrame.height; @@ -97,8 +106,10 @@ FilterManager.prototype.popFilter = function() { - var lastState = this.stack[this.stackIndex-1]; - var currentState = this.stack[this.stackIndex]; + var filterData = this.filterData; + + var lastState = filterData.stack[filterData.index-1]; + var currentState = filterData.stack[filterData.index]; this.quad.map(currentState.renderTarget.size, currentState.sourceFrame).upload(); @@ -130,7 +141,7 @@ this.freePotRenderTarget(flop); } - this.stackIndex--; + filterData.index--; }; FilterManager.prototype.applyFilter = function (filter, input, output, clear) @@ -202,7 +213,7 @@ if(shader.uniforms.data.filterArea) { - var currentState = this.stack[this.stackIndex]; + var currentState = this.filterData.stack[this.filterData.index]; var filterArea = shader.uniforms.filterArea; filterArea[0] = currentState.renderTarget.size.width; @@ -268,7 +279,7 @@ FilterManager.prototype.getRenderTarget = function() { - var currentState = this.stack[this.stackIndex]; + var currentState = this.filterData.stack[this.filterData.index]; var renderTarget = this.getPotRenderTarget(this.renderer.gl, currentState.sourceFrame.width, currentState.sourceFrame.height, currentState.resolution); renderTarget.setFrame(currentState.destinationFrame, currentState.sourceFrame); @@ -290,13 +301,13 @@ // thia returns a matrix that will normalise map filter cords in the filter to screen space FilterManager.prototype.calculateScreenSpaceMatrix = function (outputMatrix) { - var currentState = this.stack[this.stackIndex]; + var currentState = this.filterData.stack[this.filterData.index]; return filterTransforms.calculateScreenSpaceMatrix(outputMatrix, currentState.sourceFrame, currentState.renderTarget.size); }; FilterManager.prototype.calculateNormalisedScreenSpaceMatrix = function (outputMatrix) { - var currentState = this.stack[this.stackIndex]; + var currentState = this.filterData.stack[this.filterData.index]; @@ -306,7 +317,7 @@ // this will map the filter coord so that a texture can be used based on the transform of a sprite FilterManager.prototype.calculateSpriteMatrix = function (outputMatrix, sprite) { - var currentState = this.stack[this.stackIndex]; + var currentState = this.filterData.stack[this.filterData.index]; return filterTransforms.calculateSpriteMatrix(outputMatrix, currentState.sourceFrame, currentState.renderTarget.size, sprite); }; diff --git a/src/core/renderers/webgl/managers/FilterManager.js b/src/core/renderers/webgl/managers/FilterManager.js index 08a45b6..9b51961 100644 --- a/src/core/renderers/webgl/managers/FilterManager.js +++ b/src/core/renderers/webgl/managers/FilterManager.js @@ -32,14 +32,6 @@ // know about sprites! this.quad = new Quad(this.gl, renderer.state.attribState); - var rootState = new FilterState(); - rootState.sourceFrame = rootState.destinationFrame = this.renderer.rootRenderTarget.size; - rootState.renderTarget = renderer.rootRenderTarget; - - this.stack = [rootState]; - - this.stackIndex = 0; - this.shaderCache = {}; // todo add default! this.pool = {}; @@ -53,11 +45,28 @@ { var renderer = this.renderer; + var filterData = this.renderer._activeRenderTarget.filterStack; + + if(!filterData) + { + // add new stack + var filterState = new FilterState(); + filterState.sourceFrame = filterState.destinationFrame = this.renderer._activeRenderTarget.size; + filterState.renderTarget = renderer._activeRenderTarget; + + this.renderer._activeRenderTarget.filterData = filterData = { + index:0, + stack:[filterState] + }; + } + + this.filterData = filterData; + // get the current filter state.. - var currentState = this.stack[++this.stackIndex]; + var currentState = filterData.stack[++filterData.index]; if(!currentState) { - currentState = this.stack[this.stackIndex] = new FilterState(); + currentState = filterData.stack[filterData.index] = new FilterState(); } // for now we go off the filter of the first resolution.. @@ -73,7 +82,7 @@ sourceFrame.width = (((targetBounds.width + padding*2) * resolution) | 0) / resolution; sourceFrame.height = (((targetBounds.height + padding*2)* resolution) | 0) / resolution; - sourceFrame.fit(this.stack[0].destinationFrame); + sourceFrame.fit(filterData.stack[0].destinationFrame); destinationFrame.width = sourceFrame.width; destinationFrame.height = sourceFrame.height; @@ -97,8 +106,10 @@ FilterManager.prototype.popFilter = function() { - var lastState = this.stack[this.stackIndex-1]; - var currentState = this.stack[this.stackIndex]; + var filterData = this.filterData; + + var lastState = filterData.stack[filterData.index-1]; + var currentState = filterData.stack[filterData.index]; this.quad.map(currentState.renderTarget.size, currentState.sourceFrame).upload(); @@ -130,7 +141,7 @@ this.freePotRenderTarget(flop); } - this.stackIndex--; + filterData.index--; }; FilterManager.prototype.applyFilter = function (filter, input, output, clear) @@ -202,7 +213,7 @@ if(shader.uniforms.data.filterArea) { - var currentState = this.stack[this.stackIndex]; + var currentState = this.filterData.stack[this.filterData.index]; var filterArea = shader.uniforms.filterArea; filterArea[0] = currentState.renderTarget.size.width; @@ -268,7 +279,7 @@ FilterManager.prototype.getRenderTarget = function() { - var currentState = this.stack[this.stackIndex]; + var currentState = this.filterData.stack[this.filterData.index]; var renderTarget = this.getPotRenderTarget(this.renderer.gl, currentState.sourceFrame.width, currentState.sourceFrame.height, currentState.resolution); renderTarget.setFrame(currentState.destinationFrame, currentState.sourceFrame); @@ -290,13 +301,13 @@ // thia returns a matrix that will normalise map filter cords in the filter to screen space FilterManager.prototype.calculateScreenSpaceMatrix = function (outputMatrix) { - var currentState = this.stack[this.stackIndex]; + var currentState = this.filterData.stack[this.filterData.index]; return filterTransforms.calculateScreenSpaceMatrix(outputMatrix, currentState.sourceFrame, currentState.renderTarget.size); }; FilterManager.prototype.calculateNormalisedScreenSpaceMatrix = function (outputMatrix) { - var currentState = this.stack[this.stackIndex]; + var currentState = this.filterData.stack[this.filterData.index]; @@ -306,7 +317,7 @@ // this will map the filter coord so that a texture can be used based on the transform of a sprite FilterManager.prototype.calculateSpriteMatrix = function (outputMatrix, sprite) { - var currentState = this.stack[this.stackIndex]; + var currentState = this.filterData.stack[this.filterData.index]; return filterTransforms.calculateSpriteMatrix(outputMatrix, currentState.sourceFrame, currentState.renderTarget.size, sprite); }; diff --git a/src/core/renderers/webgl/utils/RenderTarget.js b/src/core/renderers/webgl/utils/RenderTarget.js index d8349cf..da22e25 100644 --- a/src/core/renderers/webgl/utils/RenderTarget.js +++ b/src/core/renderers/webgl/utils/RenderTarget.js @@ -113,14 +113,7 @@ * * @member {object[]} */ - this.filterStack = [ - { - renderTarget:this, - filter:[], - bounds:this.size - } - ]; - + this.filterData = null; /** * The scale mode.