update = quad({
uniforms: {
tick: regl.prop("subtick"),
start: [start.x, start.y],
prevState(context, props) {
const {subtick} = props;
return state[subtick % 2];
},
},
frag: `
precision highp float;
uniform int tick;
uniform ivec2 start;
uniform sampler2D prevState;
varying vec2 v_tex_pos;
${snoise3D}
${noiseShaderFunction}
void main() {
int radius = ${radius};
ivec2 cellPos = ivec2(v_tex_pos * float(radius));
vec4 state = texture2D(prevState, v_tex_pos);
vec4 newState = vec4(0.0, 0.0, 0.0, 0.0);
float r = (noise(vec3(v_tex_pos * float(radius), float(tick) * 0.05))) * 0.4 + 0.6;
float q = state.g;
float dt = 0.05;
float dq = 0.0;
for(int dx = -1; dx <= 1; dx++) {
for(int dy = -1; dy <= 1; dy++) {
float nd = length(vec2(dx, dy));
if (nd > 0.0) {
vec4 n = texture2D(prevState, vec2(cellPos + ivec2(dx, dy)) / float(radius));
float nq = n.g;
float resistance = r * nd;
dq += (nq - q) / resistance * dt;
}
}
}
if (cellPos == start) {
dq = ${resistanceResource.toPrecision(2)};
}
newState.r = r;
newState.g = q + dq;
gl_FragColor = newState;
}`
})