struct Uniforms {
  numTriangles : u32;
  gridSize : u32;
  pad1 : u32;
  pad2 : u32;
  bbMin : vec3<f32>;
  bbMax : vec3<f32>;
};

struct Dbg {
  offsetCounter : atomic<u32>;
  pad0 : u32;
  pad1 : u32;
  pad2 : u32;
  value0 : u32;
  value1 : u32;
  value2 : u32;
  value3 : u32;
  value_f32_0 : f32;
  value_f32_1 : f32;
  value_f32_2 : f32;
  value_f32_3 : f32;
};

struct F32s {
  values : [[stride(4)]] array<f32>;
};

struct U32s {
  values : [[stride(4)]] array<u32>;
};

struct I32s {
  values : [[stride(4)]] array<i32>;
};

struct AU32s {
  values : [[stride(4)]] array<atomic<u32>>;
};

struct AI32s {
  values : [[stride(4)]] array<atomic<i32>>;
};

[[binding(0), group(0)]] var<uniform> uniforms : Uniforms;

[[binding(10), group(0)]] var<storage, read_write> indices : U32s;

[[binding(11), group(0)]] var<storage, read_write> positions : F32s;

[[binding(20), group(0)]] var<storage, read_write> counters : AU32s;

[[binding(21), group(0)]] var<storage, read_write> LUT : AI32s;

[[binding(50), group(0)]] var<storage, read_write> dbg : Dbg;

fn toVoxelPos(position : vec3<f32>) -> vec3<f32> {
  var bbMin = vec3<f32>(uniforms.bbMin.x, uniforms.bbMin.y, uniforms.bbMin.z);
  var bbMax = vec3<f32>(uniforms.bbMax.x, uniforms.bbMax.y, uniforms.bbMax.z);
  var bbSize = (bbMax - bbMin);
  var cubeSize = max(max(bbSize.x, bbSize.y), bbSize.z);
  var gridSize = f32(uniforms.gridSize);
  var gx = ((gridSize * (position.x - uniforms.bbMin.x)) / cubeSize);
  var gy = ((gridSize * (position.y - uniforms.bbMin.y)) / cubeSize);
  var gz = ((gridSize * (position.z - uniforms.bbMin.z)) / cubeSize);
  return vec3<f32>(gx, gy, gz);
}

fn toIndex1D(gridSize : u32, voxelPos : vec3<f32>) -> u32 {
  var icoord = vec3<u32>(voxelPos);
  return ((icoord.x + (gridSize * icoord.y)) + ((gridSize * gridSize) * icoord.z));
}

fn toIndex3D(gridSize : u32, index : u32) -> vec3<u32> {
  var z = (index / (gridSize * gridSize));
  var y = ((index - ((gridSize * gridSize) * z)) / gridSize);
  var x = (index % gridSize);
  return vec3<u32>(x, y, z);
}

fn loadPosition(vertexIndex : u32) -> vec3<f32> {
  var position = vec3<f32>(positions.values[((3u * vertexIndex) + 0u)], positions.values[((3u * vertexIndex) + 1u)], positions.values[((3u * vertexIndex) + 2u)]);
  return position;
}

fn doIgnore() {
  var g42 = uniforms.numTriangles;
  var kj6 = dbg.value1;
  var b53 = atomicLoad(&(counters.values[0]));
  var rwg = indices.values[0];
  var rb5 = positions.values[0];
  var g55 = atomicLoad(&(LUT.values[0]));
}

[[stage(compute), workgroup_size(128)]]
fn main_count([[builtin(global_invocation_id)]] GlobalInvocationID : vec3<u32>) {
  var triangleIndex = GlobalInvocationID.x;
  if ((triangleIndex >= uniforms.numTriangles)) {
    return;
  }
  doIgnore();
  var i0 = indices.values[((3u * triangleIndex) + 0u)];
  var i1 = indices.values[((3u * triangleIndex) + 1u)];
  var i2 = indices.values[((3u * triangleIndex) + 2u)];
  var p0 = loadPosition(i0);
  var p1 = loadPosition(i1);
  var p2 = loadPosition(i2);
  var center = (((p0 + p1) + p2) / 3.0);
  var voxelPos = toVoxelPos(center);
  var voxelIndex = toIndex1D(uniforms.gridSize, voxelPos);
  var acefg = atomicAdd(&(counters.values[voxelIndex]), 1u);
  if ((triangleIndex == 0u)) {
    dbg.value0 = uniforms.gridSize;
    dbg.value_f32_0 = center.x;
    dbg.value_f32_1 = center.y;
    dbg.value_f32_2 = center.z;
  }
}

[[stage(compute), workgroup_size(128)]]
fn main_create_lut([[builtin(global_invocation_id)]] GlobalInvocationID : vec3<u32>) {
  var voxelIndex = GlobalInvocationID.x;
  doIgnore();
  var maxVoxels = ((uniforms.gridSize * uniforms.gridSize) * uniforms.gridSize);
  if ((voxelIndex >= maxVoxels)) {
    return;
  }
  var numTriangles = atomicLoad(&(counters.values[voxelIndex]));
  var offset = -1;
  if ((numTriangles > 0u)) {
    offset = i32(atomicAdd(&(dbg.offsetCounter), numTriangles));
  }
  atomicStore(&(LUT.values[voxelIndex]), offset);
}

[[stage(compute), workgroup_size(128)]]
fn main_sort_triangles([[builtin(global_invocation_id)]] GlobalInvocationID : vec3<u32>) {
  var triangleIndex = GlobalInvocationID.x;
  doIgnore();
  if ((triangleIndex >= uniforms.numTriangles)) {
    return;
  }
  var i0 = indices.values[((3u * triangleIndex) + 0u)];
  var i1 = indices.values[((3u * triangleIndex) + 1u)];
  var i2 = indices.values[((3u * triangleIndex) + 2u)];
  var p0 = loadPosition(i0);
  var p1 = loadPosition(i1);
  var p2 = loadPosition(i2);
  var center = (((p0 + p1) + p2) / 3.0);
  var voxelPos = toVoxelPos(center);
  var voxelIndex = toIndex1D(uniforms.gridSize, voxelPos);
  var triangleOffset = atomicAdd(&(LUT.values[voxelIndex]), 1);
}
