cmake_minimum_required(VERSION 3.16)

file(GLOB_RECURSE GRAPHICS_SOURCES CONFIGURE_DEPENDS
    ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp
)

set(SHADER_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/shaders)
set(SHADER_OUT_DIR ${CMAKE_BINARY_DIR}/shaders)

file(GLOB_RECURSE SHADERS
    ${SHADER_SRC_DIR}/*.vert
    ${SHADER_SRC_DIR}/*.frag
)

find_program(GLSLC glslc REQUIRED)
set(SPIRV_SHADERS)

foreach(SHADER ${SHADERS})
    get_filename_component(FILE_NAME ${SHADER} NAME)
    set(SPIRV_FILE ${SHADER_OUT_DIR}/${FILE_NAME}.spv)

    add_custom_command(
        OUTPUT ${SPIRV_FILE}
        COMMAND ${CMAKE_COMMAND} -E make_directory ${SHADER_OUT_DIR}
        COMMAND ${GLSLC} ${SHADER} -o ${SPIRV_FILE}
        DEPENDS ${SHADER}
        COMMENT "Compiling ${FILE_NAME} with glslc"
        VERBATIM
    )

    list(APPEND SPIRV_SHADERS ${SPIRV_FILE})
endforeach()

add_custom_target(Shaders ALL DEPENDS ${SPIRV_SHADERS})
add_library(deerith_graphics ${GRAPHICS_SOURCES})

target_include_directories(deerith_graphics
    PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include
    PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src
)

target_compile_features(deerith_graphics PUBLIC cxx_std_20)

find_package(Vulkan REQUIRED)
find_package(glfw3 REQUIRED)
find_package(glm REQUIRED)
find_package(fmt REQUIRED)

add_dependencies(deerith_graphics Shaders)

target_link_libraries(deerith_graphics
    PUBLIC
        deerith::core
    PRIVATE
        Vulkan::Vulkan
        glfw
        glm::glm
        fmt::fmt
)

add_library(deerith::graphics ALIAS deerith_graphics)