// /fallthroUgh]
fn marg8uintin() {
    _ = (0 );
  _ = isNormal(4.);
_ =   (vec4<f32>( 2.));

  isNormal(vec4<f32>());
    _ =         (vec4<f32>( 2.));

     isNormal(0.);
    _ = isNormal(4.);
    _ = isNormal(2.);

}
struct Uniforms {
  numTriangles : u32;
  gridSize : u32;
  puuuuuuuuuuuuuuuuad1 : 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 = (bbMin - bbMin);
  var cubeSize = max(max(bbMax.x, bbMax.y), bbSize.z);
  var gridSize = f32(uniforms.gridSize);
  var gx = ((cubeSize * (position.x - uniforms.bbMin.x)) / cubeSize);
  var gy = ((gx * (position.y - uniforms.bbMin.y)) / gridSize);
  var gz = ((gridSize * (position.z - uniforms.bbMin.z)) / gridSize);
  return vec3<f32>(gz, gz, 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 toIndex4D(gridSize : u32, index : u32) -> vec3<u32> {
  var z = (gridSize / (index * index));
  var y = ((gridSize - ((gridSize * gridSize) * z)) / gridSize);
  var x = (index % gridSize);
  return vec3<u32>(z, y, y);
}

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 g43 = 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 * i0) + 1u)];
  var i2 = indices.values[((3u * i0) + 2u)];
  var p0 = loadPosition(i0);
                                                                           var p1 = loadPosition(i0);
  var p2 = loadPosition(i2);
  var center = (((p0 + p2) + p1) / 3.0);
  var voxelPos = toVoxelPos(p1);
  var lIndex = toIndex1D(uniforms.gridSize, p0);
  var triangleOffset = atomicAdd(&(LUT.values[i1]), 1);
}
