# ============ 第三方库目标（Engine 的依赖） ============

# ImGui（docking 分支，vendored submodule）
set(IMGUI_DIR ${CMAKE_SOURCE_DIR}/Lib/imgui)
add_library(imgui STATIC
        ${IMGUI_DIR}/imgui.cpp
        ${IMGUI_DIR}/imgui_draw.cpp
        ${IMGUI_DIR}/imgui_tables.cpp
        ${IMGUI_DIR}/imgui_widgets.cpp
        # ${IMGUI_DIR}/imgui_demo.cpp      # ShowDemoWindow 的实现（调试期保留）
        ${IMGUI_DIR}/backends/imgui_impl_glfw.cpp
        ${IMGUI_DIR}/backends/imgui_impl_vulkan.cpp
)
target_include_directories(imgui PUBLIC
        ${IMGUI_DIR}
        ${IMGUI_DIR}/backends)
# 两个 backend 头文件分别依赖 GLFW / Vulkan 头
target_link_libraries(imgui PUBLIC glfw Vulkan::Vulkan)

# ImGuizmo（视口操纵杆，vendored submodule；新版仓库源码在 src/，
# 只编译 ImGuizmo.cpp，GraphEditor/ImCurveEdit 等示例模块不用）
# IMGUI_DEFINE_MATH_OPERATORS 必须 PUBLIC：ImGuizmo.cpp 与任何
# include 其头文件的 TU 都要在 imgui.h 之前看到该宏（ImVec2 运算符）
set(IMGUIZMO_DIR ${CMAKE_SOURCE_DIR}/Lib/ImGuizmo/src)
add_library(ImGuizmo STATIC ${IMGUIZMO_DIR}/ImGuizmo.cpp)
target_include_directories(ImGuizmo PUBLIC ${IMGUIZMO_DIR})
target_compile_definitions(ImGuizmo PUBLIC IMGUI_DEFINE_MATH_OPERATORS)
target_link_libraries(ImGuizmo PUBLIC imgui)

# Tracy（CPU/GPU 帧分析）
add_library(tracy STATIC ${CMAKE_SOURCE_DIR}/Lib/tracy/public/TracyClient.cpp)
target_include_directories(tracy PUBLIC ${CMAKE_SOURCE_DIR}/Lib/tracy/public)
target_compile_definitions(tracy PUBLIC
        TRACY_ENABLE
        # 按需剖析：GPU context 宣告（GpuNewContext）与连接绑定——GUI 永远晚于
        # 程序启动连接，没有这个宏宣告消息被丢弃，GPU 时间线永远空白
        TRACY_ON_DEMAND)
find_package(Threads REQUIRED)
if(WIN32)
    target_link_libraries(tracy PUBLIC
            Threads::Threads
            ws2_32       
            dbghelp
            secur32)
else()
    target_link_libraries(tracy PUBLIC Threads::Threads)
endif()


# ============ Engine ============

file(GLOB_RECURSE ENGINE_SOURCES CONFIGURE_DEPENDS src/*.cpp)

# game 构建（HELLOVULKAN_EDITOR=OFF）：editor 专属 pass 整 TU 不进产物
#（材质球预览 / Editor gizmo——对应头文件只含声明，无符号产出）
if(NOT HELLOVULKAN_EDITOR)
    list(REMOVE_ITEM ENGINE_SOURCES
            ${CMAKE_CURRENT_SOURCE_DIR}/src/Renderer/Passes/MaterialPreviewPass.cpp
            ${CMAKE_CURRENT_SOURCE_DIR}/src/Renderer/Passes/EditorGizmoPass.cpp)
endif()

add_library(Engine STATIC ${ENGINE_SOURCES})

# PhysicsDebugDraw 派生 Jolt::DebugRendererSimple：Jolt 以 -fno-rtti 编译
#（有 key function 的基类 typeinfo 符号不存在），该 TU 必须同步关闭 RTTI，
# 否则派生类 typeinfo 引用悬空符号（链接期 undefined reference）
set_source_files_properties(src/Physics/PhysicsDebugDraw.cpp PROPERTIES
        COMPILE_OPTIONS "-fno-rtti")

target_include_directories(Engine PUBLIC
        ${CMAKE_CURRENT_SOURCE_DIR}/include
        # header-only 库：纯 include 路径
        ${CMAKE_SOURCE_DIR}/Lib/entt/src
        ${CMAKE_SOURCE_DIR}/Lib/VulkanMemoryAllocator/include)

target_link_libraries(Engine PUBLIC
        glfw
        glm::glm
        Vulkan::Vulkan
        spdlog::spdlog
        stb
        assimp::assimp
        meshoptimizer
        Jolt::Jolt
        yaml-cpp::yaml-cpp
        imgui
        ImGuizmo
        tracy)

target_compile_definitions(Engine PRIVATE VULKAN_HPP_DISPATCH_LOADER_DYNAMIC=1)

# editor/game 编译期分离：HELLO_EDITOR=1 时预览子系统 + 编辑器消费端编译
#（PUBLIC——App 层 main.cpp 的编辑器装配同样按此宏裁剪）
if(HELLOVULKAN_EDITOR)
    target_compile_definitions(Engine PUBLIC HELLO_EDITOR=1)
endif()
