add_executable(HelloVulkan main.cpp)

target_link_libraries(HelloVulkan PRIVATE Engine)


###### 自动构建 shader ######
find_program(GLSLC glslc REQUIRED)

set(SHADER_SRC_DIR ${CMAKE_SOURCE_DIR}/shaders)
set(SHADER_OUT_DIR ${CMAKE_BINARY_DIR}/bin/shaders)

function(auto_compile_shader glsl_file)              # glsl_file 是相对 SHADER_SRC_DIR 的路径
    # 推断 stage：'.vert' -> 'vert'
    get_filename_component(stage ${glsl_file} EXT)
    string(SUBSTRING ${stage} 1 -1 stage)

    set(spv ${SHADER_OUT_DIR}/${glsl_file}.spv)
    get_filename_component(spv_dir ${spv} DIRECTORY)  # 保留子目录

    add_custom_command(
            OUTPUT ${spv}
            COMMAND ${CMAKE_COMMAND} -E make_directory ${spv_dir}
            COMMAND ${GLSLC} -fshader-stage=${stage}
            -o ${spv} ${SHADER_SRC_DIR}/${glsl_file}
            DEPENDS ${SHADER_SRC_DIR}/${glsl_file}
            VERBATIM)
    set_source_files_properties(${spv} PROPERTIES GENERATED TRUE)
    target_sources(${PROJECT_NAME} PRIVATE ${spv})
    set_property(DIRECTORY APPEND PROPERTY HZ_SHADER_SPV_FILES ${spv})
endfunction()

file(GLOB_RECURSE SHADER_SOURCES
        CONFIGURE_DEPENDS                          # 新增 shader 时自动重配
        RELATIVE ${SHADER_SRC_DIR}
        ${SHADER_SRC_DIR}/*.vert
        ${SHADER_SRC_DIR}/*.frag)

foreach (f ${SHADER_SOURCES})
    auto_compile_shader(${f})
endforeach()