SHAREDDIR = ../common/
MAINFLAGS = -std=c++20 -Wall -Wextra -fpermissive -fmax-errors=3
OBJECTFLAGS = -c -O3 ${MAINFLAGS}
VMAFLAGS = -c -std=c++20 -O3 # You do not want to compile vma with warnings
VMAPATH = ${SHAREDDIR}third_party/vma
SDLPATH = /usr/include/SDL2
VKBOOTSTRAPPATH = ${SHAREDDIR}third_party/vkbootstrap
INCLUDE = -I${VMAPATH} -I${SDLPATH} -I${VKBOOTSTRAPPATH} -I${SHAREDDIR}src
ALLOBJECTFILES = ${SHAREDDIR}obj/svk.o ${SHAREDDIR}obj/svk_descriptors.o ${SHAREDDIR}obj/svk_images.o ${SHAREDDIR}obj/svk_initializers.o ${SHAREDDIR}obj/svk_loader.o ${SHAREDDIR}obj/svk_pipelines.o ${SHAREDDIR}obj/delta_handler.o ${SHAREDDIR}obj/LittleOBJLoader.o ${SHAREDDIR}obj/svk_vector_utils.o ${SHAREDDIR}obj/VkBootstrap.o ${SHAREDDIR}obj/svk_vma.o

all: lab0

lab0: lab0.cpp ${ALLOBJECTFILES}
	g++ ${MAINFLAGS} ${INCLUDE} -o $@ $^ -lvulkan -lm -lSDL2

${SHAREDDIR}obj/svk.o: ${SHAREDDIR}src/svk.hpp ${SHAREDDIR}src/svk.cpp ${SHAREDDIR}obj/svk_descriptors.o ${SHAREDDIR}obj/svk_images.o ${SHAREDDIR}obj/svk_initializers.o ${SHAREDDIR}obj/svk_loader.o ${SHAREDDIR}obj/svk_pipelines.o ${SHAREDDIR}src/svk_key_converter.hpp ${SHAREDDIR}src/svk_types.hpp ${SHAREDDIR}src/svk_functions.hpp
	g++ ${OBJECTFLAGS} ${INCLUDE} ${SHAREDDIR}src/svk.cpp -o $@

${SHAREDDIR}obj/svk_pipelines.o: ${SHAREDDIR}src/svk_pipelines.cpp ${SHAREDDIR}src/svk_pipelines.hpp ${SHAREDDIR}obj/svk_initializers.o ${SHAREDDIR}src/svk_types.hpp ${SHAREDDIR}src/svk_functions.hpp
	g++ ${OBJECTFLAGS} ${INCLUDE} ${SHAREDDIR}src/svk_pipelines.cpp -o $@

${SHAREDDIR}obj/svk_images.o: ${SHAREDDIR}src/svk_images.hpp ${SHAREDDIR}src/svk_images.cpp ${SHAREDDIR}obj/svk_initializers.o ${SHAREDDIR}src/svk_types.hpp ${SHAREDDIR}src/svk_functions.hpp
	g++ ${OBJECTFLAGS} ${INCLUDE} ${SHAREDDIR}src/svk_images.cpp -o $@

${SHAREDDIR}obj/svk_descriptors.o: ${SHAREDDIR}src/svk_descriptors.hpp ${SHAREDDIR}src/svk_descriptors.cpp ${SHAREDDIR}src/svk_types.hpp ${SHAREDDIR}src/svk_functions.hpp
	g++ ${OBJECTFLAGS} ${INCLUDE} ${SHAREDDIR}src/svk_descriptors.cpp -o $@

${SHAREDDIR}obj/svk_loader.o: ${SHAREDDIR}src/svk_loader.hpp ${SHAREDDIR}src/svk_loader.cpp ${SHAREDDIR}obj/LittleOBJLoader.o ${SHAREDDIR}src/svk_types.hpp ${SHAREDDIR}src/svk_functions.hpp
	g++ ${OBJECTFLAGS} ${INCLUDE} ${SHAREDDIR}src/svk_loader.cpp -o $@

${SHAREDDIR}obj/svk_initializers.o: ${SHAREDDIR}src/svk_initializers.hpp ${SHAREDDIR}src/svk_initializers.cpp ${SHAREDDIR}src/svk_types.hpp ${SHAREDDIR}src/svk_functions.hpp
	g++ ${OBJECTFLAGS} ${INCLUDE} ${SHAREDDIR}src/svk_initializers.cpp -o $@

${SHAREDDIR}obj/LittleOBJLoader.o: ${SHAREDDIR}src/LittleOBJLoader.cpp ${SHAREDDIR}src/LittleOBJLoader.h ${SHAREDDIR}obj/svk_vector_utils.o
	g++ ${OBJECTFLAGS} ${SHAREDDIR}src/LittleOBJLoader.cpp -o $@

${SHAREDDIR}obj/svk_vector_utils.o: ${SHAREDDIR}src/svk_vector_utils.cpp ${SHAREDDIR}src/svk_vector_utils.hpp
	g++ ${OBJECTFLAGS} ${SHAREDDIR}src/svk_vector_utils.cpp -o $@

${SHAREDDIR}obj/delta_handler.o: ${SHAREDDIR}src/delta_handler.cpp ${SHAREDDIR}src/delta_handler.hpp
	g++ ${OBJECTFLAGS} ${SHAREDDIR}src/delta_handler.cpp -o $@

${SHAREDDIR}obj/VkBootstrap.o: ${VKBOOTSTRAPPATH}/VkBootstrap.cpp ${VKBOOTSTRAPPATH}/VkBootstrap.h ${VKBOOTSTRAPPATH}/VkBootstrapDispatch.h
	g++ ${OBJECTFLAGS} ${VKBOOTSTRAPPATH}/VkBootstrap.cpp -o $@

${SHAREDDIR}obj/svk_vma.o: ${SHAREDDIR}src/svk_vma.cpp
	g++ ${VMAFLAGS} -I${VMAPATH} ${SHAREDDIR}src/svk_vma.cpp -o $@

clean_all: clean clean_objects clean_shaders

clean:
	rm -f lab0

clean_objects:
	rm -f ${SHAREDDIR}obj/*.o

clean_shaders:
	rm -f compiled/*.spv
