From b99f5fc0f52fdd4ec96be844e643060503a8860b Mon Sep 17 00:00:00 2001
From: WBoerenkamps <wrj.boerenkamps@student.avans.nl>
Date: Tue, 17 Dec 2024 13:22:34 +0100
Subject: text now working with optional

---
 src/crepe/api/Asset.h             |  2 +-
 src/crepe/api/LoopManager.h       |  7 ++++---
 src/crepe/api/Script.h            |  5 +++--
 src/crepe/api/Text.cpp            |  8 +++++---
 src/crepe/api/Text.h              | 15 +++++++++++----
 src/crepe/facade/Font.cpp         |  3 +--
 src/crepe/facade/Font.h           | 10 +---------
 src/crepe/facade/FontFacade.cpp   | 11 ++++++++---
 src/crepe/facade/FontFacade.h     | 12 +++++++++---
 src/crepe/facade/SDLContext.cpp   |  5 +++++
 src/crepe/facade/SDLContext.h     | 15 +++++++++++++++
 src/crepe/system/RenderSystem.cpp | 28 +++++++++++++++++++++++++---
 src/crepe/system/RenderSystem.h   | 10 ++++++++--
 13 files changed, 96 insertions(+), 35 deletions(-)

(limited to 'src/crepe')

diff --git a/src/crepe/api/Asset.h b/src/crepe/api/Asset.h
index bfd0ac7..b367a92 100644
--- a/src/crepe/api/Asset.h
+++ b/src/crepe/api/Asset.h
@@ -37,7 +37,7 @@ public:
 
 private:
 	//! path to asset
-	const std::string src;
+	std::string src;
 
 private:
 	/**
diff --git a/src/crepe/api/LoopManager.h b/src/crepe/api/LoopManager.h
index 40e6b38..1725810 100644
--- a/src/crepe/api/LoopManager.h
+++ b/src/crepe/api/LoopManager.h
@@ -71,7 +71,9 @@ private:
 private:
 	//! Global context
 	Mediator mediator;
-
+	
+	//! SDLContext instance
+	SDLContext sdl_context{mediator};
 	//! Component manager instance
 	ComponentManager component_manager{mediator};
 	//! Scene manager instance
@@ -84,8 +86,7 @@ private:
 	ResourceManager resource_manager{mediator};
 	//! Save manager instance
 	SaveManager save_manager{mediator};
-	//! SDLContext instance
-	SDLContext sdl_context{mediator};
+	
 
 private:
 	/**
diff --git a/src/crepe/api/Script.h b/src/crepe/api/Script.h
index a24e32e..4503525 100644
--- a/src/crepe/api/Script.h
+++ b/src/crepe/api/Script.h
@@ -156,7 +156,7 @@ private:
 	void subscribe_internal(const EventHandler<EventType> & callback, event_channel_t channel);
 
 protected:
-	OptionalRef<Mediator> mediator;
+	
 	// NOTE: This must be the only constructor on Script, see "Late references" below
 	Script() = default;
 	//! Only \c BehaviorScript instantiates Script
@@ -186,12 +186,13 @@ private:
 	 *
 	 * \{
 	 */
+
 	//! Game object ID of game object parent BehaviorScript is attached to
 	game_object_id_t game_object_id;
 	//! Reference to parent component
 	OptionalRef<bool> active;
 	//! Mediator reference
-
+	OptionalRef<Mediator> mediator;
 	//! \}
 
 private:
diff --git a/src/crepe/api/Text.cpp b/src/crepe/api/Text.cpp
index 5b2befe..0624c98 100644
--- a/src/crepe/api/Text.cpp
+++ b/src/crepe/api/Text.cpp
@@ -4,9 +4,11 @@
 
 using namespace crepe;
 
-Text::Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset,
-		   const std::string & text, const std::string & font_family, const Data & data)
+Text::Text(game_object_id_t id, const vec2 & dimensions,const vec2 & offset, const std::string & font_family,
+	const Data & data, const std::string & text, std::optional<Asset> font)
 	: UIObject(id, dimensions, offset),
 	  text(text),
 	  data(data),
-	  font(FontFacade::get_font_asset(font_family)) {}
+	  font_family(font_family),
+	  font(font) {
+}
diff --git a/src/crepe/api/Text.h b/src/crepe/api/Text.h
index ec0bf74..ab72bc0 100644
--- a/src/crepe/api/Text.h
+++ b/src/crepe/api/Text.h
@@ -1,6 +1,7 @@
 #pragma once
 
 #include <string>
+#include <optional> 
 
 #include "../Component.h"
 
