| { |
| "MaxCount": 300, |
| "Drawable": { |
| "Type": "SkCircleDrawable", |
| "Radius": 3 |
| }, |
| "Code": [ |
| "void effectSpawn(inout Effect effect) {", |
| " // Phase one: Launch", |
| " effect.lifetime = 4;", |
| " effect.rate = 120;", |
| " float a = radians(mix(-20, 20, rand(effect.seed)) - 90);", |
| " float s = mix(200, 220, rand(effect.seed));", |
| " effect.vel.x = cos(a) * s;", |
| " effect.vel.y = sin(a) * s;", |
| " effect.color.rgb = float3(rand(effect.seed), rand(effect.seed), rand(effect.seed));", |
| " effect.pos.x = 0;", |
| " effect.pos.y = 0;", |
| " effect.scale = 0.25; // Also used as particle behavior flag", |
| "}", |
| "", |
| "void effectUpdate(inout Effect effect) {", |
| " if (effect.age > 0.5 && effect.rate > 0) {", |
| " // Phase two: Explode", |
| " effect.rate = 0;", |
| " effect.burst = 50;", |
| " effect.scale = 1;", |
| " } else {", |
| " effect.vel.y += dt * 90;", |
| " }", |
| "}", |
| "", |
| "void spawn(inout Particle p) {", |
| " bool explode = p.scale == 1;", |
| "", |
| " p.lifetime = explode ? (2 + rand(p.seed) * 0.5) : 0.5;", |
| " float a = radians(rand(p.seed) * 360);", |
| " float s = explode ? mix(90, 100, rand(p.seed)) : mix(5, 10, rand(p.seed));", |
| " p.vel.x = cos(a) * s;", |
| " p.vel.y = sin(a) * s;", |
| "}", |
| "", |
| "void update(inout Particle p) {", |
| " p.color.a = 1 - p.age;", |
| " if (p.scale == 1) {", |
| " p.vel.y += dt * 50;", |
| " }", |
| "}", |
| "" |
| ], |
| "Bindings": [] |
| } |