diff options
| -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 | 2 | ||||
| -rw-r--r-- | src/crepe/facade/Font.h | 2 | ||||
| -rw-r--r-- | src/crepe/facade/SDLContext.cpp | 58 | ||||
| -rw-r--r-- | src/crepe/facade/SDLContext.h | 21 | ||||
| -rw-r--r-- | src/crepe/system/RenderSystem.cpp | 47 | ||||
| -rw-r--r-- | src/crepe/system/RenderSystem.h | 13 | ||||
| -rw-r--r-- | src/example/rendering_particle.cpp | 30 | 
9 files changed, 117 insertions, 61 deletions
diff --git a/src/crepe/api/Config.h b/src/crepe/api/Config.h index 6b9e3ca..074c113 100644 --- a/src/crepe/api/Config.h +++ b/src/crepe/api/Config.h @@ -46,6 +46,10 @@ struct Config final {  		std::string location = "save.crepe.db";  	} savemgr; +	struct { +		unsigned int size = 16; +	} font; +  	//! physics-related settings  	struct {  		/** diff --git a/src/crepe/api/Text.cpp b/src/crepe/api/Text.cpp index 54a4370..9d57abd 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 771002f..0c670c1 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) {  	const 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)); 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/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp index fffbe34..ea3b71c 100644 --- a/src/crepe/facade/SDLContext.cpp +++ b/src/crepe/facade/SDLContext.cpp @@ -21,6 +21,9 @@  #include "../api/Config.h"  #include "../api/Sprite.h"  #include "../util/Log.h" +#include "api/Text.h" +#include "api/Transform.h" +#include "facade/Font.h"  #include "manager/Mediator.h"  #include "SDLContext.h" @@ -32,9 +35,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 +63,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 +79,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();  } @@ -188,6 +192,52 @@ void SDLContext::draw(const RenderContext & ctx) {  					  angle, NULL, render_flip);  } +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, +		.g = text.data.text_color.g, +		.b = text.data.text_color.b, +		.a = text.data.text_color.a, +	}; +	SDL_Surface * tmp_font_surface +		= TTF_RenderText_Solid(font.get_font(), text.text.c_str(), color); +	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 +					   + (cam_aux_data.zoomed_viewport) / 2) +						  * cam_aux_data.render_scale +					  - size / 2 + cam_aux_data.bar_size; + +	SDL_FRect dstrect{ +		.x = screen_pos.x, +		.y = screen_pos.y, +		.w = size.x, +		.h = size.y, +	}; + +	SDL_RenderCopyExF(this->game_renderer.get(), font_texture.get(), NULL, &dstrect, 0, NULL, +					  SDL_FLIP_NONE); +} +  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 b687f87..1dada74 100644 --- a/src/crepe/facade/SDLContext.h +++ b/src/crepe/facade/SDLContext.h @@ -12,6 +12,7 @@  #include <unordered_map>  #include "../types.h" +#include "EventData.h"  #include "api/Camera.h"  #include "api/Color.h"  #include "api/KeyCodes.h" @@ -24,6 +25,8 @@  namespace crepe {  class Texture; +class Text; +class Font;  class Mediator;  /** @@ -71,12 +74,11 @@ public:  		const double & scale;  	}; -public: -	/** -	 * \brief Gets the singleton instance of SDLContext. -	 * \return Reference to the SDLContext instance. -	 */ -	static SDLContext & get_instance(); +	struct RenderText { +		const Text & text; +		const Font & font; +		const Transform & transform; +	};  public:  	SDLContext(const SDLContext &) = delete; @@ -186,6 +188,13 @@ 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.  	void clear_screen(); diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index 62d42ec..684d798 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,33 @@ 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 (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(); +		ctx.draw_text(SDLContext::RenderText{ +			.text = text, +			.font = font, +			.transform = transform, +		}); +	} +} +  bool RenderSystem::render_particle(const Sprite & sprite, const double & scale) {  	ComponentManager & mgr = this->mediator.component_manager; @@ -126,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 @@ -143,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.emplace(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 56a0553..d5385eb 100644 --- a/src/crepe/system/RenderSystem.h +++ b/src/crepe/system/RenderSystem.h @@ -36,9 +36,13 @@ private:  	//! Updates the active camera used for rendering.  	void update_camera(); -	//! Renders the whole screen +	//! Renders all the sprites and particles  	void render(); +	//! Renders all Text components +	void render_text(); + +private:  	/**  	 * \brief Renders all the particles on the screen from a given sprite.  	 * @@ -51,13 +55,6 @@ 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); -	/**  	 * \brief renders a sprite with a Transform component on the screen  	 *  	 * \param sprite  the sprite component that holds all the data diff --git a/src/example/rendering_particle.cpp b/src/example/rendering_particle.cpp index add43f4..e8b3775 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; @@ -21,11 +23,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); @@ -37,29 +35,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{1280, 720}, 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{400, 400}, vec2{0, 0}, "ComicSansMS", +										Text::Data{.text_color = Color::RED}, "TEST test");  	}  	string get_name() const { return "TestScene"; };  |