aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorheavydemon21 <nielsstunnebrink1@gmail.com>2024-12-17 14:16:47 +0100
committerheavydemon21 <nielsstunnebrink1@gmail.com>2024-12-17 14:16:47 +0100
commit68be6b67f79413cb4af0ca15262ca1547a7d0d41 (patch)
tree5bc75deae3bf94d4002428c459f36783f0d74d32 /src
parentdff8c63a5af46fd3b0115e10efe9f0b67e9111b8 (diff)
finalized text rendering
Diffstat (limited to 'src')
-rw-r--r--src/crepe/facade/SDLContext.cpp22
-rw-r--r--src/crepe/facade/SDLContext.h5
-rw-r--r--src/crepe/system/RenderSystem.cpp26
-rw-r--r--src/crepe/system/RenderSystem.h8
4 files changed, 28 insertions, 33 deletions
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<SDL_Surface, std::function<void(SDL_Surface *)>> font_surface;
+ std::unique_ptr<SDL_Texture, std::function<void(SDL_Texture *)>> 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<Text> texts = mgr.get_components_by_type<Text>();
- 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<Font>(text.font.value());
const auto & transform
= mgr.get_components_by_id<Transform>(text.game_object_id).front().get();
@@ -149,11 +152,7 @@ void RenderSystem::render() {
ResourceManager & resource_manager = this->mediator.resource_manager;
RefVector<Sprite> sorted_sprites = this->sort(sprites);
RefVector<Text> text_components = mgr.get_components_by_type<Text>();
- for (Text & text : text_components) {
- const Transform & transform
- = mgr.get_components_by_id<Transform>(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>(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
*