diff --git a/CMakeLists.txt b/CMakeLists.txt index 0388759..28295de 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -409,6 +409,266 @@ set_target_properties(libzip_external_lib PROPERTIES INTERFACE_LINK_LIBRARIES zlib_external_lib ) +# =========================================== +# 5) FreeType (v2.14.1) - Зависимость для SDL2_ttf +# =========================================== +set(FT_VER "2.14.1") +set(FREETYPE_ARCHIVE "${THIRDPARTY_DIR}/freetype-${FT_VER}.tar.gz") +set(FREETYPE_SRC_DIR "${THIRDPARTY_DIR}/freetype-${FT_VER}") +# set(FREETYPE_BUILD_DIR "${FREETYPE_SRC_DIR}/build") +set(FREETYPE_BASE_DIR "${FREETYPE_SRC_DIR}/install") + +if(NOT EXISTS "${FREETYPE_ARCHIVE}") + log("Downloading FreeType ${FT_VER}...") + file(DOWNLOAD + "https://download.savannah.gnu.org/releases/freetype/freetype-${FT_VER}.tar.gz" + "${FREETYPE_ARCHIVE}" + SHOW_PROGRESS + ) +endif() + +if(NOT EXISTS "${FREETYPE_SRC_DIR}/CMakeLists.txt") + log("Extracting FreeType...") + execute_process( + COMMAND ${CMAKE_COMMAND} -E tar xvf "${FREETYPE_ARCHIVE}" + WORKING_DIRECTORY "${THIRDPARTY_DIR}" + RESULT_VARIABLE _ft_extract_res + ) + if(NOT _ft_extract_res EQUAL 0) + message(FATAL_ERROR "Failed to extract FreeType") + endif() +endif() + +# Проверяем наличие установленной библиотеки +set(_have_freetype TRUE) +foreach(cfg IN LISTS BUILD_CONFIGS) + if(NOT EXISTS "${FREETYPE_BASE_DIR}-${cfg}/lib/freetype.lib" AND + NOT EXISTS "${FREETYPE_BASE_DIR}-${cfg}/lib/freetyped.lib") + set(_have_freetype FALSE) + endif() +endforeach() + +if(NOT _have_freetype) + foreach(cfg IN LISTS BUILD_CONFIGS) + log("Configuring FreeType (${cfg})...") + execute_process( + COMMAND ${CMAKE_COMMAND} + -G "${CMAKE_GENERATOR}" + -S "${FREETYPE_SRC_DIR}" + -B "${FREETYPE_SRC_DIR}/build-${cfg}" + -DCMAKE_INSTALL_PREFIX=${FREETYPE_BASE_DIR}-${cfg} + -DCMAKE_PREFIX_PATH="${ZLIB_INSTALL_DIR};${LIBPNG_INSTALL_DIR}" + -DCMAKE_DISABLE_FIND_PACKAGE_HarfBuzz=TRUE + -DCMAKE_DISABLE_FIND_PACKAGE_BZip2=TRUE + -DFT_DISABLE_BROTLI=ON + -DBUILD_SHARED_LIBS=OFF + RESULT_VARIABLE _ft_cfg_res + ) + if(NOT _ft_cfg_res EQUAL 0) + message(FATAL_ERROR "FreeType configure failed for ${cfg}") + endif() + + log("Building FreeType (${cfg})...") + execute_process( + COMMAND ${CMAKE_COMMAND} --build "${FREETYPE_SRC_DIR}/build-${cfg}" --config ${cfg} + RESULT_VARIABLE _ft_build_res + ) + if(NOT _ft_build_res EQUAL 0) + message(FATAL_ERROR "FreeType build failed for ${cfg}") + endif() + + log("Installing FreeType (${cfg})...") + execute_process( + COMMAND ${CMAKE_COMMAND} --install "${FREETYPE_SRC_DIR}/build-${cfg}" --config ${cfg} + RESULT_VARIABLE _ft_inst_res + ) + if(NOT _ft_inst_res EQUAL 0) + message(FATAL_ERROR "FreeType install failed for ${cfg}") + endif() + endforeach() +endif() + +set(_ft_debug_lib "") +foreach(cand + "${FREETYPE_BASE_DIR}-Debug/lib/freetyped.lib" + "${FREETYPE_BASE_DIR}-Debug/lib/freetype.lib" +) + if(EXISTS "${cand}") + set(_ft_debug_lib "${cand}") + break() + endif() +endforeach() + +set(_ft_release_lib "") +foreach(cand + "${FREETYPE_BASE_DIR}-Release/lib/freetype.lib" +) + if(EXISTS "${cand}") + set(_ft_release_lib "${cand}") + break() + endif() +endforeach() + +if(_ft_debug_lib STREQUAL "" OR _ft_release_lib STREQUAL "") + message(FATAL_ERROR "FreeType libs not found in ${FREETYPE_BASE_DIR}-Debug/Release") +endif() + +add_library(freetype_external_lib UNKNOWN IMPORTED GLOBAL) +set_target_properties(freetype_external_lib PROPERTIES + IMPORTED_LOCATION_DEBUG "${_ft_debug_lib}" + IMPORTED_LOCATION_RELEASE "${_ft_release_lib}" + INTERFACE_INCLUDE_DIRECTORIES + "$,${FREETYPE_BASE_DIR}-Debug/include,${FREETYPE_BASE_DIR}-Release/include>" +) + +# =========================================== +# 6) SDL2_ttf (v2.24.0) +# =========================================== +set(SDL2TTF_ARCHIVE "${THIRDPARTY_DIR}/SDL2_ttf-release-2.24.0.zip") +set(SDL2TTF_SRC_DIR "${THIRDPARTY_DIR}/SDL_ttf-release-2.24.0") +set(SDL2TTF_BASE_DIR "${SDL2TTF_SRC_DIR}/install") + +if(NOT EXISTS "${SDL2TTF_ARCHIVE}") + log("Downloading SDL2_ttf 2.24.0...") + file(DOWNLOAD + "https://github.com/libsdl-org/SDL_ttf/archive/refs/tags/release-2.24.0.zip" + "${SDL2TTF_ARCHIVE}" + SHOW_PROGRESS + ) +endif() + +if(NOT EXISTS "${SDL2TTF_SRC_DIR}/CMakeLists.txt") + log("Extracting SDL2_ttf...") + execute_process( + COMMAND ${CMAKE_COMMAND} -E tar xvf "${SDL2TTF_ARCHIVE}" + WORKING_DIRECTORY "${THIRDPARTY_DIR}" + RESULT_VARIABLE _ttf_extract_res + ) + if(NOT _ttf_extract_res EQUAL 0) + message(FATAL_ERROR "Failed to extract SDL2_ttf") + endif() +endif() + +set(_have_sdl2ttf TRUE) +foreach(cfg IN LISTS BUILD_CONFIGS) + if(NOT EXISTS "${SDL2TTF_BASE_DIR}-${cfg}/lib/SDL2_ttf.lib" AND + NOT EXISTS "${SDL2TTF_BASE_DIR}-${cfg}/lib/SDL2_ttfd.lib") + set(_have_sdl2ttf FALSE) + endif() +endforeach() + + +if(NOT _have_sdl2ttf) + foreach(cfg IN LISTS BUILD_CONFIGS) + + # SDL2 библиотека под конфигурацию + if(cfg STREQUAL "Debug") + set(_SDL2_LIB "${SDL2_INSTALL_DIR}/lib/SDL2d.lib") + else() + set(_SDL2_LIB "${SDL2_INSTALL_DIR}/lib/SDL2.lib") + endif() + + # FreeType под конфигурацию + set(_FT_PREFIX "${FREETYPE_BASE_DIR}-${cfg}") + + set(_FT_LIB "") + foreach(cand + "${_FT_PREFIX}/lib/freetyped.lib" + "${_FT_PREFIX}/lib/freetype.lib" + ) + if(EXISTS "${cand}") + set(_FT_LIB "${cand}") + break() + endif() + endforeach() + + if(_FT_LIB STREQUAL "") + message(FATAL_ERROR "FreeType library not found for ${cfg}") + endif() + + log("Configuring SDL2_ttf (${cfg})...") + execute_process( + COMMAND ${CMAKE_COMMAND} + -G "${CMAKE_GENERATOR}" + -S "${SDL2TTF_SRC_DIR}" + -B "${SDL2TTF_SRC_DIR}/build-${cfg}" + -DCMAKE_INSTALL_PREFIX=${SDL2TTF_BASE_DIR}-${cfg} + + -DCMAKE_PREFIX_PATH=${_FT_PREFIX};${SDL2_INSTALL_DIR} + + -DSDL2_LIBRARY=${_SDL2_LIB} + -DSDL2_INCLUDE_DIR=${SDL2_INSTALL_DIR}/include/SDL2 + + -DFREETYPE_LIBRARY=${_FT_LIB} + -DFREETYPE_INCLUDE_DIR=${_FT_PREFIX}/include + -DFREETYPE_INCLUDE_DIRS=${_FT_PREFIX}/include + + -DSDL2TTF_VENDORED=OFF + -DSDL2TTF_SAMPLES=OFF + RESULT_VARIABLE _ttf_cfg_res + ) + if(NOT _ttf_cfg_res EQUAL 0) + message(FATAL_ERROR "SDL2_ttf configure failed for ${cfg}") + endif() + + log("Building SDL2_ttf (${cfg})...") + execute_process( + COMMAND ${CMAKE_COMMAND} --build "${SDL2TTF_SRC_DIR}/build-${cfg}" --config ${cfg} + RESULT_VARIABLE _ttf_build_res + ) + if(NOT _ttf_build_res EQUAL 0) + message(FATAL_ERROR "SDL2_ttf build failed for ${cfg}") + endif() + + log("Installing SDL2_ttf (${cfg})...") + execute_process( + COMMAND ${CMAKE_COMMAND} --install "${SDL2TTF_SRC_DIR}/build-${cfg}" --config ${cfg} + RESULT_VARIABLE _ttf_inst_res + ) + if(NOT _ttf_inst_res EQUAL 0) + message(FATAL_ERROR "SDL2_ttf install failed for ${cfg}") + endif() + + endforeach() +endif() + +set(_ttf_debug_lib "") +foreach(cand + "${SDL2TTF_BASE_DIR}-Debug/lib/SDL2_ttfd.lib" + "${SDL2TTF_BASE_DIR}-Debug/lib/SDL2_ttf.lib" +) + if(EXISTS "${cand}") + set(_ttf_debug_lib "${cand}") + break() + endif() +endforeach() + +set(_ttf_release_lib "") +foreach(cand + "${SDL2TTF_BASE_DIR}-Release/lib/SDL2_ttf.lib" +) + if(EXISTS "${cand}") + set(_ttf_release_lib "${cand}") + break() + endif() +endforeach() + +if(_ttf_debug_lib STREQUAL "" OR _ttf_release_lib STREQUAL "") + message(FATAL_ERROR "SDL2_ttf libs not found in install-Debug / install-Release") +endif() + + +add_library(SDL2_ttf_external_lib UNKNOWN IMPORTED GLOBAL) +set_target_properties(SDL2_ttf_external_lib PROPERTIES + IMPORTED_LOCATION_DEBUG "${_ttf_debug_lib}" + IMPORTED_LOCATION_RELEASE "${_ttf_release_lib}" +) + +set_property(TARGET SDL2_ttf_external_lib PROPERTY INTERFACE_INCLUDE_DIRECTORIES + "$,${SDL2TTF_BASE_DIR}-Debug/include,${SDL2TTF_BASE_DIR}-Release/include>;$,${SDL2TTF_BASE_DIR}-Debug/include/SDL2,${SDL2TTF_BASE_DIR}-Release/include/SDL2>" +) + + # =========================================== # Основной проект space-game001 # =========================================== @@ -472,6 +732,8 @@ target_link_libraries(space-game001 PRIVATE libpng_external_lib zlib_external_lib libzip_external_lib + freetype_external_lib + SDL2_ttf_external_lib ) # Линкуем OpenGL (Windows) @@ -491,6 +753,10 @@ if (WIN32) set(LIBZIP_DLL_SRC "$,${LIBZIP_BASE_DIR}-Debug/bin/zip.dll,${LIBZIP_BASE_DIR}-Release/bin/zip.dll>") + # SDL2_ttf + set(SDL2TTF_DLL_SRC "$,${SDL2TTF_BASE_DIR}-Debug/bin/SDL2_ttfd.dll,${SDL2TTF_BASE_DIR}-Release/bin/SDL2_ttf.dll>") + set(SDL2TTF_DLL_DST "$") + add_custom_command(TARGET space-game001 POST_BUILD COMMAND ${CMAKE_COMMAND} -E echo "Copying DLLs to output folder..." @@ -503,6 +769,11 @@ if (WIN32) COMMAND ${CMAKE_COMMAND} -E copy_if_different "${LIBZIP_DLL_SRC}" "$/zip.dll" + + # Копируем SDL2_ttf + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${SDL2TTF_DLL_SRC}" + "${SDL2TTF_DLL_DST}" ) endif() @@ -514,6 +785,7 @@ endif() set(RUNTIME_RESOURCE_DIRS "resources" "shaders" + "fonts" ) # Копируем ресурсы и шейдеры в папку exe и в корень build/ diff --git a/Game.cpp b/Game.cpp index d19757a..e30f415 100755 --- a/Game.cpp +++ b/Game.cpp @@ -8,6 +8,7 @@ #include "TextModel.h" #include #include +#include namespace ZL { @@ -195,6 +196,46 @@ void Game::setup() { renderer.InitOpenGL(); + + // =============================== + // SDL_ttf / FreeType TEST + // =============================== + if (TTF_Init() != 0) + { + std::cerr << "[TTF] Init failed: " << TTF_GetError() << std::endl; + } + else + { + std::cout << "[TTF] Initialized successfully" << std::endl; + + TTF_Font* testFont = TTF_OpenFont("./fonts/Roboto-Regular.ttf", 32); + + if (!testFont) + { + std::cerr << "[TTF] OpenFont failed: " << TTF_GetError() << std::endl; + } + else + { + std::cout << "[TTF] Font loaded successfully (FreeType OK)" << std::endl; + + SDL_Color white = { 255, 255, 255, 255 }; + + SDL_Surface* textSurface = + TTF_RenderUTF8_Blended(testFont, "SDL_ttf + FreeType OK", white); + + if (!textSurface) + { + std::cerr << "[TTF] Render failed: " << TTF_GetError() << std::endl; + } + else + { + std::cout << "[TTF] Text rendered successfully" << std::endl; + SDL_FreeSurface(textSurface); + } + + TTF_CloseFont(testFont); + } + } } void Game::drawCubemap() diff --git a/fonts/Roboto-Regular.ttf b/fonts/Roboto-Regular.ttf new file mode 100644 index 0000000..3a4973c Binary files /dev/null and b/fonts/Roboto-Regular.ttf differ