diff --git a/src/Application/Application.cpp b/src/Application/Application.cpp index 39ec86c92..e16fc78c5 100644 --- a/src/Application/Application.cpp +++ b/src/Application/Application.cpp @@ -44,7 +44,7 @@ Application::Application(const WindowSettings& window_settings) // Initializers this->InitWindow(window_settings); this->InitImGuiRenderer(); - this->InitImGuiFonts(); + Enigma::ResourceManager::initialize(); // must be after imgui context is created so to build ImFont this->InitHardwareInfo(window_settings); // Init loading scene @@ -97,74 +97,6 @@ void Application::InitHardwareInfo(const WindowSettings& window_settings) { m_cpu_info = std::make_unique(); } - -void Application::InitImGuiFonts() { - ENIGMA_TRACE_CURRENT_FUNCTION(); - - ENIGMA_TRACE("Loading Fonts..."); - - const auto& io = ImGui::GetIO(); - - const fs::path font_audiowide_path = Constants::Resources::Fonts::AUDIOWIDE_FONT_PATH; - const fs::path font_montserrat_path = Constants::Resources::Fonts::MONTSERRAT_FONT_PATH; - const fs::path font_ubuntu_path = Constants::Resources::Fonts::UBUNTU_FONT_PATH; - ENIGMA_ASSERT_OR_THROW(fs::exists(font_audiowide_path), "Font " + font_audiowide_path.string() + " not found"); - ENIGMA_ASSERT_OR_THROW(fs::exists(font_montserrat_path), "Font " + font_montserrat_path.string() + " not found"); - ENIGMA_ASSERT_OR_THROW(fs::exists(font_ubuntu_path), "Font " + font_ubuntu_path.string() + " not found"); - -#ifdef ENIGMA_DEBUG - ENIGMA_LOG("Font Audiowide-Regular path: {}", font_audiowide_path.string()); - ENIGMA_LOG("Font Montserrat-Medium path: {}", font_montserrat_path.string()); - ENIGMA_LOG("Font Ubuntu-Regular path: {}", font_ubuntu_path.string()); -#endif - - //using namespace std::string_literals; - //for(auto font_audiowide_size : std::initializer_list{ 20, 30, 45, 60 }) - // m_fonts["Audiowide-Regular-"sv + std::to_string(font_audiowide_size)] = io.Fonts->AddFontFromFileTTF(font_audiowide_path.string().c_str(), static_cast(font_audiowide_size)); - //for (auto font_montserrat_size : std::initializer_list{ 12, 14, 16, 18, 20, 45 }) - // m_fonts["Montserrat-Medium-"sv + std::to_string(font_montserrat_size)] = io.Fonts->AddFontFromFileTTF(font_montserrat_path.string().c_str(), static_cast(font_montserrat_size)); - - ImFontConfig fontConfig = ImFontConfig(); - //fontConfig.FontDataOwnedByAtlas = true; - - m_fonts["Audiowide-Regular-60"] = io.Fonts->AddFontFromFileTTF(font_audiowide_path.string().c_str(), 60.0f, &fontConfig); - m_fonts["Audiowide-Regular-45"] = io.Fonts->AddFontFromFileTTF(font_audiowide_path.string().c_str(), 45.0f, &fontConfig); - m_fonts["Audiowide-Regular-30"] = io.Fonts->AddFontFromFileTTF(font_audiowide_path.string().c_str(), 30.0f, &fontConfig); - m_fonts["Audiowide-Regular-20"] = io.Fonts->AddFontFromFileTTF(font_audiowide_path.string().c_str(), 20.0f, &fontConfig); - - m_fonts["Ubuntu-Regular-60"] = io.Fonts->AddFontFromFileTTF(font_ubuntu_path.string().c_str(), 60.0f, &fontConfig); - m_fonts["Ubuntu-Regular-45"] = io.Fonts->AddFontFromFileTTF(font_ubuntu_path.string().c_str(), 45.0f, &fontConfig); - m_fonts["Ubuntu-Regular-30"] = io.Fonts->AddFontFromFileTTF(font_ubuntu_path.string().c_str(), 30.0f, &fontConfig); - m_fonts["Ubuntu-Regular-20"] = io.Fonts->AddFontFromFileTTF(font_ubuntu_path.string().c_str(), 20.0f, &fontConfig); - m_fonts["Ubuntu-Regular-18"] = io.Fonts->AddFontFromFileTTF(font_ubuntu_path.string().c_str(), 18.0f, &fontConfig); - - m_fonts["Montserrat-Medium-45"] = io.Fonts->AddFontFromFileTTF(font_montserrat_path.string().c_str(), 45.0f, &fontConfig); - m_fonts["Montserrat-Medium-20"] = io.Fonts->AddFontFromFileTTF(font_montserrat_path.string().c_str(), 20.0f, &fontConfig); - m_fonts["Montserrat-Medium-18"] = io.Fonts->AddFontFromFileTTF(font_montserrat_path.string().c_str(), 18.0f, &fontConfig); - m_fonts["Montserrat-Medium-16"] = io.Fonts->AddFontFromFileTTF(font_montserrat_path.string().c_str(), 16.0f, &fontConfig); - m_fonts["Montserrat-Medium-14"] = io.Fonts->AddFontFromFileTTF(font_montserrat_path.string().c_str(), 14.0f, &fontConfig); - m_fonts["Montserrat-Medium-12"] = io.Fonts->AddFontFromFileTTF(font_montserrat_path.string().c_str(), 12.0f, &fontConfig); - - // Build added fonts atlas --> imgui issue #3643 - io.Fonts->Build(); - - // Check if fonts are loaded - for (const auto& [font_name, font]: m_fonts) { - if (font->IsLoaded()) { - ENIGMA_TRACE("Font {} Loaded", font->ConfigData->Name); - } else { - const std::string err_msg = "Failed to load font " + std::string(font_name); - // console alert - ENIGMA_ERROR(err_msg); - // ui alert - (void) DialogUtils::Error("Resource Loading Error", err_msg); - // no further app without dear fonts :c - this->EndApplication(); - break; - } - } -} - void Application::PushScene(std::unique_ptr scene) { ENIGMA_ASSERT(scene, "Scene is nullptr"); @@ -444,8 +376,7 @@ Application::~Application() { m_loading_scene->OnDestroy(); // Don't forget the loading scene m_scenes.clear(); - m_fonts.clear(); - ImGui::GetIO().Fonts->Clear(); + Enigma::ResourceManager::shutdown(); } NS_ENIGMA_END diff --git a/src/Application/Application.hpp b/src/Application/Application.hpp index 084efaaea..50c96fcc2 100644 --- a/src/Application/Application.hpp +++ b/src/Application/Application.hpp @@ -91,9 +91,6 @@ class Application final : public SingleProcessInstance { /** Returns Realtime CPU usage informations (if enabled in WindowSettings.ini, otherwise nullptr) */ constexpr const std::unique_ptr& GetCPUInfo() const noexcept { return m_cpu_info; } - /** Returns Loaded Fonts map */ - constexpr const std::unordered_map& GetFonts() const noexcept { return m_fonts; } - private: // Updates /** Updates delta time */ void UpdateDeltaTime() noexcept; @@ -135,9 +132,6 @@ class Application final : public SingleProcessInstance { private: std::unique_ptr m_imgui_renderer; /**< ImGui renderer wrapper */ - private: - std::unordered_map m_fonts; /**< Loaded fonts */ - private: inline static Application *m_instance{nullptr}; /**< Application singleton */ diff --git a/src/Core/Constants.hpp b/src/Core/Constants.hpp index 60ea15186..9e3579839 100644 --- a/src/Core/Constants.hpp +++ b/src/Core/Constants.hpp @@ -1,6 +1,6 @@ #pragma once #include "Types.hpp" -#include +#include #include namespace Enigma { @@ -41,7 +41,7 @@ namespace Enigma { } namespace Config { - static const fs::path WINDOW_CONFIG_FILE_PATH = ::Enigma::ResourceUtils::GetResourcesDir() / "config" / "WindowSettings.ini"; + static const fs::path WINDOW_CONFIG_FILE_PATH = ::Enigma::ResourceManager::getResourcesDir() / "config" / "WindowSettings.ini"; } namespace ENV // Environment Variable @@ -50,11 +50,11 @@ namespace Enigma { } namespace Logger { - static const fs::path LOG_FILE_PATH = ::Enigma::ResourceUtils::GetResourcesDir() / "logs" / "Enigma.log"; + static const fs::path LOG_FILE_PATH = ::Enigma::ResourceManager::getResourcesDir() / "logs" / "Enigma.log"; } namespace Database { - static const fs::path DATABASE_FILE_PATH = ::Enigma::ResourceUtils::GetResourcesDir() / "database" / "Enigma.db"; + static const fs::path DATABASE_FILE_PATH = ::Enigma::ResourceManager::getResourcesDir() / "database" / "Enigma.db"; // Unfortunately, u cant create multiple tables at once.. static constexpr const std::array CREATE_TABLES_SQL = { R"( @@ -112,13 +112,13 @@ namespace Enigma { namespace Resources { namespace Textures { // window runtime icon - static const fs::path ENIGMA_LOGO_PNG_PATH = ::Enigma::ResourceUtils::GetResourcesDir() / "branding" / "Logo.png"; + static const fs::path ENIGMA_LOGO_PNG_PATH = ::Enigma::ResourceManager::getResourcesDir() / "branding" / "Logo.png"; } namespace Fonts { - static const fs::path AUDIOWIDE_FONT_PATH = ::Enigma::ResourceUtils::GetResourcesDir() / "fonts" / "Audiowide-Regular.ttf"; - static const fs::path MONTSERRAT_FONT_PATH = ::Enigma::ResourceUtils::GetResourcesDir() / "fonts" / "Montserrat-Medium.ttf"; - static const fs::path UBUNTU_FONT_PATH = ::Enigma::ResourceUtils::GetResourcesDir() / "fonts" / "Ubuntu-Regular.ttf"; + static const fs::path AUDIOWIDE_FONT_PATH = ::Enigma::ResourceManager::getResourcesDir() / "fonts" / "Audiowide-Regular.ttf"; + static const fs::path MONTSERRAT_FONT_PATH = ::Enigma::ResourceManager::getResourcesDir() / "fonts" / "Montserrat-Medium.ttf"; + static const fs::path UBUNTU_FONT_PATH = ::Enigma::ResourceManager::getResourcesDir() / "fonts" / "Ubuntu-Regular.ttf"; } } diff --git a/src/Database/Database.cpp b/src/Database/Database.cpp index 960b4538b..ec631286a 100644 --- a/src/Database/Database.cpp +++ b/src/Database/Database.cpp @@ -1,14 +1,14 @@ #include #include "Database.hpp" #include -#include +#include NS_ENIGMA_BEGIN void Database::initialize() { ENIGMA_TRACE_CURRENT_FUNCTION(); { - const fs::path resDir = ::Enigma::ResourceUtils::GetResourcesDir(); + const fs::path resDir = ::Enigma::ResourceManager::getResourcesDir(); if (!fs::is_directory(resDir)) { ENIGMA_CRITICAL("Couldn't find resources directory at {}", resDir.string()); std::exit(EXIT_FAILURE); @@ -24,7 +24,7 @@ void Database::initialize() { try { //Create db dir if not exists - const fs::path dbDir = ::Enigma::ResourceUtils::GetResourcesDir() / "database"; + const fs::path dbDir = ::Enigma::ResourceManager::getResourcesDir() / "database"; if (!fs::is_directory(dbDir)) { ENIGMA_INFO("Creating Database Directory {} ...", dbDir.string()); if (!fs::create_directory(dbDir)) { diff --git a/src/Enigma.hpp b/src/Enigma.hpp index 45c09995c..085f98540 100644 --- a/src/Enigma.hpp +++ b/src/Enigma.hpp @@ -89,4 +89,9 @@ #include // +// ResourceManager +#include +// + + #endif // !ENIGMA_H diff --git a/src/GUI/ImGuiWidgets.hpp b/src/GUI/ImGuiWidgets.hpp index c9a0dd7d9..47bcddfcc 100644 --- a/src/GUI/ImGuiWidgets.hpp +++ b/src/GUI/ImGuiWidgets.hpp @@ -3,6 +3,7 @@ #define ENIGMA_IMGUI_WIDGETS_H #include +#include #include #include #include @@ -259,8 +260,7 @@ class ImGuiWidgets final { static constexpr auto popup_id = "loadingDialog"; const auto& [win_w, win_h] = Application::getInstance()->GetWindow()->GetSize(); - static const auto& fonts = Application::getInstance()->GetFonts(); - static ImFont *const& font_audiowide_regular_20 = fonts.at("Audiowide-Regular-20"); + static ImFont* const& font_ubuntu_regular_20 = ResourceManager::getFont("Ubuntu-Regular-20"); ImGui::OpenPopup(popup_id, ImGuiPopupFlags_AnyPopup); static constexpr const auto popup_window_flags = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoBackground; @@ -271,7 +271,7 @@ class ImGuiWidgets final { static const std::uint32_t COLOR = ImGui::GetColorU32(spinner_color); // 0xrrggbbaa ImGui::SetCursorPos(spinner_position); ImGuiWidgets::LoadingSpinner("##spinner", spinner_radius, spinner_thickness, COLOR); - ImGui::PushFont(font_audiowide_regular_20); // text font + ImGui::PushFont(font_ubuntu_regular_20); // text font const auto text_size = ImGui::CalcTextSize(text); ImGui::SetCursorPosX((win_w - text_size.x) / 2.0f); ImGui::TextWrapped("%s",text); diff --git a/src/Main.cpp b/src/Main.cpp index 9bfb5d769..51f1a85ad 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -1,7 +1,7 @@ #include #include -static void SignalHandler(const int sig); +static void SignalHandler(int sig); int main(int argc, char *argv[]) { if (argc > 1 && (!std::strcmp(argv[1], "--version") || !std::strcmp(argv[1], "-v"))) { @@ -20,16 +20,14 @@ int main(int argc, char *argv[]) { std::signal(SIGBREAK, SignalHandler); // On Windows, a click on console window close button will raise SIGBREAK #endif - using namespace Enigma; - - Logger::initialize(); - Database::initialize(); + Enigma::Logger::initialize(); + Enigma::Database::initialize(); std::int32_t exit_code = -1; try { - const Config windowConfig(Enigma::Constants::Config::WINDOW_CONFIG_FILE_PATH); - const WindowSettings windowSettings(windowConfig); - Application app(windowSettings); + const Enigma::Config windowConfig(Enigma::Constants::Config::WINDOW_CONFIG_FILE_PATH); + const Enigma::WindowSettings windowSettings(windowConfig); + Enigma::Application app(windowSettings); app.Run(); exit_code = EXIT_SUCCESS; } catch (const std::exception& e) { @@ -37,8 +35,8 @@ int main(int argc, char *argv[]) { exit_code = EXIT_FAILURE; } - Database::shutdown(); - Logger::shutdown(); + Enigma::Database::shutdown(); + Enigma::Logger::shutdown(); return exit_code; } @@ -46,7 +44,7 @@ int main(int argc, char *argv[]) { /** * Handles exit signals to release program resources gracefully */ -static void SignalHandler(const int sig) { +static void SignalHandler(int sig) { const auto stringify_signal = [sig]() noexcept -> const char * { #define RET_STR(s, desc) \