diff --git a/src/core/primitives/GraphicsRenderer.js b/src/core/primitives/GraphicsRenderer.js index 8e8a5e3..bfc18ef 100644 --- a/src/core/primitives/GraphicsRenderer.js +++ b/src/core/primitives/GraphicsRenderer.js @@ -3,7 +3,7 @@ CONST = require('../const'), ObjectRenderer = require('../renderers/webgl/utils/ObjectRenderer'), WebGLRenderer = require('../renderers/webgl/WebGLRenderer'), - WebGLGraphicsData = require('./GraphicsData'); + WebGLGraphicsData = require('./WebGLGraphicsData'); /** * Renders the graphics object. @@ -66,12 +66,12 @@ { webGLData = webGL.data[i]; - renderer.stencilManager.pushStencil(graphics, webGLData, renderer); + renderer.maskManager.pushStencil(graphics, webGLData, renderer); // render quad.. gl.drawElements(gl.TRIANGLE_FAN, 4, gl.UNSIGNED_SHORT, ( webGLData.indices.length - 4 ) * 2 ); - renderer.stencilManager.popStencil(graphics, webGLData, renderer); + renderer.maskManager.popStencil(graphics, webGLData, renderer); } else { diff --git a/src/core/primitives/GraphicsRenderer.js b/src/core/primitives/GraphicsRenderer.js index 8e8a5e3..bfc18ef 100644 --- a/src/core/primitives/GraphicsRenderer.js +++ b/src/core/primitives/GraphicsRenderer.js @@ -3,7 +3,7 @@ CONST = require('../const'), ObjectRenderer = require('../renderers/webgl/utils/ObjectRenderer'), WebGLRenderer = require('../renderers/webgl/WebGLRenderer'), - WebGLGraphicsData = require('./GraphicsData'); + WebGLGraphicsData = require('./WebGLGraphicsData'); /** * Renders the graphics object. @@ -66,12 +66,12 @@ { webGLData = webGL.data[i]; - renderer.stencilManager.pushStencil(graphics, webGLData, renderer); + renderer.maskManager.pushStencil(graphics, webGLData, renderer); // render quad.. gl.drawElements(gl.TRIANGLE_FAN, 4, gl.UNSIGNED_SHORT, ( webGLData.indices.length - 4 ) * 2 ); - renderer.stencilManager.popStencil(graphics, webGLData, renderer); + renderer.maskManager.popStencil(graphics, webGLData, renderer); } else { diff --git a/src/core/primitives/WebGLGraphicsData.js b/src/core/primitives/WebGLGraphicsData.js new file mode 100755 index 0000000..41be102 --- /dev/null +++ b/src/core/primitives/WebGLGraphicsData.js @@ -0,0 +1,48 @@ +/** + * @class + * @private + */ +function WebGLGraphicsData(gl) { + this.gl = gl; + + //TODO does this need to be split before uploding?? + this.color = [0,0,0]; // color split! + this.points = []; + this.indices = []; + this.buffer = gl.createBuffer(); + this.indexBuffer = gl.createBuffer(); + this.mode = 1; + this.alpha = 1; + this.dirty = true; +} + +WebGLGraphicsData.prototype.constructor = WebGLGraphicsData; +module.exports = WebGLGraphicsData; + +/** + * + */ +WebGLGraphicsData.prototype.reset = function () { + this.points = []; + this.indices = []; +}; + +/** + * + */ +WebGLGraphicsData.prototype.upload = function () { + var gl = this.gl; + +// this.lastIndex = graphics.graphicsData.length; + this.glPoints = new Float32Array(this.points); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer); + gl.bufferData(gl.ARRAY_BUFFER, this.glPoints, gl.STATIC_DRAW); + + this.glIndicies = new Uint16Array(this.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.glIndicies, gl.STATIC_DRAW); + + this.dirty = false; +}; diff --git a/src/core/primitives/GraphicsRenderer.js b/src/core/primitives/GraphicsRenderer.js index 8e8a5e3..bfc18ef 100644 --- a/src/core/primitives/GraphicsRenderer.js +++ b/src/core/primitives/GraphicsRenderer.js @@ -3,7 +3,7 @@ CONST = require('../const'), ObjectRenderer = require('../renderers/webgl/utils/ObjectRenderer'), WebGLRenderer = require('../renderers/webgl/WebGLRenderer'), - WebGLGraphicsData = require('./GraphicsData'); + WebGLGraphicsData = require('./WebGLGraphicsData'); /** * Renders the graphics object. @@ -66,12 +66,12 @@ { webGLData = webGL.data[i]; - renderer.stencilManager.pushStencil(graphics, webGLData, renderer); + renderer.maskManager.pushStencil(graphics, webGLData, renderer); // render quad.. gl.drawElements(gl.TRIANGLE_FAN, 4, gl.UNSIGNED_SHORT, ( webGLData.indices.length - 4 ) * 2 ); - renderer.stencilManager.popStencil(graphics, webGLData, renderer); + renderer.maskManager.popStencil(graphics, webGLData, renderer); } else { diff --git a/src/core/primitives/WebGLGraphicsData.js b/src/core/primitives/WebGLGraphicsData.js new file mode 100755 index 0000000..41be102 --- /dev/null +++ b/src/core/primitives/WebGLGraphicsData.js @@ -0,0 +1,48 @@ +/** + * @class + * @private + */ +function WebGLGraphicsData(gl) { + this.gl = gl; + + //TODO does this need to be split before uploding?? + this.color = [0,0,0]; // color split! + this.points = []; + this.indices = []; + this.buffer = gl.createBuffer(); + this.indexBuffer = gl.createBuffer(); + this.mode = 1; + this.alpha = 1; + this.dirty = true; +} + +WebGLGraphicsData.prototype.constructor = WebGLGraphicsData; +module.exports = WebGLGraphicsData; + +/** + * + */ +WebGLGraphicsData.prototype.reset = function () { + this.points = []; + this.indices = []; +}; + +/** + * + */ +WebGLGraphicsData.prototype.upload = function () { + var gl = this.gl; + +// this.lastIndex = graphics.graphicsData.length; + this.glPoints = new Float32Array(this.points); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer); + gl.bufferData(gl.ARRAY_BUFFER, this.glPoints, gl.STATIC_DRAW); + + this.glIndicies = new Uint16Array(this.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.glIndicies, gl.STATIC_DRAW); + + this.dirty = false; +}; diff --git a/src/core/renderers/webgl/WebGLRenderer.js b/src/core/renderers/webgl/WebGLRenderer.js index f84eb31..026ad82 100644 --- a/src/core/renderers/webgl/WebGLRenderer.js +++ b/src/core/renderers/webgl/WebGLRenderer.js @@ -2,7 +2,6 @@ WebGLShaderManager = require('./managers/WebGLShaderManager'), WebGLMaskManager = require('./managers/WebGLMaskManager'), WebGLFilterManager = require('./managers/WebGLFilterManager'), - WebGLStencilManager = require('./managers/WebGLStencilManager'), WebGLBlendModeManager = require('./managers/WebGLBlendModeManager'), ObjectRenderer = require('./utils/ObjectRenderer'), math = require('../../math'), @@ -207,12 +206,6 @@ this.filterManager = new WebGLFilterManager(this); /** - * Manages the stencil buffer - * @member {WebGLStencilManager} - */ - this.stencilManager = new WebGLStencilManager(this); - - /** * Manages the blendModes * @member {WebGLBlendModeManager} */ @@ -583,7 +576,6 @@ this.shaderManager = null; this.maskManager = null; this.filterManager = null; - this.stencilManager = null; this.blendModeManager = null; this.blendModes = null; diff --git a/src/core/primitives/GraphicsRenderer.js b/src/core/primitives/GraphicsRenderer.js index 8e8a5e3..bfc18ef 100644 --- a/src/core/primitives/GraphicsRenderer.js +++ b/src/core/primitives/GraphicsRenderer.js @@ -3,7 +3,7 @@ CONST = require('../const'), ObjectRenderer = require('../renderers/webgl/utils/ObjectRenderer'), WebGLRenderer = require('../renderers/webgl/WebGLRenderer'), - WebGLGraphicsData = require('./GraphicsData'); + WebGLGraphicsData = require('./WebGLGraphicsData'); /** * Renders the graphics object. @@ -66,12 +66,12 @@ { webGLData = webGL.data[i]; - renderer.stencilManager.pushStencil(graphics, webGLData, renderer); + renderer.maskManager.pushStencil(graphics, webGLData, renderer); // render quad.. gl.drawElements(gl.TRIANGLE_FAN, 4, gl.UNSIGNED_SHORT, ( webGLData.indices.length - 4 ) * 2 ); - renderer.stencilManager.popStencil(graphics, webGLData, renderer); + renderer.maskManager.popStencil(graphics, webGLData, renderer); } else { diff --git a/src/core/primitives/WebGLGraphicsData.js b/src/core/primitives/WebGLGraphicsData.js new file mode 100755 index 0000000..41be102 --- /dev/null +++ b/src/core/primitives/WebGLGraphicsData.js @@ -0,0 +1,48 @@ +/** + * @class + * @private + */ +function WebGLGraphicsData(gl) { + this.gl = gl; + + //TODO does this need to be split before uploding?? + this.color = [0,0,0]; // color split! + this.points = []; + this.indices = []; + this.buffer = gl.createBuffer(); + this.indexBuffer = gl.createBuffer(); + this.mode = 1; + this.alpha = 1; + this.dirty = true; +} + +WebGLGraphicsData.prototype.constructor = WebGLGraphicsData; +module.exports = WebGLGraphicsData; + +/** + * + */ +WebGLGraphicsData.prototype.reset = function () { + this.points = []; + this.indices = []; +}; + +/** + * + */ +WebGLGraphicsData.prototype.upload = function () { + var gl = this.gl; + +// this.lastIndex = graphics.graphicsData.length; + this.glPoints = new Float32Array(this.points); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer); + gl.bufferData(gl.ARRAY_BUFFER, this.glPoints, gl.STATIC_DRAW); + + this.glIndicies = new Uint16Array(this.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.glIndicies, gl.STATIC_DRAW); + + this.dirty = false; +}; diff --git a/src/core/renderers/webgl/WebGLRenderer.js b/src/core/renderers/webgl/WebGLRenderer.js index f84eb31..026ad82 100644 --- a/src/core/renderers/webgl/WebGLRenderer.js +++ b/src/core/renderers/webgl/WebGLRenderer.js @@ -2,7 +2,6 @@ WebGLShaderManager = require('./managers/WebGLShaderManager'), WebGLMaskManager = require('./managers/WebGLMaskManager'), WebGLFilterManager = require('./managers/WebGLFilterManager'), - WebGLStencilManager = require('./managers/WebGLStencilManager'), WebGLBlendModeManager = require('./managers/WebGLBlendModeManager'), ObjectRenderer = require('./utils/ObjectRenderer'), math = require('../../math'), @@ -207,12 +206,6 @@ this.filterManager = new WebGLFilterManager(this); /** - * Manages the stencil buffer - * @member {WebGLStencilManager} - */ - this.stencilManager = new WebGLStencilManager(this); - - /** * Manages the blendModes * @member {WebGLBlendModeManager} */ @@ -583,7 +576,6 @@ this.shaderManager = null; this.maskManager = null; this.filterManager = null; - this.stencilManager = null; this.blendModeManager = null; this.blendModes = null; diff --git a/src/core/renderers/webgl/managers/WebGLMaskManager.js b/src/core/renderers/webgl/managers/WebGLMaskManager.js deleted file mode 100644 index ce429e7..0000000 --- a/src/core/renderers/webgl/managers/WebGLMaskManager.js +++ /dev/null @@ -1,49 +0,0 @@ -var WebGLManager = require('./WebGLManager'); - -/** - * @class - * @namespace PIXI - * @param renderer {WebGLRenderer} The renderer this manager works for. - */ -function WebGLMaskManager(renderer) -{ - WebGLManager.call(this, renderer); -} - -WebGLMaskManager.prototype = Object.create(WebGLManager.prototype); -WebGLMaskManager.prototype.constructor = WebGLMaskManager; -module.exports = WebGLMaskManager; - -/** - * Applies the Mask and adds it to the current filter stack. - * - * @param maskData {any[]} - */ -WebGLMaskManager.prototype.pushMask = function (maskData) -{ - this.renderer.setObjectRenderer(this.renderer.objectRenderers.graphics); - - if (maskData.dirty) - { - this.renderer.objectRenderers.graphics.updateGraphics(maskData, this.renderer.gl); - } - - if (!maskData._webGL[this.renderer.gl.id].data.length) - { - return; - } - - this.renderer.stencilManager.pushStencil(maskData, maskData._webGL[this.renderer.gl.id].data[0], this.renderer); -}; - -/** - * Removes the last filter from the filter stack and doesn't return it. - * - * @param maskData {any[]} - */ -WebGLMaskManager.prototype.popMask = function (maskData) -{ - this.renderer.setObjectRenderer(this.renderer.objectRenderers.graphics); - - this.renderer.stencilManager.popStencil(maskData, maskData._webGL[this.renderer.gl.id].data[0], this.renderer); -}; diff --git a/src/core/primitives/GraphicsRenderer.js b/src/core/primitives/GraphicsRenderer.js index 8e8a5e3..bfc18ef 100644 --- a/src/core/primitives/GraphicsRenderer.js +++ b/src/core/primitives/GraphicsRenderer.js @@ -3,7 +3,7 @@ CONST = require('../const'), ObjectRenderer = require('../renderers/webgl/utils/ObjectRenderer'), WebGLRenderer = require('../renderers/webgl/WebGLRenderer'), - WebGLGraphicsData = require('./GraphicsData'); + WebGLGraphicsData = require('./WebGLGraphicsData'); /** * Renders the graphics object. @@ -66,12 +66,12 @@ { webGLData = webGL.data[i]; - renderer.stencilManager.pushStencil(graphics, webGLData, renderer); + renderer.maskManager.pushStencil(graphics, webGLData, renderer); // render quad.. gl.drawElements(gl.TRIANGLE_FAN, 4, gl.UNSIGNED_SHORT, ( webGLData.indices.length - 4 ) * 2 ); - renderer.stencilManager.popStencil(graphics, webGLData, renderer); + renderer.maskManager.popStencil(graphics, webGLData, renderer); } else { diff --git a/src/core/primitives/WebGLGraphicsData.js b/src/core/primitives/WebGLGraphicsData.js new file mode 100755 index 0000000..41be102 --- /dev/null +++ b/src/core/primitives/WebGLGraphicsData.js @@ -0,0 +1,48 @@ +/** + * @class + * @private + */ +function WebGLGraphicsData(gl) { + this.gl = gl; + + //TODO does this need to be split before uploding?? + this.color = [0,0,0]; // color split! + this.points = []; + this.indices = []; + this.buffer = gl.createBuffer(); + this.indexBuffer = gl.createBuffer(); + this.mode = 1; + this.alpha = 1; + this.dirty = true; +} + +WebGLGraphicsData.prototype.constructor = WebGLGraphicsData; +module.exports = WebGLGraphicsData; + +/** + * + */ +WebGLGraphicsData.prototype.reset = function () { + this.points = []; + this.indices = []; +}; + +/** + * + */ +WebGLGraphicsData.prototype.upload = function () { + var gl = this.gl; + +// this.lastIndex = graphics.graphicsData.length; + this.glPoints = new Float32Array(this.points); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer); + gl.bufferData(gl.ARRAY_BUFFER, this.glPoints, gl.STATIC_DRAW); + + this.glIndicies = new Uint16Array(this.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.glIndicies, gl.STATIC_DRAW); + + this.dirty = false; +}; diff --git a/src/core/renderers/webgl/WebGLRenderer.js b/src/core/renderers/webgl/WebGLRenderer.js index f84eb31..026ad82 100644 --- a/src/core/renderers/webgl/WebGLRenderer.js +++ b/src/core/renderers/webgl/WebGLRenderer.js @@ -2,7 +2,6 @@ WebGLShaderManager = require('./managers/WebGLShaderManager'), WebGLMaskManager = require('./managers/WebGLMaskManager'), WebGLFilterManager = require('./managers/WebGLFilterManager'), - WebGLStencilManager = require('./managers/WebGLStencilManager'), WebGLBlendModeManager = require('./managers/WebGLBlendModeManager'), ObjectRenderer = require('./utils/ObjectRenderer'), math = require('../../math'), @@ -207,12 +206,6 @@ this.filterManager = new WebGLFilterManager(this); /** - * Manages the stencil buffer - * @member {WebGLStencilManager} - */ - this.stencilManager = new WebGLStencilManager(this); - - /** * Manages the blendModes * @member {WebGLBlendModeManager} */ @@ -583,7 +576,6 @@ this.shaderManager = null; this.maskManager = null; this.filterManager = null; - this.stencilManager = null; this.blendModeManager = null; this.blendModes = null; diff --git a/src/core/renderers/webgl/managers/WebGLMaskManager.js b/src/core/renderers/webgl/managers/WebGLMaskManager.js deleted file mode 100644 index ce429e7..0000000 --- a/src/core/renderers/webgl/managers/WebGLMaskManager.js +++ /dev/null @@ -1,49 +0,0 @@ -var WebGLManager = require('./WebGLManager'); - -/** - * @class - * @namespace PIXI - * @param renderer {WebGLRenderer} The renderer this manager works for. - */ -function WebGLMaskManager(renderer) -{ - WebGLManager.call(this, renderer); -} - -WebGLMaskManager.prototype = Object.create(WebGLManager.prototype); -WebGLMaskManager.prototype.constructor = WebGLMaskManager; -module.exports = WebGLMaskManager; - -/** - * Applies the Mask and adds it to the current filter stack. - * - * @param maskData {any[]} - */ -WebGLMaskManager.prototype.pushMask = function (maskData) -{ - this.renderer.setObjectRenderer(this.renderer.objectRenderers.graphics); - - if (maskData.dirty) - { - this.renderer.objectRenderers.graphics.updateGraphics(maskData, this.renderer.gl); - } - - if (!maskData._webGL[this.renderer.gl.id].data.length) - { - return; - } - - this.renderer.stencilManager.pushStencil(maskData, maskData._webGL[this.renderer.gl.id].data[0], this.renderer); -}; - -/** - * Removes the last filter from the filter stack and doesn't return it. - * - * @param maskData {any[]} - */ -WebGLMaskManager.prototype.popMask = function (maskData) -{ - this.renderer.setObjectRenderer(this.renderer.objectRenderers.graphics); - - this.renderer.stencilManager.popStencil(maskData, maskData._webGL[this.renderer.gl.id].data[0], this.renderer); -}; diff --git a/src/core/renderers/webgl/managers/WebGLStencilManager.js b/src/core/renderers/webgl/managers/WebGLStencilManager.js deleted file mode 100644 index 4cb0134..0000000 --- a/src/core/renderers/webgl/managers/WebGLStencilManager.js +++ /dev/null @@ -1,289 +0,0 @@ -var WebGLManager = require('./WebGLManager'), - utils = require('../../../utils'); - -/** - * @class - * @namespace PIXI - * @param renderer {WebGLRenderer} The renderer this manager works for. - */ -function WebGLStencilManager(renderer) -{ - WebGLManager.call(this, renderer); - - this.stencilStack = []; - this.reverse = true; - this.count = 0; -} - -WebGLStencilManager.prototype = Object.create(WebGLManager.prototype); -WebGLStencilManager.prototype.constructor = WebGLStencilManager; -module.exports = WebGLStencilManager; - -/** - * Applies the Mask and adds it to the current filter stack. - * - * @param graphics {Graphics} - * @param webGLData {any[]} - */ -WebGLStencilManager.prototype.pushStencil = function (graphics, webGLData) -{ - var gl = this.renderer.gl; - - this.bindGraphics(graphics, webGLData, this.renderer); - - if (this.stencilStack.length === 0) - { - gl.enable(gl.STENCIL_TEST); - gl.clear(gl.STENCIL_BUFFER_BIT); - this.reverse = true; - this.count = 0; - } - - this.stencilStack.push(webGLData); - - var level = this.count; - - gl.colorMask(false, false, false, false); - - gl.stencilFunc(gl.ALWAYS,0,0xFF); - gl.stencilOp(gl.KEEP,gl.KEEP,gl.INVERT); - - // draw the triangle strip! - - if (webGLData.mode === 1) - { - gl.drawElements(gl.TRIANGLE_FAN, webGLData.indices.length - 4, gl.UNSIGNED_SHORT, 0 ); - - if (this.reverse) - { - gl.stencilFunc(gl.EQUAL, 0xFF - level, 0xFF); - gl.stencilOp(gl.KEEP,gl.KEEP,gl.DECR); - } - else - { - gl.stencilFunc(gl.EQUAL,level, 0xFF); - gl.stencilOp(gl.KEEP,gl.KEEP,gl.INCR); - } - - // draw a quad to increment.. - gl.drawElements(gl.TRIANGLE_FAN, 4, gl.UNSIGNED_SHORT, ( webGLData.indices.length - 4 ) * 2 ); - - if (this.reverse) - { - gl.stencilFunc(gl.EQUAL,0xFF-(level+1), 0xFF); - } - else - { - gl.stencilFunc(gl.EQUAL,level+1, 0xFF); - } - - this.reverse = !this.reverse; - } - else - { - if (!this.reverse) - { - gl.stencilFunc(gl.EQUAL, 0xFF - level, 0xFF); - gl.stencilOp(gl.KEEP,gl.KEEP,gl.DECR); - } - else - { - gl.stencilFunc(gl.EQUAL,level, 0xFF); - gl.stencilOp(gl.KEEP,gl.KEEP,gl.INCR); - } - - gl.drawElements(gl.TRIANGLE_STRIP, webGLData.indices.length, gl.UNSIGNED_SHORT, 0 ); - - if (!this.reverse) - { - gl.stencilFunc(gl.EQUAL,0xFF-(level+1), 0xFF); - } - else - { - gl.stencilFunc(gl.EQUAL,level+1, 0xFF); - } - } - - gl.colorMask(true, true, true, true); - gl.stencilOp(gl.KEEP,gl.KEEP,gl.KEEP); - - this.count++; -}; - -/** - * TODO this does not belong here! - * - * @param graphics {Graphics} - * @param webGLData {Array} - */ -WebGLStencilManager.prototype.bindGraphics = function (graphics, webGLData) -{ - //if (this._currentGraphics === graphics)return; - this._currentGraphics = graphics; - - var gl = this.renderer.gl; - - // bind the graphics object.. - var projection = this.renderer.projection, - offset = this.renderer.offset, - shader;// = this.renderer.shaderManager.primitiveShader; - - if (webGLData.mode === 1) - { - shader = this.renderer.shaderManager.complexPrimitiveShader; - - this.renderer.shaderManager.setShader(shader); - - gl.uniformMatrix3fv(shader.uniforms.translationMatrix._location, false, graphics.worldTransform.toArray(true)); - - gl.uniform1f(shader.uniforms.flipY._location, 1); - - gl.uniform2f(shader.uniforms.projectionVector._location, projection.x, -projection.y); - gl.uniform2f(shader.uniforms.offsetVector._location, -offset.x, -offset.y); - - gl.uniform3fv(shader.uniforms.tint._location, utils.hex2rgb(graphics.tint)); - - gl.uniform3fv(shader.uniforms.color._location, webGLData.color); - - gl.uniform1f(shader.uniforms.alpha._location, graphics.worldAlpha); - - gl.bindBuffer(gl.ARRAY_BUFFER, webGLData.buffer); - - gl.vertexAttribPointer(shader.attributes.aVertexPosition, 2, gl.FLOAT, false, 4 * 2, 0); - - - // now do the rest.. - // set the index buffer! - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, webGLData.indexBuffer); - } - else - { - //this.renderer.shaderManager.activatePrimitiveShader(); - shader = this.renderer.shaderManager.primitiveShader; - this.renderer.shaderManager.setShader( shader ); - - gl.uniformMatrix3fv(shader.uniforms.translationMatrix._location, false, graphics.worldTransform.toArray(true)); - - gl.uniform1f(shader.uniforms.flipY._location, 1); - - gl.uniform2f(shader.uniforms.projectionVector._location, projection.x, -projection.y); - gl.uniform2f(shader.uniforms.offsetVector._location, -offset.x, -offset.y); - - gl.uniform3fv(shader.uniforms.tint._location, utils.hex2rgb(graphics.tint)); - - gl.uniform1f(shader.uniforms.alpha._location, graphics.worldAlpha); - - - gl.bindBuffer(gl.ARRAY_BUFFER, webGLData.buffer); - - gl.vertexAttribPointer(shader.attributes.aVertexPosition, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(shader.attributes.aColor, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - // set the index buffer! - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, webGLData.indexBuffer); - } -}; - -/** - * @param graphics {Graphics} - * @param webGLData {Array} - */ -WebGLStencilManager.prototype.popStencil = function (graphics, webGLData) -{ - var gl = this.renderer.gl; - - this.stencilStack.pop(); - - this.count--; - - if (this.stencilStack.length === 0) - { - // the stack is empty! - gl.disable(gl.STENCIL_TEST); - - } - else - { - - var level = this.count; - - this.bindGraphics(graphics, webGLData, this.renderer); - - gl.colorMask(false, false, false, false); - - if (webGLData.mode === 1) - { - this.reverse = !this.reverse; - - if (this.reverse) - { - gl.stencilFunc(gl.EQUAL, 0xFF - (level+1), 0xFF); - gl.stencilOp(gl.KEEP,gl.KEEP,gl.INCR); - } - else - { - gl.stencilFunc(gl.EQUAL,level+1, 0xFF); - gl.stencilOp(gl.KEEP,gl.KEEP,gl.DECR); - } - - // draw a quad to increment.. - gl.drawElements(gl.TRIANGLE_FAN, 4, gl.UNSIGNED_SHORT, ( webGLData.indices.length - 4 ) * 2 ); - - gl.stencilFunc(gl.ALWAYS,0,0xFF); - gl.stencilOp(gl.KEEP,gl.KEEP,gl.INVERT); - - // draw the triangle strip! - gl.drawElements(gl.TRIANGLE_FAN, webGLData.indices.length - 4, gl.UNSIGNED_SHORT, 0 ); - - if (!this.reverse) - { - gl.stencilFunc(gl.EQUAL,0xFF-(level), 0xFF); - } - else - { - gl.stencilFunc(gl.EQUAL,level, 0xFF); - } - - } - else - { - // console.log("<<>>") - if (!this.reverse) - { - gl.stencilFunc(gl.EQUAL, 0xFF - (level+1), 0xFF); - gl.stencilOp(gl.KEEP,gl.KEEP,gl.INCR); - } - else - { - gl.stencilFunc(gl.EQUAL,level+1, 0xFF); - gl.stencilOp(gl.KEEP,gl.KEEP,gl.DECR); - } - - gl.drawElements(gl.TRIANGLE_STRIP, webGLData.indices.length, gl.UNSIGNED_SHORT, 0 ); - - if (!this.reverse) - { - gl.stencilFunc(gl.EQUAL,0xFF-(level), 0xFF); - } - else - { - gl.stencilFunc(gl.EQUAL,level, 0xFF); - } - } - - gl.colorMask(true, true, true, true); - gl.stencilOp(gl.KEEP,gl.KEEP,gl.KEEP); - - - } -}; - -/** - * Destroys the mask stack. - * - */ -WebGLStencilManager.prototype.destroy = function () -{ - this.renderer = null; - this.stencilStack = null; -}; diff --git a/src/core/primitives/GraphicsRenderer.js b/src/core/primitives/GraphicsRenderer.js index 8e8a5e3..bfc18ef 100644 --- a/src/core/primitives/GraphicsRenderer.js +++ b/src/core/primitives/GraphicsRenderer.js @@ -3,7 +3,7 @@ CONST = require('../const'), ObjectRenderer = require('../renderers/webgl/utils/ObjectRenderer'), WebGLRenderer = require('../renderers/webgl/WebGLRenderer'), - WebGLGraphicsData = require('./GraphicsData'); + WebGLGraphicsData = require('./WebGLGraphicsData'); /** * Renders the graphics object. @@ -66,12 +66,12 @@ { webGLData = webGL.data[i]; - renderer.stencilManager.pushStencil(graphics, webGLData, renderer); + renderer.maskManager.pushStencil(graphics, webGLData, renderer); // render quad.. gl.drawElements(gl.TRIANGLE_FAN, 4, gl.UNSIGNED_SHORT, ( webGLData.indices.length - 4 ) * 2 ); - renderer.stencilManager.popStencil(graphics, webGLData, renderer); + renderer.maskManager.popStencil(graphics, webGLData, renderer); } else { diff --git a/src/core/primitives/WebGLGraphicsData.js b/src/core/primitives/WebGLGraphicsData.js new file mode 100755 index 0000000..41be102 --- /dev/null +++ b/src/core/primitives/WebGLGraphicsData.js @@ -0,0 +1,48 @@ +/** + * @class + * @private + */ +function WebGLGraphicsData(gl) { + this.gl = gl; + + //TODO does this need to be split before uploding?? + this.color = [0,0,0]; // color split! + this.points = []; + this.indices = []; + this.buffer = gl.createBuffer(); + this.indexBuffer = gl.createBuffer(); + this.mode = 1; + this.alpha = 1; + this.dirty = true; +} + +WebGLGraphicsData.prototype.constructor = WebGLGraphicsData; +module.exports = WebGLGraphicsData; + +/** + * + */ +WebGLGraphicsData.prototype.reset = function () { + this.points = []; + this.indices = []; +}; + +/** + * + */ +WebGLGraphicsData.prototype.upload = function () { + var gl = this.gl; + +// this.lastIndex = graphics.graphicsData.length; + this.glPoints = new Float32Array(this.points); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer); + gl.bufferData(gl.ARRAY_BUFFER, this.glPoints, gl.STATIC_DRAW); + + this.glIndicies = new Uint16Array(this.indices); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.glIndicies, gl.STATIC_DRAW); + + this.dirty = false; +}; diff --git a/src/core/renderers/webgl/WebGLRenderer.js b/src/core/renderers/webgl/WebGLRenderer.js index f84eb31..026ad82 100644 --- a/src/core/renderers/webgl/WebGLRenderer.js +++ b/src/core/renderers/webgl/WebGLRenderer.js @@ -2,7 +2,6 @@ WebGLShaderManager = require('./managers/WebGLShaderManager'), WebGLMaskManager = require('./managers/WebGLMaskManager'), WebGLFilterManager = require('./managers/WebGLFilterManager'), - WebGLStencilManager = require('./managers/WebGLStencilManager'), WebGLBlendModeManager = require('./managers/WebGLBlendModeManager'), ObjectRenderer = require('./utils/ObjectRenderer'), math = require('../../math'), @@ -207,12 +206,6 @@ this.filterManager = new WebGLFilterManager(this); /** - * Manages the stencil buffer - * @member {WebGLStencilManager} - */ - this.stencilManager = new WebGLStencilManager(this); - - /** * Manages the blendModes * @member {WebGLBlendModeManager} */ @@ -583,7 +576,6 @@ this.shaderManager = null; this.maskManager = null; this.filterManager = null; - this.stencilManager = null; this.blendModeManager = null; this.blendModes = null; diff --git a/src/core/renderers/webgl/managers/WebGLMaskManager.js b/src/core/renderers/webgl/managers/WebGLMaskManager.js deleted file mode 100644 index ce429e7..0000000 --- a/src/core/renderers/webgl/managers/WebGLMaskManager.js +++ /dev/null @@ -1,49 +0,0 @@ -var WebGLManager = require('./WebGLManager'); - -/** - * @class - * @namespace PIXI - * @param renderer {WebGLRenderer} The renderer this manager works for. - */ -function WebGLMaskManager(renderer) -{ - WebGLManager.call(this, renderer); -} - -WebGLMaskManager.prototype = Object.create(WebGLManager.prototype); -WebGLMaskManager.prototype.constructor = WebGLMaskManager; -module.exports = WebGLMaskManager; - -/** - * Applies the Mask and adds it to the current filter stack. - * - * @param maskData {any[]} - */ -WebGLMaskManager.prototype.pushMask = function (maskData) -{ - this.renderer.setObjectRenderer(this.renderer.objectRenderers.graphics); - - if (maskData.dirty) - { - this.renderer.objectRenderers.graphics.updateGraphics(maskData, this.renderer.gl); - } - - if (!maskData._webGL[this.renderer.gl.id].data.length) - { - return; - } - - this.renderer.stencilManager.pushStencil(maskData, maskData._webGL[this.renderer.gl.id].data[0], this.renderer); -}; - -/** - * Removes the last filter from the filter stack and doesn't return it. - * - * @param maskData {any[]} - */ -WebGLMaskManager.prototype.popMask = function (maskData) -{ - this.renderer.setObjectRenderer(this.renderer.objectRenderers.graphics); - - this.renderer.stencilManager.popStencil(maskData, maskData._webGL[this.renderer.gl.id].data[0], this.renderer); -}; diff --git a/src/core/renderers/webgl/managers/WebGLStencilManager.js b/src/core/renderers/webgl/managers/WebGLStencilManager.js deleted file mode 100644 index 4cb0134..0000000 --- a/src/core/renderers/webgl/managers/WebGLStencilManager.js +++ /dev/null @@ -1,289 +0,0 @@ -var WebGLManager = require('./WebGLManager'), - utils = require('../../../utils'); - -/** - * @class - * @namespace PIXI - * @param renderer {WebGLRenderer} The renderer this manager works for. - */ -function WebGLStencilManager(renderer) -{ - WebGLManager.call(this, renderer); - - this.stencilStack = []; - this.reverse = true; - this.count = 0; -} - -WebGLStencilManager.prototype = Object.create(WebGLManager.prototype); -WebGLStencilManager.prototype.constructor = WebGLStencilManager; -module.exports = WebGLStencilManager; - -/** - * Applies the Mask and adds it to the current filter stack. - * - * @param graphics {Graphics} - * @param webGLData {any[]} - */ -WebGLStencilManager.prototype.pushStencil = function (graphics, webGLData) -{ - var gl = this.renderer.gl; - - this.bindGraphics(graphics, webGLData, this.renderer); - - if (this.stencilStack.length === 0) - { - gl.enable(gl.STENCIL_TEST); - gl.clear(gl.STENCIL_BUFFER_BIT); - this.reverse = true; - this.count = 0; - } - - this.stencilStack.push(webGLData); - - var level = this.count; - - gl.colorMask(false, false, false, false); - - gl.stencilFunc(gl.ALWAYS,0,0xFF); - gl.stencilOp(gl.KEEP,gl.KEEP,gl.INVERT); - - // draw the triangle strip! - - if (webGLData.mode === 1) - { - gl.drawElements(gl.TRIANGLE_FAN, webGLData.indices.length - 4, gl.UNSIGNED_SHORT, 0 ); - - if (this.reverse) - { - gl.stencilFunc(gl.EQUAL, 0xFF - level, 0xFF); - gl.stencilOp(gl.KEEP,gl.KEEP,gl.DECR); - } - else - { - gl.stencilFunc(gl.EQUAL,level, 0xFF); - gl.stencilOp(gl.KEEP,gl.KEEP,gl.INCR); - } - - // draw a quad to increment.. - gl.drawElements(gl.TRIANGLE_FAN, 4, gl.UNSIGNED_SHORT, ( webGLData.indices.length - 4 ) * 2 ); - - if (this.reverse) - { - gl.stencilFunc(gl.EQUAL,0xFF-(level+1), 0xFF); - } - else - { - gl.stencilFunc(gl.EQUAL,level+1, 0xFF); - } - - this.reverse = !this.reverse; - } - else - { - if (!this.reverse) - { - gl.stencilFunc(gl.EQUAL, 0xFF - level, 0xFF); - gl.stencilOp(gl.KEEP,gl.KEEP,gl.DECR); - } - else - { - gl.stencilFunc(gl.EQUAL,level, 0xFF); - gl.stencilOp(gl.KEEP,gl.KEEP,gl.INCR); - } - - gl.drawElements(gl.TRIANGLE_STRIP, webGLData.indices.length, gl.UNSIGNED_SHORT, 0 ); - - if (!this.reverse) - { - gl.stencilFunc(gl.EQUAL,0xFF-(level+1), 0xFF); - } - else - { - gl.stencilFunc(gl.EQUAL,level+1, 0xFF); - } - } - - gl.colorMask(true, true, true, true); - gl.stencilOp(gl.KEEP,gl.KEEP,gl.KEEP); - - this.count++; -}; - -/** - * TODO this does not belong here! - * - * @param graphics {Graphics} - * @param webGLData {Array} - */ -WebGLStencilManager.prototype.bindGraphics = function (graphics, webGLData) -{ - //if (this._currentGraphics === graphics)return; - this._currentGraphics = graphics; - - var gl = this.renderer.gl; - - // bind the graphics object.. - var projection = this.renderer.projection, - offset = this.renderer.offset, - shader;// = this.renderer.shaderManager.primitiveShader; - - if (webGLData.mode === 1) - { - shader = this.renderer.shaderManager.complexPrimitiveShader; - - this.renderer.shaderManager.setShader(shader); - - gl.uniformMatrix3fv(shader.uniforms.translationMatrix._location, false, graphics.worldTransform.toArray(true)); - - gl.uniform1f(shader.uniforms.flipY._location, 1); - - gl.uniform2f(shader.uniforms.projectionVector._location, projection.x, -projection.y); - gl.uniform2f(shader.uniforms.offsetVector._location, -offset.x, -offset.y); - - gl.uniform3fv(shader.uniforms.tint._location, utils.hex2rgb(graphics.tint)); - - gl.uniform3fv(shader.uniforms.color._location, webGLData.color); - - gl.uniform1f(shader.uniforms.alpha._location, graphics.worldAlpha); - - gl.bindBuffer(gl.ARRAY_BUFFER, webGLData.buffer); - - gl.vertexAttribPointer(shader.attributes.aVertexPosition, 2, gl.FLOAT, false, 4 * 2, 0); - - - // now do the rest.. - // set the index buffer! - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, webGLData.indexBuffer); - } - else - { - //this.renderer.shaderManager.activatePrimitiveShader(); - shader = this.renderer.shaderManager.primitiveShader; - this.renderer.shaderManager.setShader( shader ); - - gl.uniformMatrix3fv(shader.uniforms.translationMatrix._location, false, graphics.worldTransform.toArray(true)); - - gl.uniform1f(shader.uniforms.flipY._location, 1); - - gl.uniform2f(shader.uniforms.projectionVector._location, projection.x, -projection.y); - gl.uniform2f(shader.uniforms.offsetVector._location, -offset.x, -offset.y); - - gl.uniform3fv(shader.uniforms.tint._location, utils.hex2rgb(graphics.tint)); - - gl.uniform1f(shader.uniforms.alpha._location, graphics.worldAlpha); - - - gl.bindBuffer(gl.ARRAY_BUFFER, webGLData.buffer); - - gl.vertexAttribPointer(shader.attributes.aVertexPosition, 2, gl.FLOAT, false, 4 * 6, 0); - gl.vertexAttribPointer(shader.attributes.aColor, 4, gl.FLOAT, false,4 * 6, 2 * 4); - - // set the index buffer! - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, webGLData.indexBuffer); - } -}; - -/** - * @param graphics {Graphics} - * @param webGLData {Array} - */ -WebGLStencilManager.prototype.popStencil = function (graphics, webGLData) -{ - var gl = this.renderer.gl; - - this.stencilStack.pop(); - - this.count--; - - if (this.stencilStack.length === 0) - { - // the stack is empty! - gl.disable(gl.STENCIL_TEST); - - } - else - { - - var level = this.count; - - this.bindGraphics(graphics, webGLData, this.renderer); - - gl.colorMask(false, false, false, false); - - if (webGLData.mode === 1) - { - this.reverse = !this.reverse; - - if (this.reverse) - { - gl.stencilFunc(gl.EQUAL, 0xFF - (level+1), 0xFF); - gl.stencilOp(gl.KEEP,gl.KEEP,gl.INCR); - } - else - { - gl.stencilFunc(gl.EQUAL,level+1, 0xFF); - gl.stencilOp(gl.KEEP,gl.KEEP,gl.DECR); - } - - // draw a quad to increment.. - gl.drawElements(gl.TRIANGLE_FAN, 4, gl.UNSIGNED_SHORT, ( webGLData.indices.length - 4 ) * 2 ); - - gl.stencilFunc(gl.ALWAYS,0,0xFF); - gl.stencilOp(gl.KEEP,gl.KEEP,gl.INVERT); - - // draw the triangle strip! - gl.drawElements(gl.TRIANGLE_FAN, webGLData.indices.length - 4, gl.UNSIGNED_SHORT, 0 ); - - if (!this.reverse) - { - gl.stencilFunc(gl.EQUAL,0xFF-(level), 0xFF); - } - else - { - gl.stencilFunc(gl.EQUAL,level, 0xFF); - } - - } - else - { - // console.log("<<>>") - if (!this.reverse) - { - gl.stencilFunc(gl.EQUAL, 0xFF - (level+1), 0xFF); - gl.stencilOp(gl.KEEP,gl.KEEP,gl.INCR); - } - else - { - gl.stencilFunc(gl.EQUAL,level+1, 0xFF); - gl.stencilOp(gl.KEEP,gl.KEEP,gl.DECR); - } - - gl.drawElements(gl.TRIANGLE_STRIP, webGLData.indices.length, gl.UNSIGNED_SHORT, 0 ); - - if (!this.reverse) - { - gl.stencilFunc(gl.EQUAL,0xFF-(level), 0xFF); - } - else - { - gl.stencilFunc(gl.EQUAL,level, 0xFF); - } - } - - gl.colorMask(true, true, true, true); - gl.stencilOp(gl.KEEP,gl.KEEP,gl.KEEP); - - - } -}; - -/** - * Destroys the mask stack. - * - */ -WebGLStencilManager.prototype.destroy = function () -{ - this.renderer = null; - this.stencilStack = null; -}; diff --git a/src/core/textures/RenderTexture.js b/src/core/textures/RenderTexture.js index 351c297..c0c4af4 100644 --- a/src/core/textures/RenderTexture.js +++ b/src/core/textures/RenderTexture.js @@ -377,9 +377,6 @@ this.textureBuffer.clear(); } - - - // this.textureBuffer. var context = this.textureBuffer.context;