diff --git a/.gitignore b/.gitignore index e591cbb..b890340 100755 --- a/.gitignore +++ b/.gitignore @@ -401,3 +401,5 @@ jumpingbird.data build build-emcmake thirdparty1 + +proj-web/build diff --git a/proj-web/CMakeLists.txt b/proj-web/CMakeLists.txt new file mode 100644 index 0000000..e594e5e --- /dev/null +++ b/proj-web/CMakeLists.txt @@ -0,0 +1,141 @@ +cmake_minimum_required(VERSION 3.15) + +project(space-game001 CXX) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +# Список исходных файлов +set(SOURCES + ../src/main.cpp + ../src/Game.cpp + ../src/Environment.cpp + ../src/BoneAnimatedModel.cpp + ../src/TextModel.cpp + ../src/Projectile.cpp + ../src/SparkEmitter.cpp + ../src/UiManager.cpp + ../src/render/Renderer.cpp + ../src/render/ShaderManager.cpp + ../src/render/TextureManager.cpp + ../src/render/FrameBuffer.cpp + ../src/render/OpenGlExtensions.cpp + ../src/utils/Utils.cpp + ../src/utils/TaskManager.cpp + ../src/utils/Perlin.cpp + ../src/planet/PlanetData.cpp + ../src/planet/PlanetObject.cpp + ../src/planet/StoneObject.cpp +) + +add_executable(space-game001 ${SOURCES}) + +# Пути к инклудам +target_include_directories(space-game001 PRIVATE + ../src + ./src + ../thirdparty1/eigen-5.0.0 + ../thirdparty1/boost_1_90_0 + ./thirdparty/libzip-1.11.3/build-emcmake/install/include +) + +# Пути к либам и сами либы +target_link_directories(space-game001 PRIVATE + ./thirdparty/libzip-1.11.3/build-emcmake/install/lib +) +target_link_libraries(space-game001 zip z) + + +set(EMSCRIPTEN_FLAGS + "-sUSE_SDL=2" + "-sUSE_SDL_IMAGE=2" + "-sUSE_LIBPNG=1" + "-pthread" + "-sUSE_PTHREADS=1" + "-fexceptions" +) + +# Добавляем флаги компиляции +target_compile_options(space-game001 PRIVATE + ${EMSCRIPTEN_FLAGS} + "-O2" +) + +# Специфичные флаги только для линковки +set(EMSCRIPTEN_LINK_FLAGS + ${EMSCRIPTEN_FLAGS} # SDL и Pthreads нужны и здесь + "-O2" + "-sPTHREAD_POOL_SIZE=4" + "-sTOTAL_MEMORY=4294967296" + "-sINITIAL_MEMORY=3221225472" + "-sMAXIMUM_MEMORY=4294967296" + "-sALLOW_MEMORY_GROWTH=1" + "--preload-file resources.zip" +) + +# Используем современный target_link_options вместо set_target_properties +target_link_options(space-game001 PRIVATE ${EMSCRIPTEN_LINK_FLAGS}) + +# Объединяем флаги в строку и применяем к таргету +string(REPLACE ";" " " EMSCRIPTEN_LINK_FLAGS_STR "${EMSCRIPTEN_LINK_FLAGS}") + +set_target_properties(space-game001 PROPERTIES + LINK_FLAGS "${EMSCRIPTEN_LINK_FLAGS_STR}" + SUFFIX ".html" +) + +# Добавляем те же флаги для компиляции (pthread, exceptions и т.д.) +target_compile_options(space-game001 PRIVATE -O2 -pthread -fexceptions) + +# 1. Определяем пути +set(RESOURCES_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../resources") +set(RESOURCES_ZIP "${CMAKE_CURRENT_BINARY_DIR}/resources.zip") + +get_filename_component(RESOURCES_PARENT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/.." ABSOLUTE) + +# 2. Создаем команду для запаковки +add_custom_command( + OUTPUT "${RESOURCES_ZIP}" + # Указываем "resources" как объект упаковки + COMMAND ${CMAKE_COMMAND} -E tar "cf" "${RESOURCES_ZIP}" --format=zip "resources" + # Запускаем из корня проекта, чтобы путь "resources" был валидным + WORKING_DIRECTORY "${RESOURCES_PARENT_DIR}" + DEPENDS "${RESOURCES_PARENT_DIR}/resources" + COMMENT "Packing resources folder into ${RESOURCES_ZIP}..." +) + +# 3. Создаем таргет-пустышку, чтобы CMake знал, что нужно запустить команду +add_custom_target(pack_resources DEPENDS "${RESOURCES_ZIP}") + +# 4. Делаем основной проект зависимым от архивации +add_dependencies(space-game001 pack_resources) + +# Определяем путь к директории установки (относительно папки билда) +set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/public") + +# 1. Устанавливаем основной HTML файл +install(TARGETS space-game001 + RUNTIME DESTINATION . +) + +# 2. Устанавливаем сопутствующие файлы (JS, WASM и сгенерированный архив данных) +# Emscripten создает их в той же папке, что и таргет +install(FILES + "${CMAKE_CURRENT_BINARY_DIR}/space-game001.js" + "${CMAKE_CURRENT_BINARY_DIR}/space-game001.wasm" + "${CMAKE_CURRENT_BINARY_DIR}/space-game001.data" + DESTINATION . +) + +install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/space-game001plain.html" + DESTINATION . +) + +# Если вам все еще нужен сам resources.zip отдельно в папке public: +#install(FILES "${RESOURCES_ZIP}" DESTINATION .) + +add_custom_command(TARGET space-game001 POST_BUILD + COMMAND ${CMAKE_COMMAND} --install . + WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" + COMMENT "Automatically deploying to public directory..." +) diff --git a/proj-web/README.md b/proj-web/README.md new file mode 100644 index 0000000..5ee3fe5 --- /dev/null +++ b/proj-web/README.md @@ -0,0 +1,33 @@ +# how to build + + +Activate the environment: +``` +C:\Work\Projects\emsdk\emsdk.bat activate latest +C:\Work\Projects\emsdk\emsdk_env.bat +``` + + +Optionally clear cache: +``` +emcc --clear-cache +embuilder build sdl2 sdl2_ttf sdl2_image sdl2_image_jpg sdl2_image_png +``` + +Build: +``` +mkdir build +cd build +emcmake cmake -G Ninja -DCMAKE_MAKE_PROGRAM="../thirdparty/ninja.exe" .. +cmake --build . +``` + +Optionally install: +``` +cmake --install . +``` + +Run: +``` +emrun --no_browser --port 8080 public +``` diff --git a/proj-web/thirdparty/ninja.exe b/proj-web/thirdparty/ninja.exe new file mode 100644 index 0000000..2bd20a6 Binary files /dev/null and b/proj-web/thirdparty/ninja.exe differ diff --git a/src/Game.cpp b/src/Game.cpp index 844df23..cbd6a92 100644 --- a/src/Game.cpp +++ b/src/Game.cpp @@ -13,7 +13,7 @@ namespace ZL { #ifdef EMSCRIPTEN - const char* CONST_ZIP_FILE = "space-game001.zip"; + const char* CONST_ZIP_FILE = "resources.zip"; #else const char* CONST_ZIP_FILE = ""; #endif