1cb93a386Sopenharmony_ci{
2cb93a386Sopenharmony_ci   "MaxCount": 300,
3cb93a386Sopenharmony_ci   "Drawable": {
4cb93a386Sopenharmony_ci      "Type": "SkCircleDrawable",
5cb93a386Sopenharmony_ci      "Radius": 3
6cb93a386Sopenharmony_ci   },
7cb93a386Sopenharmony_ci   "Code": [
8cb93a386Sopenharmony_ci      "void effectSpawn(inout Effect effect) {",
9cb93a386Sopenharmony_ci      "  // Phase one: Launch",
10cb93a386Sopenharmony_ci      "  effect.lifetime = 4;",
11cb93a386Sopenharmony_ci      "  effect.rate = 120;",
12cb93a386Sopenharmony_ci      "  float a = radians(mix(-20, 20, rand(effect.seed)) - 90);",
13cb93a386Sopenharmony_ci      "  float s = mix(200, 220, rand(effect.seed));",
14cb93a386Sopenharmony_ci      "  effect.vel.x = cos(a) * s;",
15cb93a386Sopenharmony_ci      "  effect.vel.y = sin(a) * s;",
16cb93a386Sopenharmony_ci      "  effect.color.rgb = float3(rand(effect.seed), rand(effect.seed), rand(effect.seed));",
17cb93a386Sopenharmony_ci      "  effect.pos.x = 0;",
18cb93a386Sopenharmony_ci      "  effect.pos.y = 0;",
19cb93a386Sopenharmony_ci      "  effect.scale = 0.25;  // Also used as particle behavior flag",
20cb93a386Sopenharmony_ci      "}",
21cb93a386Sopenharmony_ci      "",
22cb93a386Sopenharmony_ci      "void effectUpdate(inout Effect effect) {",
23cb93a386Sopenharmony_ci      "  if (effect.age > 0.5 && effect.rate > 0) {",
24cb93a386Sopenharmony_ci      "    // Phase two: Explode",
25cb93a386Sopenharmony_ci      "    effect.rate = 0;",
26cb93a386Sopenharmony_ci      "    effect.burst = 50;",
27cb93a386Sopenharmony_ci      "    effect.scale = 1;",
28cb93a386Sopenharmony_ci      "  } else {",
29cb93a386Sopenharmony_ci      "    effect.vel.y += dt * 90;",
30cb93a386Sopenharmony_ci      "  }",
31cb93a386Sopenharmony_ci      "}",
32cb93a386Sopenharmony_ci      "",
33cb93a386Sopenharmony_ci      "void spawn(inout Particle p) {",
34cb93a386Sopenharmony_ci      "  bool explode = p.scale == 1;",
35cb93a386Sopenharmony_ci      "",
36cb93a386Sopenharmony_ci      "  p.lifetime = explode ? (2 + rand(p.seed) * 0.5) : 0.5;",
37cb93a386Sopenharmony_ci      "  float a = radians(rand(p.seed) * 360);",
38cb93a386Sopenharmony_ci      "  float s = explode ? mix(90, 100, rand(p.seed)) : mix(5, 10, rand(p.seed));",
39cb93a386Sopenharmony_ci      "  p.vel.x = cos(a) * s;",
40cb93a386Sopenharmony_ci      "  p.vel.y = sin(a) * s;",
41cb93a386Sopenharmony_ci      "}",
42cb93a386Sopenharmony_ci      "",
43cb93a386Sopenharmony_ci      "void update(inout Particle p) {",
44cb93a386Sopenharmony_ci      "  p.color.a = 1 - p.age;",
45cb93a386Sopenharmony_ci      "  if (p.scale == 1) {",
46cb93a386Sopenharmony_ci      "    p.vel.y += dt * 50;",
47cb93a386Sopenharmony_ci      "  }",
48cb93a386Sopenharmony_ci      "}",
49cb93a386Sopenharmony_ci      ""
50cb93a386Sopenharmony_ci   ],
51cb93a386Sopenharmony_ci   "Bindings": []
52cb93a386Sopenharmony_ci}