Skip to content

Commit 7f4e0f7

Browse files
committed
nicer random distribution in PS emitter
makes "explosions" in fireworks and impact FX circular instead of square, looking much better.
1 parent b452370 commit 7f4e0f7

File tree

1 file changed

+10
-2
lines changed

1 file changed

+10
-2
lines changed

wled00/FXparticleSystem.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,8 +185,16 @@ int32_t ParticleSystem2D::sprayEmit(const PSsource &emitter) {
185185
emitIndex = 0;
186186
if (particles[emitIndex].ttl == 0) { // find a dead particle
187187
success = true;
188-
particles[emitIndex].vx = emitter.vx + hw_random16(emitter.var << 1) - emitter.var; // random(-var, var)
189-
particles[emitIndex].vy = emitter.vy + hw_random16(emitter.var << 1) - emitter.var; // random(-var, var)
188+
int32_t dx = hw_random16(emitter.var << 1) - emitter.var;
189+
int32_t dy = hw_random16(emitter.var << 1) - emitter.var;
190+
if (emitter.var > 5) { // use circular random distribution for large variance to generate nicer "explosions"
191+
while (dx*dx + dy*dy > emitter.var*emitter.var) { // reject points outside circle
192+
dx = hw_random16(emitter.var << 1) - emitter.var;
193+
dy = hw_random16(emitter.var << 1) - emitter.var;
194+
}
195+
}
196+
particles[emitIndex].vx = emitter.vx + dx;
197+
particles[emitIndex].vy = emitter.vy + dy;
190198
particles[emitIndex].x = emitter.source.x;
191199
particles[emitIndex].y = emitter.source.y;
192200
particles[emitIndex].hue = emitter.source.hue;

0 commit comments

Comments
 (0)