@@ -47,15 +48,21 @@ public:
 	 * \param text The text to be displayed.
 	 * \param font_family The font style name to be displayed.
 	 * \param data Data struct containing extra text parameters.
+	 * \param font Optional font asset that can be passed or left empty.
 	 */
-	Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset,
-		 const std::string & text, const std::string & font_family, const Data & data);
+	Text(game_object_id_t id, const vec2 & dimensions, const vec2 & offset, 
+     const std::string & font_family, const Data & data, 
+     const std::string & text = "", std::optional<Asset> font = std::nullopt);
+	
 	//! Label text.
 	std::string text = "";
-	//! Font asset variable
-	const Asset font;
+	//! font family name
+	std::string font_family = "";
+	//! Font asset variable if this is not set, it will use the font_family to create an asset.
+	std::optional<Asset> font;
 	//! Data instance
 	Data data;
+	
 };
 
 } // namespace crepe
diff --git a/src/crepe/facade/Font.cpp b/src/crepe/facade/Font.cpp
index 5af943d..558641f 100644
--- a/src/crepe/facade/Font.cpp
+++ b/src/crepe/facade/Font.cpp
@@ -9,8 +9,7 @@ using namespace std;
 using namespace crepe;
 
 Font::Font(const Asset & src, Mediator & mediator)
-	: Resource(src, mediator),
-	  font(nullptr, TTF_CloseFont) {
+	: 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);
diff --git a/src/crepe/facade/Font.h b/src/crepe/facade/Font.h
index 16f8cb6..b208d96 100644
--- a/src/crepe/facade/Font.h
+++ b/src/crepe/facade/Font.h
@@ -24,14 +24,6 @@ public:
      * \param mediator The Mediator object used for managing the SDL context or related systems.
      */
 	Font(const Asset & src, Mediator & mediator);
-    	Font(const Font &) = delete;
-    	Font &operator=(const Font &) = delete;
-
-   	// Default move constructor and move assignment operator
-    	Font(Font &&) noexcept = delete;
-    	Font &operator=(Font &&) noexcept = delete;
-
-    ~Font() = default;
 	/**
      * \brief Gets the underlying TTF_Font resource.
      * 
@@ -44,7 +36,7 @@ public:
 
 private:
 	//! The SDL_ttf font object with custom deleter.
-	std::unique_ptr<TTF_Font, std::function<void(TTF_Font *)>> font;
+	std::unique_ptr<TTF_Font, std::function<void(TTF_Font *)>> font = nullptr;
 };
 
 } // namespace crepe
diff --git a/src/crepe/facade/FontFacade.cpp b/src/crepe/facade/FontFacade.cpp
index d447b6d..0a8ba5f 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"
@@ -6,10 +7,16 @@
 using namespace crepe;
 using namespace std;
 
-Asset FontFacade::get_font_asset(const string& font_family) {
+FontFacade::FontFacade(){
 	if (!FcInit()) {
 		throw runtime_error("Failed to initialize Fontconfig.");
 	}
+}
+FontFacade::~FontFacade(){
+	FcFini();
+}
+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) {
@@ -32,7 +39,6 @@ Asset FontFacade::get_font_asset(const string& font_family) {
 		FcPatternDestroy(matched_pattern);
 		throw runtime_error("No matching font found.");
 	}
-
 	// Extract the file path
 	FcChar8 * file_path = nullptr;
 	if (FcPatternGetString(matched_pattern, FC_FILE, 0, &file_path) != FcResultMatch
@@ -44,6 +50,5 @@ Asset FontFacade::get_font_asset(const string& font_family) {
 	// Convert the file path to a string
 	string font_file_path = reinterpret_cast<const char *>(file_path);
 	FcPatternDestroy(matched_pattern);
-	FcFini();
 	return Asset(font_file_path);
 }
diff --git a/src/crepe/facade/FontFacade.h b/src/crepe/facade/FontFacade.h
index fc200d6..2e08f3f 100644
--- a/src/crepe/facade/FontFacade.h
+++ b/src/crepe/facade/FontFacade.h
@@ -13,16 +13,22 @@ namespace crepe {
  */
 class FontFacade {
 public:
+	FontFacade();
+	~FontFacade();
+    FontFacade(const FontFacade & other) = delete;
+    FontFacade & operator=(const FontFacade & other) = delete;
+    FontFacade(FontFacade && other) noexcept = delete;
+    FontFacade & operator=(FontFacade && other) noexcept = delete;
 	/**
 	 * 
 	 * \brief Facade function to convert a font_family into an asset.
 	 * 
 	 * This function uses the FontConfig library to convert a font family name (Arial, Inter, Helvetica) and converts it to the font source path.
-	 * This function is static so the member function can be used without create a FontFacade object. This way it can be used in a constructor as FontFacade::get_font_asset().
+	 * This function returns a default font path if the font_family name doesnt exist or cant be found
 	 * \param font_family Name of the font family name.
-	 * \return Asset with filepath to the font.
+	 * \return Asset with filepath to the corresponding font.
 	 */
-	static Asset get_font_asset(const std::string& font_family);
+	Asset get_font_asset(const std::string& font_family);
 };
 
 } // namespace crepe
