diff --git a/src/core/renderers/webgl/filters/extractUniformsFromSrc.js b/src/core/renderers/webgl/filters/extractUniformsFromSrc.js index d78a0b1..4893214 100644 --- a/src/core/renderers/webgl/filters/extractUniformsFromSrc.js +++ b/src/core/renderers/webgl/filters/extractUniformsFromSrc.js @@ -12,7 +12,7 @@ function extractUniformsFromString(string) { - const maskRegex = new RegExp('^(projectionMatrix|uSampler|filterArea)$'); + const maskRegex = new RegExp('^(projectionMatrix|uSampler|filterArea|filterClamp)$'); const uniforms = {}; let nameSplit; diff --git a/src/core/renderers/webgl/filters/extractUniformsFromSrc.js b/src/core/renderers/webgl/filters/extractUniformsFromSrc.js index d78a0b1..4893214 100644 --- a/src/core/renderers/webgl/filters/extractUniformsFromSrc.js +++ b/src/core/renderers/webgl/filters/extractUniformsFromSrc.js @@ -12,7 +12,7 @@ function extractUniformsFromString(string) { - const maskRegex = new RegExp('^(projectionMatrix|uSampler|filterArea)$'); + const maskRegex = new RegExp('^(projectionMatrix|uSampler|filterArea|filterClamp)$'); const uniforms = {}; let nameSplit; diff --git a/src/core/renderers/webgl/managers/FilterManager.js b/src/core/renderers/webgl/managers/FilterManager.js index 39e4cc0..38d84bd 100644 --- a/src/core/renderers/webgl/managers/FilterManager.js +++ b/src/core/renderers/webgl/managers/FilterManager.js @@ -291,11 +291,14 @@ let textureCount = 1; let currentState; - if (uniforms.filterArea) + // filterArea and filterClamp that are handled by FilterManager directly + // they must not appear in uniformData + + if (shader.uniforms.filterArea) { currentState = this.filterData.stack[this.filterData.index]; - const filterArea = uniforms.filterArea; + const filterArea = shader.uniforms.filterArea; filterArea[0] = currentState.renderTarget.size.width; filterArea[1] = currentState.renderTarget.size.height; @@ -307,11 +310,11 @@ // use this to clamp displaced texture coords so they belong to filterArea // see displacementFilter fragment shader for an example - if (uniforms.filterClamp) + if (shader.uniforms.filterClamp) { currentState = this.filterData.stack[this.filterData.index]; - const filterClamp = uniforms.filterClamp; + const filterClamp = shader.uniforms.filterClamp; filterClamp[0] = 0; filterClamp[1] = 0; diff --git a/src/core/renderers/webgl/filters/extractUniformsFromSrc.js b/src/core/renderers/webgl/filters/extractUniformsFromSrc.js index d78a0b1..4893214 100644 --- a/src/core/renderers/webgl/filters/extractUniformsFromSrc.js +++ b/src/core/renderers/webgl/filters/extractUniformsFromSrc.js @@ -12,7 +12,7 @@ function extractUniformsFromString(string) { - const maskRegex = new RegExp('^(projectionMatrix|uSampler|filterArea)$'); + const maskRegex = new RegExp('^(projectionMatrix|uSampler|filterArea|filterClamp)$'); const uniforms = {}; let nameSplit; diff --git a/src/core/renderers/webgl/managers/FilterManager.js b/src/core/renderers/webgl/managers/FilterManager.js index 39e4cc0..38d84bd 100644 --- a/src/core/renderers/webgl/managers/FilterManager.js +++ b/src/core/renderers/webgl/managers/FilterManager.js @@ -291,11 +291,14 @@ let textureCount = 1; let currentState; - if (uniforms.filterArea) + // filterArea and filterClamp that are handled by FilterManager directly + // they must not appear in uniformData + + if (shader.uniforms.filterArea) { currentState = this.filterData.stack[this.filterData.index]; - const filterArea = uniforms.filterArea; + const filterArea = shader.uniforms.filterArea; filterArea[0] = currentState.renderTarget.size.width; filterArea[1] = currentState.renderTarget.size.height; @@ -307,11 +310,11 @@ // use this to clamp displaced texture coords so they belong to filterArea // see displacementFilter fragment shader for an example - if (uniforms.filterClamp) + if (shader.uniforms.filterClamp) { currentState = this.filterData.stack[this.filterData.index]; - const filterClamp = uniforms.filterClamp; + const filterClamp = shader.uniforms.filterClamp; filterClamp[0] = 0; filterClamp[1] = 0; diff --git a/test/core/filters.js b/test/core/filters.js new file mode 100644 index 0000000..df459f6 --- /dev/null +++ b/test/core/filters.js @@ -0,0 +1,21 @@ +'use strict'; + +describe('PIXI.filters', function () +{ + it('should correctly form uniformData', function () + { + const sprite = new PIXI.Sprite(PIXI.Texture.EMPTY); + const displ = new PIXI.filters.DisplacementFilter(sprite); + + expect(!!displ.uniformData.scale).to.be.true; + expect(!!displ.uniformData.filterMatrix).to.be.true; + expect(!!displ.uniformData.mapSampler).to.be.true; + // it does have filterClamp, but it is handled by FilterManager + expect(!!displ.uniformData.filterClamp).to.be.false; + + const fxaa = new PIXI.filters.FXAAFilter(); + + // it does have filterArea, but it is handled by FilterManager + expect(!!fxaa.uniformData.filterArea).to.be.false; + }); +}); diff --git a/src/core/renderers/webgl/filters/extractUniformsFromSrc.js b/src/core/renderers/webgl/filters/extractUniformsFromSrc.js index d78a0b1..4893214 100644 --- a/src/core/renderers/webgl/filters/extractUniformsFromSrc.js +++ b/src/core/renderers/webgl/filters/extractUniformsFromSrc.js @@ -12,7 +12,7 @@ function extractUniformsFromString(string) { - const maskRegex = new RegExp('^(projectionMatrix|uSampler|filterArea)$'); + const maskRegex = new RegExp('^(projectionMatrix|uSampler|filterArea|filterClamp)$'); const uniforms = {}; let nameSplit; diff --git a/src/core/renderers/webgl/managers/FilterManager.js b/src/core/renderers/webgl/managers/FilterManager.js index 39e4cc0..38d84bd 100644 --- a/src/core/renderers/webgl/managers/FilterManager.js +++ b/src/core/renderers/webgl/managers/FilterManager.js @@ -291,11 +291,14 @@ let textureCount = 1; let currentState; - if (uniforms.filterArea) + // filterArea and filterClamp that are handled by FilterManager directly + // they must not appear in uniformData + + if (shader.uniforms.filterArea) { currentState = this.filterData.stack[this.filterData.index]; - const filterArea = uniforms.filterArea; + const filterArea = shader.uniforms.filterArea; filterArea[0] = currentState.renderTarget.size.width; filterArea[1] = currentState.renderTarget.size.height; @@ -307,11 +310,11 @@ // use this to clamp displaced texture coords so they belong to filterArea // see displacementFilter fragment shader for an example - if (uniforms.filterClamp) + if (shader.uniforms.filterClamp) { currentState = this.filterData.stack[this.filterData.index]; - const filterClamp = uniforms.filterClamp; + const filterClamp = shader.uniforms.filterClamp; filterClamp[0] = 0; filterClamp[1] = 0; diff --git a/test/core/filters.js b/test/core/filters.js new file mode 100644 index 0000000..df459f6 --- /dev/null +++ b/test/core/filters.js @@ -0,0 +1,21 @@ +'use strict'; + +describe('PIXI.filters', function () +{ + it('should correctly form uniformData', function () + { + const sprite = new PIXI.Sprite(PIXI.Texture.EMPTY); + const displ = new PIXI.filters.DisplacementFilter(sprite); + + expect(!!displ.uniformData.scale).to.be.true; + expect(!!displ.uniformData.filterMatrix).to.be.true; + expect(!!displ.uniformData.mapSampler).to.be.true; + // it does have filterClamp, but it is handled by FilterManager + expect(!!displ.uniformData.filterClamp).to.be.false; + + const fxaa = new PIXI.filters.FXAAFilter(); + + // it does have filterArea, but it is handled by FilterManager + expect(!!fxaa.uniformData.filterArea).to.be.false; + }); +}); diff --git a/test/core/index.js b/test/core/index.js index 25dec64..8530131 100755 --- a/test/core/index.js +++ b/test/core/index.js @@ -27,3 +27,4 @@ require('./WebGLRenderer'); require('./Ellipse'); require('./Texture'); +require('./filters');