diff --git a/src/core/renderers/webgl/filters/extractUniformsFromSrc.js b/src/core/renderers/webgl/filters/extractUniformsFromSrc.js index a2a6bb2..25680e0 100644 --- a/src/core/renderers/webgl/filters/extractUniformsFromSrc.js +++ b/src/core/renderers/webgl/filters/extractUniformsFromSrc.js @@ -1,4 +1,5 @@ var defaultValue = require('pixi-gl-core/lib/shader/defaultValue'); +var mapSize = require('pixi-gl-core/lib/shader/mapSize'); function extractUniformsFromSrc(vertexSrc, fragmentSrc, mask) { @@ -31,11 +32,12 @@ var splitLine = line.split(' '); var type = splitLine[1]; var name = splitLine[2]; + var size = mapSize(type); if(!name.match(maskRegex)) { uniforms[name] = { - value:defaultValue(type), + value:defaultValue(type, size), name:name, type:type } diff --git a/src/core/renderers/webgl/filters/extractUniformsFromSrc.js b/src/core/renderers/webgl/filters/extractUniformsFromSrc.js index a2a6bb2..25680e0 100644 --- a/src/core/renderers/webgl/filters/extractUniformsFromSrc.js +++ b/src/core/renderers/webgl/filters/extractUniformsFromSrc.js @@ -1,4 +1,5 @@ var defaultValue = require('pixi-gl-core/lib/shader/defaultValue'); +var mapSize = require('pixi-gl-core/lib/shader/mapSize'); function extractUniformsFromSrc(vertexSrc, fragmentSrc, mask) { @@ -31,11 +32,12 @@ var splitLine = line.split(' '); var type = splitLine[1]; var name = splitLine[2]; + var size = mapSize(type); if(!name.match(maskRegex)) { uniforms[name] = { - value:defaultValue(type), + value:defaultValue(type, size), name:name, type:type } diff --git a/src/core/renderers/webgl/managers/FilterManager.js b/src/core/renderers/webgl/managers/FilterManager.js index 7be6015..2e4cca2 100644 --- a/src/core/renderers/webgl/managers/FilterManager.js +++ b/src/core/renderers/webgl/managers/FilterManager.js @@ -1,3 +1,4 @@ + var WebGLManager = require('./WebGLManager'), RenderTarget = require('../utils/RenderTarget'), CONST = require('../../../const'), @@ -64,7 +65,7 @@ sourceFrame.y = targetBounds.y | 0; sourceFrame.width = targetBounds.width | 0; sourceFrame.height = targetBounds.height | 0; - sourceFrame.pad(4 / resolution); + // sourceFrame.pad(4 / resolution); sourceFrame.fit(this.stack[0].destinationFrame); destinationFrame.width = sourceFrame.width; @@ -82,7 +83,7 @@ renderer.bindRenderTarget(renderTarget, destinationFrame, sourceFrame); // clear the renderTarget - renderer.clear(); + renderer.clear()//[0.5,0.5,0.5, 1.0]); } FilterManager.prototype.popFilter = function() @@ -98,7 +99,7 @@ if(filters.length === 1) { - filters[0].apply(this, currentState.renderTarget, lastState.renderTarget, true); + filters[0].apply(this, currentState.renderTarget, lastState.renderTarget, false); FilterManager.freePotRenderTarget(currentState.renderTarget); } else @@ -116,7 +117,7 @@ flop = t; }; - filters[i].apply(this, flip, lastState.renderTarget, true); + filters[i].apply(this, flip, lastState.renderTarget, false); FilterManager.freePotRenderTarget(flip); FilterManager.freePotRenderTarget(flop); @@ -147,6 +148,9 @@ { shader = filter.glShaders[gl.id] = new Shader(gl, filter.vertexSrc, filter.fragmentSrc); } + + //TODO - this only needs to be done once? + this.quad.initVao(shader); } renderer.bindRenderTarget(output, lastState.destinationFrame, lastState.sourceFrame); @@ -219,6 +223,13 @@ } } + +FilterManager.prototype.getPotRenderTarget = function() +{ + var currentState = this.stack[this.stackIndex]; + return FilterManager.getPotRenderTarget(renderer.gl, currentState.sourceFrame.width, currentState.sourceFrame.height, 1); +} + /* * Calculates the mapped matrix * @param filterArea {Rectangle} The filter area @@ -237,7 +248,7 @@ { var currentState = this.stack[this.stackIndex]; - + return filterTransforms.calculateNormalisedScreenSpaceMatrix(outputMatrix, currentState.sourceFrame, currentState.renderTarget.size, currentState.destinationFrame); } @@ -264,6 +275,7 @@ var key = ((minWidth & 0xFFFF) << 16) | ( minHeight & 0xFFFF); + // console.log(minWidth + " " + minHeight) if(!FilterManager.pool[key])FilterManager.pool[key] = []; var renderTarget = FilterManager.pool[key].pop() || new RenderTarget(gl, minWidth, minHeight, null, 1); diff --git a/src/core/renderers/webgl/filters/extractUniformsFromSrc.js b/src/core/renderers/webgl/filters/extractUniformsFromSrc.js index a2a6bb2..25680e0 100644 --- a/src/core/renderers/webgl/filters/extractUniformsFromSrc.js +++ b/src/core/renderers/webgl/filters/extractUniformsFromSrc.js @@ -1,4 +1,5 @@ var defaultValue = require('pixi-gl-core/lib/shader/defaultValue'); +var mapSize = require('pixi-gl-core/lib/shader/mapSize'); function extractUniformsFromSrc(vertexSrc, fragmentSrc, mask) { @@ -31,11 +32,12 @@ var splitLine = line.split(' '); var type = splitLine[1]; var name = splitLine[2]; + var size = mapSize(type); if(!name.match(maskRegex)) { uniforms[name] = { - value:defaultValue(type), + value:defaultValue(type, size), name:name, type:type } diff --git a/src/core/renderers/webgl/managers/FilterManager.js b/src/core/renderers/webgl/managers/FilterManager.js index 7be6015..2e4cca2 100644 --- a/src/core/renderers/webgl/managers/FilterManager.js +++ b/src/core/renderers/webgl/managers/FilterManager.js @@ -1,3 +1,4 @@ + var WebGLManager = require('./WebGLManager'), RenderTarget = require('../utils/RenderTarget'), CONST = require('../../../const'), @@ -64,7 +65,7 @@ sourceFrame.y = targetBounds.y | 0; sourceFrame.width = targetBounds.width | 0; sourceFrame.height = targetBounds.height | 0; - sourceFrame.pad(4 / resolution); + // sourceFrame.pad(4 / resolution); sourceFrame.fit(this.stack[0].destinationFrame); destinationFrame.width = sourceFrame.width; @@ -82,7 +83,7 @@ renderer.bindRenderTarget(renderTarget, destinationFrame, sourceFrame); // clear the renderTarget - renderer.clear(); + renderer.clear()//[0.5,0.5,0.5, 1.0]); } FilterManager.prototype.popFilter = function() @@ -98,7 +99,7 @@ if(filters.length === 1) { - filters[0].apply(this, currentState.renderTarget, lastState.renderTarget, true); + filters[0].apply(this, currentState.renderTarget, lastState.renderTarget, false); FilterManager.freePotRenderTarget(currentState.renderTarget); } else @@ -116,7 +117,7 @@ flop = t; }; - filters[i].apply(this, flip, lastState.renderTarget, true); + filters[i].apply(this, flip, lastState.renderTarget, false); FilterManager.freePotRenderTarget(flip); FilterManager.freePotRenderTarget(flop); @@ -147,6 +148,9 @@ { shader = filter.glShaders[gl.id] = new Shader(gl, filter.vertexSrc, filter.fragmentSrc); } + + //TODO - this only needs to be done once? + this.quad.initVao(shader); } renderer.bindRenderTarget(output, lastState.destinationFrame, lastState.sourceFrame); @@ -219,6 +223,13 @@ } } + +FilterManager.prototype.getPotRenderTarget = function() +{ + var currentState = this.stack[this.stackIndex]; + return FilterManager.getPotRenderTarget(renderer.gl, currentState.sourceFrame.width, currentState.sourceFrame.height, 1); +} + /* * Calculates the mapped matrix * @param filterArea {Rectangle} The filter area @@ -237,7 +248,7 @@ { var currentState = this.stack[this.stackIndex]; - + return filterTransforms.calculateNormalisedScreenSpaceMatrix(outputMatrix, currentState.sourceFrame, currentState.renderTarget.size, currentState.destinationFrame); } @@ -264,6 +275,7 @@ var key = ((minWidth & 0xFFFF) << 16) | ( minHeight & 0xFFFF); + // console.log(minWidth + " " + minHeight) if(!FilterManager.pool[key])FilterManager.pool[key] = []; var renderTarget = FilterManager.pool[key].pop() || new RenderTarget(gl, minWidth, minHeight, null, 1); diff --git a/src/core/renderers/webgl/utils/Quad.js b/src/core/renderers/webgl/utils/Quad.js index 5f07564..fc39f7f 100644 --- a/src/core/renderers/webgl/utils/Quad.js +++ b/src/core/renderers/webgl/utils/Quad.js @@ -66,15 +66,20 @@ this.indexBuffer = glCore.GLBuffer.createIndexBuffer(gl, this.indices, gl.STATIC_DRAW); this.vao = new glCore.VertexArrayObject(gl) - .addIndex(this.indexBuffer) - .addAttribute(this.vertexBuffer, {type:'vec2', size:2, location:0}, gl.FLOAT, false, 4 * 4, 0) - .addAttribute(this.vertexBuffer, {type:'vec2', size:2, location:1}, gl.FLOAT, false, 4 * 4, 2 * 4) - + } Quad.prototype.constructor = Quad; +Quad.prototype.initVao = function(shader) +{ + this.vao.clear() + .addIndex(this.indexBuffer) + .addAttribute(this.vertexBuffer, shader.attributes.aVertexPosition, gl.FLOAT, false, 4 * 4, 0) + .addAttribute(this.vertexBuffer, shader.attributes.aTextureCoord, gl.FLOAT, false, 4 * 4, 2 * 4) +} + /** * Maps two Rectangle to the quad * @param rect {PIXI.Rectangle} the first rectangle