aboutsummaryrefslogtreecommitdiff
path: root/src/crepe
diff options
context:
space:
mode:
Diffstat (limited to 'src/crepe')
-rw-r--r--src/crepe/api/Config.h4
-rw-r--r--src/crepe/api/Text.cpp1
-rw-r--r--src/crepe/facade/Font.cpp12
-rw-r--r--src/crepe/facade/Font.h5
-rw-r--r--src/crepe/facade/FontFacade.cpp6
-rw-r--r--src/crepe/facade/SDLContext.cpp37
-rw-r--r--src/crepe/facade/SDLContext.h4
-rw-r--r--src/crepe/system/RenderSystem.cpp19
-rw-r--r--src/crepe/system/RenderSystem.h2
9 files changed, 80 insertions, 10 deletions
diff --git a/src/crepe/api/Config.h b/src/crepe/api/Config.h
index 47a81b7..b86faff 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
*
@@ -85,7 +85,7 @@ struct Config final {
* This config option is the font size at which all fonts will be loaded initially.
*
*/
- unsigned int size = 16;
+ unsigned int size = 32;
} font;
//! Audio system settings
diff --git a/src/crepe/api/Text.cpp b/src/crepe/api/Text.cpp
index 0624c98..1620247 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"
diff --git a/src/crepe/facade/Font.cpp b/src/crepe/facade/Font.cpp
index 558641f..51e9690 100644
--- a/src/crepe/facade/Font.cpp
+++ b/src/crepe/facade/Font.cpp
@@ -2,6 +2,9 @@
#include "../api/Asset.h"
#include "../api/Config.h"
+#include "util/Log.h"
+#include <iostream>
+#include <string>
#include "Font.h"
@@ -12,6 +15,11 @@ Font::Font(const Asset & src, Mediator & mediator)
: Resource(src, mediator){
Config & config = Config::get_instance();
const std::string FONT_PATH = src.get_path();
+
+ this->path = FONT_PATH;
+
+ cout << this->path << endl;
+ /*
TTF_Font * loaded_font = TTF_OpenFont(FONT_PATH.c_str(), config.font.size);
if (loaded_font == NULL) {
throw runtime_error(format("Font: {} (path: {})", TTF_GetError(), FONT_PATH));
@@ -20,3 +28,7 @@ Font::Font(const Asset & src, Mediator & mediator)
}
TTF_Font * Font::get_font() const { return this->font.get(); }
+
+const string & Font::get_path() const noexcept{
+ return this->path;
+}
diff --git a/src/crepe/facade/Font.h b/src/crepe/facade/Font.h
index b208d96..3eff3c6 100644
--- a/src/crepe/facade/Font.h
+++ b/src/crepe/facade/Font.h
@@ -1,10 +1,11 @@
#pragma once
#include <SDL2/SDL_ttf.h>
+#include <functional>
#include <memory>
+#include <string>
#include "../Resource.h"
-#include "../api/Config.h"
namespace crepe {
@@ -34,6 +35,8 @@ public:
*/
TTF_Font * get_font() const;
+ const std::string & get_path() const noexcept;
+
private:
//! The SDL_ttf font object with custom deleter.
std::unique_ptr<TTF_Font, std::function<void(TTF_Font *)>> font = nullptr;
diff --git a/src/crepe/facade/FontFacade.cpp b/src/crepe/facade/FontFacade.cpp
index 08ff31c..9919032 100644
--- a/src/crepe/facade/FontFacade.cpp
+++ b/src/crepe/facade/FontFacade.cpp
@@ -1,4 +1,5 @@
#include <fontconfig/fontconfig.h>
+#include <iostream>
#include <stdexcept>
#include "FontFacade.h"
@@ -18,7 +19,7 @@ Asset FontFacade::get_font_asset(const string& font_family) {
// Create a pattern to search for the font family
FcPattern * pattern = FcNameParse(reinterpret_cast<const FcChar8 *>(font_family.c_str()));
- if (pattern == NULL) {
+ if (!pattern) {
throw runtime_error("Failed to create font pattern.");
}
@@ -34,8 +35,7 @@ Asset FontFacade::get_font_asset(const string& font_family) {
FcPattern * matched_pattern = FcFontMatch(config, pattern, &result);
FcPatternDestroy(pattern);
- if (matched_pattern == NULL) {
- FcPatternDestroy(matched_pattern);
+ if (!matched_pattern) {
throw runtime_error("No matching font found.");
}
// Extract the file path
diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp
index 8ffaad9..7bd9dbc 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"
@@ -32,9 +34,6 @@ using namespace std;
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()));
}
@@ -63,6 +62,10 @@ SDLContext::SDLContext(Mediator & mediator) {
throw runtime_error("SDLContext: SDL_image could not initialize!");
}
+ if (TTF_Init() == -1) {
+ throw runtime_error(format("SDL_ttf initialization failed: {}", TTF_GetError()));
+ }
+
mediator.sdl_context = *this;
}
@@ -75,8 +78,8 @@ SDLContext::~SDLContext() {
// TODO: how are we going to ensure that these are called from the same
// thread that SDL_Init() was called on? This has caused problems for me
// before.
- IMG_Quit();
TTF_Quit();
+ IMG_Quit();
SDL_Quit();
}
@@ -283,6 +286,32 @@ 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,
+ };
+ TTF_Font * ttf_font = TTF_OpenFont(font.get_path().c_str(), Config::get_instance().font.size);
+ SDL_Surface * font_surface = TTF_RenderText_Solid(font.get_font(), text.text.c_str(), color);
+ TTF_CloseFont(ttf_font);
+ SDL_Texture * font_texture = SDL_CreateTextureFromSurface(this->game_renderer.get(), font_surface);
+ SDL_FreeSurface(font_surface);
+
+ SDL_Rect dstrect {
+ .x = (int)text.offset.x,
+ .y = (int)text.offset.y,
+ .w = (int)text.dimensions.x,
+ .h = (int)text.dimensions.y,
+ };
+
+ SDL_RenderCopy(this->game_renderer.get(), font_texture, NULL, NULL);
+ SDL_RenderCopyExF(this->game_renderer.get(), font_texture, NULL, NULL, 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 ffa3cc0..fcf3559 100644
--- a/src/crepe/facade/SDLContext.h
+++ b/src/crepe/facade/SDLContext.h
@@ -21,6 +21,8 @@
namespace crepe {
class Texture;
+class Text;
+class Font;
class Mediator;
/**
@@ -184,6 +186,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 18f6393..7d6a31b 100644
--- a/src/crepe/system/RenderSystem.cpp
+++ b/src/crepe/system/RenderSystem.cpp
@@ -16,6 +16,8 @@
#include "../facade/Texture.h"
#include "../manager/ComponentManager.h"
#include "../manager/ResourceManager.h"
+#include "api/Text.h"
+#include "facade/Font.h"
#include "RenderSystem.h"
#include "types.h"
@@ -71,9 +73,26 @@ RefVector<Sprite> RenderSystem::sort(RefVector<Sprite> & 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<Text> texts = mgr.get_components_by_type<Text>();
+
+ for (const Text & text : texts) {
+ if (!text.active) continue;
+ const Font & res = resource_manager.get<Font>(text.font);
+ ctx.draw_text(text, res);
+ }
+
+}
+
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 56a0553..3476765 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();