# Copyright 2022 Simon Boyé

cmake_minimum_required(VERSION 3.0.0)
project(vk_expe VERSION 0.1.0)

find_package(Eigen3 3.3 REQUIRED)
find_package(Vulkan REQUIRED)
find_package(SDL2 2.0.18 REQUIRED)

include(CTest)
enable_testing()

function(add_shaders TARGET)
    foreach(SRC ${ARGN})
        set(DST "${CMAKE_CURRENT_BINARY_DIR}/${SRC}.spv")
        list(APPEND SPVS "${DST}")
        get_filename_component(DST_DIR "${DST}" DIRECTORY)
        file(MAKE_DIRECTORY "${DST_DIR}")
        add_custom_command(
            OUTPUT "${DST}"
            COMMAND "$ENV{VULKAN_SDK}/bin/glslc" "${CMAKE_CURRENT_SOURCE_DIR}/${SRC}" -o "${DST}"
            MAIN_DEPENDENCY "${CMAKE_CURRENT_SOURCE_DIR}/${SRC}"
        )
    endforeach()

    add_custom_target(
        ${TARGET}_shaders
        DEPENDS ${SPVS}
    )

    add_dependencies(${TARGET} ${TARGET}_shaders)
endfunction()

add_executable(vk_expe
    src/core/math.cpp
    src/core/utils.cpp
    src/core/Logger.cpp

    src/vk/Wrapper.cpp
    src/vk/Context.cpp
    src/vk/CommandPool.cpp
    src/vk/CommandBuffer.cpp
    src/vk/Fence.cpp
    src/vk/Semaphore.cpp
    src/vk/RenderPass.cpp
    src/vk/Framebuffer.cpp
    src/vk/ShaderModule.cpp
    src/vk/Pipeline.cpp
    src/vk/Memory.cpp
    src/vk/Buffer.cpp
    src/vk/Image.cpp
    src/vk/ImageView.cpp
    src/vk/DescriptorSetLayout.cpp
    src/vk/PipelineLayout.cpp
    src/vk/DescriptorPool.cpp
    src/vk/DescriptorSet.cpp
    src/vk/Swapchain.cpp

    src/main.cpp
    src/Camera.cpp
    src/Simplex.cpp
    src/Planet.cpp
    src/VkExpe.cpp
    src/Renderer.cpp
)

add_shaders(vk_expe
    shaders/shader.vert
    shaders/shader.geom
    shaders/shader.frag
)

target_include_directories(vk_expe
    PRIVATE src
)

target_compile_features(vk_expe
    PUBLIC cxx_std_17
)

target_link_libraries(vk_expe
    PUBLIC Eigen3::Eigen
    PUBLIC Vulkan::Vulkan
    PUBLIC SDL2::SDL2
)

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)
