#version 450
// ============================================================================
// sph_hash_dagit.comp — counting sort: partikülleri sıralı diziye YERLEŞTİR.
// ----------------------------------------------------------------------------
// hucreBas (prefix-sum, salt-oku) + hucreDoldur (atomik yazma imleci; CPU'da
// hucreBas kopyası olarak başlatılır) → her partikül kendi hücresinin bir
// sonraki boş yuvasına indeksini yazar. Sonuç parcaHucre: hücre-gruplu partikül
// indeksleri (yogunluk/kuvvet/entegre 3×3×3 tarama bunu okur).
// ============================================================================
#include "sph_ortak.glsl"

layout(local_size_x = 64) in;

layout(std430, binding = 0) readonly buffer Konum      { vec4 konum[]; };
layout(std430, binding = 6) buffer ParcaHucre          { uint parcaHucre[]; };
layout(std430, binding = 8) buffer HucreDoldur         { uint hucreDoldur[]; };

void main() {
  uint i = gl_GlobalInvocationID.x;
  if (i >= itme.n) return;
  if (konum[i].w < 0.5) return;
  uint cell = hashDuz(hashHucre(konum[i].xyz));
  uint yuva = atomicAdd(hucreDoldur[cell], 1u);
  parcaHucre[yuva] = i;
}
