struct Particle {
  float3 position[8];
  float lifetime;
  float4 color;
  float3 velocity;
};

ByteAddressBuffer particles : register(t3, space1);
cbuffer cbuffer_sim : register(b4, space1) {
  uint4 sim[1];
};

typedef float3 tint_symbol_3_ret[8];
tint_symbol_3_ret tint_symbol_3(ByteAddressBuffer buffer, uint offset) {
  float3 arr[8] = (float3[8])0;
  {
    [loop] for(uint i_1 = 0u; (i_1 < 8u); i_1 = (i_1 + 1u)) {
      arr[i_1] = asfloat(buffer.Load3((offset + (i_1 * 16u))));
    }
  }
  return arr;
}

Particle tint_symbol_2(ByteAddressBuffer buffer, uint offset) {
  const Particle tint_symbol_8 = {tint_symbol_3(buffer, (offset + 0u)), asfloat(buffer.Load((offset + 128u))), asfloat(buffer.Load4((offset + 144u))), asfloat(buffer.Load3((offset + 160u)))};
  return tint_symbol_8;
}

[numthreads(1, 1, 1)]
void main() {
  Particle particle = tint_symbol_2(particles, (176u * uint(0)));
  {
    float3 tint_symbol_1[8] = particle.position;
    tint_symbol_1[sim[0].x] = particle.position[sim[0].x];
    particle.position = tint_symbol_1;
  }
  return;
}
