Fixed binding null shader error. Particles can be used as mask without the need to render them to the screen

This commit is contained in:
Felipe Alfonso 2017-11-16 12:47:23 -03:00
parent dd17f6083f
commit 579a1e5a26
10 changed files with 116 additions and 100 deletions

View file

@ -1,29 +1,29 @@
var Class = require('../../utils/Class');
var BitmapMask = new Class({
initialize:
initialize:
function BitmapMask(scene, renderable)
{
var renderer = scene.sys.game.renderer;
var resourceManager = renderer.resourceManager;
this.bitmapMask = renderable;
this.maskRenderTarget = null;
this.mainRenderTarget = null;
this.maskTexture = null;
this.mainTexture = null;
this.dirty = true;
function BitmapMask(scene, renderable)
{
var renderer = scene.sys.game.renderer;
var resourceManager = renderer.resourceManager;
this.bitmapMask = renderable;
this.maskRenderTarget = null;
this.mainRenderTarget = null;
this.maskTexture = null;
this.mainTexture = null;
this.dirty = true;
if (resourceManager !== undefined)
{
var width = renderer.width;
var height = renderer.height;
var pot = ((width & (width - 1)) == 0 && (height & (height - 1)) == 0);
var gl = renderer.gl;
var wrap = pot ? gl.REPEAT : gl.CLAMP_TO_EDGE;
if (resourceManager !== undefined)
{
var width = renderer.width;
var height = renderer.height;
var pot = ((width & (width - 1)) == 0 && (height & (height - 1)) == 0);
var gl = renderer.gl;
var wrap = pot ? gl.REPEAT : gl.CLAMP_TO_EDGE;
this.maskTexture = resourceManager.createTexture(
this.maskTexture = resourceManager.createTexture(
0,
gl.LINEAR, gl.LINEAR,
wrap, wrap,
@ -31,7 +31,7 @@ var BitmapMask = new Class({
null, width, height
);
this.mainTexture = resourceManager.createTexture(
this.mainTexture = resourceManager.createTexture(
0,
gl.LINEAR, gl.LINEAR,
wrap, wrap,
@ -39,21 +39,21 @@ var BitmapMask = new Class({
null, width, height
);
this.maskRenderTarget = resourceManager.createRenderTarget(
width, height,
this.maskTexture,
null
);
this.mainRenderTarget = resourceManager.createRenderTarget(
width, height,
this.mainTexture,
null
);
this.maskRenderTarget = resourceManager.createRenderTarget(
width, height,
this.maskTexture,
null
);
this.mainRenderTarget = resourceManager.createRenderTarget(
width, height,
this.mainTexture,
null
);
scene.sys.game.renderer.currentTexture[0] = null;
}
}
var _this = this;
var _this = this;
renderer.addContextRestoredCallback(function (renderer) {
var resourceManager = renderer.resourceManager;
@ -75,70 +75,76 @@ var BitmapMask = new Class({
null, width, height
);
_this.maskRenderTarget = resourceManager.createRenderTarget(
width, height,
_this.maskTexture,
null
);
_this.mainRenderTarget = resourceManager.createRenderTarget(
width, height,
_this.mainTexture,
null
);
_this.maskRenderTarget = resourceManager.createRenderTarget(
width, height,
_this.maskTexture,
null
);
_this.mainRenderTarget = resourceManager.createRenderTarget(
width, height,
_this.mainTexture,
null
);
// force rebinding of prev texture
scene.sys.game.renderer.currentTexture[0] = null;
});
},
},
setBitmap: function (renderable)
{
this.bitmapMask = renderable;
},
setBitmap: function (renderable)
{
this.bitmapMask = renderable;
},
preRenderWebGL: function (renderer, gameObject, camera)
{
var bitmapMask = this.bitmapMask;
var maskRenderTarget = this.maskRenderTarget;
var mainRenderTarget = this.mainRenderTarget;
if (bitmapMask)
{
/* Clear render targets first */
var gl = renderer.gl;
preRenderWebGL: function (renderer, gameObject, camera)
{
var bitmapMask = this.bitmapMask;
var maskRenderTarget = this.maskRenderTarget;
var mainRenderTarget = this.mainRenderTarget;
var prevRenderTarget = null;
var visible = bitmapMask.visible;
if (bitmapMask)
{
/* Clear render targets first */
var gl = renderer.gl;
gl.clearColor(0.0, 0.0, 0.0, 0.0);
gl.bindFramebuffer(gl.FRAMEBUFFER, maskRenderTarget.framebufferObject);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.bindFramebuffer(gl.FRAMEBUFFER, mainRenderTarget.framebufferObject);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
gl.clearColor(0.0, 0.0, 0.0, 0.0);
gl.bindFramebuffer(gl.FRAMEBUFFER, maskRenderTarget.framebufferObject);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.bindFramebuffer(gl.FRAMEBUFFER, mainRenderTarget.framebufferObject);
gl.clear(gl.COLOR_BUFFER_BIT);
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
// Inject mask render target & reset it after rendering.
bitmapMask.renderTarget = maskRenderTarget;
bitmapMask.renderWebGL(renderer, bitmapMask, 0.0, camera);
renderer.currentRenderer.flush(null, maskRenderTarget);
bitmapMask.renderTarget = null;
// Inject mask render target & reset it after rendering.
prevRenderTarget = bitmapMask.renderTarget;
bitmapMask.renderTarget = maskRenderTarget;
bitmapMask.visible = true;
bitmapMask.renderWebGL(renderer, bitmapMask, 0.0, camera);
renderer.currentRenderer.flush(null, maskRenderTarget);
bitmapMask.renderTarget = prevRenderTarget;
bitmapMask.visible = visible;
// Inject main render target & reset it at post rendering.
gameObject.renderTarget = this.mainRenderTarget;
// Inject main render target & reset it at post rendering.
gameObject.renderTarget = this.mainRenderTarget;
renderer.setBlendMode(0);
}
}
},
},
postRenderWebGL: function (renderer, gameObject)
{
var maskRenderer = renderer.maskRenderer;
postRenderWebGL: function (renderer, gameObject)
{
var maskRenderer = renderer.maskRenderer;
var gl = renderer.gl;
var prevRenderTarget = gameObject.renderTarget;
// flush and reset
renderer.currentRenderer.flush(null, this.mainRenderTarget);
gameObject.renderTarget = null;
// flush and reset
renderer.currentRenderer.flush(null, this.mainRenderTarget);
gameObject.renderTarget = prevRenderTarget;
// Apply alpha masking using mask renderer
maskRenderer.draw(null, null, this.mainTexture, this.maskTexture);
}
// Apply alpha masking using mask renderer
maskRenderer.draw(null, null, this.mainTexture, this.maskTexture);
}
});

View file

@ -101,7 +101,7 @@ var BlitterBatch = new Class({
bind: function (shader)
{
if (shader === undefined)
if (!shader)
{
this.shader.bind();
}
@ -137,7 +137,7 @@ var BlitterBatch = new Class({
resize: function (width, height, resolution, shader)
{
var activeShader = shader !== undefined ? shader : this.shader;
var activeShader = shader ? shader : this.shader;
this.width = width * resolution;
this.height = height * resolution;

View file

@ -103,7 +103,7 @@ var EffectRenderer = new Class({
bind: function (shader)
{
if (shader === undefined)
if (!shader)
{
this.shader.bind();
}
@ -117,7 +117,7 @@ var EffectRenderer = new Class({
this.vertexBufferObject.bind();
},
flush: function (shader)
flush: function (shader, renderTarget)
{
var gl = this.glContext;
var vertexDataBuffer = this.vertexDataBuffer;
@ -127,6 +127,11 @@ var EffectRenderer = new Class({
return;
}
if (renderTarget)
{
gl.bindFramebuffer(gl.FRAMEBUFFER, renderTarget.framebufferObject);
}
this.bind(shader);
this.vertexBufferObject.updateResource(vertexDataBuffer.getUsedBufferAsFloat(), 0);
@ -135,11 +140,16 @@ var EffectRenderer = new Class({
vertexDataBuffer.clear();
this.elementCount = 0;
if (renderTarget)
{
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
}
},
resize: function (width, height, resolution, shader)
{
var activeShader = shader !== undefined ? shader : this.shader;
var activeShader = shader ? shader : this.shader;
this.width = width * resolution;
this.height = height * resolution;
@ -251,7 +261,7 @@ var EffectRenderer = new Class({
vertexBufferObjectU32[vertexOffset++] = tintTR;
vertexBufferObjectF32[vertexOffset++] = alpha;
this.flush(gameObject.dstShader);
this.flush(gameObject.dstShader, gameObject.renderTarget);
gameObject.dstRenderTarget.shouldClear = true;
},

View file

@ -74,7 +74,7 @@ var MaskRenderer = new Class({
bind: function (shader)
{
if (shader === undefined)
if (!shader)
{
this.shader.bind();
}
@ -123,7 +123,7 @@ var MaskRenderer = new Class({
resize: function (width, height, resolution, shader)
{
var activeShader = (shader !== undefined) ? shader : this.shader;
var activeShader = (shader) ? shader : this.shader;
var location = (activeShader === this.shader) ? this.viewMatrixLocation : activeShader.getUniformLocation('u_view_matrix');
this.width = width * resolution;

View file

@ -102,7 +102,7 @@ var ParticleRenderer = new Class({
bind: function (shader)
{
if (shader === undefined)
if (!shader)
{
this.shader.bind();
}
@ -149,7 +149,7 @@ var ParticleRenderer = new Class({
resize: function (width, height, resolution, shader)
{
var activeShader = (shader !== undefined) ? shader : this.shader;
var activeShader = (shader) ? shader : this.shader;
var location = (activeShader === this.shader) ? this.viewMatrixLocation : activeShader.getUniformLocation('u_view_matrix');
this.width = width * resolution;

View file

@ -137,7 +137,7 @@ var QuadBatch = new Class({
bind: function (shader)
{
if (shader === undefined)
if (!shader)
{
this.shader.bind();
}
@ -172,7 +172,7 @@ var QuadBatch = new Class({
resize: function (width, height, resolution, shader)
{
var activeShader = shader !== undefined ? shader : this.shader;
var activeShader = shader ? shader : this.shader;
this.width = width * resolution;
this.height = height * resolution;

View file

@ -122,7 +122,7 @@ var ShapeBatch = new Class({
resize: function (width, height, resolution, shader)
{
var activeShader = shader !== undefined ? shader : this.shader;
var activeShader = shader ? shader : this.shader;
this.width = width * resolution;
this.height = height * resolution;

View file

@ -180,7 +180,7 @@ var SpriteBatch = new Class({
resize: function (width, height, resolution, shader)
{
var activeShader = (shader !== undefined) ? shader : this.shader;
var activeShader = (shader) ? shader : this.shader;
var location = (activeShader === this.shader) ? this.viewMatrixLocation : activeShader.getUniformLocation('u_view_matrix');
this.width = width * resolution;

View file

@ -103,7 +103,7 @@ var TileBatch = new Class({
bind: function (shader)
{
if (shader === undefined)
if (!shader)
{
this.shader.bind();
}
@ -149,7 +149,7 @@ var TileBatch = new Class({
resize: function (width, height, resolution, shader)
{
var activeShader = shader !== undefined ? shader : this.shader;
var activeShader = shader ? shader : this.shader;
var location = activeShader == this.shader ? this.viewMatrixLocation : activeShader.getUniformLocation('u_view_matrix');
this.width = width * resolution;

View file

@ -79,7 +79,7 @@ var TilemapRenderer = new Class({
bind: function (shader)
{
if (shader === undefined)
if (!shader)
{
this.shader.bind();
}
@ -96,7 +96,7 @@ var TilemapRenderer = new Class({
resize: function (width, height, resolution, shader)
{
var activeShader = shader !== undefined ? shader : this.shader;
var activeShader = shader ? shader : this.shader;
this.width = width * resolution;
this.height = height * resolution;