#version 310 es
precision mediump float;

struct tint_symbol_2 {
  vec2 a_particlePos;
  vec2 a_particleVel;
  vec2 a_pos;
};
struct tint_symbol_3 {
  vec4 value;
};

vec4 vert_main_inner(vec2 a_particlePos, vec2 a_particleVel, vec2 a_pos) {
  float angle = -(atan(a_particleVel.x, a_particleVel.y));
  vec2 pos = vec2(((a_pos.x * cos(angle)) - (a_pos.y * sin(angle))), ((a_pos.x * sin(angle)) + (a_pos.y * cos(angle))));
  return vec4((pos + a_particlePos), 0.0f, 1.0f);
}

struct tint_symbol_4 {
  vec4 value;
};
struct Particle {
  vec2 pos;
  vec2 vel;
};
struct SimParams {
  float deltaT;
  float rule1Distance;
  float rule2Distance;
  float rule3Distance;
  float rule1Scale;
  float rule2Scale;
  float rule3Scale;
};
struct Particles {
  Particle particles[5];
};
struct tint_symbol_6 {
  uvec3 tint_symbol;
};

tint_symbol_3 vert_main(tint_symbol_2 tint_symbol_1) {
  vec4 inner_result = vert_main_inner(tint_symbol_1.a_particlePos, tint_symbol_1.a_particleVel, tint_symbol_1.a_pos);
  tint_symbol_3 wrapper_result = tint_symbol_3(vec4(0.0f, 0.0f, 0.0f, 0.0f));
  wrapper_result.value = inner_result;
  return wrapper_result;
}
layout(location = 0) in vec2 a_particlePos;
layout(location = 1) in vec2 a_particleVel;
layout(location = 2) in vec2 a_pos;
void main() {
  tint_symbol_2 inputs;
  inputs.a_particlePos = a_particlePos;
  inputs.a_particleVel = a_particleVel;
  inputs.a_pos = a_pos;
  tint_symbol_3 outputs;
  outputs = vert_main(inputs);
  gl_Position = outputs.value;
  gl_Position.z = 2.0 * gl_Position.z - gl_Position.w;
  gl_Position.y = -gl_Position.y;
}


#version 310 es
precision mediump float;

struct tint_symbol_2 {
  vec2 a_particlePos;
  vec2 a_particleVel;
  vec2 a_pos;
};
struct tint_symbol_3 {
  vec4 value;
};
struct tint_symbol_4 {
  vec4 value;
};

vec4 frag_main_inner() {
  return vec4(1.0f, 1.0f, 1.0f, 1.0f);
}

struct Particle {
  vec2 pos;
  vec2 vel;
};
struct SimParams {
  float deltaT;
  float rule1Distance;
  float rule2Distance;
  float rule3Distance;
  float rule1Scale;
  float rule2Scale;
  float rule3Scale;
};
struct Particles {
  Particle particles[5];
};
struct tint_symbol_6 {
  uvec3 tint_symbol;
};

tint_symbol_4 frag_main() {
  vec4 inner_result_1 = frag_main_inner();
  tint_symbol_4 wrapper_result_1 = tint_symbol_4(vec4(0.0f, 0.0f, 0.0f, 0.0f));
  wrapper_result_1.value = inner_result_1;
  return wrapper_result_1;
}
layout(location = 0) out vec4 value;
void main() {
  tint_symbol_4 outputs;
  outputs = frag_main();
  value = outputs.value;
}


#version 310 es
precision mediump float;

struct tint_symbol_2 {
  vec2 a_particlePos;
  vec2 a_particleVel;
  vec2 a_pos;
};
struct tint_symbol_3 {
  vec4 value;
};
struct tint_symbol_4 {
  vec4 value;
};
struct Particle {
  vec2 pos;
  vec2 vel;
};
struct SimParams {
  float deltaT;
  float rule1Distance;
  float rule2Distance;
  float rule3Distance;
  float rule1Scale;
  float rule2Scale;
  float rule3Scale;
};
struct Particles {
  Particle particles[5];
};

layout(binding = 0) uniform SimParams_1 {
  float deltaT;
  float rule1Distance;
  float rule2Distance;
  float rule3Distance;
  float rule1Scale;
  float rule2Scale;
  float rule3Scale;
} params;
layout(binding = 1) buffer Particles_1 {
  Particle particles[5];
} particlesA;
layout(binding = 2) buffer Particles_2 {
  Particle particles[5];
} particlesB;

struct tint_symbol_6 {
  uvec3 tint_symbol;
};

void comp_main_inner(uvec3 tint_symbol) {
  uint index = tint_symbol.x;
  if ((index >= 5u)) {
    return;
  }
  vec2 vPos = particlesA.particles[index].pos;
  vec2 vVel = particlesA.particles[index].vel;
  vec2 cMass = vec2(0.0f, 0.0f);
  vec2 cVel = vec2(0.0f, 0.0f);
  vec2 colVel = vec2(0.0f, 0.0f);
  int cMassCount = 0;
  int cVelCount = 0;
  vec2 pos = vec2(0.0f, 0.0f);
  vec2 vel = vec2(0.0f, 0.0f);
  {
    for(uint i = 0u; (i < 5u); i = (i + 1u)) {
      if ((i == index)) {
        continue;
      }
      pos = particlesA.particles[i].pos.xy;
      vel = particlesA.particles[i].vel.xy;
      if ((distance(pos, vPos) < params.rule1Distance)) {
        cMass = (cMass + pos);
        cMassCount = (cMassCount + 1);
      }
      if ((distance(pos, vPos) < params.rule2Distance)) {
        colVel = (colVel - (pos - vPos));
      }
      if ((distance(pos, vPos) < params.rule3Distance)) {
        cVel = (cVel + vel);
        cVelCount = (cVelCount + 1);
      }
    }
  }
  if ((cMassCount > 0)) {
    cMass = ((cMass / vec2(float(cMassCount), float(cMassCount))) - vPos);
  }
  if ((cVelCount > 0)) {
    cVel = (cVel / vec2(float(cVelCount), float(cVelCount)));
  }
  vVel = (((vVel + (cMass * params.rule1Scale)) + (colVel * params.rule2Scale)) + (cVel * params.rule3Scale));
  vVel = (normalize(vVel) * clamp(length(vVel), 0.0f, 0.100000001f));
  vPos = (vPos + (vVel * params.deltaT));
  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;
  }
  particlesB.particles[index].pos = vPos;
  particlesB.particles[index].vel = vVel;
}

layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
void comp_main(tint_symbol_6 tint_symbol_5) {
  comp_main_inner(tint_symbol_5.tint_symbol);
  return;
}
void main() {
  tint_symbol_6 inputs;
  inputs.tint_symbol = gl_GlobalInvocationID;
  comp_main(inputs);
}


