Compare commits

...

1 Commits

Author SHA1 Message Date
855002687f add SDL2_ttf and FreeType with Debug/Release support 2025-12-22 23:06:41 +06:00
3 changed files with 313 additions and 0 deletions

View File

@ -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
"$<IF:$<CONFIG:Debug>,${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
"$<IF:$<CONFIG:Debug>,${SDL2TTF_BASE_DIR}-Debug/include,${SDL2TTF_BASE_DIR}-Release/include>;$<IF:$<CONFIG:Debug>,${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 "$<IF:$<CONFIG:Debug>,${LIBZIP_BASE_DIR}-Debug/bin/zip.dll,${LIBZIP_BASE_DIR}-Release/bin/zip.dll>")
# SDL2_ttf
set(SDL2TTF_DLL_SRC "$<IF:$<CONFIG:Debug>,${SDL2TTF_BASE_DIR}-Debug/bin/SDL2_ttfd.dll,${SDL2TTF_BASE_DIR}-Release/bin/SDL2_ttf.dll>")
set(SDL2TTF_DLL_DST "$<TARGET_FILE_DIR:space-game001>")
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}"
"$<TARGET_FILE_DIR:space-game001>/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/

View File

@ -8,6 +8,7 @@
#include "TextModel.h"
#include <random>
#include <cmath>
#include <SDL_ttf.h>
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()

BIN
fonts/Roboto-Regular.ttf Normal file

Binary file not shown.