(Not quite) Cloudy Conway for the Shader Editor Android app.
Just copy and paste :D
(Not quite) Cloudy Conway for the Shader Editor Android app.
Just copy and paste :D
| #ifdef GL_FRAGMENT_PRECISION_HIGH | |
| precision highp float; | |
| #else | |
| precision mediump float; | |
| #endif | |
| uniform vec2 resolution; | |
| uniform int pointerCount; | |
| uniform vec3 pointers[10]; | |
| uniform sampler2D backbuffer; | |
| float oneIfZero(float value) { | |
| return step(abs(value), 0.1); | |
| } | |
| vec4 get4(float x, float y) { | |
| return texture2D(backbuffer, | |
| (gl_FragCoord.xy + vec2(x, y)) / resolution); | |
| } | |
| vec4 evaluate(float sum) { | |
| vec4 cell = get4(0.0, 0.0); | |
| float wasAlive = cell[3]; | |
| float has3 = oneIfZero(sum - 3.0); | |
| float has2 = oneIfZero(sum - 2.0); | |
| // a cell is (or becomes) alive if it has 3 neighbors | |
| // or if it has 2 neighbors *and* was alive already | |
| float isAlive = min(1.0, has3 + has2 * wasAlive); | |
| float justDied = (1.0 - isAlive) * wasAlive; | |
| float afterglow = cell[2]; | |
| return vec4( | |
| afterglow * isAlive, | |
| afterglow * (1.0 - isAlive), | |
| max(afterglow * 0.99, justDied), | |
| isAlive | |
| ); | |
| } | |
| float get(float x, float y) { | |
| return get4(x, y).a; | |
| } | |
| void main() { | |
| float sum = | |
| get(-1.0, -1.0) + | |
| get(-1.0, 0.0) + | |
| get(-1.0, 1.0) + | |
| get(0.0, -1.0) + | |
| get(0.0, 1.0) + | |
| get(1.0, -1.0) + | |
| get(1.0, 0.0) + | |
| get(1.0, 1.0); | |
| float tapSize = min(resolution.x, resolution.y) * 0.05; | |
| for (int n = 0; n < pointerCount; ++n) { | |
| if (distance(pointers[n].xy, gl_FragCoord.xy) < tapSize) { | |
| sum = 3.0; | |
| break; | |
| } | |
| } | |
| gl_FragColor = evaluate(sum); | |
| } |