From b084a8364495ef7a40fd77d4b30b67bace2e97b6 Mon Sep 17 00:00:00 2001 From: J3oss Date: Fri, 25 Jun 2021 21:19:14 +0200 Subject: [PATCH] Added image loader --- meson.build | 1 + meta/evmod.namespaces | 7 +++ meta/evmod.types | 15 +++++- src/loaders/ImageLoader/ImageLoader.c | 70 +++++++++++++++++++++++++++ src/loaders/ImageLoader/ImageLoader.h | 13 +++++ src/mod.c | 14 ++++++ 6 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 src/loaders/ImageLoader/ImageLoader.c create mode 100644 src/loaders/ImageLoader/ImageLoader.h diff --git a/meson.build b/meson.build index 5c91e9d..5f39fbe 100644 --- a/meson.build +++ b/meson.build @@ -19,6 +19,7 @@ mod_src = [ 'src/loaders/TextLoader/TextLoader.c', 'src/loaders/JSONLoader/JSONLoader.c', 'src/loaders/MeshLoader/MeshLoader.c', + 'src/loaders/ImageLoader/ImageLoader.c', 'src/loaders/ShaderLoader/ShaderLoader.c', ] diff --git a/meta/evmod.namespaces b/meta/evmod.namespaces index 1979a94..920e1bf 100644 --- a/meta/evmod.namespaces +++ b/meta/evmod.namespaces @@ -41,3 +41,10 @@ EV_NS_DEF_BEGIN(ShaderLoader) EV_NS_DEF_FN(ShaderAsset, loadAsset, (AssetHandle, handle), (ShaderAssetStage, stage), (CONST_STR, shader_name), (CONST_STR, entrypoint), (CompiledShaderType, type)) EV_NS_DEF_END(ShaderLoader) + + +EV_NS_DEF_BEGIN(ImageLoader) + +EV_NS_DEF_FN(ImageAsset, loadAsset, (AssetHandle, handle)) + +EV_NS_DEF_END(ImageLoader) diff --git a/meta/evmod.types b/meta/evmod.types index 09778d0..25b96c6 100644 --- a/meta/evmod.types +++ b/meta/evmod.types @@ -10,7 +10,6 @@ TYPE(JSONAsset, struct { PTR json_data; }) - TYPE(MeshAsset, struct { uint32_t vertexBuferSize; uint32_t vertexCount; @@ -21,6 +20,20 @@ TYPE(MeshAsset, struct { uint32_t *indexData; }) +typedef enum { + EV_IMAGEFORMAT_RGBA8, + EV_IMAGEFORMAT_INVALID +} EvImageFormat; + +TYPE(ImageAsset, struct { + uint32_t bufferSize; + uint32_t width; + uint32_t height; + + EvImageFormat format; + PTR data; +}) + TYPE(ShaderAssetStage, enum { EV_SHADERASSETSTAGE_VERTEX, EV_SHADERASSETSTAGE_FRAGMENT, diff --git a/src/loaders/ImageLoader/ImageLoader.c b/src/loaders/ImageLoader/ImageLoader.c new file mode 100644 index 0000000..5e35bc0 --- /dev/null +++ b/src/loaders/ImageLoader/ImageLoader.c @@ -0,0 +1,70 @@ +#define TYPE_MODULE evmod_assets +#include +#include +#include + +#include "../LoaderCommon.h" +#include "ImageLoader.h" + +EvImageFormat +strToFormat( + evstr_ref str_ref); + +ImageAsset +ev_imageloader_loadasset( + AssetHandle handle) +{ + const Asset *asset = ev_asset_getfromhandle(handle); + + uint32_t jsonLength = ((U32*)asset->data)[0]; + uint32_t blobLength = ((U32*)asset->data)[1]; + + const char *json = (PTR)(&((U32*)asset->data)[2]); + const void *data = json + jsonLength; + + evjson_t *evjs = evjs_init(); + + evjs_loadjson(evjs, json); + + evstr_ref str_ref = evjs_get(evjs, "format")->as_str; + + ImageAsset inter = { + .bufferSize = evjs_get(evjs, "buffer_size")->as_num, + .height = evjs_get(evjs, "height")->as_num, + .width = evjs_get(evjs, "width")->as_num, + .format = strToFormat(str_ref), + + .data = data, + }; + + evjs_fini(evjs); + + ev_asset_markas(handle, LoaderData.assetType, &inter); + + return inter; +} + +void +ev_imageloader_imageasset_destr( + ImageAsset image) +{ + +} + +void +ev_imageloader_setassettype( + GenericHandle type) +{ + LoaderData.assetType = type; +} + +EvImageFormat +strToFormat( + evstr_ref str_ref) +{ + if(!strncmp(str_ref.data + str_ref.offset, "RGBA8", str_ref.len)) + return EV_IMAGEFORMAT_RGBA8; + + else + return EV_IMAGEFORMAT_INVALID; +} diff --git a/src/loaders/ImageLoader/ImageLoader.h b/src/loaders/ImageLoader/ImageLoader.h new file mode 100644 index 0000000..0f4e592 --- /dev/null +++ b/src/loaders/ImageLoader/ImageLoader.h @@ -0,0 +1,13 @@ +#pragma once + +ImageAsset +ev_imageloader_loadasset( + AssetHandle handle); + +void +ev_imageloader_imageasset_destr( + ImageAsset image); + +void +ev_imageloader_setassettype( + GenericHandle type); diff --git a/src/mod.c b/src/mod.c index 63ec6bc..5410dec 100644 --- a/src/mod.c +++ b/src/mod.c @@ -13,6 +13,7 @@ #include "loaders/JSONLoader/JSONLoader.h" #include "loaders/MeshLoader/MeshLoader.h" #include "loaders/ShaderLoader/ShaderLoader.h" +#include "loaders/ImageLoader/ImageLoader.h" #define AssetSysCheck(errmsg_fmt, vars, ...) do { \ assetsys_error_t res = __VA_ARGS__; \ @@ -63,6 +64,15 @@ onRemoveJSONAsset( } } +// void +// onRemoveImageAsset( +// ECSQuery query) +// { +// ImageAsset *assets = ECS->getQueryColumn(query, sizeof(ImageAsset), 1); +// for(int i = 0; i < ECS->getQueryMatchCount(query); i++) { +// ev_imageloader_imageasset_destr(assets[i]); +// } +// } // void // onRemoveMeshAsset( @@ -107,6 +117,8 @@ EV_CONSTRUCTOR ev_jsonloader_setassettype(AssetECS->registerComponent("JSONAsset", sizeof(JSONAsset), EV_ALIGNOF(JSONAsset))); AssetECS->setOnRemoveTrigger("JSONAssetOnRemove", "JSONAsset", onRemoveJSONAsset); + ev_jsonloader_setassettype(AssetECS->registerComponent("ImageAsset", sizeof(ImageAsset), EV_ALIGNOF(ImageAsset))); + // AssetECS->setOnRemoveTrigger("ImageAssetOnRemove", "ImageAsset", onRemoveImageAsset); ev_jsonloader_setassettype(AssetECS->registerComponent("MeshAsset", sizeof(MeshAsset), EV_ALIGNOF(MeshAsset))); // AssetECS->setOnRemoveTrigger("MeshAssetOnRemove", "MeshAsset", onRemoveMeshAsset); @@ -257,5 +269,7 @@ EV_BINDINGS EV_NS_BIND_FN(ShaderLoader, loadAsset, ev_shaderloader_loadasset); + EV_NS_BIND_FN(ImageLoader, loadAsset, ev_imageloader_loadasset); + return 0; }