From 9589b4d39f3214da382a5de2bd6e387b363170ce Mon Sep 17 00:00:00 2001 From: ohyzha Date: Fri, 2 Aug 2024 23:08:24 +0300 Subject: [PATCH] refactor code and support utf8 strings rendering --- examples/ExampleApps/TextExampleApp.cpp | 21 ++++++++------ .../Host/Linux/ResourceLoaderAppDirLinux.cpp | 10 +++++-- .../Host/Linux/ResourceLoaderAppDirLinux.hpp | 3 +- openVulkanoCpp/Host/ResourceLoader.cpp | 28 +++++++++++++++++-- openVulkanoCpp/Host/ResourceLoader.hpp | 4 ++- openVulkanoCpp/Host/WebResourceLoader.cpp | 3 +- openVulkanoCpp/Host/WebResourceLoader.hpp | 2 +- .../Windows/ResourceLoaderAppDirWindows.cpp | 10 +++++-- .../Windows/ResourceLoaderAppDirWindows.hpp | 3 +- openVulkanoCpp/Scene/FontAtlasGenerator.cpp | 13 ++++----- openVulkanoCpp/Scene/FontAtlasGenerator.hpp | 3 +- 11 files changed, 70 insertions(+), 30 deletions(-) diff --git a/examples/ExampleApps/TextExampleApp.cpp b/examples/ExampleApps/TextExampleApp.cpp index 88f25f7..82ac220 100644 --- a/examples/ExampleApps/TextExampleApp.cpp +++ b/examples/ExampleApps/TextExampleApp.cpp @@ -8,7 +8,7 @@ #include "Scene/Scene.hpp" #include "Scene/Shader/Shader.hpp" #include "Scene/Geometry.hpp" -#include "Scene/Text.hpp" +#include "Scene/TextDrawable.hpp" #include "Scene/GeometryFactory.hpp" #include "Scene/Material.hpp" #include "Scene/Vertex.hpp" @@ -55,13 +55,13 @@ namespace OpenVulkano static std::vector> texts; texts.push_back(std::make_pair("ABab?.^{}_cdFGETG123)(", TextConfig())); texts.push_back(std::make_pair("Hello, World!", TextConfig())); + texts.push_back(std::make_pair("\u0410\u0411\u0412\u041F", TextConfig())); texts[0].second.applyBorder = true; texts[1].second.backgroundColor.a = 1; const int N = texts.size(); - std::string fontPath; auto& resourceLoader = ResourceLoader::GetInstance(); - resourceLoader.GetResource("Roboto-Regular.ttf", fontPath); + const std::string fontPath = resourceLoader.GetResourcePath("Roboto-Regular.ttf"); const std::string atlasPath = (fs::path(fontPath).parent_path() / "roboto-regular-atlas.png").string(); m_nodesPool.resize(N); @@ -81,11 +81,17 @@ namespace OpenVulkano m_shader.alphaBlend = true; m_shader.cullMode = CullMode::NONE; - m_atlasGenerator.GenerateAtlas(fontPath, atlasPath); + Charset charset = Charset::ASCII; + for (unicode_t c = 0x0410; c <= 0x041F; c++) + { + // some unicode values + charset.add(c); + } + m_atlasGenerator.GenerateAtlas(fontPath, atlasPath, charset); for (int i = 0; i < texts.size(); i++) { - Text* t = new Text(); + TextDrawable* t = new TextDrawable(); t->SetFontAtlasGenerator(&m_atlasGenerator); t->SetConfig(texts[i].second); t->SetUniformBuffer(&m_uniBuffers[i]); @@ -93,15 +99,14 @@ namespace OpenVulkano t->GenerateText(texts[i].first); m_drawablesPool[i] = t; m_nodesPool[i].Init(); - m_nodesPool[i].SetMatrix( - Math::Utils::translate(glm::mat4x4(1.f), Vector3f(-3 + std::rand() % 3, -2 + std::rand() % 4, 2))); + m_nodesPool[i].SetMatrix(Math::Utils::translate(glm::mat4x4(1.f), Vector3f(-5, 2 - i * 2, 0))); m_nodesPool[i].AddDrawable(m_drawablesPool[i]); m_scene.GetRoot()->AddChild(&m_nodesPool[i]); } GetGraphicsAppManager()->GetRenderer()->SetScene(&m_scene); m_camController.Init(&m_cam); m_camController.SetDefaultKeybindings(); - m_camController.SetPosition({ 0, 0, 5 }); + m_camController.SetPosition({ 0, 0, 10 }); m_camController.SetBoostFactor(5); std::shared_ptr m_perfInfo = diff --git a/openVulkanoCpp/Host/Linux/ResourceLoaderAppDirLinux.cpp b/openVulkanoCpp/Host/Linux/ResourceLoaderAppDirLinux.cpp index e0ac8f3..3d36b73 100644 --- a/openVulkanoCpp/Host/Linux/ResourceLoaderAppDirLinux.cpp +++ b/openVulkanoCpp/Host/Linux/ResourceLoaderAppDirLinux.cpp @@ -40,9 +40,13 @@ namespace OpenVulkano } } - Array ResourceLoaderAppDirLinux::GetResource(const std::string& resourceName, std::string& resourcePath) + std::string ResourceLoaderAppDirLinux::GetResourcePath(const std::string& resourceName) { - resourcePath = GetAppDir() + resourceName; - return Utils::ReadFile(resourcePath, true); + return GetAppDir() + resourceName; + } + + Array ResourceLoaderAppDirLinux::GetResource(const std::string& resourceName) + { + return Utils::ReadFile(resourceName, true); } } \ No newline at end of file diff --git a/openVulkanoCpp/Host/Linux/ResourceLoaderAppDirLinux.hpp b/openVulkanoCpp/Host/Linux/ResourceLoaderAppDirLinux.hpp index b827e99..93df363 100644 --- a/openVulkanoCpp/Host/Linux/ResourceLoaderAppDirLinux.hpp +++ b/openVulkanoCpp/Host/Linux/ResourceLoaderAppDirLinux.hpp @@ -13,6 +13,7 @@ namespace OpenVulkano class ResourceLoaderAppDirLinux final : public ResourceLoader { public: - Array GetResource(const std::string& resourceName, std::string& resourcePath) override; + std::string GetResourcePath(const std::string& resourceName) override; + Array GetResource(const std::string& resourceName) override; }; } \ No newline at end of file diff --git a/openVulkanoCpp/Host/ResourceLoader.cpp b/openVulkanoCpp/Host/ResourceLoader.cpp index 508a1d1..3dec56b 100644 --- a/openVulkanoCpp/Host/ResourceLoader.cpp +++ b/openVulkanoCpp/Host/ResourceLoader.cpp @@ -15,13 +15,13 @@ namespace OpenVulkano std::vector> m_loaders; public: - Array GetResource(const std::string& resourceName, std::string& resourcePath) override + Array GetResource(const std::string& resourceName) override { for(auto& loader : m_loaders) { try { - auto res = loader->GetResource(resourceName, resourcePath); + auto res = loader->GetResource(resourceName); if (!res.Empty()) return res; } catch (const std::exception& e) @@ -54,6 +54,30 @@ namespace OpenVulkano } return false; } + + std::string GetResourcePath(const std::string& resourceName) override + { + try + { + for (auto& loader: m_loaders) + { + auto res = loader->GetResourcePath(resourceName); + if (!res.empty()) + { + return res; + } + } + } + catch (const std::exception& e) + { + Logger::FILESYS->error("Error trying to get resource path for '{}'! Error: {}", resourceName, e.what()); + } + catch (...) + { + Logger::FILESYS->error("Unknown error trying to get resource path for '{}'!", resourceName); + } + return ""; + } }; ResourceLoader& ResourceLoader::GetInstance() diff --git a/openVulkanoCpp/Host/ResourceLoader.hpp b/openVulkanoCpp/Host/ResourceLoader.hpp index fe13dbf..54cc0f7 100644 --- a/openVulkanoCpp/Host/ResourceLoader.hpp +++ b/openVulkanoCpp/Host/ResourceLoader.hpp @@ -15,7 +15,9 @@ namespace OpenVulkano public: virtual ~ResourceLoader() = default; - virtual Array GetResource(const std::string& resourceName, std::string& resourcePath) = 0; + virtual Array GetResource(const std::string& resourceName) = 0; + + virtual std::string GetResourcePath(const std::string& resourceName) { return ""; } static ResourceLoader& GetInstance(); diff --git a/openVulkanoCpp/Host/WebResourceLoader.cpp b/openVulkanoCpp/Host/WebResourceLoader.cpp index bfb0ff2..419f87e 100644 --- a/openVulkanoCpp/Host/WebResourceLoader.cpp +++ b/openVulkanoCpp/Host/WebResourceLoader.cpp @@ -90,12 +90,11 @@ namespace OpenVulkano return Array(buffer); } - Array WebResourceLoader::GetResource(const std::string& resourceName, std::string& resourcePath) + Array WebResourceLoader::GetResource(const std::string& resourceName) { if (IsUrl(resourceName)) { std::filesystem::path cacheFilePath = GetCacheFilePath(resourceName); - resourcePath = resourceName; if (std::filesystem::exists(cacheFilePath)) { return Utils::ReadFile(cacheFilePath.string()); } else { return DownloadResource(resourceName); } } diff --git a/openVulkanoCpp/Host/WebResourceLoader.hpp b/openVulkanoCpp/Host/WebResourceLoader.hpp index 7b8208b..5159e85 100644 --- a/openVulkanoCpp/Host/WebResourceLoader.hpp +++ b/openVulkanoCpp/Host/WebResourceLoader.hpp @@ -24,6 +24,6 @@ namespace OpenVulkano WebResourceLoader(); ~WebResourceLoader(); - Array GetResource(const std::string& resourceName, std::string& resourcePath) override; + Array GetResource(const std::string& resourceName) override; }; } \ No newline at end of file diff --git a/openVulkanoCpp/Host/Windows/ResourceLoaderAppDirWindows.cpp b/openVulkanoCpp/Host/Windows/ResourceLoaderAppDirWindows.cpp index 6a0b588..65190d0 100644 --- a/openVulkanoCpp/Host/Windows/ResourceLoaderAppDirWindows.cpp +++ b/openVulkanoCpp/Host/Windows/ResourceLoaderAppDirWindows.cpp @@ -38,9 +38,13 @@ namespace OpenVulkano } } - Array ResourceLoaderAppDirWindows::GetResource(const std::string& resourceName, std::string& resourcePath) + std::string ResourceLoaderAppDirWindows::GetResourcePath(const std::string& resourceName) { - resourcePath = GetAppDir() + resourceName; - return Utils::ReadFile(resourcePath); + return GetAppDir() + resourceName; + } + + Array ResourceLoaderAppDirWindows::GetResource(const std::string& resourceName) + { + return Utils::ReadFile(resourceName); } } \ No newline at end of file diff --git a/openVulkanoCpp/Host/Windows/ResourceLoaderAppDirWindows.hpp b/openVulkanoCpp/Host/Windows/ResourceLoaderAppDirWindows.hpp index 22ea019..6e5a916 100644 --- a/openVulkanoCpp/Host/Windows/ResourceLoaderAppDirWindows.hpp +++ b/openVulkanoCpp/Host/Windows/ResourceLoaderAppDirWindows.hpp @@ -13,6 +13,7 @@ namespace OpenVulkano class ResourceLoaderAppDirWindows final : public ResourceLoader { public: - Array GetResource(const std::string& resourceName, std::string& resourcePath) override; + std::string GetResourcePath(const std::string& resourceName) override; + Array GetResource(const std::string& resourceName) override; }; } \ No newline at end of file diff --git a/openVulkanoCpp/Scene/FontAtlasGenerator.cpp b/openVulkanoCpp/Scene/FontAtlasGenerator.cpp index 89e565a..eb6d662 100644 --- a/openVulkanoCpp/Scene/FontAtlasGenerator.cpp +++ b/openVulkanoCpp/Scene/FontAtlasGenerator.cpp @@ -59,18 +59,17 @@ namespace OpenVulkano::Scene m_generator.generate(glyphsGeometry.data(), glyphsGeometry.size()); int idx = 0; - BitmapConstRef storage = m_generator.atlasStorage(); + const BitmapConstRef& storage = m_generator.atlasStorage(); + m_atlasTex.resolution = Math::Vector3ui(storage.width, storage.height, 1); + m_atlasTex.textureBuffer = (msdfgen::byte*) storage.pixels; + m_atlasTex.format = OpenVulkano::DataFormat::R8_UNORM; + m_atlasTex.size = storage.width * storage.height * 1; // 1 channel for (const auto& glyph: glyphsGeometry) { - unicode_t c = static_cast(glyph.getCodepoint()); GlyphInfo info; - info.texture.resolution = Math::Vector3ui(storage.width, storage.height, 1); - info.texture.textureBuffer = (msdfgen::byte*)storage.pixels; - info.texture.format = OpenVulkano::DataFormat::R8_UNORM; - info.texture.size = storage.width * storage.height * 1; // 1 channel info.geometry = glyph; info.glyphBox = m_generator.getLayout()[idx++]; - m_symbols[c] = std::move(info); + m_symbols[glyph.getCodepoint()] = std::move(info); } savePng(m_generator.atlasStorage(), outputFile.c_str()); destroyFont(font); diff --git a/openVulkanoCpp/Scene/FontAtlasGenerator.hpp b/openVulkanoCpp/Scene/FontAtlasGenerator.hpp index 29969f6..6c14640 100644 --- a/openVulkanoCpp/Scene/FontAtlasGenerator.hpp +++ b/openVulkanoCpp/Scene/FontAtlasGenerator.hpp @@ -23,18 +23,19 @@ namespace OpenVulkano::Scene { GlyphGeometry geometry; GlyphBox glyphBox; - Texture texture; }; class FontAtlasGenerator { public: void GenerateAtlas(const std::string& fontFile, const std::string& outputFile, const Charset& = Charset::ASCII); + const Texture& GetAtlas() const { return m_atlasTex; } std::map& GetAtlasInfo() { return m_symbols; } private: std::pair GetHandlers(const std::string& fontFile); private: ImmediateAtlasGenerator> m_generator; + Texture m_atlasTex; std::map m_symbols; std::string m_loadedFont; };