From 3d1feb62951f915110ac452e237bd4f483d4e54d Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Tue, 27 May 2025 17:09:36 +0200 Subject: [PATCH] start asset manager --- src/GraphicalUI/AppMenus/AppMenu.cpp | 12 +++ src/GraphicalUI/AppMenus/AppMenu.h | 10 +-- xmake.lua | 8 ++ xmake/bin2c.lua | 106 +++++++++++++++++++++++++++ 4 files changed, 128 insertions(+), 8 deletions(-) create mode 100644 src/GraphicalUI/AppMenus/AppMenu.cpp create mode 100644 xmake/bin2c.lua diff --git a/src/GraphicalUI/AppMenus/AppMenu.cpp b/src/GraphicalUI/AppMenus/AppMenu.cpp new file mode 100644 index 0000000..280a89f --- /dev/null +++ b/src/GraphicalUI/AppMenus/AppMenu.cpp @@ -0,0 +1,12 @@ +#include "AppMenu.h" + +#include "../AssetManager.h" + +AppMenu::AppMenu(std::shared_ptr menuStack, std::shared_ptr settings, std::shared_ptr renderWindow) : menuStack(menuStack), + settings(settings), + renderWindow(renderWindow) +{ + Asset file = getResource(AssetName::data_fonts_pressstart_prstartk_ttf); + + this->pressStartFont = sf::Font(file.data, file.size); +} \ No newline at end of file diff --git a/src/GraphicalUI/AppMenus/AppMenu.h b/src/GraphicalUI/AppMenus/AppMenu.h index 762fd5e..45591d7 100644 --- a/src/GraphicalUI/AppMenus/AppMenu.h +++ b/src/GraphicalUI/AppMenus/AppMenu.h @@ -21,16 +21,10 @@ class AppMenu { bool enterReleased = false; bool escPressed = false; bool escReleased = false; - sf::Font pressStartFont = sf::Font("data/fonts/pressstart/prstartk.ttf"); + sf::Font pressStartFont; public: - AppMenu(std::shared_ptr menuStack, std::shared_ptr settings, std::shared_ptr renderWindow) : - menuStack(menuStack), - settings(settings), - renderWindow(renderWindow) - { - - } + AppMenu(std::shared_ptr menuStack, std::shared_ptr settings, std::shared_ptr renderWindow); virtual void computeFrame() = 0; diff --git a/xmake.lua b/xmake.lua index 493efd2..86bfc1a 100644 --- a/xmake.lua +++ b/xmake.lua @@ -1,5 +1,7 @@ add_rules("mode.debug", "mode.release") +includes("xmake/bin2c.lua") + add_requires("sfml 3.0.0") set_languages("c++20") @@ -13,8 +15,14 @@ target("core") target("graph") set_default(true) + add_rules("bin2c", { + extensions = {".png", ".ttf"}, + outputSource = {"src/GraphicalUI/AssetManager.cpp"}, + outputHeader = {"src/GraphicalUI/AssetManager.h"} + }) set_kind("binary") add_files("./src/GraphicalUI/**.cpp") + add_files("data/fonts/**.ttf", "data/images/**.png") add_deps("core") add_packages("sfml") diff --git a/xmake/bin2c.lua b/xmake/bin2c.lua new file mode 100644 index 0000000..1bd8799 --- /dev/null +++ b/xmake/bin2c.lua @@ -0,0 +1,106 @@ + +buildAsset = function(target, batchcmds, sourcefile_bin, opt) + + +end + + +rule("bin2c") + set_extensions(".bin") + + on_load(function (target) + local headerdir = path.join(target:autogendir(), "rules", "bin2c") + + if not os.isdir(headerdir) then + os.mkdir(headerdir) + end + + target:add("includedirs", headerdir) + end) + + before_buildcmd_files(function (target, batchcmds, sourcebatch, opt) + local outputHeader = table.unpack(target:extraconf("rules", "bin2c", "outputHeader")) + + local outputHeaderEnumContent = "" + + for _, filePath in ipairs(sourcebatch.sourcefiles) do + local escapedName = string.gsub(filePath, "[/|.]", "_") + outputHeaderEnumContent = outputHeaderEnumContent .. "\t" .. escapedName .. ",\n" + end + + local outputHeaderContent = string.format([[ +#pragma once + +#include +#include + +struct Asset { + const unsigned char* data; + std::size_t size; +}; + +enum class AssetName { +%s +}; + +const Asset& getResource(AssetName fileName); + ]], outputHeaderEnumContent) + + local outputSource = table.unpack(target:extraconf("rules", "bin2c", "outputSource")) + + local outputSourceContent = string.format("#include \"%s\"\n", "AssetManager.h") + + local outputSourceArrayVars = "" + + for _, filePath in ipairs(sourcebatch.sourcefiles) do + local escapedName = string.gsub(filePath, "[/|.]", "_") + local varDecl = string.format("static const unsigned char %s[] = {\n\t#include <%s>\n};\n\n", escapedName, filePath .. ".h") + outputSourceContent = outputSourceContent .. varDecl + outputSourceArrayVars = outputSourceArrayVars .. string.format("\t{%s, sizeof(%s)},\n", escapedName, escapedName) + end + + outputSourceContent = outputSourceContent .. string.format([[ +static const Asset assets[] = { +%s +}; + ]], outputSourceArrayVars) + + outputSourceContent = outputSourceContent .. [[ +const Asset& getResource(AssetName fileName) { + return assets[static_cast(fileName)]; +} + ]] + + for _, sourcefile_bin in ipairs(sourcebatch.sourcefiles) do + -- get header file + local headerdir = path.join(target:autogendir(), "rules", "bin2c") + local headerfile = path.join(headerdir, sourcefile_bin .. ".h") + target:add("includedirs", headerdir) + + -- add commands + batchcmds:show_progress(opt.progress, "${color.build.object}generating.bin2c %s", sourcefile_bin) + batchcmds:mkdir(headerdir) + local argv = {"lua", "private.utils.bin2c", "-i", path(sourcefile_bin), "-o", path(headerfile)} + local linewidth = target:extraconf("rules", "bin2c", "linewidth") + if linewidth then + table.insert(argv, "-w") + table.insert(argv, tostring(linewidth)) + end + local nozeroend = target:extraconf("rules", "bin2c", "nozeroend") + if nozeroend then + table.insert(argv, "--nozeroend") + end + batchcmds:vrunv(os.programfile(), argv, {envs = {XMAKE_SKIP_HISTORY = "y"}}) + + -- add deps + batchcmds:add_depfiles(sourcefile_bin) + batchcmds:set_depmtime(os.mtime(headerfile)) + batchcmds:set_depcache(target:dependfile(headerfile)) + + end + + batchcmds:show_progress(opt.progress, "${color.build.object}generating.bin2c %s", outputHeader) + io.writefile(outputHeader, outputHeaderContent) + batchcmds:show_progress(opt.progress, "${color.build.object}generating.bin2c %s", outputSource) + io.writefile(outputSource, outputSourceContent) + end) \ No newline at end of file