diff --git a/src/crepe/facade/SDLContext.cpp b/src/crepe/facade/SDLContext.cpp
index d1d109c..8ffaad9 100644
--- a/src/crepe/facade/SDLContext.cpp
+++ b/src/crepe/facade/SDLContext.cpp
@@ -434,7 +434,12 @@ std::vector<SDLContext::EventData> SDLContext::get_events() {
 	}
 	return event_list;
 }
+
 void SDLContext::set_color_texture(const Texture & texture, const Color & color) {
 	SDL_SetTextureColorMod(texture.get_img(), color.r, color.g, color.b);
 	SDL_SetTextureAlphaMod(texture.get_img(), color.a);
 }
+
+Asset SDLContext::get_font_from_name(const std::string& font_family){
+	return this->font_facade.get_font_asset(font_family);
+}
diff --git a/src/crepe/facade/SDLContext.h b/src/crepe/facade/SDLContext.h
index efdd6fe..ffa3cc0 100644
--- a/src/crepe/facade/SDLContext.h
+++ b/src/crepe/facade/SDLContext.h
@@ -17,6 +17,7 @@
 #include "api/Transform.h"
 #include "types.h"
 
+#include "FontFacade.h"
 namespace crepe {
 
 class Texture;
@@ -239,6 +240,20 @@ private:
 	 * - this is defined in this class because get_events() needs this information aswell
 	 */
 	CameraAuxiliaryData cam_aux_data;
+private: 
+	//! instance of the font_facade
+	FontFacade font_facade{};
+public:
+	/**
+	 * \brief Function to Get asset from font_family
+	 * 
+	 * This function uses the FontFacade function to convert a font_family to an asset.
+	 * 
+	 * \param font_family name of the font style that needs to be used (will return an asset with default font path of the font_family doesnt exist)
+	 * 
+	 * \return asset with the font style absolute path
+	 */
+	Asset get_font_from_name(const std::string& font_family);
 };
 
 } // namespace crepe
diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp
index 5aa00b5..18f6393 100644
--- a/src/crepe/system/RenderSystem.cpp
+++ b/src/crepe/system/RenderSystem.cpp
@@ -2,6 +2,7 @@
 #include <cassert>
 #include <cmath>
 #include <functional>
+#include <optional>
 #include <stdexcept>
 #include <vector>
 
@@ -22,6 +23,7 @@
 using namespace crepe;
 using namespace std;
 
+
 void RenderSystem::clear_screen() {
 	SDLContext & ctx = this->mediator.sdl_context;
 	ctx.clear_screen();
@@ -124,9 +126,11 @@ void RenderSystem::render() {
 	RefVector<Sprite> sprites = mgr.get_components_by_type<Sprite>();
 	ResourceManager & resource_manager = this->mediator.resource_manager;
 	RefVector<Sprite> sorted_sprites = this->sort(sprites);
-	RefVector<Text> texts =  mgr.get_components_by_type<Text>();
-	for(const Text& text : texts){
-		const Font & res = resource_manager.get<Font>(text.font);
+	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) {
@@ -143,4 +147,22 @@ void RenderSystem::render() {
 	
 		
 	}
+	
 }
+void RenderSystem::render_text(Text & text, const Transform & tm) {
+    SDLContext & ctx = this->mediator.sdl_context;
+
+    // Check if font is available in text
+    if (!text.font.has_value()) {
+    }
+
+    ResourceManager & resource_manager = this->mediator.resource_manager;
+
+    if (text.font.has_value()) {
+        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 fc7b46e..56a0553 100644
--- a/src/crepe/system/RenderSystem.h
+++ b/src/crepe/system/RenderSystem.h
@@ -10,7 +10,7 @@ namespace crepe {
 class Camera;
 class Sprite;
 class Transform;
-
+class Text;
 /**
  * \brief Manages rendering operations for all game objects.
  *
@@ -50,7 +50,13 @@ private:
 	 * \return true if particles have been rendered
 	 */
 	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
 	 *
-- 
cgit v1.2.3