| { |
| "MaxCount": 2000, |
| "Drawable": { |
| "Type": "SkCircleDrawable", |
| "Radius": 4 |
| }, |
| "Code": [ |
| "void effectSpawn(inout Effect effect) {", |
| " effect.lifetime = 2;", |
| " effect.rate = 200;", |
| "}", |
| "", |
| "void spawn(inout Particle p) {", |
| " p.lifetime = 10;", |
| "}", |
| "", |
| "float4x4 rx(float rad) {", |
| " float c = cos(rad);", |
| " float s = sin(rad);", |
| " return float4x4(1, 0, 0, 0,", |
| " 0, c, -s, 0,", |
| " 0, s, c, 0,", |
| " 0, 0, 0, 1);", |
| "}", |
| "", |
| "float4x4 ry(float rad) {", |
| " float c = cos(rad);", |
| " float s = sin(rad);", |
| " return float4x4(c, 0, -s, 0,", |
| " 0, 1, 0, 0,", |
| " s, 0, c, 0,", |
| " 0, 0, 0, 1);", |
| "}", |
| "", |
| "float4x4 rz(float rad) {", |
| " float c = cos(rad);", |
| " float s = sin(rad);", |
| " return float4x4( c, s, 0, 0,", |
| " -s, c, 0, 0,", |
| " 0, 0, 1, 0,", |
| " 0, 0, 0, 1);", |
| "}", |
| "", |
| "void update(inout Particle p) {", |
| " float3 pos = float3(rand(p.seed), rand(p.seed), rand(p.seed));", |
| " if (rand(p.seed) < 0.33) {", |
| " if (pos.x > 0.5) {", |
| " pos.x = 1;", |
| " p.color.rgb = float3(1, 0.2, 0.2);", |
| " } else {", |
| " pos.x = 0;", |
| " p.color.rgb = float3(0.2, 1, 1);", |
| " }", |
| " } else if (rand(p.seed) < 0.5) {", |
| " if (pos.y > 0.5) {", |
| " pos.y = 1;", |
| " p.color.rgb = float3(0.2, 0.2, 1);", |
| " } else {", |
| " pos.y = 0;", |
| " p.color.rgb = float3(1, 1, 0.2);", |
| " }", |
| " } else {", |
| " if (pos.z > 0.5) {", |
| " pos.z = 1;", |
| " p.color.rgb = float3(0.2, 1, 0.2);", |
| " } else {", |
| " pos.z = 0;", |
| " p.color.rgb = float3(1, 0.2, 1);", |
| " }", |
| " }", |
| "", |
| " float s = effect.age * 2 - 1;", |
| " s = s < 0 ? -s : s;", |
| "", |
| " pos = pos * 2 - 1;", |
| " pos = mix(pos, normalize(pos), s);", |
| " pos = pos * 100;", |
| "", |
| " float age = float(effect.loop) + effect.age;", |
| " float4x4 mat = rx(age * radians(60))", |
| " * ry(age * radians(70))", |
| " * rz(age * radians(80));", |
| " pos = (mat * float4(pos, 1)).xyz;", |
| "", |
| " p.pos.x = pos.x;", |
| " p.pos.y = pos.y;", |
| " p.scale = ((pos.z + 50) / 100 + 0.5) / 2;", |
| "}", |
| "" |
| ], |
| "Bindings": [] |
| } |