Skip to content

Commit fe92b4e

Browse files
committed
WebGL using mixins.
1 parent 4cd0e83 commit fe92b4e

7 files changed

Lines changed: 137 additions & 108 deletions

File tree

build/config.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,8 +214,6 @@
214214
<script src="$path/src/renderer/webgl/gameobjects/Container.js"></script>
215215
<script src="$path/src/renderer/webgl/gameobjects/Sprite.js"></script>
216216
<script src="$path/src/renderer/webgl/gameobjects/Stage.js"></script>
217-
<script src="$path/src/renderer/webgl/gameobjects/Text.js"></script>
218-
<script src="$path/src/renderer/webgl/gameobjects/Graphics.js"></script>
219217
220218
221219
EOL;
@@ -262,6 +260,7 @@
262260
<script src="$path/src/gameobjects/GraphicsData.js"></script>
263261
<script src="$path/src/gameobjects/Graphics.js"></script>
264262
<script src="$path/src/renderer/canvas/gameobjects/Graphics.js"></script>
263+
<script src="$path/src/renderer/webgl/gameobjects/Graphics.js"></script>
265264
266265
267266
EOL;
@@ -281,6 +280,7 @@
281280
echo <<<EOL
282281
<script src="$path/src/gameobjects/Text.js"></script>
283282
<script src="$path/src/renderer/canvas/gameobjects/Text.js"></script>
283+
<script src="$path/src/renderer/webgl/gameobjects/Text.js"></script>
284284
285285
286286
EOL;

src/renderer/webgl/WebGLRenderer.js

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,17 @@ Phaser.Renderer.WebGL.prototype = {
171171
throw new Error('This browser does not support WebGL. Try using the Canvas renderer.');
172172
}
173173

174+
// Mixin the renderer functions
175+
for (var renderer in Phaser.Renderer.WebGL.GameObjects)
176+
{
177+
var types = Phaser.Renderer.WebGL.GameObjects[renderer].TYPES;
178+
179+
for (var i = 0; i < types.length; i++)
180+
{
181+
types[i].render = Phaser.Renderer.WebGL.GameObjects[renderer].render;
182+
}
183+
}
184+
174185
this.gl.id = 0;
175186

