cmake_minimum_required(VERSION 3.10.0)
project(Boundard VERSION 0.1.0 LANGUAGES C CXX)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

add_library(boundard STATIC
    src/boundard.cpp
    src/game.cpp
    src/scene.cpp
    src/render.cpp
    src/config.cpp
    src/engine.cpp
)
target_include_directories(boundard PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_compile_features(boundard PUBLIC cxx_std_17)

find_package(glfw3 REQUIRED)
find_package(Vulkan REQUIRED)
find_package(PNG REQUIRED)
find_package(PkgConfig REQUIRED)
pkg_check_modules(JSONCPP REQUIRED IMPORTED_TARGET jsoncpp)
find_program(GLSLC_EXECUTABLE glslc REQUIRED)

set(BOUNDARD_SHADER_DIR "${CMAKE_CURRENT_BINARY_DIR}/shaders")
set(BOUNDARD_SHADER_SOURCES
    shaders/textured_quad.vert
    shaders/textured_quad.frag
)
set(BOUNDARD_SHADER_BINARIES)
foreach(shader IN LISTS BOUNDARD_SHADER_SOURCES)
    get_filename_component(shader_name "${shader}" NAME)
    set(shader_output "${BOUNDARD_SHADER_DIR}/${shader_name}.spv")
    add_custom_command(
        OUTPUT "${shader_output}"
        COMMAND ${CMAKE_COMMAND} -E make_directory "${BOUNDARD_SHADER_DIR}"
        COMMAND ${GLSLC_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/${shader}" -o "${shader_output}"
        DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${shader}"
        VERBATIM
    )
    list(APPEND BOUNDARD_SHADER_BINARIES "${shader_output}")
endforeach()
add_custom_target(boundard_shaders DEPENDS ${BOUNDARD_SHADER_BINARIES})
add_dependencies(boundard boundard_shaders)
target_compile_definitions(boundard PRIVATE BOUNDARD_SHADER_DIR="${BOUNDARD_SHADER_DIR}")
target_link_libraries(boundard PUBLIC glfw Vulkan::Vulkan PNG::PNG PkgConfig::JSONCPP)

add_executable(square_example examples/square/main.cpp)
target_link_libraries(square_example PRIVATE boundard)

add_executable(boundard_engine src/engine_main.cpp)
target_link_libraries(boundard_engine PRIVATE boundard)
