From 3ed4e51e23b5093a44a166b2f11ff66164e5cff1 Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Thu, 12 Dec 2024 21:09:55 +0100 Subject: font working --- src/crepe/facade/SDLContext.h | 1 + 1 file changed, 1 insertion(+) (limited to 'src/crepe/facade/SDLContext.h') diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 46b779f..6b725e3 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include -- cgit v1.2.3 From 054b1ebea645bb8916f87e0d8f0f85d59e998eaf Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Thu, 12 Dec 2024 21:16:19 +0100 Subject: font facade added to SDLContext --- src/crepe/api/Text.h | 6 ++++-- src/crepe/facade/Font.h | 31 ++++++++++++++++++------------- src/crepe/facade/SDLContext.h | 5 ++++- 3 files changed, 26 insertions(+), 16 deletions(-) (limited to 'src/crepe/facade/SDLContext.h') diff --git a/src/crepe/api/Text.h b/src/crepe/api/Text.h index 51bab98..8436611 100644 --- a/src/crepe/api/Text.h +++ b/src/crepe/api/Text.h @@ -20,8 +20,6 @@ public: Text(game_object_id_t id,const vec2 & dimensions, const vec2 & offset,std::string text,std::string font_family); //! Text data that does not have to be set in the constructor struct Data { - //! Label text color. - Color text_color = Color::BLACK; /** * \brief fontsize for text rendering * @@ -32,11 +30,15 @@ public: * Instead this value is used to upscale the font texture which can cause blurring or distorted text when upscaling or downscaling too much. */ unsigned int font_size = 16; + //! Layer sorting level of the text const int sorting_in_layer = 0; //! Order within the sorting text const int order_in_layer = 0; + + //! Label text color. + Color text_color = Color::BLACK; }; public: //! font family name such as (Arial,Helvetica,Inter) diff --git a/src/crepe/facade/Font.h b/src/crepe/facade/Font.h index a27676b..fbc1b8f 100644 --- a/src/crepe/facade/Font.h +++ b/src/crepe/facade/Font.h @@ -1,35 +1,40 @@ #pragma once - -#include #include +#include #include "../api/Asset.h" #include "../api/Config.h" #include "../Resource.h" + namespace crepe { /** * \brief Resource for managing font creation and destruction * * This class is a wrapper around an SDL_ttf font instance, encapsulating font loading and usage. + * It loads a font from an Asset and manages its lifecycle. The font is automatically unloaded + * when this object is destroyed. */ class Font : public Resource{ public: /** - * \param src Asset with font data to load. - * \param mediator use the SDLContext reference to get_font() - */ + * \param src The Asset containing the font file path and metadata to load the font. + * \param mediator The Mediator object used for managing the SDL context or related systems. + */ Font(const Asset & src, Mediator & mediator); - /** - * \brief getter for TTF_Font - * - * \param src Asset with font data to load. - * \param mediator use the SDLContext reference to get_font() - */ - TTF_Font* get_font() const; + /** + * \brief Gets the underlying TTF_Font resource. + * + * This function returns the raw pointer to the SDL_ttf TTF_Font object that represents + * the loaded font. This can be used with SDL_ttf functions to render text. + * + * \return The raw TTF_Font object wrapped in a unique pointer. + */ + TTF_Font* get_font() const; + private: - //! The SDL_ttf font object with custom deleter. + //! The SDL_ttf font object with custom deleter. std::unique_ptr font; }; diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 6b725e3..bbbb542 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -16,9 +16,10 @@ #include "api/KeyCodes.h" #include "api/Sprite.h" #include "api/Transform.h" - #include "types.h" +#include "SDLFontContext.h" + namespace crepe { class Texture; @@ -226,6 +227,7 @@ public: void set_color_texture(const Texture & texture, const Color & color); private: + //! sdl Window std::unique_ptr> game_window; @@ -234,6 +236,7 @@ private: //! black bars rectangle to draw SDL_FRect black_bars[2] = {}; + SDLFontContext font_facade{}; }; } // namespace crepe -- cgit v1.2.3 From 24818173c970829553d75787ed6a60e6c95e16c6 Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Thu, 12 Dec 2024 21:17:29 +0100 Subject: fontcontext removed from sdlcontext --- src/crepe/facade/SDLContext.h | 2 -- 1 file changed, 2 deletions(-) (limited to 'src/crepe/facade/SDLContext.h') diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index bbbb542..957ee32 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -18,7 +18,6 @@ #include "api/Transform.h" #include "types.h" -#include "SDLFontContext.h" namespace crepe { @@ -236,7 +235,6 @@ private: //! black bars rectangle to draw SDL_FRect black_bars[2] = {}; - SDLFontContext font_facade{}; }; } // namespace crepe -- cgit v1.2.3 From 1658c71bb7d3676699e9519131d6ea542e74fc83 Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Thu, 12 Dec 2024 21:22:06 +0100 Subject: added enter between functions --- src/crepe/facade/SDLContext.h | 1 - src/crepe/facade/SDLFontContext.cpp | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) (limited to 'src/crepe/facade/SDLContext.h') diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 554880f..d7b8365 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -18,7 +18,6 @@ #include "api/Transform.h" #include "types.h" - namespace crepe { class Texture; diff --git a/src/crepe/facade/SDLFontContext.cpp b/src/crepe/facade/SDLFontContext.cpp index e7f04cc..4fb0e88 100644 --- a/src/crepe/facade/SDLFontContext.cpp +++ b/src/crepe/facade/SDLFontContext.cpp @@ -15,6 +15,7 @@ SDLFontContext::SDLFontContext(){ SDLFontContext::~SDLFontContext(){ FcFini(); } + unique_ptr SDLFontContext::get_font_asset(const string & font_family) { // Create a pattern to search for the font family -- cgit v1.2.3 From 5ef7c56e44a864e580810952450c43c0f9a7b6e0 Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Thu, 12 Dec 2024 21:26:03 +0100 Subject: make format --- src/crepe/api/Text.cpp | 7 +++- src/crepe/api/Text.h | 8 ++-- src/crepe/facade/Font.cpp | 28 ++++++------- src/crepe/facade/Font.h | 16 ++++---- src/crepe/facade/SDLContext.cpp | 4 +- src/crepe/facade/SDLContext.h | 3 +- src/crepe/facade/SDLFontContext.cpp | 80 ++++++++++++++++++------------------- src/crepe/facade/SDLFontContext.h | 21 +++++----- src/example/loadfont.cpp | 34 ++++++++-------- 9 files changed, 102 insertions(+), 99 deletions(-) (limited to 'src/crepe/facade/SDLContext.h') diff --git a/src/crepe/api/Text.cpp b/src/crepe/api/Text.cpp index 12d01f1..b30ccf6 100644 --- a/src/crepe/api/Text.cpp +++ b/src/crepe/api/Text.cpp @@ -2,5 +2,8 @@ using namespace crepe; -Text::Text(game_object_id_t id,const vec2 & dimensions, const vec2 & offset,std::string text,std::string font_family) : UIObject(id,dimensions,offset),text(text), font_family(font_family){} - +Text::Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, std::string text, + std::string font_family) + : UIObject(id, dimensions, offset), + text(text), + font_family(font_family) {} diff --git a/src/crepe/api/Text.h b/src/crepe/api/Text.h index 8436611..ebf413b 100644 --- a/src/crepe/api/Text.h +++ b/src/crepe/api/Text.h @@ -8,16 +8,17 @@ #include "Color.h" #include "UIObject.h" -namespace crepe{ +namespace crepe { /** * \brief Text UIObject component for displaying text * * This class can be used to display text on screen. By setting the font_family to a font already stored on the current device it will automatically be loaded in. */ -class Text : public UIObject{ +class Text : public UIObject { public: - Text(game_object_id_t id,const vec2 & dimensions, const vec2 & offset,std::string text,std::string font_family); + Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, std::string text, + std::string font_family); //! Text data that does not have to be set in the constructor struct Data { /** @@ -40,6 +41,7 @@ public: //! Label text color. Color text_color = Color::BLACK; }; + public: //! font family name such as (Arial,Helvetica,Inter) std::string font_family = ""; diff --git a/src/crepe/facade/Font.cpp b/src/crepe/facade/Font.cpp index 37dee3a..85b0e13 100644 --- a/src/crepe/facade/Font.cpp +++ b/src/crepe/facade/Font.cpp @@ -5,21 +5,21 @@ using namespace std; using namespace crepe; -Font::Font(const Asset& src, Mediator& mediator) - : Resource(src, mediator), font(nullptr, TTF_CloseFont) { - // Get the font file path from the Asset - const std::string font_path = src.get_path(); +Font::Font(const Asset & src, Mediator & mediator) + : Resource(src, mediator), + font(nullptr, TTF_CloseFont) { + // Get the font file path from the Asset + const std::string font_path = src.get_path(); - // Attempt to load the font - this->font.reset(TTF_OpenFont(font_path.c_str(), Config::get_instance().font.size)); + // Attempt to load the font + this->font.reset(TTF_OpenFont(font_path.c_str(), Config::get_instance().font.size)); - // Check if font loading failed - if (!this->font) { - throw runtime_error(format("Failed to load font from path: {}" - ". SDL_ttf error: {}",font_path, TTF_GetError())); - } + // Check if font loading failed + if (!this->font) { + throw runtime_error(format("Failed to load font from path: {}" + ". SDL_ttf error: {}", + font_path, TTF_GetError())); + } } -TTF_Font* Font::get_font() const { - return this->font.get(); -} +TTF_Font * Font::get_font() const { return this->font.get(); } diff --git a/src/crepe/facade/Font.h b/src/crepe/facade/Font.h index fbc1b8f..983ef31 100644 --- a/src/crepe/facade/Font.h +++ b/src/crepe/facade/Font.h @@ -2,9 +2,9 @@ #include #include +#include "../Resource.h" #include "../api/Asset.h" #include "../api/Config.h" -#include "../Resource.h" namespace crepe { @@ -15,15 +15,15 @@ namespace crepe { * It loads a font from an Asset and manages its lifecycle. The font is automatically unloaded * when this object is destroyed. */ -class Font : public Resource{ +class Font : public Resource { public: - /** + /** * \param src The Asset containing the font file path and metadata to load the font. * \param mediator The Mediator object used for managing the SDL context or related systems. */ - Font(const Asset & src, Mediator & mediator); + Font(const Asset & src, Mediator & mediator); - /** + /** * \brief Gets the underlying TTF_Font resource. * * This function returns the raw pointer to the SDL_ttf TTF_Font object that represents @@ -31,11 +31,11 @@ public: * * \return The raw TTF_Font object wrapped in a unique pointer. */ - TTF_Font* get_font() const; + TTF_Font * get_font() const; private: - //! The SDL_ttf font object with custom deleter. - std::unique_ptr font; + //! The SDL_ttf font object with custom deleter. + std::unique_ptr font; }; } // namespace crepe diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 274c14a..cbb0f3b 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -32,8 +32,8 @@ using namespace std; SDLContext::SDLContext(Mediator & mediator) { dbg_trace(); if (TTF_Init() == -1) { - throw runtime_error(format("SDL_ttf initialization failed: {}", TTF_GetError())); - } + throw runtime_error(format("SDL_ttf initialization failed: {}", TTF_GetError())); + } if (SDL_Init(SDL_INIT_VIDEO) != 0) { throw runtime_error(format("SDLContext: SDL_Init error: {}", SDL_GetError())); } diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index d7b8365..76cd99a 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -4,8 +4,8 @@ #include #include #include -#include #include +#include #include #include #include @@ -225,7 +225,6 @@ public: void set_color_texture(const Texture & texture, const Color & color); private: - //! sdl Window std::unique_ptr> game_window; diff --git a/src/crepe/facade/SDLFontContext.cpp b/src/crepe/facade/SDLFontContext.cpp index 851016b..2bccac4 100644 --- a/src/crepe/facade/SDLFontContext.cpp +++ b/src/crepe/facade/SDLFontContext.cpp @@ -2,54 +2,52 @@ #include "SDLFontContext.h" - using namespace crepe; using namespace std; -SDLFontContext::SDLFontContext(){ +SDLFontContext::SDLFontContext() { if (!FcInit()) { - throw runtime_error("Failed to initialize Fontconfig."); - } + throw runtime_error("Failed to initialize Fontconfig."); + } } -SDLFontContext::~SDLFontContext(){ - FcFini(); -} +SDLFontContext::~SDLFontContext() { FcFini(); } unique_ptr SDLFontContext::get_font_asset(const string & font_family) { - - // Create a pattern to search for the font family - FcPattern* pattern = FcNameParse(reinterpret_cast(font_family.c_str())); - if (!pattern) { - throw runtime_error("Failed to create font pattern."); - } - - // Default configuration - FcConfig* config = FcConfigGetCurrent(); - if (!config) { - FcPatternDestroy(pattern); - throw runtime_error("Failed to get current Fontconfig configuration."); - } - - // Match the font pattern - FcResult result; - FcPattern* matched_pattern = FcFontMatch(config, pattern, &result); - FcPatternDestroy(pattern); - - if (!matched_pattern) { + + // Create a pattern to search for the font family + FcPattern * pattern = FcNameParse(reinterpret_cast(font_family.c_str())); + if (!pattern) { + throw runtime_error("Failed to create font pattern."); + } + + // Default configuration + FcConfig * config = FcConfigGetCurrent(); + if (!config) { + FcPatternDestroy(pattern); + throw runtime_error("Failed to get current Fontconfig configuration."); + } + + // Match the font pattern + FcResult result; + FcPattern * matched_pattern = FcFontMatch(config, pattern, &result); + FcPatternDestroy(pattern); + + if (!matched_pattern) { FcPatternDestroy(matched_pattern); - throw runtime_error("No matching font found."); - } - - // Extract the file path - FcChar8* file_path = nullptr; - if (FcPatternGetString(matched_pattern, FC_FILE, 0, &file_path) != FcResultMatch || !file_path) { - FcPatternDestroy(matched_pattern); - throw runtime_error("Failed to get font file path."); - } - - // Convert the file path to a string - string font_file_path(reinterpret_cast(file_path)); - FcPatternDestroy(matched_pattern); - return move(make_unique(font_file_path)); + throw runtime_error("No matching font found."); + } + + // Extract the file path + FcChar8 * file_path = nullptr; + if (FcPatternGetString(matched_pattern, FC_FILE, 0, &file_path) != FcResultMatch + || !file_path) { + FcPatternDestroy(matched_pattern); + throw runtime_error("Failed to get font file path."); + } + + // Convert the file path to a string + string font_file_path(reinterpret_cast(file_path)); + FcPatternDestroy(matched_pattern); + return move(make_unique(font_file_path)); } diff --git a/src/crepe/facade/SDLFontContext.h b/src/crepe/facade/SDLFontContext.h index c890b2d..b9e1f23 100644 --- a/src/crepe/facade/SDLFontContext.h +++ b/src/crepe/facade/SDLFontContext.h @@ -1,17 +1,17 @@ #pragma once -#include #include #include +#include #include "../api/Asset.h" namespace crepe { - class SDLFontContext{ - public: - SDLFontContext(); - ~SDLFontContext(); - /** +class SDLFontContext { +public: + SDLFontContext(); + ~SDLFontContext(); + /** * * \brief Facade function to convert a font_family into an asset. * @@ -19,8 +19,9 @@ namespace crepe { * * \param font_family Name of the font family name. */ - std::unique_ptr get_font_asset(const std::string & font_family); - private: - }; + std::unique_ptr get_font_asset(const std::string & font_family); + +private: +}; -} +} // namespace crepe diff --git a/src/example/loadfont.cpp b/src/example/loadfont.cpp index 52454a1..efd5a98 100644 --- a/src/example/loadfont.cpp +++ b/src/example/loadfont.cpp @@ -1,27 +1,27 @@ -#include -#include -#include -#include #include #include -#include #include +#include +#include +#include +#include +#include using namespace crepe; int main() { - - SDLFontContext font_facade; + + SDLFontContext font_facade; Mediator mediator; SDLContext sdl_context{mediator}; - try{ - // Correct way to create a unique pointer for Text - std::unique_ptr label = std::make_unique(1, vec2(100, 100), vec2(0, 0), "test test","OpenSymbol"); - std::unique_ptr asset = font_facade.get_font_asset(label->font_family); - std::cout << "path: " << asset->get_path() << std::endl; - std::unique_ptr font = std::make_unique(*asset,mediator); - }catch (const std::exception& e) { - std::cout << "Standard exception thrown: " << e.what() << std::endl; + try { + // Correct way to create a unique pointer for Text + std::unique_ptr label + = std::make_unique(1, vec2(100, 100), vec2(0, 0), "test test", "OpenSymbol"); + std::unique_ptr asset = font_facade.get_font_asset(label->font_family); + std::cout << "path: " << asset->get_path() << std::endl; + std::unique_ptr font = std::make_unique(*asset, mediator); + } catch (const std::exception & e) { + std::cout << "Standard exception thrown: " << e.what() << std::endl; } - - return 0; + return 0; } -- cgit v1.2.3 From fda61be91cd8667fa2b51e3b8a17ba6b93b728c8 Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Sat, 14 Dec 2024 14:45:10 +0100 Subject: feedback changes --- src/crepe/facade/SDLContext.cpp | 3 ++- src/crepe/facade/SDLContext.h | 1 - src/crepe/facade/SDLFontContext.cpp | 8 ++++---- src/example/loadfont.cpp | 3 ++- 4 files changed, 8 insertions(+), 7 deletions(-) (limited to 'src/crepe/facade/SDLContext.h') diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index cbb0f3b..47dda81 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -75,8 +76,8 @@ SDLContext::~SDLContext() { // thread that SDL_Init() was called on? This has caused problems for me // before. IMG_Quit(); - SDL_Quit(); TTF_Quit(); + SDL_Quit(); } Keycode SDLContext::sdl_to_keycode(SDL_Keycode sdl_key) { diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 76cd99a..efdd6fe 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -4,7 +4,6 @@ #include #include #include -#include #include #include #include diff --git a/src/crepe/facade/SDLFontContext.cpp b/src/crepe/facade/SDLFontContext.cpp index 5123b3b..e0b9a89 100644 --- a/src/crepe/facade/SDLFontContext.cpp +++ b/src/crepe/facade/SDLFontContext.cpp @@ -17,13 +17,13 @@ Asset SDLFontContext::get_font_asset(const string font_family) { // Create a pattern to search for the font family FcPattern * pattern = FcNameParse(reinterpret_cast(font_family.c_str())); - if (!pattern) { + if (pattern == NULL) { throw runtime_error("Failed to create font pattern."); } // Default configuration FcConfig * config = FcConfigGetCurrent(); - if (!config) { + if (config == NULL) { FcPatternDestroy(pattern); throw runtime_error("Failed to get current Fontconfig configuration."); } @@ -33,7 +33,7 @@ Asset SDLFontContext::get_font_asset(const string font_family) { FcPattern * matched_pattern = FcFontMatch(config, pattern, &result); FcPatternDestroy(pattern); - if (!matched_pattern) { + if (matched_pattern == NULL) { FcPatternDestroy(matched_pattern); throw runtime_error("No matching font found."); } @@ -41,7 +41,7 @@ Asset SDLFontContext::get_font_asset(const string font_family) { // Extract the file path FcChar8 * file_path = nullptr; if (FcPatternGetString(matched_pattern, FC_FILE, 0, &file_path) != FcResultMatch - || !file_path) { + || file_path == NULL) { FcPatternDestroy(matched_pattern); throw runtime_error("Failed to get font file path."); } diff --git a/src/example/loadfont.cpp b/src/example/loadfont.cpp index a52e7f0..6020908 100644 --- a/src/example/loadfont.cpp +++ b/src/example/loadfont.cpp @@ -21,7 +21,8 @@ int main() { std::unique_ptr font = std::make_unique(asset, mediator); // Get the TTF_Font from the Font object TTF_Font* ttf_font = font->get_font(); - + //example if the asset is not correct for font + //std::unique_ptr fontThrow = std::make_unique(Asset("../help.txt"), mediator); // Check if the font is loaded properly if (ttf_font != nullptr) { std::cout << "Font successfully loaded!" << std::endl; -- cgit v1.2.3 From 8abc6008880dd9ed0c16a68a126b49f0eb03caa2 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Mon, 16 Dec 2024 20:52:43 +0100 Subject: fonting --- src/crepe/api/Config.h | 2 +- src/crepe/api/Text.cpp | 5 ++++- src/crepe/facade/Font.cpp | 10 ++++++++-- src/crepe/facade/Font.h | 1 + src/crepe/facade/SDLContext.cpp | 24 ++++++++++++++++++++++++ src/crepe/facade/SDLContext.h | 4 ++++ src/crepe/system/RenderSystem.cpp | 19 +++++++++++++++++++ src/crepe/system/RenderSystem.h | 2 ++ src/example/rendering_particle.cpp | 25 +++++-------------------- 9 files changed, 68 insertions(+), 24 deletions(-) (limited to 'src/crepe/facade/SDLContext.h') diff --git a/src/crepe/api/Config.h b/src/crepe/api/Config.h index 47a81b7..c20287d 100644 --- a/src/crepe/api/Config.h +++ b/src/crepe/api/Config.h @@ -26,7 +26,7 @@ struct Config final { * * Only messages with equal or higher priority than this value will be logged. */ - Log::Level level = Log::Level::INFO; + Log::Level level = Log::Level::DEBUG; /** * \brief Colored log output * diff --git a/src/crepe/api/Text.cpp b/src/crepe/api/Text.cpp index 5b2befe..07d1705 100644 --- a/src/crepe/api/Text.cpp +++ b/src/crepe/api/Text.cpp @@ -1,4 +1,5 @@ #include "../facade/FontFacade.h" +#include "util/Log.h" #include "Text.h" @@ -9,4 +10,6 @@ Text::Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, : UIObject(id, dimensions, offset), text(text), data(data), - font(FontFacade::get_font_asset(font_family)) {} + font(FontFacade::get_font_asset(font_family)) { + dbg_trace(); +} diff --git a/src/crepe/facade/Font.cpp b/src/crepe/facade/Font.cpp index 1ee3de1..83e8519 100644 --- a/src/crepe/facade/Font.cpp +++ b/src/crepe/facade/Font.cpp @@ -1,4 +1,5 @@ #include "../api/Config.h" +#include "util/Log.h" #include "Font.h" @@ -6,8 +7,8 @@ using namespace std; using namespace crepe; Font::Font(const Asset & src, Mediator & mediator) - : Resource(src, mediator), - font(nullptr, TTF_CloseFont) { + : Resource(src, mediator) { + dbg_trace(); Config & config = Config::get_instance(); const std::string FONT_PATH = src.get_path(); TTF_Font * font = TTF_OpenFont(FONT_PATH.c_str(), config.font.size); @@ -16,4 +17,9 @@ Font::Font(const Asset & src, Mediator & mediator) this->font = {font, [](TTF_Font * font) { TTF_CloseFont(font); }}; } +Font::~Font(){ + dbg_trace(); + this->font.reset(); +} + TTF_Font * Font::get_font() const { return this->font.get(); } diff --git a/src/crepe/facade/Font.h b/src/crepe/facade/Font.h index e93bfe9..e9f5fa1 100644 --- a/src/crepe/facade/Font.h +++ b/src/crepe/facade/Font.h @@ -22,6 +22,7 @@ public: * \param mediator The Mediator object used for managing the SDL context or related systems. */ Font(const Asset & src, Mediator & mediator); + ~Font(); /** * \brief Gets the underlying TTF_Font resource. diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index d1d109c..4e969b9 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -21,6 +21,8 @@ #include "../api/Config.h" #include "../api/Sprite.h" #include "../util/Log.h" +#include "api/Text.h" +#include "facade/Font.h" #include "manager/Mediator.h" #include "SDLContext.h" @@ -283,6 +285,28 @@ void SDLContext::draw(const RenderContext & ctx) { angle, NULL, render_flip); } + +void SDLContext::draw_text(const Text & text, const Font & font){ + SDL_Color color { + .r = text.data.text_color.r, + .g = text.data.text_color.g, + .b = text.data.text_color.b, + .a = text.data.text_color.a, + }; + SDL_Surface * font_surface = TTF_RenderText_Solid(font.get_font(), text.text.c_str(), color); + SDL_Texture * font_texture = SDL_CreateTextureFromSurface(this->game_renderer.get(), font_surface); + SDL_FreeSurface(font_surface); + + SDL_FRect dstrect { + .x = text.offset.x, + .y = text.offset.y, + .w = text.dimensions.x, + .h = text.dimensions.y, + }; + SDL_RenderCopyExF(this->game_renderer.get(), font_texture, NULL, &dstrect , 0 , NULL, SDL_FLIP_NONE); + SDL_DestroyTexture(font_texture); +} + void SDLContext::update_camera_view(const Camera & cam, const vec2 & new_pos) { const Camera::Data & cam_data = cam.data; diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index efdd6fe..3f9f9ee 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -20,6 +20,8 @@ namespace crepe { class Texture; +class Text; +class Font; class Mediator; /** @@ -183,6 +185,8 @@ public: */ void draw(const RenderContext & ctx); + void draw_text(const Text & text, const Font & font); + //! Clears the screen, preparing for a new frame. void clear_screen(); diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index afd9548..7f00891 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -15,6 +15,8 @@ #include "../manager/ResourceManager.h" #include "RenderSystem.h" +#include "api/Text.h" +#include "facade/Font.h" #include "types.h" using namespace crepe; @@ -67,9 +69,26 @@ RefVector RenderSystem::sort(RefVector & objs) const { void RenderSystem::update() { this->clear_screen(); this->render(); + this->render_text(); this->present_screen(); } + +void RenderSystem::render_text(){ + SDLContext & ctx = this->mediator.sdl_context; + ComponentManager & mgr = this->mediator.component_manager; + ResourceManager & resource_manager = this->mediator.resource_manager; + + RefVector texts = mgr.get_components_by_type(); + + for (Text & text : texts) { + if (!text.active) continue; + resource_manager.get(text.font); + //ctx.draw_text(text, font); + } + +} + bool RenderSystem::render_particle(const Sprite & sprite, const double & scale) { ComponentManager & mgr = this->mediator.component_manager; diff --git a/src/crepe/system/RenderSystem.h b/src/crepe/system/RenderSystem.h index fc7b46e..ae55404 100644 --- a/src/crepe/system/RenderSystem.h +++ b/src/crepe/system/RenderSystem.h @@ -27,6 +27,8 @@ public: void update() override; private: + + void render_text(); //! Clears the screen in preparation for rendering. void clear_screen(); diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp index 13e625f..3857acc 100644 --- a/src/example/rendering_particle.cpp +++ b/src/example/rendering_particle.cpp @@ -1,4 +1,5 @@ #include "api/Asset.h" +#include "api/Text.h" #include #include #include @@ -43,11 +44,7 @@ using namespace std; class TestScene : public Scene { public: void load_scene() { - - cout << "TestScene" << endl; - Mediator & mediator = this->mediator; - ComponentManager & mgr = mediator.component_manager; - GameObject game_object = mgr.new_object("", "", vec2{0, 0}, 0, 1); + GameObject game_object = new_object("", "", vec2{0, 0}, 0, 1); Color color(255, 255, 255, 255); @@ -59,29 +56,17 @@ public: .flip = Sprite::FlipSettings{false, false}, .sorting_in_layer = 2, .order_in_layer = 2, - .size = {0, 100}, + .size = {0, 0}, .angle_offset = 0, .position_offset = {0, 0}, }); - //auto & anim = game_object.add_component(test_sprite,ivec2{32, 64}, uvec2{4,1}, Animator::Data{}); - //anim.set_anim(0); - - auto & cam = game_object.add_component(ivec2{720, 1280}, vec2{400, 400}, + auto & cam = game_object.add_component(ivec2{400, 400}, vec2{400, 400}, Camera::Data{ .bg_color = Color::WHITE, }); - function on_click = [&]() { cout << "button clicked" << std::endl; }; - function on_enter = [&]() { cout << "enter" << std::endl; }; - function on_exit = [&]() { cout << "exit" << std::endl; }; - - auto & button - = game_object.add_component