#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; } in vec2 a_particlePos; in vec2 a_particleVel; 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.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; } 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); }