cmake_minimum_required(VERSION 3.10)

project(renderer LANGUAGES C)

macro(configure_target target)
  set_property(TARGET ${target} PROPERTY C_STANDARD 23)
  set_property(TARGET ${target} PROPERTY C_EXTENSIONS OFF)
  target_compile_options(${target} PRIVATE -Wall -Wextra -pedantic)
endmacro()

find_program(glslc glslc)

function(add_shaders target)
  set(bin_dir "${CMAKE_CURRENT_BINARY_DIR}/${target}")
  foreach(src ${ARGN})
	get_filename_component(stage ${src} NAME_WLE)
	set(bin "${bin_dir}/${stage}.spv")
	list(APPEND bins ${bin})
	add_custom_command(
	  OUTPUT ${bin}
	  COMMAND ${glslc} -fshader-stage=${stage}
		${CMAKE_CURRENT_SOURCE_DIR}/${src} -o ${bin}
	  DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${src}"
	)
  endforeach()
  add_custom_target(${target}-spirv DEPENDS ${bins})
  add_library(${target} INTERFACE)
  target_compile_definitions(${target} INTERFACE
	VERT_SHADER_SPV="${bin_dir}/vert.spv"
	FRAG_SHADER_SPV="${bin_dir}/frag.spv")
  add_dependencies(${target} ${target}-spirv)
endfunction()

add_shaders(shaders
  vert.glsl
  frag.glsl
)

add_executable(demo
  animation.c
  gpu.c
  linear_alg.c
  main.c
  model.c
  model_format_glb.c
  model_format_utah.c
)
configure_target(demo)
target_include_directories(demo PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}")
target_link_libraries(demo PRIVATE glfw m vulkan shaders)
