Skip to content

Commit 579a1e5

Browse files
committed
Fixed binding null shader error. Particles can be used as mask without the need to render them to the screen
1 parent dd17f60 commit 579a1e5

10 files changed

Lines changed: 124 additions & 108 deletions

File tree

v3/src/display/mask/BitmapMask.js

Lines changed: 96 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,59 @@
11
var Class = require('../../utils/Class');
22

33
var BitmapMask = new Class({
4-
5-
initialize:
6-
7-
function BitmapMask(scene, renderable)
8-
{
9-
var renderer = scene.sys.game.renderer;
10-
var resourceManager = renderer.resourceManager;
11-
this.bitmapMask = renderable;
12-
this.maskRenderTarget = null;
13-
this.mainRenderTarget = null;
14-
this.maskTexture = null;
15-
this.mainTexture = null;
16-
this.dirty = true;
17-
18-
if (resourceManager !== undefined)
19-
{
20-
var width = renderer.width;
21-
var height = renderer.height;
22-
var pot = ((width & (width - 1)) == 0 && (height & (height - 1)) == 0);
23-
var gl = renderer.gl;
24-
var wrap = pot ? gl.REPEAT : gl.CLAMP_TO_EDGE;
25-
26-
this.maskTexture = resourceManager.createTexture(
4+
5+
initialize:
6+
7+
function BitmapMask(scene, renderable)
8+
{
9+
var renderer = scene.sys.game.renderer;
10+
var resourceManager = renderer.resourceManager;
11+
this.bitmapMask = renderable;
12+
this.maskRenderTarget = null;
13+
this.mainRenderTarget = null;
14+
this.maskTexture = null;
15+
this.mainTexture = null;
16+
this.dirty = true;
17+
18+
if (resourceManager !== undefined)
19+
{
20+
var width = renderer.width;
21+
var height = renderer.height;
22+
var pot = ((width & (width - 1)) == 0 && (height & (height - 1)) == 0);
23+
var gl = renderer.gl;
24+
var wrap = pot ? gl.REPEAT : gl.CLAMP_TO_EDGE;
25+
26+
this.maskTexture = resourceManager.createTexture(
2727
0,
2828
gl.LINEAR, gl.LINEAR,
2929
wrap, wrap,
3030
gl.RGBA,
3131
null, width, height
3232
);
3333

34-
this.mainTexture = resourceManager.createTexture(
34+
this.mainTexture = resourceManager.createTexture(
3535
0,
3636
gl.LINEAR, gl.LINEAR,
3737
wrap, wrap,
3838
gl.RGBA,
3939
null, width, height
4040
);
4141

42-
this.maskRenderTarget = resourceManager.createRenderTarget(
43-
width, height,
44-
this.maskTexture,
45-
null
46-
);
47-
this.mainRenderTarget = resourceManager.createRenderTarget(
48-
width, height,
49-
this.mainTexture,
50-
null
51-
);
42+
this.maskRenderTarget = resourceManager.createRenderTarget(
43+
width, height,
44+
this.maskTexture,
45+
null
46+
);
47+
this.mainRenderTarget = resourceManager.createRenderTarget(
48+
width, height,
49+
this.mainTexture,
50+
null
51+
);
5252

5353
scene.sys.game.renderer.currentTexture[0] = null;
54-
}
54+
}
5555

56-
var _this = this;
56+
var _this = this;
5757

5858
renderer.addContextRestoredCallback(function (renderer) {
5959
var resourceManager = renderer.resourceManager;
@@ -75,70 +75,76 @@ var BitmapMask = new Class({
7575
null, width, height
7676
);
7777

78-
_this.maskRenderTarget = resourceManager.createRenderTarget(
79-
width, height,
80-
_this.maskTexture,
81-
null
82-
);
83-
_this.mainRenderTarget = resourceManager.createRenderTarget(
84-
width, height,
85-
_this.mainTexture,
86-
null
87-
);
78+
_this.maskRenderTarget = resourceManager.createRenderTarget(
79+
width, height,
80+
_this.maskTexture,
81+
null
82+
);
83+
_this.mainRenderTarget = resourceManager.createRenderTarget(
84+
width, height,
85+
_this.mainTexture,
86+
null
87+
);
8888

8989
// force rebinding of prev texture
9090
scene.sys.game.renderer.currentTexture[0] = null;
9191
});
92-
},
93-
94-
setBitmap: function (renderable)
95-
{
96-
this.bitmapMask = renderable;
97-
},
98-
99-
preRenderWebGL: function (renderer, gameObject, camera)
100-
{
101-
var bitmapMask = this.bitmapMask;
102-
var maskRenderTarget = this.maskRenderTarget;
103-
var mainRenderTarget = this.mainRenderTarget;
104-
105-
if (bitmapMask)
106-
{
107-
/* Clear render targets first */
108-
var gl = renderer.gl;
109-
110-
gl.clearColor(0.0, 0.0, 0.0, 0.0);
111-
gl.bindFramebuffer(gl.FRAMEBUFFER, maskRenderTarget.framebufferObject);
112-
gl.clear(gl.COLOR_BUFFER_BIT);
113-
gl.bindFramebuffer(gl.FRAMEBUFFER, mainRenderTarget.framebufferObject);
114-
gl.clear(gl.COLOR_BUFFER_BIT);
115-
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
116-
117-
// Inject mask render target & reset it after rendering.
118-
bitmapMask.renderTarget = maskRenderTarget;
119-
bitmapMask.renderWebGL(renderer, bitmapMask, 0.0, camera);
120-
renderer.currentRenderer.flush(null, maskRenderTarget);
121-
bitmapMask.renderTarget = null;
122-
123-
// Inject main render target & reset it at post rendering.
124-
gameObject.renderTarget = this.mainRenderTarget;
92+
},
93+
94+
setBitmap: function (renderable)
95+
{
96+
this.bitmapMask = renderable;
97+
},
98+
99+
preRenderWebGL: function (renderer, gameObject, camera)
100+
{
101+
var bitmapMask = this.bitmapMask;
102+
var maskRenderTarget = this.maskRenderTarget;
103+
var mainRenderTarget = this.mainRenderTarget;
104+
var prevRenderTarget = null;
105+
var visible = bitmapMask.visible;
106+
107+
if (bitmapMask)
108+
{
109+
/* Clear render targets first */
110+
var gl = renderer.gl;
111+
112+
gl.clearColor(0.0, 0.0, 0.0, 0.0);
113+
gl.bindFramebuffer(gl.FRAMEBUFFER, maskRenderTarget.framebufferObject);
114+
gl.clear(gl.COLOR_BUFFER_BIT);
115+
gl.bindFramebuffer(gl.FRAMEBUFFER, mainRenderTarget.framebufferObject);
116+
gl.clear(gl.COLOR_BUFFER_BIT);
117+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
118+
119+
// Inject mask render target & reset it after rendering.
120+
prevRenderTarget = bitmapMask.renderTarget;
121+
bitmapMask.renderTarget = maskRenderTarget;
122+
bitmapMask.visible = true;
123+
bitmapMask.renderWebGL(renderer, bitmapMask, 0.0, camera);
124+
renderer.currentRenderer.flush(null, maskRenderTarget);
125+
bitmapMask.renderTarget = prevRenderTarget;
126+
bitmapMask.visible = visible;
127+
128+
// Inject main render target & reset it at post rendering.
129+
gameObject.renderTarget = this.mainRenderTarget;
125130
renderer.setBlendMode(0);
126-
}
131+
}
127132

128-
},
133+
},
129134

130-
postRenderWebGL: function (renderer, gameObject)
131-
{
132-
var maskRenderer = renderer.maskRenderer;
135+
postRenderWebGL: function (renderer, gameObject)
136+
{
137+
var maskRenderer = renderer.maskRenderer;
133138
var gl = renderer.gl;
139+
var prevRenderTarget = gameObject.renderTarget;
134140

135-
// flush and reset
136-
renderer.currentRenderer.flush(null, this.mainRenderTarget);
137-
gameObject.renderTarget = null;
141+
// flush and reset
142+
renderer.currentRenderer.flush(null, this.mainRenderTarget);
143+
gameObject.renderTarget = prevRenderTarget;
138144

139-
// Apply alpha masking using mask renderer
140-
maskRenderer.draw(null, null, this.mainTexture, this.maskTexture);
141-
}
145+
// Apply alpha masking using mask renderer
146+
maskRenderer.draw(null, null, this.mainTexture, this.maskTexture);
147+
}
142148

143149
});
144150

v3/src/renderer/webgl/renderers/blitterbatch/BlitterBatch.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ var BlitterBatch = new Class({
101101

102102
bind: function (shader)
103103
{
104-
if (shader === undefined)
104+
if (!shader)
105105
{
106106
this.shader.bind();
107107
}
@@ -137,7 +137,7 @@ var BlitterBatch = new Class({
137137

138138
resize: function (width, height, resolution, shader)
139139
{
140-
var activeShader = shader !== undefined ? shader : this.shader;
140+
var activeShader = shader ? shader : this.shader;
141141

142142
this.width = width * resolution;
143143
this.height = height * resolution;

v3/src/renderer/webgl/renderers/effectrenderer/EffectRenderer.js

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ var EffectRenderer = new Class({
103103

104104
bind: function (shader)
105105
{
106-
if (shader === undefined)
106+
if (!shader)
107107
{
108108
this.shader.bind();
109109
}
@@ -117,7 +117,7 @@ var EffectRenderer = new Class({
117117
this.vertexBufferObject.bind();
118118
},
119119

120-
flush: function (shader)
120+
flush: function (shader, renderTarget)
121121
{
122122
var gl = this.glContext;
123123
var vertexDataBuffer = this.vertexDataBuffer;
@@ -127,6 +127,11 @@ var EffectRenderer = new Class({
127127
return;
128128
}
129129

130+
if (renderTarget)
131+
{
132+
gl.bindFramebuffer(gl.FRAMEBUFFER, renderTarget.framebufferObject);
133+
}
134+
130135
this.bind(shader);
131136
this.vertexBufferObject.updateResource(vertexDataBuffer.getUsedBufferAsFloat(), 0);
132137

@@ -135,11 +140,16 @@ var EffectRenderer = new Class({
135140
vertexDataBuffer.clear();
136141

137142
this.elementCount = 0;
143+
144+
if (renderTarget)
145+
{
146+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
147+
}
138148
},
139149

140150
resize: function (width, height, resolution, shader)
141151
{
142-
var activeShader = shader !== undefined ? shader : this.shader;
152+
var activeShader = shader ? shader : this.shader;
143153

144154
this.width = width * resolution;
145155
this.height = height * resolution;
@@ -251,7 +261,7 @@ var EffectRenderer = new Class({
251261
vertexBufferObjectU32[vertexOffset++] = tintTR;
252262
vertexBufferObjectF32[vertexOffset++] = alpha;
253263

254-
this.flush(gameObject.dstShader);
264+
this.flush(gameObject.dstShader, gameObject.renderTarget);
255265

256266
gameObject.dstRenderTarget.shouldClear = true;
257267
},

v3/src/renderer/webgl/renderers/maskrenderer/MaskRenderer.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ var MaskRenderer = new Class({
7474

7575
bind: function (shader)
7676
{
77-
if (shader === undefined)
77+
if (!shader)
7878
{
7979
this.shader.bind();
8080
}
@@ -123,7 +123,7 @@ var MaskRenderer = new Class({
123123

124124
resize: function (width, height, resolution, shader)
125125
{
126-
var activeShader = (shader !== undefined) ? shader : this.shader;
126+
var activeShader = (shader) ? shader : this.shader;
127127
var location = (activeShader === this.shader) ? this.viewMatrixLocation : activeShader.getUniformLocation('u_view_matrix');
128128

129129
this.width = width * resolution;

v3/src/renderer/webgl/renderers/particlerenderer/ParticleRenderer.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ var ParticleRenderer = new Class({
102102

103103
bind: function (shader)
104104
{
105-
if (shader === undefined)
105+
if (!shader)
106106
{
107107
this.shader.bind();
108108
}
@@ -149,7 +149,7 @@ var ParticleRenderer = new Class({
149149

150150
resize: function (width, height, resolution, shader)
151151
{
152-
var activeShader = (shader !== undefined) ? shader : this.shader;
152+
var activeShader = (shader) ? shader : this.shader;
153153
var location = (activeShader === this.shader) ? this.viewMatrixLocation : activeShader.getUniformLocation('u_view_matrix');
154154

155155
this.width = width * resolution;

v3/src/renderer/webgl/renderers/quadbatch/QuadBatch.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ var QuadBatch = new Class({
137137

138138
bind: function (shader)
139139
{
140-
if (shader === undefined)
140+
if (!shader)
141141
{
142142
this.shader.bind();
143143
}
@@ -172,7 +172,7 @@ var QuadBatch = new Class({
172172

173173
resize: function (width, height, resolution, shader)
174174
{
175-
var activeShader = shader !== undefined ? shader : this.shader;
175+
var activeShader = shader ? shader : this.shader;
176176

177177
this.width = width * resolution;
178178
this.height = height * resolution;

v3/src/renderer/webgl/renderers/shapebatch/ShapeBatch.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ var ShapeBatch = new Class({
122122

123123
resize: function (width, height, resolution, shader)
124124
{
125-
var activeShader = shader !== undefined ? shader : this.shader;
125+
var activeShader = shader ? shader : this.shader;
126126

127127
this.width = width * resolution;
128128
this.height = height * resolution;

v3/src/renderer/webgl/renderers/spritebatch/SpriteBatch.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ var SpriteBatch = new Class({
180180

181181
resize: function (width, height, resolution, shader)
182182
{
183-
var activeShader = (shader !== undefined) ? shader : this.shader;
183+
var activeShader = (shader) ? shader : this.shader;
184184
var location = (activeShader === this.shader) ? this.viewMatrixLocation : activeShader.getUniformLocation('u_view_matrix');
185185

186186
this.width = width * resolution;

v3/src/renderer/webgl/renderers/tilebatch/TileBatch.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ var TileBatch = new Class({
103103

104104
bind: function (shader)
105105
{
106-
if (shader === undefined)
106+
if (!shader)
107107
{
108108
this.shader.bind();
109109
}
@@ -149,7 +149,7 @@ var TileBatch = new Class({
149149

150150
resize: function (width, height, resolution, shader)
151151
{
152-
var activeShader = shader !== undefined ? shader : this.shader;
152+
var activeShader = shader ? shader : this.shader;
153153
var location = activeShader == this.shader ? this.viewMatrixLocation : activeShader.getUniformLocation('u_view_matrix');
154154

155155
this.width = width * resolution;

0 commit comments

Comments
 (0)