Skip to content

Commit 74abb96

Browse files
committed
Added alpha and tint to static tilemap layer. Fixed BitmapMask binding resources issue.
1 parent 92182be commit 74abb96

5 files changed

Lines changed: 55 additions & 24 deletions

File tree

src/renderer/webgl/WebGLPipeline.js

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,16 @@ var WebGLPipeline = new Class({
186186
* @since 3.0.0
187187
*/
188188
this.vertexComponentCount = Utils.getComponentCount(config.attributes);
189+
190+
/**
191+
* Indicates if the current pipeline is flushing the contents to the GPU.
192+
* When the variable is set the flush function will be locked.
193+
*
194+
* @name Phaser.Renderer.WebGL.WebGLPipeline#flushLocked
195+
* @type {boolean}
196+
* @since 3.0.0
197+
*/
198+
this.flushLocked = false;
189199
},
190200

191201
/**
@@ -328,19 +338,26 @@ var WebGLPipeline = new Class({
328338
*/
329339
flush: function ()
330340
{
341+
if (this.flushLocked) return this;
342+
this.flushLocked = true;
343+
331344
var gl = this.gl;
332345
var vertexCount = this.vertexCount;
333346
var vertexBuffer = this.vertexBuffer;
334347
var vertexData = this.vertexData;
335348
var topology = this.topology;
336349
var vertexSize = this.vertexSize;
337350

338-
if (vertexCount === 0) return;
339-
351+
if (vertexCount === 0)
352+
{
353+
this.flushLocked = false;
354+
return;
355+
}
340356
gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.bytes.subarray(0, vertexCount * vertexSize));
341357
gl.drawArrays(topology, 0, vertexCount);
342358

343359
this.vertexCount = 0;
360+
this.flushLocked = false;
344361

345362
return this;
346363
},

