find_package(Vulkan REQUIRED)
find_package(glfw3 REQUIRED)
find_package(FreeType REQUIRED)

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

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Werror")

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}
                COMMAND
                ${glslc_executable}
                -o ${source}.${arg_FORMAT}
                    ${CMAKE_CURRENT_SOURCE_DIR}/${source}
                    )
    endforeach()
endfunction()

compile_shader(graphics
ENV opengl
FORMAT num
SOURCES
shaders/shader.vert
shaders/solid_objects.frag
shaders/on_screen_text.frag
)

add_library(graphics SHARED
    shaders/shader.vert.num
    shaders/solid_objects.frag.num
    shaders/on_screen_text.frag.num
    )
target_include_directories(graphics PRIVATE
${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/third_party/include/
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_SOURCE_DIR}
    ${Vulkan_INCLUDE_DIR}
    ${vma_INCLUDE_DIR}
    ${glfw3_INCLUDE_DIR}
    ${stb_INCLUDE_DIR}
    ${FreeType_INCLUDE_DIR}
)

target_sources(graphics PRIVATE
src/vma_port.cpp
src/window.c
src/vulkan_base.c
src/vulkan_commands.c
src/vulkan_buffers.c
src/rse_graphics.c
src/math.c
src/mesh_controller.c
src/vulkan_commons.c
src/vulkan_image.c
src/vulkan_render_pass.c
src/vulkan_swapchain.c
src/text_renderer.c
src/pipeline_builder.c
src/descriptor_builder.c
)

target_link_libraries(graphics PUBLIC
    utilities
    ${Vulkan_LIBRARIES}
    glfw
    ${freetype}
)
