precision highp float;

uniform sampler2D uParticlesA;
uniform sampler2D uParticlesB;
uniform float uRandomData;
uniform float uFactor;

varying vec2 fUV;

float random(float v) {
    return fract(sin(dot(vec2(fUV.x * cos(v * uRandomData), fUV.y * sin(v * uRandomData)), vec2(12.9898, 78.233))) * 43758.5453);
}

void main() {
    vec4 particleAData = texture2D(uParticlesA, fUV);
    vec4 particleBData = texture2D(uParticlesB, fUV);

    particleAData.x += cos(particleAData.z) * (particleAData.w * 0.125) * uFactor;
    particleAData.y += sin(particleAData.z) * (particleAData.w * 0.125) * uFactor;
    particleAData.w *= 0.9; // velocity

    if (particleAData.w < (2.0 / 1024.0)) {
        particleAData.z += random(1.424); // angle
        particleAData.w = (2.0 / 256.0);
    }

    if (particleBData.x < 0.0) {
        particleAData.x = (random(2.234) * 2.0) - 1.0;
        particleAData.y = (random(3.529) * 2.0) - 1.0;
    }

    gl_FragColor = particleAData;
}
