Skip to content

Commit c268d44

Browse files
committed
Renderer now renders the entire manager, saving a flush after each emitter.
1 parent c65c247 commit c268d44

3 files changed

Lines changed: 172 additions & 15 deletions

File tree

v3/src/gameobjects/particles/ParticleManagerCanvasRenderer.js

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,15 @@ var ParticleManagerCanvasRenderer = function (renderer, emitterManager, interpol
1515

1616
var particles = emitter.alive;
1717
var length = particles.length;
18-
var ctx = renderer.currentContext;
1918

20-
// TODO: Move into the ctx loop below as it's now Particle specific
21-
var frame = emitter.frame;
22-
var dx = frame.x;
23-
var dy = frame.y;
24-
var width = frame.width;
25-
var height = frame.height;
26-
var ox = width * 0.5;
27-
var oy = height * 0.5;
19+
if (!emitter.visible || length === 0)
20+
{
21+
continue;
22+
}
23+
24+
var ctx = renderer.currentContext;
2825

2926
var lastAlpha = ctx.globalAlpha;
30-
var cd = frame.canvasData;
3127
var cameraScrollX = camera.scrollX * emitter.scrollFactorX;
3228
var cameraScrollY = camera.scrollY * emitter.scrollFactorY;
3329

@@ -40,6 +36,16 @@ var ParticleManagerCanvasRenderer = function (renderer, emitterManager, interpol
4036
for (var index = 0; index < length; ++index)
4137
{
4238
var particle = particles[index];
39+
40+
var frame = particle.frame;
41+
var dx = frame.x;
42+
var dy = frame.y;
43+
var width = frame.width;
44+
var height = frame.height;
45+
var ox = width * 0.5;
46+
var oy = height * 0.5;
47+
var cd = frame.canvasData;
48+
4349
var x = -ox;
4450
var y = -oy;
4551
var alpha = ((particle.color >> 24) & 0xFF) / 255.0;

v3/src/gameobjects/particles/ParticleManagerWebGLRenderer.js

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,7 @@ var ParticleManagerWebGLRenderer = function (renderer, emitterManager, interpola
99
return;
1010
}
1111

12-
for (var i = 0; i < emitters.length; i++)
13-
{
14-
renderer.particleRenderer.renderEmitter(emitters[i], camera);
15-
}
12+
renderer.particleRenderer.renderEmitterManager(emitterManager, camera);
1613
};
1714

1815
module.exports = ParticleManagerWebGLRenderer;

v3/src/renderer/webgl/renderers/particlerenderer/ParticleRenderer.js

Lines changed: 155 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ var ParticleRenderer = new Class({
170170
);
171171
},
172172

173+
/*
173174
renderEmitter: function (emitter, camera)
174175
{
175176
var particles = emitter.alive;
@@ -213,7 +214,7 @@ var ParticleRenderer = new Class({
213214
var cameraScrollX = camera.scrollX * emitter.scrollFactorX;
214215
var cameraScrollY = camera.scrollY * emitter.scrollFactorY;
215216
216-
this.manager.setRenderer(this, emitter.frame.source.glTexture, renderTarget);
217+
this.manager.setRenderer(this, emitter.defaultFrame.source.glTexture, renderTarget);
217218
218219
// If there are more particles than fit into a single batch (16000) then it flushes after each one
219220
for (var batchIndex = 0; batchIndex < batchCount; ++batchIndex)
@@ -309,6 +310,159 @@ var ParticleRenderer = new Class({
309310
elementCount = 0;
310311
}
311312
},
313+
*/
314+
315+
renderEmitterManager: function (emitterManager, camera)
316+
{
317+
var renderTarget = emitterManager.renderTarget;
318+
319+
this.manager.setRenderer(this, emitterManager.defaultFrame.source.glTexture, renderTarget);
320+
321+
var emitters = emitterManager.emitters;
322+
323+
for (var i = 0; i < emitters.length; i++)
324+
{
325+
var emitter = emitters[i];
326+
var particles = emitter.alive;
327+
var length = particles.length;
328+
329+
if (!emitter.visible || length === 0)
330+
{
331+
continue;
332+
}
333+
334+
if (emitter.blendMode !== this.manager.blendMode)
335+
{
336+
this.manager.setBlendMode(emitter.blendMode);
337+
}
338+
339+
var data = this.vertexDataBuffer;
340+
var vbF32 = data.floatView;
341+
var vbU32 = data.uintView;
342+
var vtxOffset = 0;
343+
344+
var cameraMatrix = camera.matrix.matrix;
345+
var cma = cameraMatrix[0];
346+
var cmb = cameraMatrix[1];
347+
var cmc = cameraMatrix[2];
348+
var cmd = cameraMatrix[3];
349+
var cme = cameraMatrix[4];
350+
var cmf = cameraMatrix[5];
351+
352+
var elementCount = this.elementCount;
353+
354+
var particleCount = 0;
355+
var batchCount = Math.ceil(length / CONST.MAX);
356+
357+
// var renderTarget = emitter.renderTarget;
358+
359+
var tempMatrix = this.tempMatrix;
360+
var tempMatrixMatrix = tempMatrix.matrix;
361+
362+
var particleOffset = 0;
363+
364+
var cameraScrollX = camera.scrollX * emitter.scrollFactorX;
365+
var cameraScrollY = camera.scrollY * emitter.scrollFactorY;
366+
367+
// If there are more particles than fit into a single batch (16000) then it flushes after each one
368+
for (var batchIndex = 0; batchIndex < batchCount; ++batchIndex)
369+
{
370+
var batchSize = Math.min(length, CONST.MAX);
371+
372+
for (var index = 0; index < batchSize; index++)
373+
{
374+
var particle = particles[particleOffset + index];
375+
376+
var frame = particle.frame;
377+
var uvs = frame.uvs;
378+
379+
var x = -(frame.halfWidth);
380+
var y = -(frame.halfHeight);
381+
382+
var color = particle.color;
383+
384+
var xw = x + frame.width;
385+
var yh = y + frame.height;
386+
387+
tempMatrix.applyITRS(
388+
particle.x - cameraScrollX * particle.scrollFactorX,
389+
particle.y - cameraScrollY * particle.scrollFactorY,
390+
particle.rotation,
391+
particle.scaleX,
392+
particle.scaleY
393+
);
394+
395+
var sra = tempMatrixMatrix[0];
396+
var srb = tempMatrixMatrix[1];
397+
var src = tempMatrixMatrix[2];
398+
var srd = tempMatrixMatrix[3];
399+
var sre = tempMatrixMatrix[4];
400+
var srf = tempMatrixMatrix[5];
401+
402+
var mva = sra * cma + srb * cmc;
403+
var mvb = sra * cmb + srb * cmd;
404+
var mvc = src * cma + srd * cmc;
405+
var mvd = src * cmb + srd * cmd;
406+
var mve = sre * cma + srf * cmc + cme;
407+
var mvf = sre * cmb + srf * cmd + cmf;
408+
409+
var tx0 = x * mva + y * mvc + mve;
410+
var ty0 = x * mvb + y * mvd + mvf;
411+
var tx1 = x * mva + yh * mvc + mve;
412+
var ty1 = x * mvb + yh * mvd + mvf;
413+
var tx2 = xw * mva + yh * mvc + mve;
414+
var ty2 = xw * mvb + yh * mvd + mvf;
415+
var tx3 = xw * mva + y * mvc + mve;
416+
var ty3 = xw * mvb + y * mvd + mvf;
417+
418+
vtxOffset = data.allocate(20);
419+
elementCount += 6;
420+
421+
// Top Left
422+
vbF32[vtxOffset++] = tx0;
423+
vbF32[vtxOffset++] = ty0;
424+
vbF32[vtxOffset++] = uvs.x0;
425+
vbF32[vtxOffset++] = uvs.y0;
426+
vbU32[vtxOffset++] = color;
427+
428+
// Bottom Left
429+
vbF32[vtxOffset++] = tx1;
430+
vbF32[vtxOffset++] = ty1;
431+
vbF32[vtxOffset++] = uvs.x1;
432+
vbF32[vtxOffset++] = uvs.y1;
433+
vbU32[vtxOffset++] = color;
434+
435+
// Bottom Right
436+
vbF32[vtxOffset++] = tx2;
437+
vbF32[vtxOffset++] = ty2;
438+
vbF32[vtxOffset++] = uvs.x2;
439+
vbF32[vtxOffset++] = uvs.y2;
440+
vbU32[vtxOffset++] = color;
441+
442+
// Top Right
443+
vbF32[vtxOffset++] = tx3;
444+
vbF32[vtxOffset++] = ty3;
445+
vbF32[vtxOffset++] = uvs.x3;
446+
vbF32[vtxOffset++] = uvs.y3;
447+
vbU32[vtxOffset++] = color;
448+
}
449+
450+
particleOffset += batchSize;
451+
452+
length -= batchSize;
453+
454+
this.elementCount = elementCount;
455+
456+
if (this.isFull())
457+
{
458+
this.flush(undefined, renderTarget);
459+
elementCount = 0;
460+
}
461+
}
462+
}
463+
464+
this.flush(undefined, renderTarget);
465+
},
312466

313467
destroy: function ()
314468
{

0 commit comments

Comments
 (0)