#version 310 es


struct Particle {
  vec2 pos;
  vec2 vel;
};

struct Particles {
  Particle particles[5];
};

layout(binding = 0, std140)
uniform params_block_1_ubo {
  uvec4 inner[2];
} v;
layout(binding = 1, std430)
buffer particlesA_block_1_ssbo {
  Particles inner;
} v_1;
layout(binding = 2, std430)
buffer particlesB_block_1_ssbo {
  Particles inner;
} v_2;
void comp_main_inner(uvec3 v_3) {
  uint index = v_3.x;
  if ((index >= 5u)) {
    return;
  }
  uint v_4 = min(index, 4u);
  vec2 vPos = v_1.inner.particles[v_4].pos;
  uint v_5 = min(index, 4u);
  vec2 vVel = v_1.inner.particles[v_5].vel;
  vec2 cMass = vec2(0.0f);
  vec2 cVel = vec2(0.0f);
  vec2 colVel = vec2(0.0f);
  int cMassCount = 0;
  int cVelCount = 0;
  vec2 pos = vec2(0.0f);
  vec2 vel = vec2(0.0f);
  {
    uint i = 0u;
    while(true) {
      if ((i < 5u)) {
      } else {
        break;
      }
      if ((i == index)) {
        {
          i = (i + 1u);
        }
        continue;
      }
      uint v_6 = i;
      pos = v_1.inner.particles[v_6].pos.xy;
      uint v_7 = i;
      vel = v_1.inner.particles[v_7].vel.xy;
      uvec4 v_8 = v.inner[0u];
      if ((distance(pos, vPos) < uintBitsToFloat(v_8.y))) {
        cMass = (cMass + pos);
        uint v_9 = uint(cMassCount);
        cMassCount = int((v_9 + uint(1)));
      }
      uvec4 v_10 = v.inner[0u];
      if ((distance(pos, vPos) < uintBitsToFloat(v_10.z))) {
        colVel = (colVel - (pos - vPos));
      }
      uvec4 v_11 = v.inner[0u];
      if ((distance(pos, vPos) < uintBitsToFloat(v_11.w))) {
        cVel = (cVel + vel);
        uint v_12 = uint(cVelCount);
        cVelCount = int((v_12 + uint(1)));
      }
      {
        i = (i + 1u);
      }
    }
  }
  if ((cMassCount > 0)) {
    vec2 v_13 = cMass;
    float v_14 = float(cMassCount);
    vec2 v_15 = (v_13 / vec2(v_14, float(cMassCount)));
    cMass = (v_15 - vPos);
  }
  if ((cVelCount > 0)) {
    vec2 v_16 = cVel;
    float v_17 = float(cVelCount);
    cVel = (v_16 / vec2(v_17, float(cVelCount)));
  }
  uvec4 v_18 = v.inner[1u];
  uvec4 v_19 = v.inner[1u];
  uvec4 v_20 = v.inner[1u];
  vVel = (((vVel + (cMass * uintBitsToFloat(v_18.x))) + (colVel * uintBitsToFloat(v_19.y))) + (cVel * uintBitsToFloat(v_20.z)));
  vVel = (normalize(vVel) * clamp(length(vVel), 0.0f, 0.10000000149011611938f));
  uvec4 v_21 = v.inner[0u];
  vPos = (vPos + (vVel * uintBitsToFloat(v_21.x)));
  if ((vPos.x < -1.0f)) {
    vPos.x = 1.0f;
  }
  if ((vPos.x > 1.0f)) {
    vPos.x = -1.0f;
  }
  if ((vPos.y < -1.0f)) {
    vPos.y = 1.0f;
  }
  if ((vPos.y > 1.0f)) {
    vPos.y = -1.0f;
  }
  uint v_22 = min(index, 4u);
  v_2.inner.particles[v_22].pos = vPos;
  uint v_23 = min(index, 4u);
  v_2.inner.particles[v_23].vel = vVel;
}
layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
void main() {
  comp_main_inner(gl_GlobalInvocationID);
}
