diff --git a/.gitignore b/.gitignore index c6d15111..daaecff3 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,8 @@ ebook/*.epub convert.py +**/[B,b]uild/* + attachments/build/** attachments/android/.gradle/** attachments/android/.idea diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..cbd76ba7 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,18 @@ +cmake_minimum_required (VERSION 3.29) + +project (VulkanTutorialRoot) +# This is to allow the CMakeLists.txt files in attachments/ to be accessed from root level +# Use command: cmake -S . -B build to configure from root level +# Then use command: cmake --build build to build from root level +# This will generate the build files in the build/ directory +# The build files will reference the source files in the attachments/ directory +# No need to change or delete any lines in attachments/ CMakeLists.txt files +# You can still build from attachments/ directory if needed +# Just navigate to attachments/ and run cmake and build commands as usual +add_subdirectory(attachments) + +# Any other subdirectories can be added here +# Need to be carefull using CMAKE_SOURCE_DIR is points to the root level CMakeLists.txt +# Use CMAKE_CURRENT_SOURCE_DIR to point to the current directory instead +# For Simple Vulkan Engine project please uncomment the following line +# add_subdirectory(attachments/simple_engine) \ No newline at end of file diff --git a/attachments/CMakeLists.txt b/attachments/CMakeLists.txt index 1261ca30..8fed8649 100644 --- a/attachments/CMakeLists.txt +++ b/attachments/CMakeLists.txt @@ -51,12 +51,12 @@ if(ENABLE_CPP20_MODULE) endif() target_sources(VulkanCppModule - PUBLIC - FILE_SET cxx_modules TYPE CXX_MODULES - BASE_DIRS - "${Vulkan_INCLUDE_DIR}" - FILES - "${Vulkan_INCLUDE_DIR}/vulkan/vulkan.cppm" + PUBLIC + FILE_SET cxx_modules TYPE CXX_MODULES + BASE_DIRS + "${Vulkan_INCLUDE_DIR}" + FILES + "${Vulkan_INCLUDE_DIR}/vulkan/vulkan.cppm" ) @@ -85,7 +85,7 @@ find_program(SLANGC_EXECUTABLE slangc HINTS $ENV{VULKAN_SDK}/bin REQUIRED) function (add_shaders_target TARGET) cmake_parse_arguments ("SHADER" "" "CHAPTER_NAME" "SOURCES" ${ARGN}) - set (SHADERS_DIR ${SHADER_CHAPTER_NAME}/shaders) + set (SHADERS_DIR ${CMAKE_BINARY_DIR}/${SHADER_CHAPTER_NAME}/shaders) add_custom_command ( OUTPUT ${SHADERS_DIR} COMMAND ${CMAKE_COMMAND} -E make_directory ${SHADERS_DIR} @@ -95,8 +95,8 @@ function (add_shaders_target TARGET) COMMAND glslang::validator ARGS --target-env vulkan1.0 ${SHADER_SOURCES} --quiet WORKING_DIRECTORY ${SHADERS_DIR} - DEPENDS ${SHADERS_DIR} ${SHADER_SOURCES} - COMMENT "Compiling Shaders" + DEPENDS ${SHADER_SOURCES} + COMMENT "Compiling Shaders for ${TARGET}" VERBATIM ) add_custom_target (${TARGET} DEPENDS ${SHADERS_DIR}/frag.spv ${SHADERS_DIR}/vert.spv) @@ -104,23 +104,23 @@ endfunction () function (add_slang_shader_target TARGET) cmake_parse_arguments ("SHADER" "" "CHAPTER_NAME" "SOURCES" ${ARGN}) - set (SHADERS_DIR ${SHADER_CHAPTER_NAME}/shaders) + set (SHADERS_DIR ${CMAKE_BINARY_DIR}/${SHADER_CHAPTER_NAME}/shaders) file(GLOB HAS_COMPUTE ${CHAPTER_SHADER}.comp) set (ENTRY_POINTS -entry vertMain -entry fragMain) if(HAS_COMPUTE) list(APPEND ENTRY_POINTS -entry compMain) endif() add_custom_command ( - OUTPUT ${SHADERS_DIR} - COMMAND ${CMAKE_COMMAND} -E make_directory ${SHADERS_DIR} + OUTPUT ${SHADERS_DIR} + COMMAND ${CMAKE_COMMAND} -E make_directory ${SHADERS_DIR} ) add_custom_command ( - OUTPUT ${SHADERS_DIR}/slang.spv - COMMAND ${SLANGC_EXECUTABLE} ${SHADER_SOURCES} -target spirv -profile spirv_1_4+spvRayQueryKHR -emit-spirv-directly -fvk-use-entrypoint-name ${ENTRY_POINTS} -o slang.spv - WORKING_DIRECTORY ${SHADERS_DIR} - DEPENDS ${SHADERS_DIR} ${SHADER_SOURCES} - COMMENT "Compiling Slang Shaders" - VERBATIM + OUTPUT ${SHADERS_DIR}/slang.spv + COMMAND ${SLANGC_EXECUTABLE} ${SHADER_SOURCES} -target spirv -profile spirv_1_4+spvRayQueryKHR -emit-spirv-directly -fvk-use-entrypoint-name ${ENTRY_POINTS} -o slang.spv + WORKING_DIRECTORY ${SHADERS_DIR} + DEPENDS ${SHADER_SOURCES} + COMMENT "Compiling Slang Shaders for ${TARGET}" + VERBATIM ) add_custom_target (${TARGET} DEPENDS ${SHADERS_DIR}/slang.spv) endfunction() @@ -165,15 +165,66 @@ function (add_chapter CHAPTER_NAME) target_link_libraries (${CHAPTER_NAME} ${CHAPTER_LIBS}) endif () if (DEFINED CHAPTER_MODELS) - list(TRANSFORM CHAPTER_MODELS PREPEND "${CMAKE_SOURCE_DIR}/assets/") + list(TRANSFORM CHAPTER_MODELS PREPEND "${CMAKE_CURRENT_SOURCE_DIR}/assets/") file (COPY ${CHAPTER_MODELS} DESTINATION ${CMAKE_BINARY_DIR}/${CHAPTER_NAME}/models) endif () if (DEFINED CHAPTER_TEXTURES) - list(TRANSFORM CHAPTER_TEXTURES PREPEND "${CMAKE_SOURCE_DIR}/assets/") + list(TRANSFORM CHAPTER_TEXTURES PREPEND "${CMAKE_CURRENT_SOURCE_DIR}/assets/") file (COPY ${CHAPTER_TEXTURES} DESTINATION ${CMAKE_BINARY_DIR}/${CHAPTER_NAME}/textures) endif () + + # Post-build step to copy assets to executable directory + if(${CMAKE_GENERATOR} MATCHES "Visual Studio.*" OR + ${CMAKE_GENERATOR} MATCHES "Ninja Multi-Config") + + set(EXECUTABLE_DIR $) + if(DEFINED CHAPTER_SHADER) + sync_directory( + "${CMAKE_BINARY_DIR}/${CHAPTER_NAME}/shaders" + "${EXECUTABLE_DIR}/shaders" + ${CHAPTER_NAME} + "${CHAPTER_NAME}: Shaders" + ) + endif() + + if(DEFINED CHAPTER_MODELS) + sync_directory( + "${CMAKE_BINARY_DIR}/${CHAPTER_NAME}/models" + "${EXECUTABLE_DIR}/models" + ${CHAPTER_NAME} + "${CHAPTER_NAME}: Models" + ) + endif() + + if(DEFINED CHAPTER_TEXTURES) + sync_directory( + "${CMAKE_BINARY_DIR}/${CHAPTER_NAME}/textures" + "${EXECUTABLE_DIR}/textures" + ${CHAPTER_NAME} + "${CHAPTER_NAME}: Textures" + ) + endif() + endif() endfunction () +function(sync_directory SRC_DIR DST_DIR TARGET_NAME LABEL) + file(GLOB_RECURSE FILES "${SRC_DIR}/*") + + foreach(FILE IN LISTS FILES) + file(RELATIVE_PATH REL_PATH "${SRC_DIR}" "${FILE}") + set(DST_FILE "${DST_DIR}/${REL_PATH}") + get_filename_component(DST_DIR_PATH "${DST_FILE}" DIRECTORY) + + add_custom_command( + TARGET ${TARGET_NAME} + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory "${DST_DIR_PATH}" + COMMAND ${CMAKE_COMMAND} -E copy_if_different "${FILE}" "${DST_FILE}" + COMMENT "${LABEL}: Syncing ${REL_PATH}" + ) + endforeach() +endfunction() + add_chapter (00_base_code) add_chapter (01_instance_creation)