{ "MaxCount": 128, "Drawable": { "Type": "SkCircleDrawable", "Radius": 2 }, "EffectCode": [ "void effectSpawn(inout Effect effect) {", " if (effect.loop == 0) {", " cloud(true);", " }", " effect.color = float4(0.1, 0.1, 1.0, 1.0);", " effect.rate = 10;", "}", "" ], "Code": [ "void spawn(inout Particle p) {", " p.lifetime = 4;", " p.pos.x = mix(-50, 50, rand);", " p.vel.y = 50;", "}", "", "bool once(bool cond, inout uint flags, uint flag) {", " bool result = false;", " if (cond && (flags & flag) == 0) {", " flags |= flag;", " result = true;", " }", " return result;", "}", "", "void update(inout Particle p) {", " p.vel.y += 20 * dt;", " if (once(p.pos.y > 150, p.flags, 0x1)) {", " p.scale = 0;", " splash(false);", " }", "}", "" ], "Bindings": [ { "Type": "SkEffectBinding", "Name": "cloud", "MaxCount": 60, "Drawable": { "Type": "SkCircleDrawable", "Radius": 16 }, "EffectCode": [ "void effectSpawn(inout Effect effect) {", " effect.color = float4(1, 1, 1, 1);", " effect.rate = 30;", "}", "" ], "Code": [ "float2 circle() {", " float2 xy;", " do {", " xy.x = 2 * rand - 1;", " xy.y = 2 * rand - 1;", " } while (dot(xy, xy) > 1);", " return xy;", "}", "", "void spawn(inout Particle p) {", " p.lifetime = 2.5;", " p.pos = circle() * float2(50, 10);", " p.vel.x = mix(-10, 10, rand);", " p.vel.y = mix(-10, 10, rand);", "}", "", "void update(inout Particle p) {", " p.color.a = 1 - (length(p.pos) / 150);", "}", "" ], "Bindings": [] }, { "Type": "SkEffectBinding", "Name": "splash", "MaxCount": 8, "Drawable": { "Type": "SkCircleDrawable", "Radius": 1 }, "EffectCode": [ "void effectSpawn(inout Effect effect) {", " effect.burst = 8;", " effect.scale = 1;", "}", "" ], "Code": [ "void spawn(inout Particle p) {", " p.lifetime = rand;", " float a = radians(mix(-80, 80, rand) - 90);", " p.vel.x = cos(a) * 20;", " p.vel.y = sin(a) * 20;", "}", "", "void update(inout Particle p) {", " p.vel.y += dt * 20;", "}", "" ], "Bindings": [] } ] }