diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/crepe/api/Config.h | 4 | ||||
| -rw-r--r-- | src/crepe/api/Text.cpp | 1 | ||||
| -rw-r--r-- | src/crepe/facade/Font.cpp | 3 | ||||
| -rw-r--r-- | src/crepe/facade/Font.h | 2 | ||||
| -rw-r--r-- | src/crepe/facade/FontFacade.cpp | 6 | ||||
| -rw-r--r-- | src/crepe/facade/SDLContext.cpp | 35 | ||||
| -rw-r--r-- | src/crepe/facade/SDLContext.h | 4 | ||||
| -rw-r--r-- | src/crepe/system/RenderSystem.cpp | 19 | ||||
| -rw-r--r-- | src/crepe/system/RenderSystem.h | 2 | ||||
| -rw-r--r-- | src/example/rendering_particle.cpp | 30 | 
10 files changed, 74 insertions, 32 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 58dc6c6..2e248de 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 f202c05..81a9e7a 100644 --- a/src/crepe/facade/Font.cpp +++ b/src/crepe/facade/Font.cpp @@ -2,6 +2,7 @@  #include "../api/Asset.h"  #include "../api/Config.h" +#include <string>  #include "Font.h" @@ -11,6 +12,7 @@ using namespace crepe;  Font::Font(const Asset & src, Mediator & mediator) : Resource(src, mediator) {  	Config & config = Config::get_instance();  	const std::string FONT_PATH = src.get_path(); +  	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)); @@ -19,3 +21,4 @@ Font::Font(const Asset & src, Mediator & mediator) : Resource(src, mediator) {  }  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 b208d96..b08366d 100644 --- a/src/crepe/facade/Font.h +++ b/src/crepe/facade/Font.h @@ -1,10 +1,10 @@  #pragma once  #include <SDL2/SDL_ttf.h> +#include <functional>  #include <memory>  #include "../Resource.h" -#include "../api/Config.h"  namespace crepe { diff --git a/src/crepe/facade/FontFacade.cpp b/src/crepe/facade/FontFacade.cpp index 7edfeb8..cec3507 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" @@ -16,7 +17,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.");  	} @@ -32,8 +33,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 c88687e..a5ccdae 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,30 @@ 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_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 6f6eddb..33a4ff9 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -22,6 +22,8 @@  namespace crepe {  class Texture; +class Text; +class Font;  class Mediator;  /** @@ -185,6 +187,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 a03c636..872ba29 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" @@ -70,9 +72,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.value()); +		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(); diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp index 13e625f..b261f52 100644 --- a/src/example/rendering_particle.cpp +++ b/src/example/rendering_particle.cpp @@ -1,4 +1,7 @@ + +  #include "api/Asset.h" +#include "api/Text.h"  #include <crepe/Component.h>  #include <crepe/api/Animator.h>  #include <crepe/api/Button.h> @@ -13,7 +16,6 @@  #include <crepe/manager/ComponentManager.h>  #include <crepe/manager/Mediator.h>  #include <crepe/types.h> -#include <iostream>  using namespace crepe;  using namespace std; @@ -43,11 +45,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 +57,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<Animator>(test_sprite,ivec2{32, 64}, uvec2{4,1}, Animator::Data{}); -		//anim.set_anim(0); - -		auto & cam = game_object.add_component<Camera>(ivec2{720, 1280}, vec2{400, 400}, +		auto & cam = game_object.add_component<Camera>(ivec2{400, 400}, vec2{400, 400},  													   Camera::Data{  														   .bg_color = Color::WHITE,  													   }); - -		function<void()> on_click = [&]() { cout << "button clicked" << std::endl; }; -		function<void()> on_enter = [&]() { cout << "enter" << std::endl; }; -		function<void()> on_exit = [&]() { cout << "exit" << std::endl; }; - -		auto & button -			= game_object.add_component<Button>(vec2{200, 200}, vec2{0, 0}, on_click, false); -		button.on_mouse_enter = on_enter; -		button.on_mouse_exit = on_exit; -		button.is_toggle = true; -		button.active = true; +		game_object.add_component<Text>(vec2{200, 200}, vec2{0, 0}, "test test", "Ariel.ttf", +										Text::Data{});  	}  	string get_name() const { return "TestScene"; }; |