Skip to content

Commit e0918df

Browse files
committed
Canvas particle renderer now using same matrix math as webgl
1 parent 0a03535 commit e0918df

1 file changed

Lines changed: 61 additions & 43 deletions

File tree

src/gameobjects/particles/ParticleManagerCanvasRenderer.js

Lines changed: 61 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -30,93 +30,111 @@ var ParticleManagerCanvasRenderer = function (renderer, emitterManager, interpol
3030
}
3131

3232
var camMatrix = renderer._tempMatrix1.copyFrom(camera.matrix);
33-
var managerMatrix = renderer._tempMatrix2.applyITRS(emitterManager.x, emitterManager.y, emitterManager.rotation, emitterManager.scaleX, emitterManager.scaleY);
33+
var calcMatrix = renderer._tempMatrix2;
34+
var particleMatrix = renderer._tempMatrix3;
35+
var managerMatrix = renderer._tempMatrix4.applyITRS(emitterManager.x, emitterManager.y, emitterManager.rotation, emitterManager.scaleX, emitterManager.scaleY);
3436

3537
camMatrix.multiply(managerMatrix);
3638

39+
var roundPixels = camera.roundPixels;
40+
3741
var ctx = renderer.currentContext;
38-
var matrix = camMatrix.matrix;
3942

4043
ctx.save();
4144

42-
ctx.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);
43-
44-
if (parentMatrix !== undefined)
45+
for (var e = 0; e < emittersLength; e++)
4546
{
46-
matrix = parentMatrix.matrix;
47-
48-
ctx.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);
49-
}
50-
51-
for (var i = 0; i < emittersLength; i++)
52-
{
53-
var emitter = emitters[i];
54-
47+
var emitter = emitters[e];
5548
var particles = emitter.alive;
56-
var length = particles.length;
49+
var particleCount = particles.length;
5750

58-
if (!emitter.visible || length === 0)
51+
if (!emitter.visible || particleCount === 0)
5952
{
6053
continue;
6154
}
6255

63-
var lastAlpha = ctx.globalAlpha;
56+
var scrollX = camera.scrollX * emitter.scrollFactorX;
57+
var scrollY = camera.scrollY * emitter.scrollFactorY;
6458

65-
var cameraScrollX = camera.scrollX * emitter.scrollFactorX;
66-
var cameraScrollY = camera.scrollY * emitter.scrollFactorY;
59+
if (parentMatrix)
60+
{
61+
// Multiply the camera by the parent matrix
62+
camMatrix.multiplyWithOffset(parentMatrix, -scrollX, -scrollY);
63+
64+
scrollX = 0;
65+
scrollY = 0;
66+
}
6767

6868
if (renderer.currentBlendMode !== emitter.blendMode)
6969
{
7070
renderer.currentBlendMode = emitter.blendMode;
7171
ctx.globalCompositeOperation = renderer.blendModes[emitter.blendMode];
7272
}
7373

74-
for (var index = 0; index < length; ++index)
74+
for (var i = 0; i < particleCount; i++)
7575
{
76-
var particle = particles[index];
76+
var particle = particles[i];
7777

78-
var particleAlpha = camera.alpha * ((particle.color >> 24) & 0xFF) / 255;
78+
var alpha = particle.alpha * camera.alpha;
7979

80-
if (particleAlpha <= 0)
80+
if (alpha <= 0)
8181
{
8282
continue;
8383
}
8484

8585
var frame = particle.frame;
86-
var width = frame.width;
87-
var height = frame.height;
88-
var ox = width * 0.5;
89-
var oy = height * 0.5;
90-
var cd = frame.canvasData;
9186

92-
var x = -ox;
93-
var y = -oy;
87+
var x = -(frame.halfWidth);
88+
var y = -(frame.halfHeight);
9489

95-
var tx = particle.x - cameraScrollX;
96-
var ty = particle.y - cameraScrollY;
90+
// var width = frame.width;
91+
// var height = frame.height;
92+
// var ox = width * 0.5;
93+
// var oy = height * 0.5;
9794

98-
if (camera.roundPixels)
99-
{
100-
tx |= 0;
101-
ty |= 0;
102-
}
95+
particleMatrix.applyITRS(0, 0, particle.rotation, particle.scaleX, particle.scaleY);
10396

104-
ctx.globalAlpha = particleAlpha;
97+
particleMatrix.e = particle.x - scrollX;
98+
particleMatrix.f = particle.y - scrollY;
99+
100+
camMatrix.multiply(particleMatrix, calcMatrix);
101+
102+
// var x = -ox;
103+
// var y = -oy;
104+
105+
// var tx = particle.x - cameraScrollX;
106+
// var ty = particle.y - cameraScrollY;
107+
108+
// if (camera.roundPixels)
109+
// {
110+
// tx |= 0;
111+
// ty |= 0;
112+
// }
113+
114+
ctx.globalAlpha = alpha;
105115

106116
ctx.save();
107117

108-
ctx.translate(tx, ty);
118+
calcMatrix.copyToContext(ctx);
119+
120+
if (roundPixels)
121+
{
122+
x |= 0;
123+
y |= 0;
124+
}
125+
126+
// ctx.translate(tx, ty);
109127

110-
ctx.rotate(particle.rotation);
128+
// ctx.rotate(particle.rotation);
111129

112-
ctx.scale(particle.scaleX, particle.scaleY);
130+
// ctx.scale(particle.scaleX, particle.scaleY);
131+
132+
var cd = frame.canvasData;
113133

114134
ctx.drawImage(frame.source.image, cd.x, cd.y, cd.width, cd.height, x, y, cd.width, cd.height);
115135

116136
ctx.restore();
117137
}
118-
119-
ctx.globalAlpha = lastAlpha;
120138
}
121139

122140
ctx.restore();

0 commit comments

Comments
 (0)