{ "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.seed));", " 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(inout uint seed) {", " float2 xy;", " do {", " xy.x = 2 * rand(seed) - 1;", " xy.y = 2 * rand(seed) - 1;", " } while (dot(xy, xy) > 1);", " return xy;", "}", "", "void spawn(inout Particle p) {", " p.lifetime = 2.5;", " p.pos = circle(p.seed) * float2(50, 10);", " p.vel.x = mix(-10, 10, rand(p.seed));", " p.vel.y = mix(-10, 10, rand(p.seed));", "}", "", "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(p.seed);", " float a = radians(mix(-80, 80, rand(p.seed)) - 90);", " p.vel.x = cos(a) * 20;", " p.vel.y = sin(a) * 20;", "}", "", "void update(inout Particle p) {", " p.vel.y += dt * 20;", "}", "" ], "Bindings": [] } ] }