From a80477f2e7f4c18adcc6441828d17582aad2598f Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Mon, 9 Dec 2024 15:29:18 +0100 Subject: get_keyboard_state working --- src/example/button.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'src/example') diff --git a/src/example/button.cpp b/src/example/button.cpp index 00bdc28..f2e77f6 100644 --- a/src/example/button.cpp +++ b/src/example/button.cpp @@ -15,7 +15,6 @@ #include #include #include -#include using namespace crepe; using namespace std; -- cgit v1.2.3 From b2c72ee8ce282bb13b0fbeb2ddb01fdfd6ad1280 Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Tue, 10 Dec 2024 12:27:59 +0100 Subject: font progress --- src/crepe/api/Config.h | 11 +++++++++ src/crepe/facade/SDLFontContext.cpp | 19 ++++++++------- src/crepe/facade/SDLFontContext.h | 5 +++- src/crepe/facade/font.cpp | 21 +++++++++++++++++ src/crepe/facade/font.h | 47 +++++++++++++++++++++++++++++++++++++ src/example/CMakeLists.txt | 1 + src/example/loadfont.cpp | 13 ++++++++++ 7 files changed, 108 insertions(+), 9 deletions(-) create mode 100644 src/crepe/facade/font.cpp create mode 100644 src/crepe/facade/font.h create mode 100644 src/example/loadfont.cpp (limited to 'src/example') diff --git a/src/crepe/api/Config.h b/src/crepe/api/Config.h index a9745c3..e4808fe 100644 --- a/src/crepe/api/Config.h +++ b/src/crepe/api/Config.h @@ -86,6 +86,17 @@ public: */ std::string root_pattern = ".crepe-root"; } asset; + //! Default font options + struct { + /** + * \brief Default font size + * + * using the SDL_ttf library the font size needs to be set when loading the font. + * This config option is the font size at which all fonts will be loaded initially. + * + */ + int font_size = 16; + } font; }; } // namespace crepe diff --git a/src/crepe/facade/SDLFontContext.cpp b/src/crepe/facade/SDLFontContext.cpp index 6ce5efd..a4be143 100644 --- a/src/crepe/facade/SDLFontContext.cpp +++ b/src/crepe/facade/SDLFontContext.cpp @@ -1,19 +1,22 @@ -#include "SDLFontContext.h" #include +#include "SDLFontContext.h" + + using namespace crepe; using namespace std; SDLFontContext::SDLFontContext(){ - if (!FcInit()) { - throw std::runtime_error("Failed to initialize Fontconfig."); - } + } SDLFontContext::~SDLFontContext(){ - FcFini(); + } -Asset SDLFontContext::get_font_asset(const std::string & font_family) { +unique_ptr SDLFontContext::get_font_asset(const std::string & font_family) { + if (!FcInit()) { + throw std::runtime_error("Failed to initialize Fontconfig."); + } // Create a pattern to search for the font family FcPattern* pattern = FcNameParse(reinterpret_cast(font_family.c_str())); if (!pattern) { @@ -46,6 +49,6 @@ Asset SDLFontContext::get_font_asset(const std::string & font_family) { // Convert the file path to a std::string std::string font_file_path(reinterpret_cast(file_path)); FcPatternDestroy(matched_pattern); - - return Asset(font_file_path); + FcFini(); + return std::move(make_unique(font_file_path)); } diff --git a/src/crepe/facade/SDLFontContext.h b/src/crepe/facade/SDLFontContext.h index 3b2e162..cd91383 100644 --- a/src/crepe/facade/SDLFontContext.h +++ b/src/crepe/facade/SDLFontContext.h @@ -1,14 +1,17 @@ #pragma once +#include #include #include + #include "../api/Asset.h" + namespace crepe { class SDLFontContext{ public: SDLFontContext(); ~SDLFontContext(); - Asset get_font_asset(const std::string & font_family); + std::unique_ptr get_font_asset(const std::string & font_family); private: }; diff --git a/src/crepe/facade/font.cpp b/src/crepe/facade/font.cpp new file mode 100644 index 0000000..259a6cd --- /dev/null +++ b/src/crepe/facade/font.cpp @@ -0,0 +1,21 @@ +#include "font.h" +#include "../api/Config.h" +using namespace std; +using namespace crepe; + +void Font::load(unique_ptr res){ + const char* font_path = res->get_path(); + int font_size = Config::get_instance().font.font_size; + this->font = std::unique_ptr( + TTF_OpenFont(font_path, font_size), &TTF_CloseFont); + + if (!font) { + throw std::runtime_error("Failed to load font: " + std::string(TTF_GetError())); + } +} +Font::Font(const char* src){ + this->load(make_unique(src)); +} +Font::Font(std::unique_ptr res){ + this->load(std::move(res)); +} diff --git a/src/crepe/facade/font.h b/src/crepe/facade/font.h new file mode 100644 index 0000000..f5c7785 --- /dev/null +++ b/src/crepe/facade/font.h @@ -0,0 +1,47 @@ +#pragma once + +#include +#include + +#include "../api/Asset.h" + +namespace crepe { + +/** + * \brief Font resource facade + * + * This class is a wrapper around an SDL_ttf font instance, encapsulating font loading and usage. + */ +class Font { +public: + /** + * \param src The file path to the font file. + */ + Font(const char* src); + + /** + * \param res A unique pointer to an Asset holding the font resource. + */ + Font(std::unique_ptr res); + + /** + * \brief Destructor to clean up font resources. + */ + ~Font() = default; + + void draw(const vec2& pos, const vec2&) +private: + /** + * \brief Load the font from the given resource. + * + * This method is used by both constructors to load the font resource. + * + * \param res A unique pointer to an Asset holding the font resource. + */ + void load(std::unique_ptr res); + +private: + std::unique_ptr font; ///< The SDL_ttf font object with custom deleter. +}; + +} // namespace crepe diff --git a/src/example/CMakeLists.txt b/src/example/CMakeLists.txt index 8ef71bb..7fc81d7 100644 --- a/src/example/CMakeLists.txt +++ b/src/example/CMakeLists.txt @@ -21,3 +21,4 @@ add_example(savemgr) add_example(rendering_particle) add_example(game) add_example(button) +add_example(loadfont) diff --git a/src/example/loadfont.cpp b/src/example/loadfont.cpp new file mode 100644 index 0000000..8931ce3 --- /dev/null +++ b/src/example/loadfont.cpp @@ -0,0 +1,13 @@ +#include +#include + +#include + +using namespace crepe; + +int main(){ + SDLFontContext font_facade; + std::unique_ptr asset = font_facade.get_font_asset("OpenSymbol"); + std::cout << "path: " << asset->get_path() << std::endl; + return 0; +} -- cgit v1.2.3 From e75e355c3a59d53a1d64fd8fae3331b2234083e2 Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Wed, 11 Dec 2024 22:17:43 +0100 Subject: text component pretty much finished --- src/crepe/api/CMakeLists.txt | 2 ++ src/crepe/api/Config.h | 4 ++-- src/crepe/api/Text.cpp | 6 ++++++ src/crepe/api/Text.h | 8 ++++---- src/crepe/facade/Font.cpp | 10 +++++++--- src/crepe/facade/Font.h | 12 ++++++------ src/crepe/facade/SDLFontContext.cpp | 11 +++++------ src/crepe/facade/SDLFontContext.h | 8 ++++++++ src/example/loadfont.cpp | 23 +++++++++++++++++------ 9 files changed, 57 insertions(+), 27 deletions(-) (limited to 'src/example') diff --git a/src/crepe/api/CMakeLists.txt b/src/crepe/api/CMakeLists.txt index fb11c8d..90e4d1f 100644 --- a/src/crepe/api/CMakeLists.txt +++ b/src/crepe/api/CMakeLists.txt @@ -20,6 +20,7 @@ target_sources(crepe PUBLIC Button.cpp UIObject.cpp AI.cpp + Text.cpp ) target_sources(crepe PUBLIC FILE_SET HEADERS FILES @@ -49,4 +50,5 @@ target_sources(crepe PUBLIC FILE_SET HEADERS FILES Button.h UIObject.h AI.h + Text.h ) diff --git a/src/crepe/api/Config.h b/src/crepe/api/Config.h index def4c49..159be99 100644 --- a/src/crepe/api/Config.h +++ b/src/crepe/api/Config.h @@ -81,11 +81,11 @@ struct Config final { /** * \brief Default font size * - * using the SDL_ttf library the font size needs to be set when loading the font. + * Using the SDL_ttf library the font size needs to be set when loading the font. * This config option is the font size at which all fonts will be loaded initially. * */ - int font_size = 16; + unsigned int size = 16; } font; //! Audio system settings diff --git a/src/crepe/api/Text.cpp b/src/crepe/api/Text.cpp index e69de29..dd44dd9 100644 --- a/src/crepe/api/Text.cpp +++ b/src/crepe/api/Text.cpp @@ -0,0 +1,6 @@ +#include "Text.h" + +using namespace crepe; + +Text::Text(game_object_id_t id,const vec2 & dimensions, const vec2 & offset, const Asset & font) : UIObject(id,dimensions,offset),source(font){} + diff --git a/src/crepe/api/Text.h b/src/crepe/api/Text.h index 9dd275b..d5f47fa 100644 --- a/src/crepe/api/Text.h +++ b/src/crepe/api/Text.h @@ -11,11 +11,11 @@ namespace crepe{ class Text : public UIObject{ public: - Text(game_object_id_t id,const vec2 & dimensions, const vec2 & offset, const Asset & font, int font_size); + Text(game_object_id_t id,const vec2 & dimensions, const vec2 & offset, const Asset & font); //! Label text. std::string text; - //! Label text color + //! Label text color. Color text_color = Color::BLACK; /** * \brief fontsize for text rendering @@ -26,8 +26,8 @@ public: * The default font size that is loaded is set in the Config. * Instead this value is used to upscale the font texture which can cause blurring or distorted text when upscaling or downscaling too much. */ - int font_size = 16; - + unsigned int font_size = 16; + //! Font asset const Asset source; private: }; diff --git a/src/crepe/facade/Font.cpp b/src/crepe/facade/Font.cpp index 2ad176a..b600b01 100644 --- a/src/crepe/facade/Font.cpp +++ b/src/crepe/facade/Font.cpp @@ -1,24 +1,28 @@ -#include "font.h" #include "../api/Config.h" + +#include "font.h" + using namespace std; using namespace crepe; void Font::load(unique_ptr res){ const char* font_path = res->get_path(); - int font_size = Config::get_instance().font.font_size; this->font = std::unique_ptr( - TTF_OpenFont(font_path, font_size), &TTF_CloseFont); + TTF_OpenFont(font_path, this->default_font_size), &TTF_CloseFont); if (!font) { throw std::runtime_error("Failed to load font: " + std::string(TTF_GetError())); } } + Font::Font(const char* src){ this->load(make_unique(src)); } + Font::Font(std::unique_ptr res){ this->load(std::move(res)); } + const TTF_Font& Font::get_font() const{ return this->font; } diff --git a/src/crepe/facade/Font.h b/src/crepe/facade/Font.h index e34ac63..8bf9fc9 100644 --- a/src/crepe/facade/Font.h +++ b/src/crepe/facade/Font.h @@ -9,17 +9,17 @@ namespace crepe { /** - * \brief Font resource facade + * \brief Resource for managing font creation and destruction * * This class is a wrapper around an SDL_ttf font instance, encapsulating font loading and usage. */ class Font : public Resource{ public: - /**. - * \param src Asset with texture data to load. - * \param mediator use the SDLContext reference to load the image + /** + * \param src Asset with font data to load. + * \param mediator use the SDLContext reference to load text */ - Font(const Asset & src, Mediator & mediator); + Font( src, Mediator & mediator); ~Font() = default @@ -27,7 +27,7 @@ public: private: //! The SDL_ttf font object with custom deleter. std::unique_ptr font; - int default_font_size = Config::get_instance().font.font_size; + unsigned int default_font_size = Config::get_instance().font.size; }; } // namespace crepe diff --git a/src/crepe/facade/SDLFontContext.cpp b/src/crepe/facade/SDLFontContext.cpp index a4be143..d7a0bff 100644 --- a/src/crepe/facade/SDLFontContext.cpp +++ b/src/crepe/facade/SDLFontContext.cpp @@ -7,16 +7,16 @@ using namespace crepe; using namespace std; SDLFontContext::SDLFontContext(){ - + if (!FcInit()) { + throw std::runtime_error("Failed to initialize Fontconfig."); + } } SDLFontContext::~SDLFontContext(){ - + FcFini(); } unique_ptr SDLFontContext::get_font_asset(const std::string & font_family) { - if (!FcInit()) { - throw std::runtime_error("Failed to initialize Fontconfig."); - } + // Create a pattern to search for the font family FcPattern* pattern = FcNameParse(reinterpret_cast(font_family.c_str())); if (!pattern) { @@ -49,6 +49,5 @@ unique_ptr SDLFontContext::get_font_asset(const std::string & font_family // Convert the file path to a std::string std::string font_file_path(reinterpret_cast(file_path)); FcPatternDestroy(matched_pattern); - FcFini(); return std::move(make_unique(font_file_path)); } diff --git a/src/crepe/facade/SDLFontContext.h b/src/crepe/facade/SDLFontContext.h index cd91383..c890b2d 100644 --- a/src/crepe/facade/SDLFontContext.h +++ b/src/crepe/facade/SDLFontContext.h @@ -11,6 +11,14 @@ namespace crepe { public: SDLFontContext(); ~SDLFontContext(); + /** + * + * \brief Facade function to convert a font_family into an asset. + * + * This function uses the FontConfig library to convert a font family name (Arial, Inter, Helvetica) and converts it to the font source path. + * + * \param font_family Name of the font family name. + */ std::unique_ptr get_font_asset(const std::string & font_family); private: }; diff --git a/src/example/loadfont.cpp b/src/example/loadfont.cpp index 8931ce3..0002026 100644 --- a/src/example/loadfont.cpp +++ b/src/example/loadfont.cpp @@ -1,13 +1,24 @@ #include +#include #include - #include +#include using namespace crepe; -int main(){ - SDLFontContext font_facade; - std::unique_ptr asset = font_facade.get_font_asset("OpenSymbol"); - std::cout << "path: " << asset->get_path() << std::endl; - return 0; +int main() { + SDLFontContext font_facade; + + // Create a unique pointer to the font asset + std::unique_ptr asset = font_facade.get_font_asset("OpenSymbol"); + std::cout << "path: " << asset->get_path() << 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), *asset); + }catch (const std::exception& e) { + std::cout << "Standard exception thrown: " << e.what() << std::endl; + } + + + return 0; } -- cgit v1.2.3 From 431d7cceb25db86f31a8c89440f3cdd2c7bf061f Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Thu, 12 Dec 2024 20:45:49 +0100 Subject: load font almost working --- src/crepe/api/Text.cpp | 2 +- src/crepe/api/Text.h | 49 ++++++---- src/crepe/facade/Font.cpp | 4 +- src/crepe/facade/Font.h | 15 +-- src/crepe/facade/SDLContext.cpp | 202 ++++++++++++++++++++++++++-------------- src/example/loadfont.cpp | 13 +-- 6 files changed, 181 insertions(+), 104 deletions(-) (limited to 'src/example') diff --git a/src/crepe/api/Text.cpp b/src/crepe/api/Text.cpp index dd44dd9..12d01f1 100644 --- a/src/crepe/api/Text.cpp +++ b/src/crepe/api/Text.cpp @@ -2,5 +2,5 @@ using namespace crepe; -Text::Text(game_object_id_t id,const vec2 & dimensions, const vec2 & offset, const Asset & font) : UIObject(id,dimensions,offset),source(font){} +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 d5f47fa..51bab98 100644 --- a/src/crepe/api/Text.h +++ b/src/crepe/api/Text.h @@ -9,27 +9,42 @@ #include "UIObject.h" 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{ public: - Text(game_object_id_t id,const vec2 & dimensions, const vec2 & offset, const Asset & font); + 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 + * + * \note this is not the actual font size that is loaded in. + * + * Since SDL_TTF requires the font size when loading in the font it is not possible to switch the font size. + * The default font size that is loaded is set in the Config. + * 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; + }; +public: + //! font family name such as (Arial,Helvetica,Inter) + std::string font_family = ""; //! Label text. - std::string text; - //! Label text color. - Color text_color = Color::BLACK; - /** - * \brief fontsize for text rendering - * - * \note this is not the actual font size that is loaded in. - * - * Since SDL_TTF requires the font size when loading in the font it is not possible to switch the font size. - * The default font size that is loaded is set in the Config. - * 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; - //! Font asset - const Asset source; -private: + std::string text = ""; + // Data instance for data not gotten from constructor + Data data; }; } // namespace crepe diff --git a/src/crepe/facade/Font.cpp b/src/crepe/facade/Font.cpp index b600b01..66835ee 100644 --- a/src/crepe/facade/Font.cpp +++ b/src/crepe/facade/Font.cpp @@ -23,6 +23,6 @@ Font::Font(std::unique_ptr res){ this->load(std::move(res)); } -const TTF_Font& Font::get_font() const{ - return this->font; +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 8bf9fc9..dd1cebf 100644 --- a/src/crepe/facade/Font.h +++ b/src/crepe/facade/Font.h @@ -17,17 +17,20 @@ class Font : public Resource{ public: /** * \param src Asset with font data to load. - * \param mediator use the SDLContext reference to load text + * \param mediator use the SDLContext reference to get_font() */ - Font( src, Mediator & mediator); + Font(const Asset & src, Mediator & mediator); - - ~Font() = default - const TTF_Font& get_font() const; + /** + * \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; private: //! The SDL_ttf font object with custom deleter. std::unique_ptr font; - unsigned int default_font_size = Config::get_instance().font.size; }; } // namespace crepe diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index d71a9c8..8f6c02c 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -18,18 +18,23 @@ #include "../api/Color.h" #include "../api/Config.h" #include "../api/Sprite.h" +#include "../api/Texture.h" #include "../util/Log.h" -#include "manager/Mediator.h" #include "SDLContext.h" -#include "Texture.h" #include "types.h" using namespace crepe; using namespace std; -SDLContext::SDLContext(Mediator & mediator) { +SDLContext & SDLContext::get_instance() { + static SDLContext instance; + return instance; +} + +SDLContext::SDLContext() { dbg_trace(); + if (SDL_Init(SDL_INIT_VIDEO) != 0) { throw runtime_error(format("SDLContext: SDL_Init error: {}", SDL_GetError())); } @@ -57,8 +62,6 @@ SDLContext::SDLContext(Mediator & mediator) { if (!(IMG_Init(img_flags) & img_flags)) { throw runtime_error("SDLContext: SDL_image could not initialize!"); } - - mediator.sdl_context = *this; } SDLContext::~SDLContext() { @@ -74,11 +77,12 @@ SDLContext::~SDLContext() { SDL_Quit(); } -Keycode SDLContext::sdl_to_keycode(SDL_Keycode sdl_key) { +Keycode SDLContext::sdl_to_keycode(SDL_Scancode sdl_key) { static const std::array LOOKUP_TABLE = [] { std::array table{}; table.fill(Keycode::NONE); + // Map all SDL scancodes to Keycodes table[SDL_SCANCODE_SPACE] = Keycode::SPACE; table[SDL_SCANCODE_APOSTROPHE] = Keycode::APOSTROPHE; table[SDL_SCANCODE_COMMA] = Keycode::COMMA; @@ -180,13 +184,27 @@ Keycode SDLContext::sdl_to_keycode(SDL_Keycode sdl_key) { return table; }(); - if (sdl_key < 0 || sdl_key >= SDL_NUM_SCANCODES) { return Keycode::NONE; } - return LOOKUP_TABLE[sdl_key]; } +std::array SDLContext::get_keyboard_state() { + // Array to hold the key states (true if pressed, false if not) + std::array keyState{}; + SDL_PumpEvents(); + const Uint8 * current_state = SDL_GetKeyboardState(nullptr); + + for (int i = 0; i < SDL_NUM_SCANCODES; ++i) { + Keycode key = sdl_to_keycode(static_cast(i)); + + if (key != Keycode::NONE) { + keyState[key] = current_state[i] != 0; + } + } + + return keyState; +} MouseButton SDLContext::sdl_to_mousebutton(Uint8 sdl_button) { static const std::array MOUSE_BUTTON_LOOKUP_TABLE = [] { @@ -218,19 +236,25 @@ void SDLContext::present_screen() { SDL_RenderPresent(this->game_renderer.get()); } +SDL_Rect SDLContext::get_src_rect(const Sprite & sprite) const { + return SDL_Rect{ + .x = sprite.mask.x, + .y = sprite.mask.y, + .w = sprite.mask.w, + .h = sprite.mask.h, + }; +} + SDL_FRect SDLContext::get_dst_rect(const DestinationRectangleData & ctx) const { const Sprite::Data & data = ctx.sprite.data; - float aspect_ratio - = (ctx.sprite.aspect_ratio == 0) ? ctx.texture.get_ratio() : ctx.sprite.aspect_ratio; - vec2 size = data.size; if (data.size.x == 0 && data.size.y != 0) { - size.x = data.size.y * aspect_ratio; + size.x = data.size.y * ctx.sprite.aspect_ratio; } if (data.size.y == 0 && data.size.x != 0) { - size.y = data.size.x / aspect_ratio; + size.y = data.size.x / ctx.sprite.aspect_ratio; } const CameraValues & cam = ctx.cam; @@ -251,24 +275,15 @@ SDL_FRect SDLContext::get_dst_rect(const DestinationRectangleData & ctx) const { } void SDLContext::draw(const RenderContext & ctx) { + const Sprite::Data & data = ctx.sprite.data; SDL_RendererFlip render_flip = (SDL_RendererFlip) ((SDL_FLIP_HORIZONTAL * data.flip.flip_x) | (SDL_FLIP_VERTICAL * data.flip.flip_y)); - SDL_Rect srcrect; - SDL_Rect * srcrect_ptr = NULL; - if (ctx.sprite.mask.w != 0 || ctx.sprite.mask.h != 0) { - srcrect.w = ctx.sprite.mask.w; - srcrect.h = ctx.sprite.mask.h; - srcrect.x = ctx.sprite.mask.x; - srcrect.y = ctx.sprite.mask.y; - srcrect_ptr = &srcrect; - } - + SDL_Rect srcrect = this->get_src_rect(ctx.sprite); SDL_FRect dstrect = this->get_dst_rect(SDLContext::DestinationRectangleData{ .sprite = ctx.sprite, - .texture = ctx.texture, .cam = ctx.cam, .pos = ctx.pos, .img_scale = ctx.scale, @@ -276,9 +291,9 @@ void SDLContext::draw(const RenderContext & ctx) { double angle = ctx.angle + data.angle_offset; - this->set_color_texture(ctx.texture, ctx.sprite.data.color); - SDL_RenderCopyExF(this->game_renderer.get(), ctx.texture.get_img(), srcrect_ptr, &dstrect, - angle, NULL, render_flip); + this->set_color_texture(ctx.sprite.texture, ctx.sprite.data.color); + SDL_RenderCopyExF(this->game_renderer.get(), ctx.sprite.texture.texture.get(), &srcrect, + &dstrect, angle, NULL, render_flip); } SDLContext::CameraValues SDLContext::set_camera(const Camera & cam) { @@ -340,6 +355,8 @@ SDLContext::CameraValues SDLContext::set_camera(const Camera & cam) { return ret_cam; } +uint64_t SDLContext::get_ticks() const { return SDL_GetTicks64(); } + std::unique_ptr> SDLContext::texture_from_path(const std::string & path) { @@ -366,71 +383,112 @@ SDLContext::texture_from_path(const std::string & path) { ivec2 SDLContext::get_size(const Texture & ctx) { ivec2 size; - SDL_QueryTexture(ctx.get_img(), NULL, NULL, &size.x, &size.y); + SDL_QueryTexture(ctx.texture.get(), NULL, NULL, &size.x, &size.y); return size; } +void SDLContext::delay(int ms) const { SDL_Delay(ms); } + std::vector SDLContext::get_events() { std::vector event_list; SDL_Event event; + + // Handle general SDL events while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_QUIT: - event_list.push_back(EventData{ - .event_type = SDLContext::EventType::SHUTDOWN, - }); + event_list.push_back({SDLContext::EventType::SHUTDOWN, {}, {}, {}}); break; case SDL_KEYDOWN: - event_list.push_back(EventData{ - .event_type = SDLContext::EventType::KEYDOWN, - .key = sdl_to_keycode(event.key.keysym.scancode), - .key_repeat = (event.key.repeat != 0), - }); + event_list.push_back( + {SDLContext::EventType::KEYDOWN, + {sdl_to_keycode(event.key.keysym.scancode), event.key.repeat != 0}, + {}, + {}}); break; case SDL_KEYUP: - event_list.push_back(EventData{ - .event_type = SDLContext::EventType::KEYUP, - .key = sdl_to_keycode(event.key.keysym.scancode), - }); + event_list.push_back({SDLContext::EventType::KEYUP, + {sdl_to_keycode(event.key.keysym.scancode), false}, + {}, + {}}); break; case SDL_MOUSEBUTTONDOWN: - event_list.push_back(EventData{ - .event_type = SDLContext::EventType::MOUSEDOWN, - .mouse_button = sdl_to_mousebutton(event.button.button), - .mouse_position = {event.button.x, event.button.y}, - }); + event_list.push_back({SDLContext::EventType::MOUSEDOWN, + {}, + {sdl_to_mousebutton(event.button.button), + {event.button.x, event.button.y}}, + {}}); + break; + case SDL_MOUSEBUTTONUP: + event_list.push_back({SDLContext::EventType::MOUSEUP, + {}, + {sdl_to_mousebutton(event.button.button), + {event.button.x, event.button.y}}, + {}}); + break; + case SDL_MOUSEMOTION: + event_list.push_back({SDLContext::EventType::MOUSEMOVE, + {}, + {{}, + {event.motion.x, event.motion.y}, + -1, + INFINITY, + {event.motion.xrel, event.motion.yrel}}, + {}}); break; - case SDL_MOUSEBUTTONUP: { - int x, y; - SDL_GetMouseState(&x, &y); - event_list.push_back(EventData{ - .event_type = SDLContext::EventType::MOUSEUP, - .mouse_button = sdl_to_mousebutton(event.button.button), - .mouse_position = {event.button.x, event.button.y}, - }); - } break; - - case SDL_MOUSEMOTION: { + case SDL_MOUSEWHEEL: event_list.push_back( - EventData{.event_type = SDLContext::EventType::MOUSEMOVE, - .mouse_position = {event.motion.x, event.motion.y}, - .rel_mouse_move = {event.motion.xrel, event.motion.yrel}}); - } break; - - case SDL_MOUSEWHEEL: { - event_list.push_back(EventData{ - .event_type = SDLContext::EventType::MOUSEWHEEL, - .mouse_position = {event.motion.x, event.motion.y}, - // TODO: why is this needed? - .scroll_direction = event.wheel.y < 0 ? -1 : 1, - .scroll_delta = event.wheel.preciseY, - }); - } break; + {SDLContext::EventType::MOUSEWHEEL, + {}, + {{}, {}, event.wheel.y < 0 ? -1 : 1, event.wheel.preciseY, {}}, + {}}); + break; + + // Forward window events for further processing + case SDL_WINDOWEVENT: + this->handle_window_event(event.window, event_list); + break; } } + return event_list; } + +// Separate function for SDL_WINDOWEVENT subtypes +void SDLContext::handle_window_event(const SDL_WindowEvent & window_event, + std::vector & event_list) { + switch (window_event.event) { + case SDL_WINDOWEVENT_EXPOSED: + event_list.push_back({SDLContext::EventType::WINDOW_EXPOSE, {}, {}, {}}); + break; + case SDL_WINDOWEVENT_RESIZED: + event_list.push_back({SDLContext::EventType::WINDOW_RESIZE, + {}, + {}, + {{}, {window_event.data1, window_event.data2}}}); + break; + case SDL_WINDOWEVENT_MOVED: + event_list.push_back({SDLContext::EventType::WINDOW_MOVE, + {}, + {}, + {{window_event.data1, window_event.data2}, {}}}); + break; + case SDL_WINDOWEVENT_MINIMIZED: + event_list.push_back({SDLContext::EventType::WINDOW_MINIMIZE, {}, {}, {}}); + break; + case SDL_WINDOWEVENT_MAXIMIZED: + event_list.push_back({SDLContext::EventType::WINDOW_MAXIMIZE, {}, {}, {}}); + break; + case SDL_WINDOWEVENT_FOCUS_GAINED: + event_list.push_back({SDLContext::EventType::WINDOW_FOCUS_GAIN, {}, {}, {}}); + break; + case SDL_WINDOWEVENT_FOCUS_LOST: + event_list.push_back({SDLContext::EventType::WINDOW_FOCUS_LOST, {}, {}, {}}); + break; + } +} + void SDLContext::set_color_texture(const Texture & texture, const Color & color) { - SDL_SetTextureColorMod(texture.get_img(), color.r, color.g, color.b); - SDL_SetTextureAlphaMod(texture.get_img(), color.a); + SDL_SetTextureColorMod(texture.texture.get(), color.r, color.g, color.b); + SDL_SetTextureAlphaMod(texture.texture.get(), color.a); } diff --git a/src/example/loadfont.cpp b/src/example/loadfont.cpp index 0002026..fe5466f 100644 --- a/src/example/loadfont.cpp +++ b/src/example/loadfont.cpp @@ -3,18 +3,19 @@ #include #include #include - +#include +#include using namespace crepe; int main() { SDLFontContext font_facade; - - // Create a unique pointer to the font asset - std::unique_ptr asset = font_facade.get_font_asset("OpenSymbol"); - std::cout << "path: " << asset->get_path() << std::endl; + Mediator 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), *asset); + 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 = make_unique(asset,mediator) }catch (const std::exception& e) { std::cout << "Standard exception thrown: " << e.what() << std::endl; } -- cgit v1.2.3 From 3ed4e51e23b5093a44a166b2f11ff66164e5cff1 Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Thu, 12 Dec 2024 21:09:55 +0100 Subject: font working --- src/CMakeLists.txt | 2 + src/crepe/facade/CMakeLists.txt | 2 + src/crepe/facade/Font.cpp | 31 +++--- src/crepe/facade/Font.h | 2 +- src/crepe/facade/SDLContext.cpp | 206 +++++++++++++++------------------------- src/crepe/facade/SDLContext.h | 1 + src/example/loadfont.cpp | 6 +- 7 files changed, 100 insertions(+), 150 deletions(-) (limited to 'src/example') diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2b8873f..a525c74 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -9,6 +9,7 @@ project(crepe C CXX) find_package(SDL2 REQUIRED) find_package(SDL2_image REQUIRED) +find_package(SDL2_ttf REQUIRED) find_package(SoLoud REQUIRED) find_package(GTest REQUIRED) find_package(whereami REQUIRED) @@ -25,6 +26,7 @@ target_include_directories(crepe target_link_libraries(crepe PRIVATE soloud PUBLIC SDL2 + PUBLIC SDL2_ttf PUBLIC SDL2_image PUBLIC ${BERKELEY_DB} PUBLIC whereami diff --git a/src/crepe/facade/CMakeLists.txt b/src/crepe/facade/CMakeLists.txt index f4d71ff..e61b680 100644 --- a/src/crepe/facade/CMakeLists.txt +++ b/src/crepe/facade/CMakeLists.txt @@ -5,6 +5,7 @@ target_sources(crepe PUBLIC SDLContext.cpp DB.cpp SDLFontContext.cpp + Font.cpp ) target_sources(crepe PUBLIC FILE_SET HEADERS FILES @@ -14,5 +15,6 @@ target_sources(crepe PUBLIC FILE_SET HEADERS FILES SDLContext.h DB.h SDLFontContext.h + Font.h ) diff --git a/src/crepe/facade/Font.cpp b/src/crepe/facade/Font.cpp index 66835ee..37dee3a 100644 --- a/src/crepe/facade/Font.cpp +++ b/src/crepe/facade/Font.cpp @@ -1,28 +1,25 @@ #include "../api/Config.h" -#include "font.h" +#include "Font.h" using namespace std; using namespace crepe; -void Font::load(unique_ptr res){ - const char* font_path = res->get_path(); - this->font = std::unique_ptr( - TTF_OpenFont(font_path, this->default_font_size), &TTF_CloseFont); +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(); - if (!font) { - throw std::runtime_error("Failed to load font: " + std::string(TTF_GetError())); - } -} + // Attempt to load the font + this->font.reset(TTF_OpenFont(font_path.c_str(), Config::get_instance().font.size)); -Font::Font(const char* src){ - this->load(make_unique(src)); -} - -Font::Font(std::unique_ptr res){ - this->load(std::move(res)); + // 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 dd1cebf..a27676b 100644 --- a/src/crepe/facade/Font.h +++ b/src/crepe/facade/Font.h @@ -5,7 +5,7 @@ #include "../api/Asset.h" #include "../api/Config.h" - +#include "../Resource.h" namespace crepe { /** diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 8f6c02c..38d12f6 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -18,23 +18,21 @@ #include "../api/Color.h" #include "../api/Config.h" #include "../api/Sprite.h" -#include "../api/Texture.h" #include "../util/Log.h" +#include "manager/Mediator.h" #include "SDLContext.h" +#include "Texture.h" #include "types.h" using namespace crepe; using namespace std; -SDLContext & SDLContext::get_instance() { - static SDLContext instance; - return instance; -} - -SDLContext::SDLContext() { +SDLContext::SDLContext(Mediator & mediator) { dbg_trace(); - + if (TTF_Init() == -1) { + 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())); } @@ -62,6 +60,8 @@ SDLContext::SDLContext() { if (!(IMG_Init(img_flags) & img_flags)) { throw runtime_error("SDLContext: SDL_image could not initialize!"); } + + mediator.sdl_context = *this; } SDLContext::~SDLContext() { @@ -75,14 +75,14 @@ SDLContext::~SDLContext() { // before. IMG_Quit(); SDL_Quit(); + TTF_Quit(); } -Keycode SDLContext::sdl_to_keycode(SDL_Scancode sdl_key) { +Keycode SDLContext::sdl_to_keycode(SDL_Keycode sdl_key) { static const std::array LOOKUP_TABLE = [] { std::array table{}; table.fill(Keycode::NONE); - // Map all SDL scancodes to Keycodes table[SDL_SCANCODE_SPACE] = Keycode::SPACE; table[SDL_SCANCODE_APOSTROPHE] = Keycode::APOSTROPHE; table[SDL_SCANCODE_COMMA] = Keycode::COMMA; @@ -184,26 +184,12 @@ Keycode SDLContext::sdl_to_keycode(SDL_Scancode sdl_key) { return table; }(); + if (sdl_key < 0 || sdl_key >= SDL_NUM_SCANCODES) { return Keycode::NONE; } - return LOOKUP_TABLE[sdl_key]; -} -std::array SDLContext::get_keyboard_state() { - // Array to hold the key states (true if pressed, false if not) - std::array keyState{}; - SDL_PumpEvents(); - const Uint8 * current_state = SDL_GetKeyboardState(nullptr); - for (int i = 0; i < SDL_NUM_SCANCODES; ++i) { - Keycode key = sdl_to_keycode(static_cast(i)); - - if (key != Keycode::NONE) { - keyState[key] = current_state[i] != 0; - } - } - - return keyState; + return LOOKUP_TABLE[sdl_key]; } MouseButton SDLContext::sdl_to_mousebutton(Uint8 sdl_button) { @@ -236,25 +222,19 @@ void SDLContext::present_screen() { SDL_RenderPresent(this->game_renderer.get()); } -SDL_Rect SDLContext::get_src_rect(const Sprite & sprite) const { - return SDL_Rect{ - .x = sprite.mask.x, - .y = sprite.mask.y, - .w = sprite.mask.w, - .h = sprite.mask.h, - }; -} - SDL_FRect SDLContext::get_dst_rect(const DestinationRectangleData & ctx) const { const Sprite::Data & data = ctx.sprite.data; + float aspect_ratio + = (ctx.sprite.aspect_ratio == 0) ? ctx.texture.get_ratio() : ctx.sprite.aspect_ratio; + vec2 size = data.size; if (data.size.x == 0 && data.size.y != 0) { - size.x = data.size.y * ctx.sprite.aspect_ratio; + size.x = data.size.y * aspect_ratio; } if (data.size.y == 0 && data.size.x != 0) { - size.y = data.size.x / ctx.sprite.aspect_ratio; + size.y = data.size.x / aspect_ratio; } const CameraValues & cam = ctx.cam; @@ -275,15 +255,24 @@ SDL_FRect SDLContext::get_dst_rect(const DestinationRectangleData & ctx) const { } void SDLContext::draw(const RenderContext & ctx) { - const Sprite::Data & data = ctx.sprite.data; SDL_RendererFlip render_flip = (SDL_RendererFlip) ((SDL_FLIP_HORIZONTAL * data.flip.flip_x) | (SDL_FLIP_VERTICAL * data.flip.flip_y)); - SDL_Rect srcrect = this->get_src_rect(ctx.sprite); + SDL_Rect srcrect; + SDL_Rect * srcrect_ptr = NULL; + if (ctx.sprite.mask.w != 0 || ctx.sprite.mask.h != 0) { + srcrect.w = ctx.sprite.mask.w; + srcrect.h = ctx.sprite.mask.h; + srcrect.x = ctx.sprite.mask.x; + srcrect.y = ctx.sprite.mask.y; + srcrect_ptr = &srcrect; + } + SDL_FRect dstrect = this->get_dst_rect(SDLContext::DestinationRectangleData{ .sprite = ctx.sprite, + .texture = ctx.texture, .cam = ctx.cam, .pos = ctx.pos, .img_scale = ctx.scale, @@ -291,9 +280,9 @@ void SDLContext::draw(const RenderContext & ctx) { double angle = ctx.angle + data.angle_offset; - this->set_color_texture(ctx.sprite.texture, ctx.sprite.data.color); - SDL_RenderCopyExF(this->game_renderer.get(), ctx.sprite.texture.texture.get(), &srcrect, - &dstrect, angle, NULL, render_flip); + this->set_color_texture(ctx.texture, ctx.sprite.data.color); + SDL_RenderCopyExF(this->game_renderer.get(), ctx.texture.get_img(), srcrect_ptr, &dstrect, + angle, NULL, render_flip); } SDLContext::CameraValues SDLContext::set_camera(const Camera & cam) { @@ -355,8 +344,6 @@ SDLContext::CameraValues SDLContext::set_camera(const Camera & cam) { return ret_cam; } -uint64_t SDLContext::get_ticks() const { return SDL_GetTicks64(); } - std::unique_ptr> SDLContext::texture_from_path(const std::string & path) { @@ -383,112 +370,71 @@ SDLContext::texture_from_path(const std::string & path) { ivec2 SDLContext::get_size(const Texture & ctx) { ivec2 size; - SDL_QueryTexture(ctx.texture.get(), NULL, NULL, &size.x, &size.y); + SDL_QueryTexture(ctx.get_img(), NULL, NULL, &size.x, &size.y); return size; } -void SDLContext::delay(int ms) const { SDL_Delay(ms); } - std::vector SDLContext::get_events() { std::vector event_list; SDL_Event event; - - // Handle general SDL events while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_QUIT: - event_list.push_back({SDLContext::EventType::SHUTDOWN, {}, {}, {}}); + event_list.push_back(EventData{ + .event_type = SDLContext::EventType::SHUTDOWN, + }); break; case SDL_KEYDOWN: - event_list.push_back( - {SDLContext::EventType::KEYDOWN, - {sdl_to_keycode(event.key.keysym.scancode), event.key.repeat != 0}, - {}, - {}}); + event_list.push_back(EventData{ + .event_type = SDLContext::EventType::KEYDOWN, + .key = sdl_to_keycode(event.key.keysym.scancode), + .key_repeat = (event.key.repeat != 0), + }); break; case SDL_KEYUP: - event_list.push_back({SDLContext::EventType::KEYUP, - {sdl_to_keycode(event.key.keysym.scancode), false}, - {}, - {}}); + event_list.push_back(EventData{ + .event_type = SDLContext::EventType::KEYUP, + .key = sdl_to_keycode(event.key.keysym.scancode), + }); break; case SDL_MOUSEBUTTONDOWN: - event_list.push_back({SDLContext::EventType::MOUSEDOWN, - {}, - {sdl_to_mousebutton(event.button.button), - {event.button.x, event.button.y}}, - {}}); - break; - case SDL_MOUSEBUTTONUP: - event_list.push_back({SDLContext::EventType::MOUSEUP, - {}, - {sdl_to_mousebutton(event.button.button), - {event.button.x, event.button.y}}, - {}}); - break; - case SDL_MOUSEMOTION: - event_list.push_back({SDLContext::EventType::MOUSEMOVE, - {}, - {{}, - {event.motion.x, event.motion.y}, - -1, - INFINITY, - {event.motion.xrel, event.motion.yrel}}, - {}}); + event_list.push_back(EventData{ + .event_type = SDLContext::EventType::MOUSEDOWN, + .mouse_button = sdl_to_mousebutton(event.button.button), + .mouse_position = {event.button.x, event.button.y}, + }); break; - case SDL_MOUSEWHEEL: + case SDL_MOUSEBUTTONUP: { + int x, y; + SDL_GetMouseState(&x, &y); + event_list.push_back(EventData{ + .event_type = SDLContext::EventType::MOUSEUP, + .mouse_button = sdl_to_mousebutton(event.button.button), + .mouse_position = {event.button.x, event.button.y}, + }); + } break; + + case SDL_MOUSEMOTION: { event_list.push_back( - {SDLContext::EventType::MOUSEWHEEL, - {}, - {{}, {}, event.wheel.y < 0 ? -1 : 1, event.wheel.preciseY, {}}, - {}}); - break; - - // Forward window events for further processing - case SDL_WINDOWEVENT: - this->handle_window_event(event.window, event_list); - break; + EventData{.event_type = SDLContext::EventType::MOUSEMOVE, + .mouse_position = {event.motion.x, event.motion.y}, + .rel_mouse_move = {event.motion.xrel, event.motion.yrel}}); + } break; + + case SDL_MOUSEWHEEL: { + event_list.push_back(EventData{ + .event_type = SDLContext::EventType::MOUSEWHEEL, + .mouse_position = {event.motion.x, event.motion.y}, + // TODO: why is this needed? + .scroll_direction = event.wheel.y < 0 ? -1 : 1, + .scroll_delta = event.wheel.preciseY, + }); + } break; } } - return event_list; } - -// Separate function for SDL_WINDOWEVENT subtypes -void SDLContext::handle_window_event(const SDL_WindowEvent & window_event, - std::vector & event_list) { - switch (window_event.event) { - case SDL_WINDOWEVENT_EXPOSED: - event_list.push_back({SDLContext::EventType::WINDOW_EXPOSE, {}, {}, {}}); - break; - case SDL_WINDOWEVENT_RESIZED: - event_list.push_back({SDLContext::EventType::WINDOW_RESIZE, - {}, - {}, - {{}, {window_event.data1, window_event.data2}}}); - break; - case SDL_WINDOWEVENT_MOVED: - event_list.push_back({SDLContext::EventType::WINDOW_MOVE, - {}, - {}, - {{window_event.data1, window_event.data2}, {}}}); - break; - case SDL_WINDOWEVENT_MINIMIZED: - event_list.push_back({SDLContext::EventType::WINDOW_MINIMIZE, {}, {}, {}}); - break; - case SDL_WINDOWEVENT_MAXIMIZED: - event_list.push_back({SDLContext::EventType::WINDOW_MAXIMIZE, {}, {}, {}}); - break; - case SDL_WINDOWEVENT_FOCUS_GAINED: - event_list.push_back({SDLContext::EventType::WINDOW_FOCUS_GAIN, {}, {}, {}}); - break; - case SDL_WINDOWEVENT_FOCUS_LOST: - event_list.push_back({SDLContext::EventType::WINDOW_FOCUS_LOST, {}, {}, {}}); - break; - } -} - void SDLContext::set_color_texture(const Texture & texture, const Color & color) { - SDL_SetTextureColorMod(texture.texture.get(), color.r, color.g, color.b); - SDL_SetTextureAlphaMod(texture.texture.get(), color.a); + SDL_SetTextureColorMod(texture.get_img(), color.r, color.g, color.b); + SDL_SetTextureAlphaMod(texture.get_img(), color.a); } 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 diff --git a/src/example/loadfont.cpp b/src/example/loadfont.cpp index fe5466f..52454a1 100644 --- a/src/example/loadfont.cpp +++ b/src/example/loadfont.cpp @@ -5,17 +5,19 @@ #include #include #include +#include using namespace crepe; - int main() { + 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 = make_unique(asset,mediator) + std::unique_ptr font = std::make_unique(*asset,mediator); }catch (const std::exception& e) { std::cout << "Standard exception thrown: " << e.what() << std::endl; } -- 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/example') 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 fb33482a14915373bdfdaeb7d4856cde31d922ab Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Thu, 12 Dec 2024 21:28:29 +0100 Subject: added small check to the example --- src/example/loadfont.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'src/example') diff --git a/src/example/loadfont.cpp b/src/example/loadfont.cpp index efd5a98..3cbe559 100644 --- a/src/example/loadfont.cpp +++ b/src/example/loadfont.cpp @@ -19,6 +19,15 @@ int main() { 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); + // Get the TTF_Font from the Font object + TTF_Font* ttf_font = font->get_font(); + + // Check if the font is loaded properly + if (ttf_font != nullptr) { + std::cout << "Font successfully loaded!" << std::endl; + } else { + std::cout << "Failed to load font." << std::endl; + } } catch (const std::exception & e) { std::cout << "Standard exception thrown: " << e.what() << std::endl; } -- cgit v1.2.3 From c17233b10bd8e35bead60c5f44bb8a14836d755f Mon Sep 17 00:00:00 2001 From: WBoerenkamps Date: Sat, 14 Dec 2024 13:49:40 +0100 Subject: keyboard state working --- src/crepe/api/Event.h | 2 +- src/crepe/facade/SDLContext.cpp | 13 +++-------- src/crepe/facade/SDLContext.h | 20 ++++++++-------- src/example/button.cpp | 51 ++++++++++++++++++++++------------------- src/test/InputTest.cpp | 1 + 5 files changed, 42 insertions(+), 45 deletions(-) (limited to 'src/example') diff --git a/src/crepe/api/Event.h b/src/crepe/api/Event.h index d353a5b..4e57b45 100644 --- a/src/crepe/api/Event.h +++ b/src/crepe/api/Event.h @@ -3,7 +3,7 @@ #include -#include "KeyCodes.h" +#include "api/KeyCodes.h" #include "types.h" namespace crepe { diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index bb65e3b..e5b0284 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -6,7 +6,6 @@ #include #include #include -#include #include #include #include @@ -82,22 +81,18 @@ Keycode SDLContext::sdl_to_keycode(SDL_Scancode sdl_key) { return LOOKUP_TABLE.at(sdl_key); } -const keyboard_state_t& SDLContext::get_keyboard_state() const{ - return this->keyboard_state; -} - -void SDLContext::update_keyboard_state() { - // Array to hold the key states (true if pressed, false if not) +const keyboard_state_t& SDLContext::get_keyboard_state(){ SDL_PumpEvents(); const Uint8 * current_state = SDL_GetKeyboardState(nullptr); for (int i = 0; i < SDL_NUM_SCANCODES; ++i) { + Keycode key = sdl_to_keycode(static_cast(i)); - if (key != Keycode::NONE) { this->keyboard_state[key] = current_state[i] != 0; } } + return this->keyboard_state; } MouseButton SDLContext::sdl_to_mousebutton(Uint8 sdl_button) { @@ -289,7 +284,6 @@ std::vector SDLContext::get_events() { event_list.push_back({.event_type = EventType::SHUTDOWN}); break; case SDL_KEYDOWN: - this->update_keyboard_state(); event_list.push_back(EventData{ .event_type = EventType::KEY_DOWN, .data = { @@ -302,7 +296,6 @@ std::vector SDLContext::get_events() { break; case SDL_KEYUP: - this->update_keyboard_state(); event_list.push_back(EventData{ .event_type = EventType::KEY_UP, .data = { diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 34a4a09..3531680 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -137,7 +137,16 @@ public: * \return The corresponding `MouseButton` value or `MouseButton::NONE` if the key is unrecognized */ MouseButton sdl_to_mousebutton(Uint8 sdl_button); - const keyboard_state_t& get_keyboard_state() const; + /** + * \brief Gets the current state of the keyboard. + * + * Updates the internal keyboard state by checking the current key states using + * SDL's `SDL_GetKeyboardState()`, and returns a reference to the `keyboard_state_t`. + * + * \return A constant reference to the `keyboard_state_t`, which holds the state + * of each key (true = pressed, false = not pressed). + */ + const keyboard_state_t& get_keyboard_state(); public: /** @@ -235,15 +244,6 @@ private: CameraAuxiliaryData cam_aux_data; private: - /** - * \brief Retrieves the current state of the keyboard. - * - * This method updates the state of all keys on the keyboard. Each element of the unordered map corresponds to a - * specific key defined in the `Keycode` enum, and the value indicates whether - * the key is currently pressed (true) or not pressed (false). - * - */ - void update_keyboard_state(); //! variable to store the state of each key (true = pressed, false = not pressed) keyboard_state_t keyboard_state; //! lookup table for converting SDL_SCANCODES to Keycodes diff --git a/src/example/button.cpp b/src/example/button.cpp index f2e77f6..c4e9a47 100644 --- a/src/example/button.cpp +++ b/src/example/button.cpp @@ -1,17 +1,18 @@ #include #include #include -#include +#include #include #include #include #include -#include +#include #include #include #include #include #include +#include #include #include #include @@ -19,33 +20,35 @@ using namespace crepe; using namespace std; int main(int argc, char * argv[]) { - ComponentManager mgr; - RenderSystem sys{mgr}; - EventManager & event_mgr = EventManager::get_instance(); - InputSystem input_sys{mgr}; - AnimatorSystem asys{mgr}; - GameObject camera_obj = mgr.new_object("", "", vec2{1000, 1000}, 0, 1); - camera_obj.add_component(Color::WHITE, ivec2{1080, 720}, vec2{2000, 2000}, 1.0f); + Mediator mediator; + ComponentManager mgr{mediator}; + RenderSystem sys{mediator}; + EventManager event_mgr{mediator}; + InputSystem input_sys{mediator}; + SDLContext sdl_context{mediator}; + GameObject obj = mgr.new_object("camera", "camera", vec2{0, 0}, 0, 1); + auto & camera = obj.add_component(ivec2{500, 500}, vec2{500, 500}, + Camera::Data{.bg_color = Color::WHITE, .zoom = 1.0f}); - GameObject button_obj = mgr.new_object("body", "person", vec2{0, 0}, 0, 1); - auto s2 = Texture("asset/texture/test_ap43.png"); - bool button_clicked = false; - auto & sprite2 = button_obj.add_component( - s2, Color::GREEN, Sprite::FlipSettings{false, false}, 2, 1, 100); - std::function on_click = [&]() { std::cout << "button clicked" << std::endl; }; - std::function on_enter = [&]() { std::cout << "enter" << std::endl; }; - std::function on_exit = [&]() { std::cout << "exit" << std::endl; }; - auto & button - = button_obj.add_component