# App 层源文件：main + editor/（docking 编辑器）+ scripts/（C++ 原生脚本）
file(GLOB EDITOR_SOURCES CONFIGURE_DEPENDS
        ${CMAKE_CURRENT_SOURCE_DIR}/editor/*.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/editor/*.h)

file(GLOB SCRIPT_SOURCES CONFIGURE_DEPENDS
        ${CMAKE_CURRENT_SOURCE_DIR}/scripts/*.cpp)

add_executable(HelloVulkan main.cpp ${EDITOR_SOURCES} ${SCRIPT_SOURCES})

target_include_directories(HelloVulkan PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/editor)

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
        ${SHADER_SRC_DIR}/*.comp)

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