Skip to content

Commit 0516fd4

Browse files
committed
The Flat Tint Pipeline is now using the same shader as the Texture Tint
Time to make sure no texture swaps happen and we can finally have Graphics mixed with Sprites in the display list with no swapping cost (and soon, no flush cost either when we unify the pipelines)
1 parent 8c19c2b commit 0516fd4

4 files changed

Lines changed: 79 additions & 20 deletions

File tree

src/renderer/webgl/WebGLRenderer.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,8 @@ var WebGLRenderer = new Class({
533533
*/
534534
boot: function ()
535535
{
536+
this.blankTexture = this.game.textures.getFrame('__DEFAULT').glTexture;
537+
536538
for (var pipelineName in this.pipelines)
537539
{
538540
this.pipelines[pipelineName].boot();

src/renderer/webgl/pipelines/FlatTintPipeline.js

Lines changed: 75 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@
88
var Class = require('../../../utils/Class');
99
var Commands = require('../../../gameobjects/graphics/Commands');
1010
var Earcut = require('../../../geom/polygon/Earcut');
11+
var GetFastValue = require('../../../utils/object/GetFastValue');
1112
var ModelViewProjection = require('./components/ModelViewProjection');
12-
var ShaderSourceFS = require('../shaders/FlatTint-frag.js');
13-
var ShaderSourceVS = require('../shaders/FlatTint-vert.js');
13+
var ShaderSourceFS = require('../shaders/TextureTint-frag.js');
14+
var ShaderSourceVS = require('../shaders/TextureTint-vert.js');
1415
var TransformMatrix = require('../../../gameobjects/components/TransformMatrix');
1516
var Utils = require('../Utils');
1617
var WebGLPipeline = require('../WebGLPipeline');
@@ -70,19 +71,17 @@ var FlatTintPipeline = new Class({
7071

7172
function FlatTintPipeline (config)
7273
{
74+
var rendererConfig = config.renderer.config;
75+
7376
WebGLPipeline.call(this, {
7477
game: config.game,
7578
renderer: config.renderer,
7679
gl: config.renderer.gl,
77-
topology: (config.topology ? config.topology : config.renderer.gl.TRIANGLES),
78-
vertShader: (config.vertShader ? config.vertShader : ShaderSourceVS),
79-
fragShader: (config.fragShader ? config.fragShader : ShaderSourceFS),
80-
vertexCapacity: (config.vertexCapcity ? config.vertexCapacity : 12000),
81-
82-
vertexSize: (config.vertexSize ? config.vertexSize :
83-
Float32Array.BYTES_PER_ELEMENT * 2 +
84-
Uint8Array.BYTES_PER_ELEMENT * 4),
85-
80+
topology: GetFastValue(config, 'topology', config.renderer.gl.TRIANGLES),
81+
vertShader: GetFastValue(config, 'vertShader', ShaderSourceVS),
82+
fragShader: GetFastValue(config, 'fragShader', ShaderSourceFS),
83+
vertexCapacity: GetFastValue(config, 'vertexCapacity', 6 * rendererConfig.batchSize),
84+
vertexSize: GetFastValue(config, 'vertexSize', Float32Array.BYTES_PER_ELEMENT * 5 + Uint8Array.BYTES_PER_ELEMENT * 4),
8685
attributes: [
8786
{
8887
name: 'inPosition',
@@ -91,12 +90,26 @@ var FlatTintPipeline = new Class({
9190
normalized: false,
9291
offset: 0
9392
},
93+
{
94+
name: 'inTexCoord',
95+
size: 2,
96+
type: config.renderer.gl.FLOAT,
97+
normalized: false,
98+
offset: Float32Array.BYTES_PER_ELEMENT * 2
99+
},
100+
{
101+
name: 'inTintEffect',
102+
size: 1,
103+
type: config.renderer.gl.FLOAT,
104+
normalized: false,
105+
offset: Float32Array.BYTES_PER_ELEMENT * 4
106+
},
94107
{
95108
name: 'inTint',
96109
size: 4,
97110
type: config.renderer.gl.UNSIGNED_BYTE,
98111
normalized: true,
99-
offset: Float32Array.BYTES_PER_ELEMENT * 2
112+
offset: Float32Array.BYTES_PER_ELEMENT * 5
100113
}
101114
]
102115
});
@@ -222,6 +235,44 @@ var FlatTintPipeline = new Class({
222235
return this;
223236
},
224237

238+
/**
239+
* Uploads the vertex data and emits a draw call
240+
* for the current batch of vertices.
241+
*
242+
* @method Phaser.Renderer.WebGL.WebGLPipeline#flush
243+
* @since 3.0.0
244+
*
245+
* @return {Phaser.Renderer.WebGL.WebGLPipeline} [description]
246+
*/
247+
flush: function ()
248+
{
249+
if (this.flushLocked) { return this; }
250+
251+
this.flushLocked = true;
252+
253+
var gl = this.gl;
254+
var vertexCount = this.vertexCount;
255+
var topology = this.topology;
256+
var vertexSize = this.vertexSize;
257+
var renderer = this.renderer;
258+
259+
if (vertexCount === 0)
260+
{
261+
this.flushLocked = false;
262+
return;
263+
}
264+
265+
renderer.setTexture2D(renderer.blankTexture, 0);
266+
267+
gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.bytes.subarray(0, vertexCount * vertexSize));
268+
gl.drawArrays(topology, 0, vertexCount);
269+
270+
this.vertexCount = 0;
271+
this.flushLocked = false;
272+
273+
return this;
274+
},
275+
225276
batchVertex: function (x, y, tint)
226277
{
227278
var vertexViewF32 = this.vertexViewF32;
@@ -231,12 +282,9 @@ var FlatTintPipeline = new Class({
231282

232283
vertexViewF32[++vertexOffset] = x;
233284
vertexViewF32[++vertexOffset] = y;
234-
235-
// For the TTP
236-
// vertexViewF32[++vertexOffset] = u0;
237-
// vertexViewF32[++vertexOffset] = v0;
238-
// vertexViewF32[++vertexOffset] = tintEffect;
239-
285+
vertexViewF32[++vertexOffset] = 0;
286+
vertexViewF32[++vertexOffset] = 0;
287+
vertexViewF32[++vertexOffset] = 0.5;
240288
vertexViewU32[++vertexOffset] = tint;
241289

242290
this.vertexCount++;
@@ -251,14 +299,23 @@ var FlatTintPipeline = new Class({
251299

252300
vertexViewF32[++vertexOffset] = x1;
253301
vertexViewF32[++vertexOffset] = y1;
302+
vertexViewF32[++vertexOffset] = 0;
303+
vertexViewF32[++vertexOffset] = 0;
304+
vertexViewF32[++vertexOffset] = 0.5;
254305
vertexViewU32[++vertexOffset] = tint;
255306

256307
vertexViewF32[++vertexOffset] = x2;
257308
vertexViewF32[++vertexOffset] = y2;
309+
vertexViewF32[++vertexOffset] = 0;
310+
vertexViewF32[++vertexOffset] = 0;
311+
vertexViewF32[++vertexOffset] = 0.5;
258312
vertexViewU32[++vertexOffset] = tint;
259313

260314
vertexViewF32[++vertexOffset] = x3;
261315
vertexViewF32[++vertexOffset] = y3;
316+
vertexViewF32[++vertexOffset] = 0;
317+
vertexViewF32[++vertexOffset] = 0;
318+
vertexViewF32[++vertexOffset] = 0.5;
262319
vertexViewU32[++vertexOffset] = tint;
263320

264321
this.vertexCount += 3;

src/renderer/webgl/shaders/TextureTint-frag.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ module.exports = [
1818
' texel = texture2D(uMainSampler, outTexCoord);',
1919
' texel.rgb = mix(texel.rgb, outTint.rgb, texel.a);',
2020
' }',
21-
' else',
21+
' else if (outTintEffect == 0.0)',
2222
' {',
2323
' texel *= texture2D(uMainSampler, outTexCoord);',
2424
' }',

src/renderer/webgl/shaders/src/TextureTint.frag

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ void main()
1717
texel = texture2D(uMainSampler, outTexCoord);
1818
texel.rgb = mix(texel.rgb, outTint.rgb, texel.a);
1919
}
20-
else
20+
else if (outTintEffect == 0.0)
2121
{
2222
texel *= texture2D(uMainSampler, outTexCoord);
2323
}

0 commit comments

Comments
 (0)