176187
var gl = this.gl;
@@ -362,7 +373,7 @@ Phaser.Renderer.WebGL.prototype = {
362373
this.offset.x = this.game.camera._shake.x;
363374
this.offset.y = this.game.camera._shake.y;
364375

365-
// this.renderSession.blendModeManager.setBlendMode(PIXI.blendModes.NORMAL);
376+
this.setBlendMode(this.blendModes.NORMAL);
366377

367378
// Reset draw count
368379
this.drawCount = 0;
@@ -374,7 +385,7 @@ Phaser.Renderer.WebGL.prototype = {
374385

375386
// this.filterManager.begin();
376387

377-
stage.render(this);
388+
stage.render(this, stage);
378389

379390
this.spriteBatch.end();
380391

src/renderer/webgl/gameobjects/Container.js

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,50 +5,56 @@
55
*/
66
Phaser.Renderer.WebGL.GameObjects.Container = {
77

8-
render: function (renderer)
8+
TYPES: [
9+
Phaser.Group.prototype,
10+
PIXI.DisplayObjectContainer.prototype
11+
],
12+
13+
render: function (renderer, src)
914
{
10-
if (this.visible === false || this.alpha === 0 || this.children.length === 0)
15+
if (src.visible === false || src.alpha === 0 || src.children.length === 0)
1116
{
1217
return;
1318
}
1419

15-
if (this._cacheAsBitmap)
20+
if (src._cacheAsBitmap)
1621
{
17-
return this.renderCachedSprite(renderer);
22+
return Phaser.Renderer.WebGL.GameObjects.Container.renderCachedSprite(renderer, src);
1823
}
1924

2025
var i;
2126

22-
if (this._mask || this._filters)
27+
if (src._mask || src._filters)
2328
{
2429
// push filter first as we need to ensure the stencil buffer is correct for any masking
25-
if (this._filters)
30+
if (src._filters)
2631
{
2732
renderer.spriteBatch.flush();
28-
renderer.filterManager.pushFilter(this._filterBlock);
33+
renderer.filterManager.pushFilter(src._filterBlock);
2934
}
3035

31-
if (this._mask)
36+
if (src._mask)
3237
{
3338
renderer.spriteBatch.stop();
34-
renderer.pushMask(this.mask);
39+
renderer.pushMask(src.mask);
3540
renderer.spriteBatch.start();
3641
}
3742

3843
// simple render children!
39-
for (i = 0; i < this.children.length; i++)
44+
for (i = 0; i < src.children.length; i++)
4045
{
41-
this.children[i].render(renderer);
46+
var child = src.children[i];
47+
child.render(renderer, child);
4248
}
4349

4450
renderer.spriteBatch.stop();
4551

46-
if (this._mask)
52+
if (src._mask)
4753
{
48-
renderer.popMask(this._mask);
54+
renderer.popMask(src._mask);
4955
}
5056

51-
if (this._filters)
57+
if (src._filters)
5258
{
5359
renderer.filterManager.popFilter();
5460
}
@@ -58,15 +64,16 @@ Phaser.Renderer.WebGL.GameObjects.Container = {
5864
else
5965
{
6066
// simple render children!
61-
for (i = 0; i < this.children.length; i++)
67+
for (i = 0; i < src.children.length; i++)
6268
{
63-
this.children[i].render(renderer);
69+
var child = src.children[i];
70+
child.render(renderer, child);
6471
}
6572
}
6673

6774
},
6875

69-
renderCachedSprite: function (renderer)
76+
renderCachedSprite: function (renderer, src)
7077
{
7178
// TODO
7279
return renderer;

src/renderer/webgl/gameobjects/Graphics.js

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,29 +5,31 @@
55
*/
66
Phaser.Renderer.WebGL.GameObjects.Graphics = {
77

8-
render: function (renderer)
9-
{
10-
var local = Phaser.Renderer.Canvas.GameObjects.Graphics;
8+
TYPES: [
9+
Phaser.Graphics.prototype
10+
],
1111

12-
if (this.visible === false || this.alpha === 0 || this.isMask === true)
12+
render: function (renderer, src)
13+
{
14+
if (src.visible === false || src.alpha === 0 || src.isMask === true)
1315
{
1416
return;
1517
}
1618

17-
if (this._cacheAsBitmap)
19+
if (src._cacheAsBitmap)
1820
{
19-
if (this.dirty || this.cachedSpriteDirty)
21+
if (src.dirty || src.cachedSpriteDirty)
2022
{
21-
this._generateCachedSprite();
23+
src._generateCachedSprite();
2224

2325
// we will also need to update the texture on the gpu too!
24-
this.updateCachedSpriteTexture();
26+
src.updateCachedSpriteTexture();
2527

26-
this.cachedSpriteDirty = false;
27-
this.dirty = false;
28+
src.cachedSpriteDirty = false;
29+
src.dirty = false;
2830
}
2931

30-
this._cachedSprite.worldAlpha = this.worldAlpha;
32+
src._cachedSprite.worldAlpha = src.worldAlpha;
3133

3234
// PIXI.Sprite.prototype._renderWebGL.call(this._cachedSprite, renderSession);
3335

@@ -36,59 +38,60 @@ Phaser.Renderer.WebGL.GameObjects.Graphics = {
3638
else
3739
{
3840
renderer.spriteBatch.stop();
39-
renderer.setBlendMode(this.blendMode);
41+
renderer.setBlendMode(src.blendMode);
4042

41-
if (this._mask)
43+
if (src._mask)
4244
{
43-
renderer.pushMask(this._mask);
45+
renderer.pushMask(src._mask);
4446
}
4547

46-
if (this._filters)
48+
if (src._filters)
4749
{
48-
renderer.filterManager.pushFilter(this._filterBlock);
50+
renderer.filterManager.pushFilter(src._filterBlock);
4951
}
5052

5153
// check blend mode
52-
if (this.blendMode !== renderer.spriteBatch.currentBlendMode)
54+
if (src.blendMode !== renderer.spriteBatch.currentBlendMode)
5355
{
54-
renderer.spriteBatch.currentBlendMode = this.blendMode;
56+
renderer.spriteBatch.currentBlendMode = src.blendMode;
5557

5658
var blendModeWebGL = renderer.blendModes[renderer.spriteBatch.currentBlendMode];
5759

5860
renderer.spriteBatch.gl.blendFunc(blendModeWebGL[0], blendModeWebGL[1]);
5961
}
6062

6163
// check if the webgl graphic needs to be updated
62-
if (this.webGLDirty)
64+
if (src.webGLDirty)
6365
{
64-
this.dirty = true;
65-
this.webGLDirty = false;
66+
src.dirty = true;
67+
src.webGLDirty = false;
6668
}
6769

6870
// Merge with this class
6971
// PIXI.WebGLGraphics.renderGraphics(this, renderSession);
7072

7173
// only render if it has children!
72-
if (this.children.length)
74+
if (src.children.length)
7375
{
7476
renderer.spriteBatch.start();
7577

76-
for (var i = 0; i < this.children.length; i++)
78+
for (var i = 0; i < src.children.length; i++)
7779
{
78-
this.children[i].render(renderer);
80+
var child = src.children[i];
81+
child.render(renderer, child);
7982
}
8083

8184
renderer.spriteBatch.stop();
8285
}
8386

84-
if (this._filters)
87+
if (src._filters)
8588
{
8689
renderer.filterManager.popFilter();
8790
}
8891

89-
if (this._mask)
92+
if (src._mask)
9093
{
91-
renderer.popMask(this.mask);
94+
renderer.popMask(src.mask);
9295
}
9396

9497
renderer.drawCount++;

src/renderer/webgl/gameobjects/Sprite.js

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,16 @@
55
*/
66
Phaser.Renderer.WebGL.GameObjects.Sprite = {
77

8-
render: function (renderer)
8+
TYPES: [
9+
Phaser.Sprite.prototype,
10+
Phaser.Image.prototype,
11+
PIXI.Sprite.prototype
12+
],
13+
14+
render: function (renderer, src)
915
{
1016
// If the sprite is not visible or the alpha is 0 then no need to render this element
11-
if (!this.visible || this.alpha === 0 || !this.renderable)
17+
if (!src.visible || src.alpha === 0 || !src.renderable)
1218
{
1319
return;
1420
}
@@ -18,42 +24,43 @@ Phaser.Renderer.WebGL.GameObjects.Sprite = {
1824
var i;
1925

2026
// Would be good to get this down to 1 check, or even none.
21-
if (this._mask || this._filters)
27+
if (src._mask || src._filters)
2228
{
2329
var spriteBatch = renderer.spriteBatch;
2430

2531
// push filter first as we need to ensure the stencil buffer is correct for any masking
26-
if (this._filters)
32+
if (src._filters)
2733
{
2834
spriteBatch.flush();
29-
renderer.filterManager.pushFilter(this._filterBlock);
35+
renderer.filterManager.pushFilter(src._filterBlock);
3036
}
3137

32-
if (this._mask)
38+
if (src._mask)
3339
{
3440
spriteBatch.stop();
35-
renderer.pushMask(this.mask);
41+
renderer.pushMask(src.mask);
3642
spriteBatch.start();
3743
}
3844

3945
// add this sprite to the batch
40-
spriteBatch.render(this);
46+
spriteBatch.render(src);
4147

4248
// now loop through the children and make sure they get rendered
4349
for (i = 0; i < this.children.length; i++)
4450
{
45-
this.children[i].render(renderer);
51+
var child = src.children[i];
52+
child.render(renderer, child);
4653
}
4754

4855
// time to stop the sprite batch as either a mask element or a filter draw will happen next
4956
spriteBatch.stop();
5057

51-
if (this._mask)
58+
if (src._mask)
5259
{
53-
renderer.popMask(this._mask);
60+
renderer.popMask(src._mask);
5461
}
5562

56-
if (this._filters)
63+
if (src._filters)
5764
{
5865
renderer.filterManager.popFilter();
5966
}
@@ -62,12 +69,13 @@ Phaser.Renderer.WebGL.GameObjects.Sprite = {
6269
}
6370
else
6471
{
65-
renderer.spriteBatch.render(this);
72+
renderer.spriteBatch.render(src);
6673

6774
// Render children!
68-
for (i = 0; i < this.children.length; i++)
75+
for (i = 0; i < src.children.length; i++)
6976
{
70-
this.children[i].render(renderer);
77+
var child = src.children[i];
78+
child.render(renderer, child);
7179
}
7280
}
7381
}

0 commit comments

Comments
 (0)