@@ -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