cmake_minimum_required(VERSION 3.20)
project(HelloVulkan CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_BINARY_DIR  ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})

# 第三方库
add_subdirectory(Lib/glfw)
add_subdirectory(Lib/glm)
add_subdirectory(Lib/spdlog)
add_subdirectory(Lib/stb)
# meshoptimizer（submodule，LOD 网格简化；demo/gltfpack 默认关闭，install 不需要）
set(MESHOPT_INSTALL OFF CACHE BOOL "" FORCE)
add_subdirectory(Lib/meshoptimizer)

# ---- Jolt Physics（submodule v5.6，刚体/软体/角色/载具模拟）----
# 顶层 CMake 在 Build/ 子目录；只编 jolt 静态库，示例/测试目标默认全关
set(JPH_BUILD_SHARED_LIBS OFF        CACHE BOOL "" FORCE)
set(INTERPROCEDURAL_OPTIMIZATION OFF CACHE BOOL "" FORCE)  # LTO 拖慢开发迭代
set(OVERRIDE_CXX_FLAGS OFF           CACHE BOOL "" FORCE)  # 不动全局优化参数
set(FLOATING_POINT_EXCEPTIONS_ENABLED OFF CACHE BOOL "" FORCE)  # NaN 进物理不炸，仅报警
# JPH_USE_CPU_COMPUTE 默认 ON，需要 DXC 把 Shaders/*.hlsl 编成 .spv（本机无
# 工具链）；我们不使用 Jolt 的 GPU compute 路径，连同后端 shader 一并关掉
set(JPH_USE_CPU_COMPUTE OFF CACHE BOOL "" FORCE)
set(JPH_USE_DX12 OFF CACHE BOOL "" FORCE)
set(JPH_USE_VK   OFF CACHE BOOL "" FORCE)
set(JPH_USE_MTL  OFF CACHE BOOL "" FORCE)
add_subdirectory(Lib/JoltPhysics/Build)

# ---- Assimp（vendored submodule，模型导入；只编译需要的 importer） ----
set(BUILD_SHARED_LIBS OFF)                                  # 静态链接
set(ASSIMP_BUILD_TESTS OFF                     CACHE BOOL "" FORCE)
set(ASSIMP_BUILD_ASSIMP_TOOLS OFF              CACHE BOOL "" FORCE)   # 不编 assimp_cmd 等工具
set(ASSIMP_INSTALL OFF                         CACHE BOOL "" FORCE)
set(ASSIMP_WARNINGS_AS_ERRORS OFF              CACHE BOOL "" FORCE)   # assimp 源码警告多
set(ASSIMP_INJECT_DEBUG_POSTFIX OFF            CACHE BOOL "" FORCE)
set(ASSIMP_NO_EXPORT ON                        CACHE BOOL "" FORCE)   # 彻底移除导出代码
set(ASSIMP_BUILD_ALL_IMPORTERS_BY_DEFAULT OFF  CACHE BOOL "" FORCE)   # 全关，按需开
set(ASSIMP_BUILD_DRACO OFF                     CACHE BOOL "" FORCE)
# 用 assimp 自带 contrib zlib（而非系统 zlib）。原因：系统 zlib 会使 assimp 走
# pkg-config 找系统 minizip，而 Arch 的 minizip 头文件在 /usr/include/minizip/
# 子目录，与 assimp 的 #include <unzip.h> 不符 → ZipArchiveIOSystem 编译失败。
# 自带 zlib 后 ASSIMP_BUILD_MINIZIP=1，跳过 pkg-config，直接用 contrib/unzip。
set(ASSIMP_BUILD_ZLIB ON                       CACHE BOOL "" FORCE)
# 清除首次 configure 残留的 UNZIP_FOUND 缓存（INTERNAL=1 会持续生效，
# 使 assimp 误判系统 minizip 可用而不把 contrib/unzip 加进 include 路径）。
set(UNZIP_FOUND OFF                            CACHE INTERNAL "" FORCE)
# 需要的导入格式（按需增减，每关一个省编译时间）：
set(ASSIMP_BUILD_OBJ_IMPORTER    ON CACHE BOOL "" FORCE)
set(ASSIMP_BUILD_GLTF_IMPORTER   ON CACHE BOOL "" FORCE)   # glTF1+2 同一选项
set(ASSIMP_BUILD_FBX_IMPORTER    ON CACHE BOOL "" FORCE)
set(ASSIMP_BUILD_STL_IMPORTER    ON CACHE BOOL "" FORCE)
set(ASSIMP_BUILD_PLY_IMPORTER    ON CACHE BOOL "" FORCE)
add_subdirectory(Lib/assimp)



# Vulkan
find_package(Vulkan REQUIRED)

# Engine 和 App
add_subdirectory(Engine)
add_subdirectory(App)

file(GLOB ASSETS "assets")
file(COPY ${ASSETS} DESTINATION ${CMAKE_BINARY_DIR})
