Skip to content

Commit f968913

Browse files
committed
BitmapMask rendering progress
1 parent 9990460 commit f968913

4 files changed

Lines changed: 174 additions & 631 deletions

File tree

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
var Class = require('../../utils/Class');
2+
3+
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(
27+
0,
28+
gl.LINEAR, gl.LINEAR,
29+
wrap, wrap,
30+
gl.RGBA,
31+
null, width, height
32+
);
33+
34+
this.mainTexture = resourceManager.createTexture(
35+
0,
36+
gl.LINEAR, gl.LINEAR,
37+
wrap, wrap,
38+
gl.RGBA,
39+
null, width, height
40+
);
41+
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+
);
52+
53+
scene.sys.game.renderer.currentTexture[0] = null;
54+
}
55+
56+
var _this = this;
57+
58+
renderer.addContextRestoredCallback(function (renderer) {
59+
var resourceManager = renderer.resourceManager;
60+
var gl = renderer.gl;
61+
var wrap = pot ? gl.REPEAT : gl.CLAMP_TO_EDGE;
62+
63+
_this.maskTexture = resourceManager.createTexture(
64+
0,
65+
gl.LINEAR, gl.LINEAR,
66+
wrap, wrap,
67+
gl.RGBA,
68+
null, width, height
69+
);
70+
_this.mainTexture = resourceManager.createTexture(
71+
0,
72+
gl.LINEAR, gl.LINEAR,
73+
wrap, wrap,
74+
gl.RGBA,
75+
null, width, height
76+
);
77+
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+
);
88+
89+
// force rebinding of prev texture
90+
scene.sys.game.renderer.currentTexture[0] = null;
91+
});
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+
103+
if (bitmapMask)
104+
{
105+
/* Clear render targets first */
106+
var gl = renderer.gl;
107+
108+
if (gl)
109+
{
110+
gl.clearColor(0.0, 0.0, 0.0, 0.0);
111+
112+
gl.bindFramebuffer(gl.FRAMEBUFFER, this.maskRenderTarget.framebufferObject);
113+
gl.clear(gl.COLOR_BUFFER_BIT);
114+
115+
gl.bindFramebuffer(gl.FRAMEBUFFER, this.mainRenderTarget.framebufferObject);
116+
gl.clear(gl.COLOR_BUFFER_BIT);
117+
118+
}
119+
120+
// Inject mask render target & reset it after rendering.
121+
bitmapMask.renderTarget = this.maskRenderTarget;
122+
bitmapMask.renderWebGL(renderer, bitmapMask, 0.0, camera);
123+
bitmapMask.renderTarget = null;
124+
125+
// Inject main render target & reset it at post rendering.
126+
gameObject.renderTarget = this.mainRenderTarget;
127+
128+
// Cleanup GL state
129+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
130+
}
131+
132+
},
133+
134+
postRenderWebGL: function (renderer)
135+
{
136+
var maskRenderer = renderer.maskRenderer;
137+
// reset
138+
gameObject.renderTarget = null;
139+
140+
// Apply alpha masking using mask renderer
141+
maskRenderer.flush(null, null, this.mainTexture, this.maskTexture);
142+
}
143+
144+
});

v3/src/renderer/webgl/WebGLRenderer.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ var Class = require('../../utils/Class');
1111
var CONST = require('../../const');
1212
var EffectRenderer = require('./renderers/effectrenderer/EffectRenderer');
1313
var IsSizePowerOfTwo = require('../../math/pow2/IsSizePowerOfTwo');
14+
var MaskRenderer = require('./renderers/maskrenderer/MaskRenderer');
1415
var QuadBatch = require('./renderers/quadbatch/QuadBatch');
1516
var ParticleRenderer = require('./renderers/particlerenderer/ParticleRenderer');
1617
var ResourceManager = require('./ResourceManager');
@@ -100,6 +101,7 @@ var WebGLRenderer = new Class({
100101
this.spriteBatch = null;
101102
this.shapeBatch = null;
102103
this.effectRenderer = null;
104+
this.maskRenderer = null;
103105
this.currentRenderer = null;
104106
this.currentTexture = [];
105107
this.shaderCache = {};
@@ -169,6 +171,7 @@ var WebGLRenderer = new Class({
169171
this.tileBatch = this.addRenderer(new TileBatch(this.game, gl, this));
170172
this.tilemapRenderer = this.addRenderer(new TilemapRenderer(this.game, gl, this));
171173
this.particleRenderer = this.addRenderer(new ParticleRenderer(this.game, gl, this));
174+
this.maskRenderer = this.addRenderer(new MaskRenderer(this.game, gl, this));
172175
this.currentRenderer = this.spriteBatch;
173176
this.currentVertexBuffer = null;
174177
this.setBlendMode(0);

0 commit comments

Comments
 (0)