cmake_minimum_required(VERSION 3.16) project(ShadowOverBishkekDemo LANGUAGES C CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # Опция для интеграции Steamworks SDK (по умолчанию выключена) option(STEAMSDK "Enable Steamworks SDK integration" OFF) include(${CMAKE_CURRENT_SOURCE_DIR}/../cmake/ThirdParty.cmake) # =========================================== # Основной проект ShadowOverBishkekDemo # =========================================== add_executable(ShadowOverBishkekDemo WIN32 ../src/main.cpp ../src/Game.cpp ../src/Game.h ../src/Character.cpp ../src/Character.h ../src/CharacterState.cpp ../src/CharacterState.h ../src/Environment.cpp ../src/Environment.h ../src/Localization.cpp ../src/Localization.h ../src/render/Renderer.cpp ../src/render/Renderer.h ../src/render/ShaderManager.cpp ../src/render/ShaderManager.h ../src/render/TextureManager.cpp ../src/render/TextureManager.h ../src/TextModel.cpp ../src/TextModel.h ../src/AudioPlayerAsync.cpp ../src/AudioPlayerAsync.h ../src/BoneAnimatedModelNew.cpp ../src/BoneAnimatedModelNew.h ../src/render/OpenGlExtensions.cpp ../src/render/OpenGlExtensions.h ../src/utils/Utils.cpp ../src/utils/Utils.h ../src/SparkEmitter.cpp ../src/SparkEmitter.h ../src/TeleportZone.h ../src/TeleportZone.cpp ../src/utils/TaskManager.cpp ../src/utils/TaskManager.h ../src/render/FrameBuffer.cpp ../src/render/FrameBuffer.h ../src/render/ShadowMap.cpp ../src/render/ShadowMap.h ../src/UiManager.cpp ../src/UiManager.h ../src/render/TextRenderer.h ../src/render/TextRenderer.cpp ../src/MenuManager.h ../src/MenuManager.cpp ../src/Location.h ../src/Location.cpp ../src/LocationState.h ../src/LocationState.cpp ../src/LocationEditor.h ../src/LocationEditor.cpp ../src/NpcCar.h ../src/NpcCar.cpp ../src/GameConstants.h ../src/GameConstants.cpp ../src/GameState.h ../src/GameState.cpp ../src/ScriptEngine.h ../src/ScriptEngine.cpp ../src/navigation/PathFinder.h ../src/navigation/PathFinder.cpp ../src/items/GameObjectLoader.h ../src/items/GameObjectLoader.cpp ../src/items/Item.h ../src/items/Item.cpp ../src/items/ItemRegistry.h ../src/items/ItemRegistry.cpp ../src/items/InteractiveObject.h ../src/items/InteractiveObject.cpp ../src/items/InteractiveObjectState.h ../src/dialogue/DialogueTypes.h ../src/dialogue/DialogueDatabase.h ../src/dialogue/DialogueDatabase.cpp ../src/dialogue/DialogueRuntime.h ../src/dialogue/DialogueRuntime.cpp ../src/dialogue/DialogueOverlay.h ../src/dialogue/DialogueOverlay.cpp ../src/dialogue/DialogueSystem.h ../src/dialogue/DialogueSystem.cpp ../src/dialogue/TranslationDatabase.h ../src/dialogue/TranslationDatabase.cpp ../src/quest/QuestTypes.h ../src/quest/QuestJournal.h ../src/quest/QuestJournal.cpp ../src/cutscene/CutsceneTypes.h ../src/cutscene/CutsceneDatabase.h ../src/cutscene/CutsceneDatabase.cpp ../src/cutscene/CutsceneRuntime.h ../src/cutscene/CutsceneRuntime.cpp ../src/cutscene/CutsceneOverlay.h ../src/cutscene/CutsceneOverlay.cpp ../src/render/UiQuad.h app.rc ) # Установка проекта по умолчанию для Visual Studio set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT ShadowOverBishkekDemo) # include-пути проекта target_include_directories(ShadowOverBishkekDemo PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../src" ) set_target_properties(ShadowOverBishkekDemo PROPERTIES OUTPUT_NAME "ShadowOverBishkekDemo" ) # Определения препроцессора: # PNG_ENABLED – включает код PNG в TextureManager # SDL_MAIN_HANDLED – отключает переопределение main -> SDL_main target_compile_definitions(ShadowOverBishkekDemo PRIVATE WIN32_LEAN_AND_MEAN PNG_ENABLED # SDL_MAIN_HANDLED # DEBUG_LIGHT # SHOW_PATH ) # Линкуем с SDL2main, если он вообще установлен target_link_libraries(ShadowOverBishkekDemo PRIVATE SDL2main_external_lib) # Линкуем сторонние библиотеки target_link_libraries(ShadowOverBishkekDemo PRIVATE SDL2_external_lib libpng_external_lib zlib_external_lib libzip_external_lib freetype_external_lib SDL2_ttf_external_lib eigen_external_lib boost_external_lib sol2_external_lib SDL2_mixer_external_lib ) # Линкуем OpenGL (Windows) if(WIN32) target_link_libraries(ShadowOverBishkekDemo PRIVATE opengl32) endif() # =========================================== # Интеграция Steamworks SDK (если STEAMSDK=ON) # =========================================== if(STEAMSDK) message(STATUS "Steamworks SDK integration is ENABLED.") # Макрос STEAMSDK для условной компиляции в C++ коде (#ifdef STEAMSDK) target_compile_definitions(ShadowOverBishkekDemo PRIVATE STEAMSDK) set(STEAM_SDK_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../thirdparty/steamworks_sdk_164/sdk") # Подключение заголовочных файлов Steamworks target_include_directories(ShadowOverBishkekDemo PRIVATE "${STEAM_SDK_DIR}/public" "${STEAM_SDK_DIR}/public/steam" ) # Определение разрядности сборки (x86 vs x64) для выбора версий lib и dll if(CMAKE_SIZEOF_VOID_P EQUAL 8) set(STEAM_LIB_DIR "${STEAM_SDK_DIR}/redistributable_bin/win64") set(STEAM_LIB_NAME "steam_api64") set(STEAM_DLL_NAME "steam_api64.dll") else() set(STEAM_LIB_DIR "${STEAM_SDK_DIR}/redistributable_bin") set(STEAM_LIB_NAME "steam_api") set(STEAM_DLL_NAME "steam_api.dll") endif() # Поиск библиотеки линковки (.lib) find_library(STEAM_LIBRARY NAMES ${STEAM_LIB_NAME} PATHS ${STEAM_LIB_DIR} NO_DEFAULT_PATH ) if(STEAM_LIBRARY) target_link_libraries(ShadowOverBishkekDemo PRIVATE ${STEAM_LIBRARY}) message(STATUS "Found Steam API library: ${STEAM_LIBRARY}") else() message(FATAL_ERROR "Steam API library (${STEAM_LIB_NAME}) NOT found in ${STEAM_LIB_DIR}!") endif() # Генерация временного файла steam_appid.txt с ID демо-версии (4945840) file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/steam_appid.txt" "4945840") else() message(STATUS "Steamworks SDK integration is DISABLED.") endif() # =========================================== # Копирование SDL2d.dll и zlibd.dll рядом с exe # =========================================== if (WIN32) # SDL2: в Debug - SDL2d.dll, в Release - SDL2.dll set(SDL2_DLL_SRC "$,${SDL2_INSTALL_DIR}/bin/SDL2d.dll,${SDL2_INSTALL_DIR}/bin/SDL2.dll>") set(SDL2_DLL_DST "$,$/SDL2d.dll,$/SDL2.dll>") set(LIBZIP_DLL_SRC "$,${LIBZIP_BASE_DIR}-Debug/bin/zip.dll,${LIBZIP_BASE_DIR}-Release/bin/zip.dll>") set(ZLIB_DLL_SRC "$,${ZLIB_INSTALL_DIR}/bin/zd.dll,${ZLIB_INSTALL_DIR}/bin/z.dll>") set(ZLIB_DLL_DST "$,$/zd.dll,$/z.dll>") set(SDL2TTF_DLL_SRC "$,${SDL2TTF_BASE_DIR}-Debug/bin/SDL2_ttfd.dll,${SDL2TTF_BASE_DIR}-Release/bin/SDL2_ttf.dll>") set(SDL2MIXER_DLL_SRC "$,${SDL2MIXER_BASE_DIR}-Debug/bin/SDL2_mixerd.dll,${SDL2MIXER_BASE_DIR}-Release/bin/SDL2_mixer.dll>") add_custom_command(TARGET ShadowOverBishkekDemo POST_BUILD COMMAND ${CMAKE_COMMAND} -E echo "Copying DLLs to output folder..." # Копируем SDL2 COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SDL2_DLL_SRC}" "${SDL2_DLL_DST}" # Копируем LIBZIP (целевое имя всегда zip.dll) COMMAND ${CMAKE_COMMAND} -E copy_if_different "${LIBZIP_DLL_SRC}" "$/zip.dll" COMMAND ${CMAKE_COMMAND} -E copy_if_different "${ZLIB_DLL_SRC}" "${ZLIB_DLL_DST}" COMMAND ${CMAKE_COMMAND} -E copy_if_different "${SDL2TTF_DLL_SRC}" "$" COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/../thirdparty/SDL_mixer-release-2.8.0/install-$/bin/SDL2_mixer$<$:d>.dll" "$/SDL2_mixer$<$:d>.dll" ) # Если включен Steam, добавляем шаги копирования DLL и appid в этот же POST_BUILD if(STEAMSDK) add_custom_command(TARGET ShadowOverBishkekDemo POST_BUILD COMMAND ${CMAKE_COMMAND} -E echo "Copying Steam SDK components..." # Копирование dll к исполняемому файлу COMMAND ${CMAKE_COMMAND} -E copy_if_different "${STEAM_LIB_DIR}/${STEAM_DLL_NAME}" "$/${STEAM_DLL_NAME}" # Копирование steam_appid.txt к исполняемому файлу COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_BINARY_DIR}/steam_appid.txt" "$/steam_appid.txt" # Дублируем steam_appid.txt в корень сборки (полезно при отладке прямо из MSVC) COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_BINARY_DIR}/steam_appid.txt" "${CMAKE_BINARY_DIR}/steam_appid.txt" ) endif() endif() # =========================================== # Копирование ресурсов после сборки # =========================================== # Какие папки с ресурсами нужно копировать set(RUNTIME_RESOURCE_DIRS "resources" "audio" ) # Копируем ресурсы и шейдеры в папку exe и в корень build/ foreach(resdir IN LISTS RUNTIME_RESOURCE_DIRS) add_custom_command(TARGET ShadowOverBishkekDemo POST_BUILD COMMAND ${CMAKE_COMMAND} -E echo "Copying ${resdir} to runtime folders..." # 1) туда, где лежит exe (build/Debug, build/Release и т.п.) COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/../${resdir}" "$/${resdir}" # 2) в корень build, если захочешь запускать из этой папки COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/../${resdir}" "${CMAKE_BINARY_DIR}/${resdir}" ) endforeach()