mirror of
https://github.com/photonstorm/phaser
synced 2025-02-17 14:38:30 +00:00
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:
parent
dd17f6083f
commit
579a1e5a26
10 changed files with 116 additions and 100 deletions
|
@ -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);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
},
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue