From 68be6b67f79413cb4af0ca15262ca1547a7d0d41 Mon Sep 17 00:00:00 2001 From: heavydemon21 Date: Tue, 17 Dec 2024 14:16:47 +0100 Subject: finalized text rendering --- src/crepe/facade/SDLContext.cpp | 22 ++++++++++++++++------ src/crepe/facade/SDLContext.h | 5 +++++ src/crepe/system/RenderSystem.cpp | 26 +++++--------------------- src/crepe/system/RenderSystem.h | 8 ++------ 4 files changed, 28 insertions(+), 33 deletions(-) (limited to 'src') diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index 41c6d21..c3c1b59 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -292,6 +292,8 @@ void SDLContext::draw_text(const RenderText & data) { const Text & text = data.text; const Font & font = data.font; const Transform & transform = data.transform; + std::unique_ptr> font_surface; + std::unique_ptr> font_texture; SDL_Color color{ .r = text.data.text_color.r, @@ -299,11 +301,20 @@ void SDLContext::draw_text(const RenderText & data) { .b = text.data.text_color.b, .a = text.data.text_color.a, }; - SDL_Surface * font_surface + SDL_Surface * tmp_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); + if (!tmp_font_surface) { + throw runtime_error(format("draw_text: font surface error: {}", SDL_GetError())); + } + font_surface = {tmp_font_surface, [](SDL_Surface * surface) { SDL_FreeSurface(surface); }}; + + SDL_Texture * tmp_font_texture + = SDL_CreateTextureFromSurface(this->game_renderer.get(), font_surface.get()); + if (!tmp_font_texture) { + throw runtime_error(format("draw_text: font texture error: {}", SDL_GetError())); + } + font_texture + = {tmp_font_texture, [](SDL_Texture * texture) { SDL_DestroyTexture(texture); }}; vec2 size = text.dimensions * cam_aux_data.render_scale; vec2 screen_pos = (transform.position + text.offset - cam_aux_data.cam_pos @@ -318,9 +329,8 @@ void SDLContext::draw_text(const RenderText & data) { .h = size.y, }; - SDL_RenderCopyExF(this->game_renderer.get(), font_texture, NULL, &dstrect, 0, NULL, + SDL_RenderCopyExF(this->game_renderer.get(), font_texture.get(), NULL, &dstrect, 0, NULL, SDL_FLIP_NONE); - SDL_DestroyTexture(font_texture); } void SDLContext::update_camera_view(const Camera & cam, const vec2 & new_pos) { diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h index 066a881..aeace07 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -193,6 +193,11 @@ public: */ void draw(const RenderContext & ctx); + /** + * \brief draws a text to the screen + * + * \param data Reference to the rendering data needed to draw + */ void draw_text(const RenderText & data); //! Clears the screen, preparing for a new frame. diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index 2641435..42e4236 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -83,8 +83,11 @@ void RenderSystem::render_text() { RefVector texts = mgr.get_components_by_type(); - for (const Text & text : texts) { + for (Text & text : texts) { if (!text.active) continue; + if (!text.font.has_value()) text.font = ctx.get_font_from_name(text.font_family); + if (!text.font.has_value()) continue; + const Font & font = resource_manager.get(text.font.value()); const auto & transform = mgr.get_components_by_id(text.game_object_id).front().get(); @@ -149,11 +152,7 @@ void RenderSystem::render() { ResourceManager & resource_manager = this->mediator.resource_manager; RefVector sorted_sprites = this->sort(sprites); RefVector text_components = mgr.get_components_by_type(); - for (Text & text : text_components) { - const Transform & transform - = mgr.get_components_by_id(text.game_object_id).front().get(); - this->render_text(text, transform); - } + for (const Sprite & sprite : sorted_sprites) { if (!sprite.active) continue; const Transform & transform @@ -166,18 +165,3 @@ void RenderSystem::render() { this->render_normal(sprite, transform); } } -void RenderSystem::render_text(Text & text, const Transform & tm) { - SDLContext & ctx = this->mediator.sdl_context; - - if (!text.font.has_value()) { - text.font = ctx.get_font_from_name(text.font_family); - } - - ResourceManager & resource_manager = this->mediator.resource_manager; - - if (!text.font.has_value()) { - return; - } - const Asset & font_asset = text.font.value(); - const Font & res = resource_manager.get(font_asset); -} diff --git a/src/crepe/system/RenderSystem.h b/src/crepe/system/RenderSystem.h index 3aa846e..5fe24d7 100644 --- a/src/crepe/system/RenderSystem.h +++ b/src/crepe/system/RenderSystem.h @@ -27,7 +27,6 @@ public: void update() override; private: - void render_text(); //! Clears the screen in preparation for rendering. void clear_screen(); @@ -39,7 +38,7 @@ private: //! Renders the whole screen void render(); - + /** * \brief Renders all the particles on the screen from a given sprite. * @@ -53,11 +52,8 @@ private: bool render_particle(const Sprite & sprite, const double & scale); /** * \brief Renders all Text components - * - * \param text The text component to be rendered. - * \param tm the Transform component that holds the position,rotation and scale */ - void render_text(Text & text, const Transform & tm); + void render_text(); /** * \brief renders a sprite with a Transform component on the screen * -- cgit v1.2.3