From 5ccbacd25f62d0ae25059114a116511d2c704063 Mon Sep 17 00:00:00 2001 From: Robear Selwans Date: Mon, 31 May 2021 11:41:02 +0200 Subject: [PATCH] Implemented Asset foundation Signed-off-by: Robear Selwans --- meson.build | 8 ++ meta/evmod.configvars | 1 + meta/evmod.namespaces | 18 +++ meta/evmod.types | 8 ++ module.lua | 6 +- src/loaders/LoaderCommon.h | 16 +++ src/loaders/TextLoader/TextLoader.c | 16 +++ src/loaders/TextLoader/TextLoader.h | 5 + src/mod.c | 128 +++++++++++++++++- subprojects/assetsys.wrap | 10 ++ subprojects/evmod_ecs.wrap | 7 + subprojects/packagefiles/assetsys/assetsys.c | 3 + subprojects/packagefiles/assetsys/meson.build | 16 +++ 13 files changed, 237 insertions(+), 5 deletions(-) create mode 100644 src/loaders/LoaderCommon.h create mode 100644 src/loaders/TextLoader/TextLoader.c create mode 100644 src/loaders/TextLoader/TextLoader.h create mode 100644 subprojects/assetsys.wrap create mode 100644 subprojects/evmod_ecs.wrap create mode 100644 subprojects/packagefiles/assetsys/assetsys.c create mode 100644 subprojects/packagefiles/assetsys/meson.build diff --git a/meson.build b/meson.build index cc49880..79ffad7 100644 --- a/meson.build +++ b/meson.build @@ -7,8 +7,13 @@ dst = meson.current_source_dir() + '/import/' run_command( 'python3', meson.source_root() + '/subprojects/evol/buildscripts/copy.py', src, dst) subdir('import') +subproject('evmod_ecs') + mod_src = [ 'src/mod.c', + + # Loaders + 'src/loaders/TextLoader/TextLoader.c', ] mod_incdir = [ @@ -17,6 +22,9 @@ mod_incdir = [ mod_deps = [ evmod_deps, + + dependency('assetsys'), + dependency('evmod_ecs'), ] module = shared_module( diff --git a/meta/evmod.configvars b/meta/evmod.configvars index e69de29..3723c76 100644 --- a/meta/evmod.configvars +++ b/meta/evmod.configvars @@ -0,0 +1 @@ +EV_CONFIG_VAR(resource_directory, STRING, ".") diff --git a/meta/evmod.namespaces b/meta/evmod.namespaces index e69de29..4954a64 100644 --- a/meta/evmod.namespaces +++ b/meta/evmod.namespaces @@ -0,0 +1,18 @@ +EV_NS_DEF_BEGIN(Asset) +EV_NS_DEF_FN(AssetHandle, load, (CONST_STR, path)) +EV_NS_DEF_FN(AssetHandle, cloneHandle, (AssetHandle, handle)) +EV_NS_DEF_FN(void, free, (AssetHandle, handle)) +EV_NS_DEF_END(Asset) + + +EV_NS_DEF_BEGIN(AssetManager) +EV_NS_DEF_FN(void, mount, (CONST_STR, path), (CONST_STR, as)) +EV_NS_DEF_END(AssetManager) + +/* #include LOADERS_NAMESPACES_H */ + +EV_NS_DEF_BEGIN(TextLoader) + +EV_NS_DEF_FN(TextAsset, loadAsset, (AssetHandle, handle)) + +EV_NS_DEF_END(TextLoader) diff --git a/meta/evmod.types b/meta/evmod.types index e69de29..0029b5e 100644 --- a/meta/evmod.types +++ b/meta/evmod.types @@ -0,0 +1,8 @@ +TYPE(AssetHandle, GenericHandle) + +/* #include LOADERS_TYPES_H */ + +TYPE(TextAsset, struct { + CONST_STR text; + U64 length; +}) diff --git a/module.lua b/module.lua index 1f714bd..8bd64c8 100644 --- a/module.lua +++ b/module.lua @@ -1,6 +1,6 @@ { - name = "Template", + name = "asset-manager", version = "0.1", - categories = {"Category1", "Category2"}, - dependencies = {"Dependency1", "Dependency2"} + categories = {"assetmanager"}, + dependencies = {"ecs"} } diff --git a/src/loaders/LoaderCommon.h b/src/loaders/LoaderCommon.h new file mode 100644 index 0000000..58ff209 --- /dev/null +++ b/src/loaders/LoaderCommon.h @@ -0,0 +1,16 @@ +#pragma once + +#include + +typedef struct { + PTR data; + I64 size; + + U32 ref_count; + U32 ticks_left; +} Asset; + + +const Asset * +ev_asset_getfromhandle( + AssetHandle handle); diff --git a/src/loaders/TextLoader/TextLoader.c b/src/loaders/TextLoader/TextLoader.c new file mode 100644 index 0000000..ff06c3c --- /dev/null +++ b/src/loaders/TextLoader/TextLoader.c @@ -0,0 +1,16 @@ +#define TYPE_MODULE evmod_assets +#include + +#include "../LoaderCommon.h" +#include "TextLoader.h" + +TextAsset +ev_textloader_loadasset( + AssetHandle handle) +{ + const Asset *asset = ev_asset_getfromhandle(handle); + return (TextAsset) { + .text = asset->data, + .length = asset->size + }; +} diff --git a/src/loaders/TextLoader/TextLoader.h b/src/loaders/TextLoader/TextLoader.h new file mode 100644 index 0000000..8220d6d --- /dev/null +++ b/src/loaders/TextLoader/TextLoader.h @@ -0,0 +1,5 @@ +#pragma once + +TextAsset +ev_textloader_loadasset( + AssetHandle handle); diff --git a/src/mod.c b/src/mod.c index 51eab12..d3de965 100644 --- a/src/mod.c +++ b/src/mod.c @@ -1,14 +1,138 @@ #define EV_MODULE_DEFINE #include +#include +#include -EV_CONSTRUCTOR +#define IMPORT_MODULE evmod_ecs +#include + +#include "loaders/LoaderCommon.h" +#include "loaders/TextLoader/TextLoader.h" + +#define AssetSysCheck(...) do { \ + assetsys_error_t res = __VA_ARGS__; \ + if(res != ASSETSYS_SUCCESS) { \ + ev_log_error("`%s` failed. Error Message: %s", EV_STRINGIZE(__VA_ARGS__), assetsys_error_strings[res]); \ + } \ +} while (0) + +struct { + assetsys_t *sys; + + evolmodule_t ecs_mod; + ECSAssetWorldHandle world; + AssetComponentID assetcomponent_id; + +} AssetManagerData = {NULL}; + +void +onRemoveAssetComponent( + ECSQuery query) { + Asset *asset = ECS->getQueryColumn(query, sizeof(Asset), 1); + aligned_free(asset->data); } -EV_DESTRUCTOR +EV_CONSTRUCTOR { + static_assert(sizeof(AssetEntityID) == sizeof(AssetHandle), "AssetEntityID not the same size of AssetHandle"); + + AssetManagerData.sys = assetsys_create( 0 ); + + AssetManagerData.ecs_mod = evol_loadmodule("ecs"); + if(AssetManagerData.ecs_mod) { + imports(AssetManagerData.ecs_mod, (ECS, AssetECS)); + if(AssetECS) { + AssetManagerData.world = AssetECS->newWorld(); + + AssetManagerData.assetcomponent_id = AssetECS->registerComponent("Asset", sizeof(Asset), EV_ALIGNOF(Asset)); + AssetECS->setOnRemoveTrigger("AssetComponentOnRemove", "Asset", onRemoveAssetComponent); + } + } + + return AssetManagerData.sys == NULL; +} + +EV_DESTRUCTOR +{ + assetsys_destroy(AssetManagerData.sys); + + if(AssetManagerData.world) { + AssetECS->destroyWorld(AssetManagerData.world); + } + if(AssetManagerData.ecs_mod) { + evol_unloadmodule(AssetManagerData.ecs_mod); + } + return 0; +} + +AssetHandle +ev_asset_load( + CONST_STR path) +{ + assetsys_file_t file; + AssetSysCheck(assetsys_file(AssetManagerData.sys, path, &file)); + Asset a; + a.size = (I64)assetsys_file_size(AssetManagerData.sys, file); + a.data = aligned_malloc(a.size + 1, 16); + int loaded_size = 0; + AssetSysCheck(assetsys_file_load(AssetManagerData.sys, file, &loaded_size, a.data, a.size)); + a.size = (I64) loaded_size; + ((char*)a.data)[a.size] = '\0'; + + a.ref_count = 1; + + AssetEntityID entt = AssetECS->createEntity(AssetManagerData.world); + AssetECS->setComponent(AssetManagerData.world, entt, AssetManagerData.assetcomponent_id, &a); + + return (AssetHandle)entt; +} + +AssetHandle +ev_asset_clonehandle( + AssetHandle handle) +{ + Asset *asset = AssetECS->getComponent(AssetManagerData.world, handle, AssetManagerData.assetcomponent_id); + asset->ref_count++; + + return handle; +} + +void +ev_asset_free( + AssetHandle handle) +{ + Asset *asset = AssetECS->getComponent(AssetManagerData.world, handle, AssetManagerData.assetcomponent_id); + asset->ref_count--; + if(asset->ref_count == 0) { + AssetECS->destroyEntity(AssetManagerData.world, handle); + } +} + +void +ev_assetmanager_mount( + CONST_STR path, + CONST_STR as) +{ + AssetSysCheck(assetsys_mount(AssetManagerData.sys, path, as)); +} + +const Asset * +ev_asset_getfromhandle( + AssetHandle handle) +{ + return AssetECS->getComponent(AssetManagerData.world, handle, AssetManagerData.assetcomponent_id); } EV_BINDINGS { + EV_NS_BIND_FN(AssetManager, mount, ev_assetmanager_mount); + + EV_NS_BIND_FN(Asset, load, ev_asset_load); + EV_NS_BIND_FN(Asset, cloneHandle, ev_asset_clonehandle); + EV_NS_BIND_FN(Asset, free, ev_asset_free); + + EV_NS_BIND_FN(TextLoader, loadAsset, ev_textloader_loadasset); + + return 0; } diff --git a/subprojects/assetsys.wrap b/subprojects/assetsys.wrap new file mode 100644 index 0000000..943767c --- /dev/null +++ b/subprojects/assetsys.wrap @@ -0,0 +1,10 @@ +[wrap-git] +directory = assetsys +url = https://github.com/evol3d/libs +revision = main +depth = 1 + +patch_directory = assetsys + +[provide] +dependency_names = assetsys diff --git a/subprojects/evmod_ecs.wrap b/subprojects/evmod_ecs.wrap new file mode 100644 index 0000000..3a7d7ba --- /dev/null +++ b/subprojects/evmod_ecs.wrap @@ -0,0 +1,7 @@ +[wrap-git] +directory = evmod_ecs +url = https://github.com/evol3D/evol-mod-flecs.git +revision = master + +[provide] +dependency_names = evmod_ecs diff --git a/subprojects/packagefiles/assetsys/assetsys.c b/subprojects/packagefiles/assetsys/assetsys.c new file mode 100644 index 0000000..04dd82f --- /dev/null +++ b/subprojects/packagefiles/assetsys/assetsys.c @@ -0,0 +1,3 @@ +#define ASSETSYS_IMPLEMENTATION +#define STRPOOL_IMPLEMENTATION +#include diff --git a/subprojects/packagefiles/assetsys/meson.build b/subprojects/packagefiles/assetsys/meson.build new file mode 100644 index 0000000..92f1f23 --- /dev/null +++ b/subprojects/packagefiles/assetsys/meson.build @@ -0,0 +1,16 @@ +project('assetsys', 'c', + default_options: [ + 'default_library=static', + ], +) + +assetsys_include = include_directories('.') + +# All other targets should follow the same template +assetsys_src = files('assetsys.c') +assetsys_lib = library('assetsys', assetsys_src, include_directories: assetsys_include) +assetsys_dep = declare_dependency(link_with: assetsys_lib, include_directories: assetsys_include) + +if meson.version().version_compare('>= 0.54.0') + meson.override_dependency('assetsys', assetsys_dep) +endif