Skip to content

Commit dc45945

Browse files
committed
WebGL Specific Game Objects work with restored context, except EffectLayer and RenderPass. That would require developer to rebind render targets and resources
1 parent de507de commit dc45945

8 files changed

Lines changed: 96 additions & 15 deletions

File tree

v3/src/gameobjects/effectlayer/EffectLayer.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,30 @@ var EffectLayer = new Class({
6868
this.setPosition(x, y);
6969
this.setSize(width, height);
7070
this.setOrigin(0, 0);
71+
72+
var _this = this;
73+
scene.sys.game.renderer.addContextRestoredCallback(function (renderer) {
74+
var resourceManager = renderer.resourceManager;
75+
var gl = renderer.gl;
76+
var wrap = pot ? gl.REPEAT : gl.CLAMP_TO_EDGE;
77+
_this.dstShader = resourceManager.createShader(effectName, {
78+
vert: TexturedAndNormalizedTintedShader.vert,
79+
frag: fragmentShader
80+
});
81+
82+
_this.renderTexture = resourceManager.createTexture(
83+
0,
84+
gl.LINEAR, gl.LINEAR,
85+
wrap, wrap,
86+
gl.RGBA,
87+
null, _this.width, _this.height
88+
);
89+
90+
_this.dstRenderTarget = resourceManager.createRenderTarget(_this.width, _this.height, _this.renderTexture, null);
91+
_this.uniforms = {};
92+
scene.sys.game.renderer.currentTexture[0] = null; // force rebinding of prev texture
93+
94+
});
7195
},
7296

7397
setClearAlpha: function (alpha)

v3/src/gameobjects/renderpass/RenderPass.js

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,18 @@ var RenderPass = new Class({
6363
this.setPosition(x, y);
6464
this.setSize(width, height);
6565
this.setOrigin(0, 0);
66+
67+
var _this = this;
68+
scene.sys.game.renderer.addContextRestoredCallback(function (renderer) {
69+
var gl = renderer.gl;
70+
var wrap = pot ? gl.REPEAT : gl.CLAMP_TO_EDGE;
71+
_this.passShader = resourceManager.createShader(shaderName, {vert: TexturedAndNormalizedTintedShader.vert, frag: fragmentShader});
72+
_this.renderTexture = resourceManager.createTexture(0, gl.LINEAR, gl.LINEAR, wrap, wrap, gl.RGBA, null, _this.width, _this.height);
73+
_this.passRenderTarget = resourceManager.createRenderTarget(_this.width, _this.height, _this.renderTexture, null);
74+
_this.uniforms = {};
75+
_this.textures = {};
76+
scene.sys.game.renderer.currentTexture[0] = null; // force rebinding of prev texture
77+
});
6678
},
6779

6880
clearColorBuffer: function (r, g, b, a)
@@ -109,12 +121,13 @@ var RenderPass = new Class({
109121

110122
render: function (gameObject, camera)
111123
{
112-
var gl = this.renderer.gl;
124+
var renderer = this.renderer;
125+
var gl = renderer.gl;
113126

114-
if (gl)
127+
if (gl && !renderer.contextLost)
115128
{
116-
this.renderer.setRenderer(this.renderer.spriteBatch, null, null);
117-
this.renderer.spriteBatch.addSprite(gameObject, camera);
129+
renderer.setRenderer(this.renderer.spriteBatch, null, null);
130+
renderer.spriteBatch.addSprite(gameObject, camera);
118131
for (var key in this.textures)
119132
{
120133
var textureData = this.textures[key];
@@ -123,18 +136,19 @@ var RenderPass = new Class({
123136
gl.bindTexture(gl.TEXTURE_2D, textureData.texture);
124137
gl.activeTexture(gl.TEXTURE0);
125138
}
126-
this.renderer.spriteBatch.flush(this.passShader, this.passRenderTarget.framebufferObject);
139+
renderer.spriteBatch.flush(this.passShader, this.passRenderTarget.framebufferObject);
127140
}
128141
},
129142

130143
renderRect: function (x, y, width, height, camera)
131144
{
132-
var gl = this.renderer.gl;
145+
var renderer = this.renderer;
146+
var gl = renderer.gl;
133147

134-
if (gl)
148+
if (gl && !renderer.contextLost)
135149
{
136-
this.renderer.setRenderer(this.renderer.spriteBatch, null, null);
137-
this.renderer.spriteBatch.addTileTextureRect(
150+
renderer.setRenderer(this.renderer.spriteBatch, null, null);
151+
renderer.spriteBatch.addTileTextureRect(
138152
null, x, y, width, height, 1.0, 0xFFFFFFFF, this.scrollFactorX, this.scrollFactorY,
139153
width, height, 0, 0, width, height, camera, null
140154
);
@@ -146,15 +160,16 @@ var RenderPass = new Class({
146160
gl.bindTexture(gl.TEXTURE_2D, textureData.texture);
147161
gl.activeTexture(gl.TEXTURE0);
148162
}
149-
this.renderer.spriteBatch.flush(this.passShader, this.passRenderTarget.framebufferObject);
163+
renderer.spriteBatch.flush(this.passShader, this.passRenderTarget.framebufferObject);
150164
}
151165
},
152166

153167
setRenderTextureAt: function (renderTexture, samplerName, unit)
154168
{
155-
var gl = this.renderer.gl;
169+
var renderer = this.renderer;
170+
var gl = renderer.gl;
156171

157-
if (gl)
172+
if (gl && !renderer.contextLost)
158173
{
159174
/* Texture 1 is reserved for Phasers Main Renderer */
160175
unit = (unit > 0) ? unit : 1;

v3/src/gameobjects/text/static/Text.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,12 @@ var Text = new Class({
8282
{
8383
this.updateText();
8484
}
85+
86+
var _this = this;
87+
scene.sys.game.renderer.addContextRestoredCallback(function (renderer) {
88+
_this.canvasTexture = null;
89+
_this.dirty = true;
90+
});
8591
},
8692

8793
setText: function (value)

v3/src/gameobjects/tilemap/static/StaticTilemap.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,15 @@ var StaticTilemap = new Class({
5050
this.setSizeToFrame();
5151
this.setOrigin();
5252
this.setSize(tileWidth * mapWidth, tileHeight * mapHeight);
53+
54+
var _this = this;
55+
scene.sys.game.renderer.addContextRestoredCallback(function (renderer) {
56+
_this.tileTexture = null;
57+
_this.dirty = true;
58+
_this.vbo = null;
59+
_this.gl = renderer.gl;
60+
_this.tilemapRenderer = renderer.tilemapRenderer;
61+
});
5362
},
5463

5564
upload: function (camera)

v3/src/gameobjects/tilesprite/TileSprite.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,13 @@ var TileSprite = new Class({
6161
this.canvasBufferCtx = this.canvasBuffer.getContext('2d');
6262

6363
this.updateTileTexture();
64+
65+
var _this = this;
66+
scene.sys.game.renderer.addContextRestoredCallback(function (renderer) {
67+
_this.tileTexture = null;
68+
_this.dirty = true;
69+
_this.tileTexture = resourceManager.createTexture(0, gl.LINEAR, gl.LINEAR, gl.REPEAT, gl.REPEAT, gl.RGBA, _this.canvasBuffer, _this.potWidth, _this.potHeight);
70+
});
6471
},
6572

6673
updateTileTexture: function ()

v3/src/renderer/canvas/CanvasRenderer.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,15 @@ var CanvasRenderer = new Class({
9393
}
9494
},
9595

96+
addContextLostCallback: function (callback)
97+
{
98+
},
99+
100+
addContextRestoredCallback: function (callback)
101+
{
102+
},
103+
104+
96105
resetTransform: function ()
97106
{
98107
this.currentContext.setTransform(1, 0, 0, 1, 0, 0);

v3/src/renderer/webgl/WebGLRenderer.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,12 @@ var WebGLRenderer = new Class({
5858
_this.resourceManager.shaderCount = 0;
5959
_this.contextLost = false;
6060
_this.init();
61+
_this.game.textures.each(function (texture) {
62+
for (var i = 0; i < texture.source.length; ++i)
63+
{
64+
texture.source[i].init(_this.game);
65+
}
66+
}, null);
6167
for (var index = 0; index < callbacks.length; ++index)
6268
{
6369
callbacks[index](_this);

v3/src/textures/TextureSource.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ var TextureSource = new Class({
99

1010
function TextureSource (texture, source, width, height)
1111
{
12+
var game = texture.manager.game;
13+
1214
this.texture = texture;
1315

1416
this.image = source;
@@ -25,13 +27,16 @@ var TextureSource = new Class({
2527

2628
this.isPowerOf2 = IsSizePowerOfTwo(this.width, this.height);
2729

28-
this.glTexture = null;
30+
this.init(game);
31+
},
2932

30-
var game = texture.manager.game;
33+
init: function (game)
34+
{
35+
this.glTexture = null;
3136

3237
if (game.config.renderType === CONST.WEBGL)
3338
{
34-
game.renderer.createTexture(this, width, height);
39+
game.renderer.createTexture(this, this.width, this.height);
3540
}
3641

3742
if (game.config.pixelArt)

0 commit comments

Comments
 (0)