Added the ability for assets to be considered components and have OnRemove callbacks

Signed-off-by: Robear Selwans <robear.selwans@outlook.com>
This commit is contained in:
2021-06-01 05:17:45 +02:00
parent 5ccbacd25f
commit 70f0449a7b
5 changed files with 66 additions and 7 deletions

View File

@@ -3,6 +3,5 @@ TYPE(AssetHandle, GenericHandle)
/* #include LOADERS_TYPES_H */ /* #include LOADERS_TYPES_H */
TYPE(TextAsset, struct { TYPE(TextAsset, struct {
CONST_STR text; evstring text;
U64 length;
}) })

View File

@@ -10,7 +10,17 @@ typedef struct {
U32 ticks_left; U32 ticks_left;
} Asset; } Asset;
static struct {
GenericHandle assetType;
} LoaderData;
const Asset * const Asset *
ev_asset_getfromhandle( ev_asset_getfromhandle(
AssetHandle handle); AssetHandle handle);
void
ev_asset_markas(
AssetHandle handle,
GenericHandle assetType,
PTR data);

View File

@@ -1,5 +1,6 @@
#define TYPE_MODULE evmod_assets #define TYPE_MODULE evmod_assets
#include <evol/meta/type_import.h> #include <evol/meta/type_import.h>
#include <evol/common/ev_log.h>
#include "../LoaderCommon.h" #include "../LoaderCommon.h"
#include "TextLoader.h" #include "TextLoader.h"
@@ -9,8 +10,25 @@ ev_textloader_loadasset(
AssetHandle handle) AssetHandle handle)
{ {
const Asset *asset = ev_asset_getfromhandle(handle); const Asset *asset = ev_asset_getfromhandle(handle);
return (TextAsset) { TextAsset inter = (TextAsset) {
.text = asset->data, .text = evstring_new(asset->data),
.length = asset->size
}; };
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;
} }

View File

@@ -3,3 +3,11 @@
TextAsset TextAsset
ev_textloader_loadasset( ev_textloader_loadasset(
AssetHandle handle); AssetHandle handle);
void
ev_textloader_textasset_destr(
TextAsset txt);
void
ev_textloader_setassettype(
GenericHandle type);

View File

@@ -29,8 +29,20 @@ void
onRemoveAssetComponent( onRemoveAssetComponent(
ECSQuery query) ECSQuery query)
{ {
Asset *asset = ECS->getQueryColumn(query, sizeof(Asset), 1); Asset *assets = ECS->getQueryColumn(query, sizeof(Asset), 1);
aligned_free(asset->data); 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 EV_CONSTRUCTOR
@@ -47,6 +59,9 @@ EV_CONSTRUCTOR
AssetManagerData.assetcomponent_id = AssetECS->registerComponent("Asset", sizeof(Asset), EV_ALIGNOF(Asset)); AssetManagerData.assetcomponent_id = AssetECS->registerComponent("Asset", sizeof(Asset), EV_ALIGNOF(Asset));
AssetECS->setOnRemoveTrigger("AssetComponentOnRemove", "Asset", onRemoveAssetComponent); 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); 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_BINDINGS
{ {
EV_NS_BIND_FN(AssetManager, mount, ev_assetmanager_mount); EV_NS_BIND_FN(AssetManager, mount, ev_assetmanager_mount);