Implemented Asset foundation
Signed-off-by: Robear Selwans <robear.selwans@outlook.com>
This commit is contained in:
@@ -7,8 +7,13 @@ dst = meson.current_source_dir() + '/import/'
|
|||||||
run_command( 'python3', meson.source_root() + '/subprojects/evol/buildscripts/copy.py', src, dst)
|
run_command( 'python3', meson.source_root() + '/subprojects/evol/buildscripts/copy.py', src, dst)
|
||||||
subdir('import')
|
subdir('import')
|
||||||
|
|
||||||
|
subproject('evmod_ecs')
|
||||||
|
|
||||||
mod_src = [
|
mod_src = [
|
||||||
'src/mod.c',
|
'src/mod.c',
|
||||||
|
|
||||||
|
# Loaders
|
||||||
|
'src/loaders/TextLoader/TextLoader.c',
|
||||||
]
|
]
|
||||||
|
|
||||||
mod_incdir = [
|
mod_incdir = [
|
||||||
@@ -17,6 +22,9 @@ mod_incdir = [
|
|||||||
|
|
||||||
mod_deps = [
|
mod_deps = [
|
||||||
evmod_deps,
|
evmod_deps,
|
||||||
|
|
||||||
|
dependency('assetsys'),
|
||||||
|
dependency('evmod_ecs'),
|
||||||
]
|
]
|
||||||
|
|
||||||
module = shared_module(
|
module = shared_module(
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
EV_CONFIG_VAR(resource_directory, STRING, ".")
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
TYPE(AssetHandle, GenericHandle)
|
||||||
|
|
||||||
|
/* #include LOADERS_TYPES_H */
|
||||||
|
|
||||||
|
TYPE(TextAsset, struct {
|
||||||
|
CONST_STR text;
|
||||||
|
U64 length;
|
||||||
|
})
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
name = "Template",
|
name = "asset-manager",
|
||||||
version = "0.1",
|
version = "0.1",
|
||||||
categories = {"Category1", "Category2"},
|
categories = {"assetmanager"},
|
||||||
dependencies = {"Dependency1", "Dependency2"}
|
dependencies = {"ecs"}
|
||||||
}
|
}
|
||||||
|
|||||||
16
src/loaders/LoaderCommon.h
Normal file
16
src/loaders/LoaderCommon.h
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <evol/common/ev_types.h>
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
PTR data;
|
||||||
|
I64 size;
|
||||||
|
|
||||||
|
U32 ref_count;
|
||||||
|
U32 ticks_left;
|
||||||
|
} Asset;
|
||||||
|
|
||||||
|
|
||||||
|
const Asset *
|
||||||
|
ev_asset_getfromhandle(
|
||||||
|
AssetHandle handle);
|
||||||
16
src/loaders/TextLoader/TextLoader.c
Normal file
16
src/loaders/TextLoader/TextLoader.c
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
#define TYPE_MODULE evmod_assets
|
||||||
|
#include <evol/meta/type_import.h>
|
||||||
|
|
||||||
|
#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
|
||||||
|
};
|
||||||
|
}
|
||||||
5
src/loaders/TextLoader/TextLoader.h
Normal file
5
src/loaders/TextLoader/TextLoader.h
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
TextAsset
|
||||||
|
ev_textloader_loadasset(
|
||||||
|
AssetHandle handle);
|
||||||
124
src/mod.c
124
src/mod.c
@@ -1,14 +1,138 @@
|
|||||||
#define EV_MODULE_DEFINE
|
#define EV_MODULE_DEFINE
|
||||||
#include <evol/evolmod.h>
|
#include <evol/evolmod.h>
|
||||||
|
#include <assetsys/assetsys.h>
|
||||||
|
#include <evol/utils/aligned_alloc.h>
|
||||||
|
|
||||||
|
#define IMPORT_MODULE evmod_ecs
|
||||||
|
#include <evol/meta/module_import.h>
|
||||||
|
|
||||||
|
#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_CONSTRUCTOR
|
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
|
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_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;
|
||||||
}
|
}
|
||||||
|
|||||||
10
subprojects/assetsys.wrap
Normal file
10
subprojects/assetsys.wrap
Normal file
@@ -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
|
||||||
7
subprojects/evmod_ecs.wrap
Normal file
7
subprojects/evmod_ecs.wrap
Normal file
@@ -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
|
||||||
3
subprojects/packagefiles/assetsys/assetsys.c
Normal file
3
subprojects/packagefiles/assetsys/assetsys.c
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#define ASSETSYS_IMPLEMENTATION
|
||||||
|
#define STRPOOL_IMPLEMENTATION
|
||||||
|
#include <assetsys.h>
|
||||||
16
subprojects/packagefiles/assetsys/meson.build
Normal file
16
subprojects/packagefiles/assetsys/meson.build
Normal file
@@ -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
|
||||||
Reference in New Issue
Block a user