#pragma once

#include <string>

namespace fn::gfx {

// Devuelve un preamble GLSL que define primitivas RNG PCG32 para inyectar
// en un compute shader. El preamble incluye:
//
//   layout(std430, binding = <seed_binding>) buffer RngSeeds { uint rng_seeds[]; };
//
//   uint  pcg32(inout uint state)             // step + scramble
//   float rng_uniform(inout uint state)       // [0, 1)
//   float rng_normal(inout uint state)        // N(0, 1) Box-Muller
//   uint  rng_below(inout uint state, uint n) // [0, n)
//
// Patron de uso en el shader:
//   void main() {
//       uint i = gl_GlobalInvocationID.x;
//       uint s = rng_seeds[i];
//       float x = rng_normal(s);
//       ...
//       rng_seeds[i] = s;   // persistir para siguientes dispatches
//   }
//
// Pasar el resultado a gpu_compute_program::compile_compute(..., preamble).
std::string glsl_rng_preamble(int seed_binding);

// Genera count seeds no-cero deterministas a partir de master_seed usando
// SplitMix64. Util para inicializar el SSBO rng_seeds antes del primer
// dispatch. Garantiza out[i] != 0 (PCG32 requiere state != 0 para no
// quedarse atascado).
void seed_walkers_init(unsigned long long master_seed,
                       unsigned int* out, int count);

} // namespace fn::gfx
