set(PROJECT_NAME vulkan_demo)

find_package(GLFW3 REQUIRED)
find_package(Vulkan REQUIRED)

if(NOT Vulkan_glslc_FOUND)
    find_program(Vulkan_GLSLC_EXECUTABLE glslc)
    if( NOT Vulkan_GLSLC_EXECUTABLE )
        message( FATAL_ERROR "Vulkan glslc not found. Please install via Vulkan SDK.")
    endif()
endif()

#compile vulkan shaders
file(GLOB Shader_Files 
    "shaders/*.vert"
    "shaders/*.frag"
)

execute_process(
    COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/shaders"
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)
# Loop through shader sources and create SPIR-V and hex-dump header outputs.
# The add_custom_command creates an output file. The command is executed, if the output file is needed.
# In our case, we add the final outputs to the ${Header_Files},
# so compiling triggers the dependency chain and the commands are executed.
foreach(SHADER ${Shader_Files})
    get_filename_component(SHADER_DIR ${SHADER} DIRECTORY )
    get_filename_component(SHADER_BASENAME ${SHADER} NAME_WE)
    get_filename_component(SHADER_EXTENSION ${SHADER} EXT)
    string(SUBSTRING ${SHADER_EXTENSION} 1 -1 SHADER_EXTENSION)
    set(SHADER_NAME "${SHADER_BASENAME}_${SHADER_EXTENSION}")
    set(SPIRV_OUTPUT "${CMAKE_BINARY_DIR}/shaders/${SHADER_NAME}.spv" )

    # Custom command to compile the shaders
    add_custom_command(
        OUTPUT ${SPIRV_OUTPUT}
        COMMAND ${Vulkan_GLSLC_EXECUTABLE} ${SHADER} -o ${SPIRV_OUTPUT}
        DEPENDS ${SHADER}
        COMMENT "VULKAN DEMO Compiling shader: ${SHADER} => ${SPIRV_OUTPUT}"
    )
    # Collect all compiled shader binaries
    list(APPEND SPIRV_OUTPUTS ${SPIRV_OUTPUT})
endforeach()

set(Header_Files
)
source_group("Header_Files" FILES ${Header_Files})
set(Source_Files
    "main.cpp"
)
source_group("Source_Files" FILES ${Source_Files})

add_executable(${PROJECT_NAME} ${Header_Files} ${Source_Files} ${SPIRV_OUTPUTS} )
add_dependencies(${PROJECT_NAME} dpLib)

target_include_directories(${PROJECT_NAME} PUBLIC
    "${EXTERNAL_FOLDER}/glm-0.9.9-a2"
    "${glfw3_INCLUDE_DIRS}"
    "${EXTERNAL_FOLDER}/stb/include"
)

target_link_libraries(${PROJECT_NAME} PRIVATE 
    dpLib
    Vulkan::Vulkan
)
if(WIN32)
    target_link_libraries(${PROJECT_NAME} PUBLIC 
        glfw
    )
else()
    target_link_libraries(${PROJECT_NAME} PUBLIC 
        libglfw.so
    )
endif(WIN32)
