Skip to content

Commit d87ea67

Browse files
committed
add opacity calculation to Particle System 2D
1 parent 69d3d60 commit d87ea67

1 file changed

Lines changed: 27 additions & 8 deletions

File tree

cocos/particle-2d/particle-simulator-2d.ts

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ class Particle {
5252
public pos = new Vec2(0, 0);
5353
public startPos = new Vec2(0, 0);
5454
public color = new Color(0, 0, 0, 255);
55+
public curColor = { r: 0, g: 0, b: 0, a: 255 };
5556
public deltaColor = { r: 0, g: 0, b: 0, a: 255 };
5657
public size = 0;
5758
public deltaSize = 0;
@@ -81,6 +82,8 @@ const pool = new ParticlePool((par: Particle): void => {
8182
par.pos.set(Vec2.ZERO);
8283
par.startPos.set(Vec2.ZERO);
8384
par.color.set(0, 0, 0, 255);
85+
par.curColor.r = par.curColor.g = par.curColor.b = 0;
86+
par.curColor.a = 255;
8487
par.deltaColor.r = par.deltaColor.g = par.deltaColor.b = 0;
8588
par.deltaColor.a = 255;
8689
par.size = 0;
@@ -111,6 +114,7 @@ export class Simulator {
111114
private elapsed = 0;
112115
private emitCounter = 0;
113116
private _worldRotation = 0;
117+
private _parentAlpha = 0.0;
114118
private declare sys: ParticleSystem2D;
115119

116120
constructor (system) {
@@ -169,10 +173,10 @@ export class Simulator {
169173
const endColor = psys.endColor;
170174
const endColorVar = psys.endColorVar;
171175

172-
particle.color.r = sr = clamp(startColor.r + startColorVar.r * (random() - 0.5) * 2, 0, 255);
173-
particle.color.g = sg = clamp(startColor.g + startColorVar.g * (random() - 0.5) * 2, 0, 255);
174-
particle.color.b = sb = clamp(startColor.b + startColorVar.b * (random() - 0.5) * 2, 0, 255);
175-
particle.color.a = sa = clamp(startColor.a + startColorVar.a * (random() - 0.5) * 2, 0, 255);
176+
particle.curColor.r = sr = clamp(startColor.r + startColorVar.r * (random() - 0.5) * 2, 0, 255);
177+
particle.curColor.g = sg = clamp(startColor.g + startColorVar.g * (random() - 0.5) * 2, 0, 255);
178+
particle.curColor.b = sb = clamp(startColor.b + startColorVar.b * (random() - 0.5) * 2, 0, 255);
179+
particle.curColor.a = sa = clamp(startColor.a + startColorVar.a * (random() - 0.5) * 2, 0, 255);
176180
particle.deltaColor.r = (clamp(endColor.r + endColorVar.r * (random() - 0.5) * 2, 0, 255) - sr) / timeToLive;
177181
particle.deltaColor.g = (clamp(endColor.g + endColorVar.g * (random() - 0.5) * 2, 0, 255) - sg) / timeToLive;
178182
particle.deltaColor.b = (clamp(endColor.b + endColorVar.b * (random() - 0.5) * 2, 0, 255) - sb) / timeToLive;
@@ -329,6 +333,14 @@ export class Simulator {
329333
Vec4.toArray(vbuf, _col, offset + 32);
330334
}
331335

336+
private _updateColor(): void {
337+
const selfNode = this.sys.node;
338+
const parentNode = selfNode.parent;
339+
const uiProps = selfNode._uiProps;
340+
const parentOpacity = parentNode ? parentNode._uiProps.opacity : 1.0;
341+
this._parentAlpha = uiProps.localOpacity * parentOpacity;
342+
}
343+
332344
public step (dt: number): void {
333345
const assembler = this.sys.assembler as Particle2DAssembler;
334346
const psys = this.sys;
@@ -379,6 +391,8 @@ export class Simulator {
379391
this.updateUVs();
380392
}
381393

394+
this._updateColor();
395+
382396
// Used to reduce memory allocation / creation within the loop
383397
let particleIdx = 0;
384398
while (particleIdx < particles.length) {
@@ -431,10 +445,15 @@ export class Simulator {
431445
}
432446

433447
// color
434-
particle.color.r += particle.deltaColor.r * dt;
435-
particle.color.g += particle.deltaColor.g * dt;
436-
particle.color.b += particle.deltaColor.b * dt;
437-
particle.color.a += particle.deltaColor.a * dt;
448+
particle.curColor.r += particle.deltaColor.r * dt;
449+
particle.curColor.g += particle.deltaColor.g * dt;
450+
particle.curColor.b += particle.deltaColor.b * dt;
451+
particle.curColor.a += particle.deltaColor.a * dt;
452+
453+
particle.color.r = particle.curColor.r;
454+
particle.color.g = particle.curColor.g;
455+
particle.color.b = particle.curColor.b;
456+
particle.color.a = particle.curColor.a * this._parentAlpha;
438457

439458
// size
440459
particle.size += particle.deltaSize * dt;

0 commit comments

Comments
 (0)