src/renderer/webgl/WebGLRenderer.js

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,16 @@ var WebGLRenderer = new Class({
189189

190190
// Intenal Renderer State (Textures, Framebuffers, Pipelines, Buffers, etc)
191191

192+
/**
193+
* [description]
194+
*
195+
* @name Phaser.Renderer.WebGL.WebGLRenderer#currentActiveTextureUnit
196+
* @type {int}
197+
* @since 3.0.0
198+
*/
199+
this.currentActiveTextureUnit = 0;
200+
201+
192202
/**
193203
* [description]
194204
*
@@ -817,7 +827,11 @@ var WebGLRenderer = new Class({
817827
{
818828
this.flush();
819829

820-
gl.activeTexture(gl.TEXTURE0 + textureUnit);
830+
if (this.currentActiveTextureUnit !== textureUnit)
831+
{
832+
gl.activeTexture(gl.TEXTURE0 + textureUnit);
833+
this.currentActiveTextureUnit = textureUnit;
834+
}
821835
gl.bindTexture(gl.TEXTURE_2D, texture);
822836

823837
this.currentTextures[textureUnit] = texture;

src/renderer/webgl/pipelines/BitmapMaskPipeline.js

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -153,10 +153,8 @@ var BitmapMaskPipeline = new Class({
153153

154154
if (bitmapMask && gl)
155155
{
156-
renderer.flush();
157-
158156
// First we clear the mask framebuffer
159-
gl.bindFramebuffer(gl.FRAMEBUFFER, mask.maskFramebuffer);
157+
renderer.setFramebuffer(mask.maskFramebuffer);
160158
gl.clearColor(0, 0, 0, 0);
161159
gl.clear(gl.COLOR_BUFFER_BIT);
162160

@@ -167,7 +165,7 @@ var BitmapMaskPipeline = new Class({
167165
renderer.flush();
168166

169167
// Bind and clear our main source (masked object)
170-
gl.bindFramebuffer(gl.FRAMEBUFFER, mask.mainFramebuffer);
168+
renderer.setFramebuffer(mask.mainFramebuffer);
171169
gl.clearColor(0, 0, 0, 0);
172170
gl.clear(gl.COLOR_BUFFER_BIT);
173171
}
@@ -189,19 +187,14 @@ var BitmapMaskPipeline = new Class({
189187

190188
if (bitmapMask)
191189
{
192-
renderer.flush();
193-
194190
// Return to default framebuffer
195-
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
191+
renderer.setFramebuffer(null);
196192

197193
// Bind bitmap mask pipeline and draw
198194
renderer.setPipeline(this);
199195

200-
gl.activeTexture(gl.TEXTURE1);
201-
gl.bindTexture(gl.TEXTURE_2D, mask.maskTexture);
202-
203-
gl.activeTexture(gl.TEXTURE0);
204-
gl.bindTexture(gl.TEXTURE_2D, mask.mainTexture);
196+
renderer.setTexture2D(mask.maskTexture, 1);
197+
renderer.setTexture2D(mask.mainTexture, 0);
205198

206199
// Finally draw a triangle filling the whole screen
207200
gl.drawArrays(this.topology, 0, 3);

src/renderer/webgl/pipelines/TextureTintPipeline.js

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,11 @@ var TextureTintPipeline = new Class({
158158

159159
flush: function ()
160160
{
161+
if (this.flushLocked) return this;
162+
this.flushLocked = true;
163+
161164
var gl = this.gl;
165+
var renderer = this.renderer;
162166
var vertexCount = this.vertexCount;
163167
var vertexBuffer = this.vertexBuffer;
164168
var vertexData = this.vertexData;
@@ -170,8 +174,11 @@ var TextureTintPipeline = new Class({
170174
var batch = null;
171175
var nextBatch = null;
172176

173-
if (batchCount === 0 || vertexCount === 0) return;
174-
177+
if (batchCount === 0 || vertexCount === 0)
178+
{
179+
this.flushLocked = false;
180+
return this;
181+
}
175182
gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.bytes.subarray(0, vertexCount * vertexSize));
176183

177184
for (var index = 0; index < batches.length - 1; ++index)
@@ -186,8 +193,7 @@ var TextureTintPipeline = new Class({
186193
var nTexture = batch.textures[textureIndex];
187194
if (nTexture)
188195
{
189-
gl.activeTexture(gl.TEXTURE0 + 1 + textureIndex);
190-
gl.bindTexture(gl.TEXTURE_2D, nTexture);
196+
renderer.setTexture2D(nTexture, 1 + textureIndex);
191197
}
192198
}
193199
gl.activeTexture(gl.TEXTURE0);
@@ -197,7 +203,7 @@ var TextureTintPipeline = new Class({
197203

198204
if (batch.texture === null || batchVertexCount <= 0) continue;
199205

200-
gl.bindTexture(gl.TEXTURE_2D, batch.texture);
206+
renderer.setTexture2D(batch.texture, 0);
201207
gl.drawArrays(topology, batch.first, batchVertexCount);
202208
}
203209

@@ -211,8 +217,7 @@ var TextureTintPipeline = new Class({
211217
var nTexture = batch.textures[textureIndex];
212218
if (nTexture)
213219
{
214-
gl.activeTexture(gl.TEXTURE0 + 1 + textureIndex);
215-
gl.bindTexture(gl.TEXTURE_2D, nTexture);
220+
renderer.setTexture2D(nTexture, 1 + textureIndex);
216221
}
217222
}
218223
gl.activeTexture(gl.TEXTURE0);
@@ -222,12 +227,13 @@ var TextureTintPipeline = new Class({
222227

223228
if (batch.texture && batchVertexCount > 0)
224229
{
225-
gl.bindTexture(gl.TEXTURE_2D, batch.texture);
230+
renderer.setTexture2D(batch.texture, 0);
226231
gl.drawArrays(topology, batch.first, batchVertexCount);
227232
}
228233

229234
this.vertexCount = 0;
230235
batches.length = 0;
236+
this.flushLocked = false;
231237

232238
return this;
233239
},

src/tilemaps/staticlayer/StaticTilemapLayer.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ var Components = require('../../gameobjects/components');
99
var GameObject = require('../../gameobjects/GameObject');
1010
var StaticTilemapLayerRender = require('./StaticTilemapLayerRender');
1111
var TilemapComponents = require('../components');
12+
var Utils = require('../../renderer/webgl/Utils');
1213

1314
/**
1415
* @classdesc
@@ -248,7 +249,6 @@ var StaticTilemapLayer = new Class({
248249
var voffset = 0;
249250
var vertexCount = 0;
250251
var bufferSize = (mapWidth * mapHeight) * pipeline.vertexSize * 6;
251-
var tint = 0xffffffff;
252252

253253
if (bufferData === null)
254254
{
@@ -289,6 +289,7 @@ var StaticTilemapLayer = new Class({
289289
var ty2 = tyh;
290290
var tx3 = txw;
291291
var ty3 = ty;
292+
var tint = Utils.getTintAppendFloatAlpha(0xffffff, tile.alpha);
292293

293294
vertexViewF32[voffset + 0] = tx0;
294295
vertexViewF32[voffset + 1] = ty0;

0 commit comments

Comments
 (0)