Skip to content

Commit bc28187

Browse files
committed
- Particle Emitter canvas renderer
- Camera Effects resets blend mode to avoid bug when dealing with custom blended game objects
1 parent 9e8d239 commit bc28187

4 files changed

Lines changed: 56 additions & 4 deletions

File tree

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,55 @@
1-
var ParticleEmitterCanvasRenderer = function (renderer, src, interpolationPercentage, camera)
1+
var GameObject = require('../GameObject');
2+
3+
var ParticleEmitterCanvasRenderer = function (renderer, emitter, interpolationPercentage, camera)
24
{
5+
var particles = emitter.alive;
6+
var length = particles.length;
7+
var ctx = renderer.currentContext;
8+
var frame = emitter.frame;
9+
var dx = frame.x;
10+
var dy = frame.y;
11+
var width = frame.width;
12+
var height = frame.height;
13+
var ox = width * 0.5;
14+
var oy = height * 0.5;
15+
var lastAlpha = ctx.globalAlpha;
16+
var cd = frame.canvasData;
17+
var cameraScrollX = camera.scrollX * emitter.scrollFactorX;
18+
var cameraScrollY = camera.scrollY * emitter.scrollFactorY;
19+
20+
if (length === 0 || GameObject.RENDER_MASK !== emitter.renderFlags || (emitter.cameraFilter > 0 && (emitter.cameraFilter & camera._id)))
21+
{
22+
return;
23+
}
24+
25+
if (renderer.currentBlendMode !== emitter.blendMode)
26+
{
27+
renderer.currentBlendMode = emitter.blendMode;
28+
ctx.globalCompositeOperation = renderer.blendModes[emitter.blendMode];
29+
}
30+
31+
for (var index = 0; index < length; ++index)
32+
{
33+
var particle = particles[index];
34+
var x = -ox;
35+
var y = -oy;
36+
var scaleX = particle.scaleX;
37+
var scaleY = particle.scaleY;
38+
var rotation = particle.rotation;
39+
var color = particle.color;
40+
var alpha = ((color >> 24) & 0xFF) / 255.0;
41+
42+
ctx.globalAlpha = alpha;
43+
44+
ctx.save();
45+
ctx.translate(particle.x - cameraScrollX, particle.y - cameraScrollY);
46+
ctx.rotate(rotation);
47+
ctx.scale(scaleX, scaleY);
48+
ctx.drawImage(frame.source.image, cd.sx, cd.sy, cd.sWidth, cd.sHeight, x, y, cd.dWidth, cd.dHeight);
49+
ctx.restore();
50+
}
351

52+
ctx.globalAlpha = lastAlpha;
453
};
554

655
module.exports = ParticleEmitterCanvasRenderer;

v3/src/renderer/canvas/CanvasRenderer.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,8 @@ var CanvasRenderer = new Class({
227227

228228
if (camera._fadeAlpha > 0 || camera._flashAlpha > 0)
229229
{
230+
ctx.globalCompositeOperation = 'source-over';
231+
230232
// fade rendering
231233
ctx.fillStyle = 'rgb(' + (camera._fadeRed * 255) + ',' + (camera._fadeGreen * 255) + ',' + (camera._fadeBlue * 255) + ')';
232234
ctx.globalAlpha = camera._fadeAlpha;

v3/src/renderer/webgl/WebGLRenderer.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -500,8 +500,7 @@ var WebGLRenderer = new Class({
500500
if (camera._fadeAlpha > 0 || camera._flashAlpha > 0)
501501
{
502502
this.setRenderTarget(null);
503-
504-
quadBatch.bind();
503+
this.setBlendMode(BlendModes.NORMAL);
505504

506505
// fade rendering
507506
quadBatch.add(

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,8 @@ var ParticleRenderer = new Class({
215215
var tempMatrix = this.tempMatrix;
216216
var tempMatrixMatrix = tempMatrix.matrix;
217217
var particleOffset = 0;
218+
var cameraScrollX = camera.scrollX * emitter.scrollFactorX;
219+
var cameraScrollY = camera.scrollY * emitter.scrollFactorY;
218220

219221
if (length === 0) return;
220222

@@ -235,7 +237,7 @@ var ParticleRenderer = new Class({
235237
var xw = x + width;
236238
var yh = y + height;
237239

238-
tempMatrix.applyITRS(particle.x, particle.y, rotation, scaleX, scaleY);
240+
tempMatrix.applyITRS(particle.x - cameraScrollX, particle.y - cameraScrollY, rotation, scaleX, scaleY);
239241

240242
var sra = tempMatrixMatrix[0];
241243
var srb = tempMatrixMatrix[1];

0 commit comments

Comments
 (0)