cmake_minimum_required(VERSION 3.26) project(MetaCore VERSION 1.0.0 DESCRIPTION "MetaCore Panda3D-based Unity-like editor prototype" LANGUAGES CXX ) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) if(MSVC) # Debug 使用调试运行库,Release 使用可分发运行库,避免不同配置之间的 CRT 冲突。 set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>DLL") endif() option(METACORE_BUILD_TESTS "Build MetaCore tests" ON) option(METACORE_AUTO_PREPARE_PANDA3D "Automatically prepare Panda3D SDK during configure" ON) list(PREPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") if(EXISTS "${CMAKE_SOURCE_DIR}/vcpkg_installed/x64-windows/share/imgui/imgui-config.cmake") list(PREPEND CMAKE_PREFIX_PATH "${CMAKE_SOURCE_DIR}/vcpkg_installed/x64-windows") endif() include(MetaCorePanda3D) metacore_prepare_panda3d() find_package(glm CONFIG REQUIRED) find_package(imgui CONFIG REQUIRED) set(METACORE_COMMON_WARNINGS) if(MSVC) set(METACORE_COMMON_WARNINGS /W4 /permissive- /EHsc) else() set(METACORE_COMMON_WARNINGS -Wall -Wextra -Wpedantic) endif() add_executable(MetaCoreHeaderTool Tools/MetaCoreHeaderTool/main.cpp ) target_compile_options(MetaCoreHeaderTool PRIVATE ${METACORE_COMMON_WARNINGS}) add_executable(MetaCoreRuntimeConfigTool Tools/MetaCoreRuntimeConfigTool/main.cpp ) target_compile_options(MetaCoreRuntimeConfigTool PRIVATE ${METACORE_COMMON_WARNINGS}) add_executable(MetaCoreTcpSenderTool Tools/MetaCoreTcpSenderTool/main.cpp ) target_compile_options(MetaCoreTcpSenderTool PRIVATE ${METACORE_COMMON_WARNINGS}) target_link_libraries(MetaCoreTcpSenderTool PRIVATE ws2_32) function(metacore_generate_reflection module_name function_name output_var) set(generated_headers ${ARGN}) set(absolute_headers) foreach(header IN LISTS generated_headers) list(APPEND absolute_headers "${CMAKE_SOURCE_DIR}/${header}") endforeach() set(generated_cpp "${CMAKE_BINARY_DIR}/Generated/${module_name}/${module_name}GeneratedReflection.cpp") add_custom_command( OUTPUT "${generated_cpp}" COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/Generated/${module_name}" COMMAND $ --output "${generated_cpp}" --function "${function_name}" --module "${module_name}" ${absolute_headers} DEPENDS MetaCoreHeaderTool ${absolute_headers} VERBATIM ) set(${output_var} "${generated_cpp}" PARENT_SCOPE) endfunction() set(METACORE_FOUNDATION_HEADERS Source/MetaCoreFoundation/Public/MetaCoreFoundation/MetaCoreArchive.h Source/MetaCoreFoundation/Public/MetaCoreFoundation/MetaCoreAssetGuid.h Source/MetaCoreFoundation/Public/MetaCoreFoundation/MetaCoreGeneratedReflection.h Source/MetaCoreFoundation/Public/MetaCoreFoundation/MetaCoreHash.h Source/MetaCoreFoundation/Public/MetaCoreFoundation/MetaCoreId.h Source/MetaCoreFoundation/Public/MetaCoreFoundation/MetaCoreLogService.h Source/MetaCoreFoundation/Public/MetaCoreFoundation/MetaCorePackage.h Source/MetaCoreFoundation/Public/MetaCoreFoundation/MetaCoreProject.h Source/MetaCoreFoundation/Public/MetaCoreFoundation/MetaCoreReflection.h ) set(METACORE_FOUNDATION_SOURCES Source/MetaCoreFoundation/Private/MetaCoreArchive.cpp Source/MetaCoreFoundation/Private/MetaCoreAssetGuid.cpp Source/MetaCoreFoundation/Private/MetaCoreHash.cpp Source/MetaCoreFoundation/Private/MetaCoreId.cpp Source/MetaCoreFoundation/Private/MetaCoreLogService.cpp Source/MetaCoreFoundation/Private/MetaCorePackage.cpp Source/MetaCoreFoundation/Private/MetaCoreProject.cpp Source/MetaCoreFoundation/Private/MetaCoreReflection.cpp ) metacore_generate_reflection( Foundation MetaCoreRegisterFoundationGeneratedTypes METACORE_FOUNDATION_GENERATED_SOURCE Source/MetaCoreFoundation/Public/MetaCoreFoundation/MetaCoreAssetGuid.h Source/MetaCoreFoundation/Public/MetaCoreFoundation/MetaCorePackage.h Source/MetaCoreFoundation/Public/MetaCoreFoundation/MetaCoreAssetTypes.h ) add_library(MetaCoreFoundation STATIC ${METACORE_FOUNDATION_HEADERS} ${METACORE_FOUNDATION_SOURCES} ${METACORE_FOUNDATION_GENERATED_SOURCE} ) target_include_directories(MetaCoreFoundation PUBLIC Source/MetaCoreFoundation/Public ) target_link_libraries(MetaCoreFoundation PUBLIC glm::glm ) target_compile_options(MetaCoreFoundation PRIVATE ${METACORE_COMMON_WARNINGS}) set(METACORE_PLATFORM_HEADERS Source/MetaCorePlatform/Public/MetaCorePlatform/MetaCoreInput.h Source/MetaCorePlatform/Public/MetaCorePlatform/MetaCoreWindow.h ) set(METACORE_PLATFORM_SOURCES Source/MetaCorePlatform/Private/MetaCoreInput.cpp Source/MetaCorePlatform/Private/MetaCoreWindow.cpp ) add_library(MetaCorePlatform STATIC ${METACORE_PLATFORM_HEADERS} ${METACORE_PLATFORM_SOURCES} ) target_include_directories(MetaCorePlatform PUBLIC Source/MetaCorePlatform/Public ) target_link_libraries(MetaCorePlatform PUBLIC MetaCoreFoundation MetaCorePanda3D::SDK glm::glm ) target_compile_options(MetaCorePlatform PRIVATE ${METACORE_COMMON_WARNINGS}) target_compile_definitions(MetaCorePlatform PRIVATE WIN32_LEAN_AND_MEAN NOMINMAX) set(METACORE_SCENE_HEADERS Source/MetaCoreScene/Public/MetaCoreScene/MetaCoreComponents.h Source/MetaCoreScene/Public/MetaCoreScene/MetaCoreGameObject.h Source/MetaCoreScene/Public/MetaCoreScene/MetaCoreSceneDocument.h Source/MetaCoreScene/Public/MetaCoreScene/MetaCoreScenePackage.h Source/MetaCoreScene/Public/MetaCoreScene/MetaCoreScene.h ) set(METACORE_SCENE_SOURCES Source/MetaCoreScene/Private/MetaCoreScenePackage.cpp Source/MetaCoreScene/Private/MetaCoreScene.cpp ) metacore_generate_reflection( Scene MetaCoreRegisterSceneGeneratedTypes METACORE_SCENE_GENERATED_SOURCE Source/MetaCoreScene/Public/MetaCoreScene/MetaCoreComponents.h Source/MetaCoreScene/Public/MetaCoreScene/MetaCoreGameObject.h Source/MetaCoreScene/Public/MetaCoreScene/MetaCoreSceneDocument.h Source/MetaCoreScene/Public/MetaCoreScene/MetaCoreScene.h ) add_library(MetaCoreScene STATIC ${METACORE_SCENE_HEADERS} ${METACORE_SCENE_SOURCES} ${METACORE_SCENE_GENERATED_SOURCE} ) target_include_directories(MetaCoreScene PUBLIC Source/MetaCoreScene/Public ) target_link_libraries(MetaCoreScene PUBLIC MetaCoreFoundation glm::glm ) target_compile_options(MetaCoreScene PRIVATE ${METACORE_COMMON_WARNINGS}) set(METACORE_RENDER_HEADERS Source/MetaCoreRender/Public/MetaCoreRender/MetaCoreEditorViewportRenderer.h Source/MetaCoreRender/Public/MetaCoreRender/MetaCorePandaSceneBridge.h Source/MetaCoreRender/Public/MetaCoreRender/MetaCoreRenderDevice.h Source/MetaCoreRender/Public/MetaCoreRender/MetaCoreRenderTypes.h ) set(METACORE_RENDER_SOURCES Source/MetaCoreRender/Private/MetaCoreEditorViewportRenderer.cpp Source/MetaCoreRender/Private/MetaCorePandaSceneBridge.cpp Source/MetaCoreRender/Private/MetaCoreRenderDevice.cpp ) add_library(MetaCoreRender STATIC ${METACORE_RENDER_HEADERS} ${METACORE_RENDER_SOURCES} ) target_include_directories(MetaCoreRender PUBLIC Source/MetaCoreRender/Public ) target_link_libraries(MetaCoreRender PUBLIC MetaCoreFoundation MetaCorePlatform MetaCoreScene MetaCorePanda3D::SDK glm::glm ) target_compile_options(MetaCoreRender PRIVATE ${METACORE_COMMON_WARNINGS}) set(METACORE_RUNTIME_DATA_HEADERS Source/MetaCoreRuntimeData/Public/MetaCoreRuntimeData/MetaCoreRuntimeDataDispatcher.h Source/MetaCoreRuntimeData/Public/MetaCoreRuntimeData/MetaCoreRuntimeDataProject.h Source/MetaCoreRuntimeData/Public/MetaCoreRuntimeData/MetaCoreRuntimeDataSource.h Source/MetaCoreRuntimeData/Public/MetaCoreRuntimeData/MetaCoreRuntimeDataTypes.h ) set(METACORE_RUNTIME_DATA_SOURCES Source/MetaCoreRuntimeData/Private/MetaCoreRuntimeDataDispatcher.cpp Source/MetaCoreRuntimeData/Private/MetaCoreRuntimeDataProject.cpp Source/MetaCoreRuntimeData/Private/MetaCoreRuntimeDataSource.cpp ) metacore_generate_reflection( RuntimeData MetaCoreRegisterRuntimeDataGeneratedTypes METACORE_RUNTIME_DATA_GENERATED_SOURCE Source/MetaCoreRuntimeData/Public/MetaCoreRuntimeData/MetaCoreRuntimeDataProject.h Source/MetaCoreRuntimeData/Public/MetaCoreRuntimeData/MetaCoreRuntimeDataTypes.h ) add_library(MetaCoreRuntimeData STATIC ${METACORE_RUNTIME_DATA_HEADERS} ${METACORE_RUNTIME_DATA_SOURCES} ${METACORE_RUNTIME_DATA_GENERATED_SOURCE} ) target_include_directories(MetaCoreRuntimeData PUBLIC Source/MetaCoreRuntimeData/Public ) target_link_libraries(MetaCoreRuntimeData PUBLIC MetaCoreFoundation MetaCoreScene glm::glm PRIVATE ws2_32 ) target_compile_options(MetaCoreRuntimeData PRIVATE ${METACORE_COMMON_WARNINGS}) target_link_libraries(MetaCoreRuntimeConfigTool PRIVATE MetaCoreFoundation MetaCoreRuntimeData MetaCoreScene ) set(METACORE_EDITOR_HEADERS Source/MetaCoreEditor/Public/MetaCoreEditor/MetaCoreBuiltinModules.h Source/MetaCoreEditor/Public/MetaCoreEditor/MetaCoreEditorApp.h Source/MetaCoreEditor/Public/MetaCoreEditor/MetaCoreEditorAssetTypes.h Source/MetaCoreEditor/Public/MetaCoreEditor/MetaCoreEditorCommandService.h Source/MetaCoreEditor/Public/MetaCoreEditor/MetaCoreEditorContext.h Source/MetaCoreEditor/Public/MetaCoreEditor/MetaCoreEditorModule.h Source/MetaCoreEditor/Public/MetaCoreEditor/MetaCoreEditorServices.h Source/MetaCoreEditor/Public/MetaCoreEditor/MetaCoreSceneInteractionService.h ) set(METACORE_EDITOR_PRIVATE_HEADERS Source/MetaCoreEditor/Private/MetaCoreBuiltinEditorModule.h Source/MetaCoreEditor/Private/MetaCoreEditorCameraController.h third_party/ImGuizmo/ImGuizmo.h third_party/cgltf/cgltf.h ) set(METACORE_EDITOR_SOURCES Source/MetaCoreEditor/Private/MetaCoreBuiltinCoreServicesModule.cpp Source/MetaCoreEditor/Private/MetaCoreBuiltinEditorModule.cpp Source/MetaCoreEditor/Private/MetaCoreEditorApp.cpp Source/MetaCoreEditor/Private/MetaCoreEditorCameraController.cpp Source/MetaCoreEditor/Private/MetaCoreEditorCommandService.cpp Source/MetaCoreEditor/Private/MetaCoreEditorContext.cpp Source/MetaCoreEditor/Private/MetaCoreEditorServices.cpp Source/MetaCoreEditor/Private/MetaCoreEditorModule.cpp Source/MetaCoreEditor/Private/MetaCoreSceneInteractionService.cpp third_party/ImGuizmo/ImGuizmo.cpp third_party/cgltf/cgltf.cpp ) metacore_generate_reflection( Editor MetaCoreRegisterEditorGeneratedTypes METACORE_EDITOR_GENERATED_SOURCE Source/MetaCoreEditor/Public/MetaCoreEditor/MetaCoreEditorAssetTypes.h Source/MetaCoreEditor/Public/MetaCoreEditor/MetaCoreEditorContext.h ) add_library(MetaCoreEditor STATIC ${METACORE_EDITOR_HEADERS} ${METACORE_EDITOR_PRIVATE_HEADERS} ${METACORE_EDITOR_SOURCES} ${METACORE_EDITOR_GENERATED_SOURCE} ) target_include_directories(MetaCoreEditor PUBLIC Source/MetaCoreEditor/Public PRIVATE Source/MetaCoreEditor/Private third_party third_party/ImGuizmo third_party/cgltf ) target_link_libraries(MetaCoreEditor PUBLIC MetaCoreFoundation MetaCorePlatform MetaCoreRender MetaCoreRuntimeData MetaCoreScene glm::glm imgui::imgui ) target_compile_options(MetaCoreEditor PRIVATE ${METACORE_COMMON_WARNINGS}) target_compile_definitions(MetaCoreEditor PRIVATE WIN32_LEAN_AND_MEAN NOMINMAX) add_executable(MetaCoreEditorApp Apps/MetaCoreEditor/main.cpp ) target_link_libraries(MetaCoreEditorApp PRIVATE MetaCoreEditor ) metacore_stage_panda3d_runtime(MetaCoreEditorApp) metacore_stage_simplepbr_runtime(MetaCoreEditorApp) add_executable(MetaCorePlayer Apps/MetaCorePlayer/main.cpp ) target_link_libraries(MetaCorePlayer PRIVATE MetaCoreFoundation MetaCorePlatform MetaCoreRender MetaCoreRuntimeData MetaCoreScene MetaCorePanda3D::SDK ) metacore_stage_panda3d_runtime(MetaCorePlayer) metacore_stage_simplepbr_runtime(MetaCorePlayer) if(METACORE_BUILD_TESTS) enable_testing() add_executable(MetaCoreSmokeTests tests/MetaCoreSmokeTests.cpp ) target_link_libraries(MetaCoreSmokeTests PRIVATE MetaCoreEditor MetaCoreRuntimeData ) metacore_stage_panda3d_runtime(MetaCoreSmokeTests) metacore_stage_simplepbr_runtime(MetaCoreSmokeTests) add_test(NAME MetaCoreSmokeTests COMMAND MetaCoreSmokeTests) endif()