# compile_spirv.cmake
# Compila shaders GLSL a SPIR-V y genera headers C++ embebibles.
# Multiplataforma: Windows, macOS, Linux (no requiere bash, xxd ni /tmp/).
#
# Invocado por CMakeLists.txt con:
#   cmake -D GLSLC=<path> -D SHADERS_DIR=<path> -D HEADERS_DIR=<path> -P compile_spirv.cmake
#
# También puede ejecutarse manualmente desde la raíz del proyecto:
#   cmake -D GLSLC=glslc -D SHADERS_DIR=data/shaders -D HEADERS_DIR=source/core/rendering/sdl3gpu -P tools/shaders/compile_spirv.cmake

cmake_minimum_required(VERSION 3.10)

foreach(SHADER vert frag)
    set(SRC "${SHADERS_DIR}/postfx.${SHADER}")
    set(SPV "${HEADERS_DIR}/postfx_${SHADER}.spv")
    set(HDR "${HEADERS_DIR}/postfx_${SHADER}_spv.h")
    set(VAR "kpostfx_${SHADER}_spv")

    message(STATUS "Compilando ${SRC} ...")
    execute_process(
        COMMAND "${GLSLC}" "${SRC}" -o "${SPV}"
        RESULT_VARIABLE GLSLC_RESULT
        ERROR_VARIABLE  GLSLC_ERROR
    )
    if(NOT GLSLC_RESULT EQUAL 0)
        message(FATAL_ERROR "glslc falló para ${SRC}:\n${GLSLC_ERROR}")
    endif()

    # Leer binario SPV como hex (sin separadores: "0302230700...")
    file(READ "${SPV}" HEX_DATA HEX)
    # Dividir en pares de caracteres hex → lista de bytes
    string(REGEX MATCHALL ".." BYTES "${HEX_DATA}")
    list(LENGTH BYTES NUM_BYTES)

    # Construir el cuerpo del array C++ con un byte por línea
    set(ARRAY_BODY "")
    foreach(BYTE ${BYTES})
        string(APPEND ARRAY_BODY "    0x${BYTE},\n")
    endforeach()

    file(WRITE "${HDR}"
        "#pragma once\n"
        "#include <cstddef>\n"
        "#include <cstdint>\n"
        "static const uint8_t ${VAR}[] = {\n"
        "${ARRAY_BODY}"
        "};\n"
        "static const size_t ${VAR}_size = ${NUM_BYTES};\n"
    )

    file(REMOVE "${SPV}")
    message(STATUS "  -> ${HDR} (${NUM_BYTES} bytes)")
endforeach()

message(STATUS "Shaders SPIR-V compilados correctamente.")
