skia2/resources/particles/raincloud.json
Brian Osman 95c26efc90 Pure SkSL RNG for particles
Change-Id: I2cb6255a553852a292427d6dc9ef8c5ed7f8286d
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/252926
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: Michael Ludwig <michaelludwig@google.com>
Reviewed-by: Mike Reed <reed@google.com>
2020-04-10 17:20:07 +00:00

113 lines
3.0 KiB
JSON

{
"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": []
}
]
}