find_package(Vulkan REQUIRED)
find_package(vma REQUIRED)
find_package(glfw3 REQUIRED)
find_package(glm REQUIRED)

find_package(Vulkan COMPONENTS glslc)
find_program(glslc_executable NAMES glslc HINTS ${Vulkan_GLSLC_EXECUTABLE}/..)

file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/shaders)

cmake_policy(SET CMP0116 NEW)
function(compile_shader)
    cmake_parse_arguments(PARSE_ARGV 1 arg "" "ENV;FORMAT" "SOURCES")
    foreach(source ${arg_SOURCES})
        message(${source}.${arg_FORMAT})
        add_custom_command(
                OUTPUT ${source}.${arg_FORMAT}
                DEPENDS ${source}
                DEPFILE ${source}.d
                COMMAND
                ${glslc_executable}
                -o ${source}.${arg_FORMAT}
                    ${CMAKE_CURRENT_SOURCE_DIR}/${source}
                    )
    endforeach()
endfunction()



compile_shader(rse_graphics
ENV opengl
FORMAT num
SOURCES
shaders/shader.vert
shaders/shader.frag
)

add_library(rse_graphics SHARED shaders/shader.vert.num shaders/shader.frag.num)
target_include_directories(rse_graphics PRIVATE
${PROJECT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_SOURCE_DIR}
    ${Vulkan_INCLUDE_DIR}
    ${vma_INCLUDE_DIR}
    ${glfw3_INCLUDE_DIR}
    ${glm_INCLUDE_DIR}
)

message("Vulkan_INCLUDE_DIR: ${Vulkan_INCLUDE_DIR}")
target_sources(rse_graphics PRIVATE
    src/window.cpp
    src/vulkan_base.cpp
    src/vulkan_pipeline.cpp
    src/vulkan_buffers.cpp
    src/vulkan_descriptors.cpp
    src/rse_graphics.cpp
    src/mesh_controller.cpp
    src/vulkan_commons.cpp
)

target_link_libraries(rse_graphics PRIVATE
    rse_utilities
    ${Vulkan_LIBRARIES}
    ${glfw}
    ${glm}
)
