From 70f0449a7bfa59b9297b859f296e7187988c0a25 Mon Sep 17 00:00:00 2001 From: Robear Selwans Date: Tue, 1 Jun 2021 05:17:45 +0200 Subject: [PATCH] Added the ability for assets to be considered components and have OnRemove callbacks Signed-off-by: Robear Selwans --- meta/evmod.types | 3 +-- src/loaders/LoaderCommon.h | 10 ++++++++++ src/loaders/TextLoader/TextLoader.c | 24 +++++++++++++++++++++--- src/loaders/TextLoader/TextLoader.h | 8 ++++++++ src/mod.c | 28 ++++++++++++++++++++++++++-- 5 files changed, 66 insertions(+), 7 deletions(-) diff --git a/meta/evmod.types b/meta/evmod.types index 0029b5e..cff8bfa 100644 --- a/meta/evmod.types +++ b/meta/evmod.types @@ -3,6 +3,5 @@ TYPE(AssetHandle, GenericHandle) /* #include LOADERS_TYPES_H */ TYPE(TextAsset, struct { - CONST_STR text; - U64 length; + evstring text; }) diff --git a/src/loaders/LoaderCommon.h b/src/loaders/LoaderCommon.h index 58ff209..c177e99 100644 --- a/src/loaders/LoaderCommon.h +++ b/src/loaders/LoaderCommon.h @@ -10,7 +10,17 @@ typedef struct { U32 ticks_left; } Asset; +static struct { + GenericHandle assetType; +} LoaderData; + const Asset * ev_asset_getfromhandle( AssetHandle handle); + +void +ev_asset_markas( + AssetHandle handle, + GenericHandle assetType, + PTR data); diff --git a/src/loaders/TextLoader/TextLoader.c b/src/loaders/TextLoader/TextLoader.c index ff06c3c..42ba966 100644 --- a/src/loaders/TextLoader/TextLoader.c +++ b/src/loaders/TextLoader/TextLoader.c @@ -1,5 +1,6 @@ #define TYPE_MODULE evmod_assets #include +#include #include "../LoaderCommon.h" #include "TextLoader.h" @@ -9,8 +10,25 @@ ev_textloader_loadasset( AssetHandle handle) { const Asset *asset = ev_asset_getfromhandle(handle); - return (TextAsset) { - .text = asset->data, - .length = asset->size + TextAsset inter = (TextAsset) { + .text = evstring_new(asset->data), }; + + ev_asset_markas(handle, LoaderData.assetType, &inter); + + return inter; +} + +void +ev_textloader_textasset_destr( + TextAsset txt) +{ + evstring_free(txt.text); +} + +void +ev_textloader_setassettype( + GenericHandle type) +{ + LoaderData.assetType = type; } diff --git a/src/loaders/TextLoader/TextLoader.h b/src/loaders/TextLoader/TextLoader.h index 8220d6d..644ef29 100644 --- a/src/loaders/TextLoader/TextLoader.h +++ b/src/loaders/TextLoader/TextLoader.h @@ -3,3 +3,11 @@ TextAsset ev_textloader_loadasset( AssetHandle handle); + +void +ev_textloader_textasset_destr( + TextAsset txt); + +void +ev_textloader_setassettype( + GenericHandle type); diff --git a/src/mod.c b/src/mod.c index d3de965..5881110 100644 --- a/src/mod.c +++ b/src/mod.c @@ -29,8 +29,20 @@ void onRemoveAssetComponent( ECSQuery query) { - Asset *asset = ECS->getQueryColumn(query, sizeof(Asset), 1); - aligned_free(asset->data); + Asset *assets = ECS->getQueryColumn(query, sizeof(Asset), 1); + for(int i = 0; i < ECS->getQueryMatchCount(query); i++) { + aligned_free(assets[i].data); + } +} + +void +onRemoveTextAsset( + ECSQuery query) +{ + TextAsset *assets = ECS->getQueryColumn(query, sizeof(TextAsset), 1); + for(int i = 0; i < ECS->getQueryMatchCount(query); i++) { + ev_textloader_textasset_destr(assets[i]); + } } EV_CONSTRUCTOR @@ -47,6 +59,9 @@ EV_CONSTRUCTOR AssetManagerData.assetcomponent_id = AssetECS->registerComponent("Asset", sizeof(Asset), EV_ALIGNOF(Asset)); AssetECS->setOnRemoveTrigger("AssetComponentOnRemove", "Asset", onRemoveAssetComponent); + + ev_textloader_setassettype(AssetECS->registerComponent("TextAsset", sizeof(TextAsset), EV_ALIGNOF(TextAsset))); + AssetECS->setOnRemoveTrigger("TextAssetOnRemove", "TextAsset", onRemoveTextAsset); } } @@ -124,6 +139,15 @@ ev_asset_getfromhandle( return AssetECS->getComponent(AssetManagerData.world, handle, AssetManagerData.assetcomponent_id); } +void +ev_asset_markas( + AssetHandle handle, + GenericHandle assetType, + PTR data) +{ + AssetECS->setComponent(AssetManagerData.world, handle, assetType, data); +} + EV_BINDINGS { EV_NS_BIND_FN(AssetManager, mount, ev_assetmanager_mount);