diff --git a/meson.build b/meson.build index aef33a5..d90383f 100644 --- a/meson.build +++ b/meson.build @@ -18,6 +18,7 @@ mod_src = [ # Loaders 'src/loaders/TextLoader/TextLoader.c', 'src/loaders/JSONLoader/JSONLoader.c', + 'src/loaders/MeshLoader/MeshLoader.c', 'src/loaders/ShaderLoader/ShaderLoader.c', ] diff --git a/meta/evmod.namespaces b/meta/evmod.namespaces index 1345778..e33a1c4 100644 --- a/meta/evmod.namespaces +++ b/meta/evmod.namespaces @@ -25,6 +25,13 @@ EV_NS_DEF_FN(JSONAsset, loadAsset, (AssetHandle, handle)) EV_NS_DEF_END(JSONLoader) +EV_NS_DEF_BEGIN(MeshLoader) + +EV_NS_DEF_FN(MeshAsset, loadAsset, (AssetHandle, handle)) + +EV_NS_DEF_END(MeshLoader) + + EV_NS_DEF_BEGIN(ShaderLoader) EV_NS_DEF_FN(ShaderAsset, loadAsset, (AssetHandle, handle), (ShaderAssetStage, stage), (CONST_STR, shader_name), (CONST_STR, entrypoint), (CompiledShaderType, type)) diff --git a/meta/evmod.types b/meta/evmod.types index 80b40ac..cd9ad62 100644 --- a/meta/evmod.types +++ b/meta/evmod.types @@ -10,6 +10,16 @@ TYPE(JSONAsset, struct { PTR json_data; }) + +TYPE(MeshAsset, struct { + uint32_t vertexBuferSize; + uint32_t vertexCount; + float *vertexData; + + uint32_t indexBuferSize; + uint32_t indexCount; + uint32_t *indexData; + TYPE(ShaderAssetStage, enum { EV_SHADERASSETSTAGE_VERTEX, EV_SHADERASSETSTAGE_FRAGMENT, diff --git a/src/loaders/MeshLoader/MeshLoader.c b/src/loaders/MeshLoader/MeshLoader.c new file mode 100644 index 0000000..569e442 --- /dev/null +++ b/src/loaders/MeshLoader/MeshLoader.c @@ -0,0 +1,61 @@ +#define TYPE_MODULE evmod_assets +#include +#include +#include + +#include "../LoaderCommon.h" +#include "MeshLoader.h" + +typedef struct { + Vec4 pos; + Vec4 nor; + Vec4 col; + Vec4 uv; +} Vertex; + +MeshAsset +ev_meshloader_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); + + MeshAsset inter = { + .vertexBuferSize = evjs_get(evjs, "vertex_buffer_size")->as_num, + .vertexCount = evjs_get(evjs, "vertex_count")->as_num, + .vertexData = data, + + .indexBuferSize = evjs_get(evjs, "index_buffer_size")->as_num, + .indexCount = evjs_get(evjs, "index_count")->as_num, + .indexData = (PTR)(&((char*)data)[inter.vertexBuferSize]), + }; + + evjs_fini(evjs); + + ev_asset_markas(handle, LoaderData.assetType, &inter); + + return inter; +} + +void +ev_meshloader_textasset_destr( + MeshAsset mesh) +{ + +} + +void +ev_meshloader_setassettype( + GenericHandle type) +{ + LoaderData.assetType = type; +} diff --git a/src/loaders/MeshLoader/MeshLoader.h b/src/loaders/MeshLoader/MeshLoader.h new file mode 100644 index 0000000..97ff219 --- /dev/null +++ b/src/loaders/MeshLoader/MeshLoader.h @@ -0,0 +1,13 @@ +#pragma once + +MeshAsset +ev_meshloader_loadasset( + AssetHandle handle); + +void +ev_meshloader_meshasset_destr( + MeshAsset mesh); + +void +ev_meshloader_setassettype( + GenericHandle type); diff --git a/src/mod.c b/src/mod.c index 475fe4c..51d7c7e 100644 --- a/src/mod.c +++ b/src/mod.c @@ -9,6 +9,7 @@ #include "loaders/LoaderCommon.h" #include "loaders/TextLoader/TextLoader.h" #include "loaders/JSONLoader/JSONLoader.h" +#include "loaders/MeshLoader/MeshLoader.h" #include "loaders/ShaderLoader/ShaderLoader.h" #define AssetSysCheck(...) do { \ @@ -57,6 +58,17 @@ onRemoveJSONAsset( } } + +// void +// onRemoveMeshAsset( +// ECSQuery query) +// { +// MeshAsset *assets = ECS->getQueryColumn(query, sizeof(MeshAsset), 1); +// for(int i = 0; i < ECS->getQueryMatchCount(query); i++) { +// ev_meshloader_meshasset_destr(assets[i]); +// } +// } + void onRemoveShaderAsset( ECSQuery query) @@ -89,6 +101,10 @@ EV_CONSTRUCTOR ev_jsonloader_setassettype(AssetECS->registerComponent("JSONAsset", sizeof(JSONAsset), EV_ALIGNOF(JSONAsset))); AssetECS->setOnRemoveTrigger("JSONAssetOnRemove", "JSONAsset", onRemoveJSONAsset); + + ev_jsonloader_setassettype(AssetECS->registerComponent("MeshAsset", sizeof(MeshAsset), EV_ALIGNOF(MeshAsset))); + // AssetECS->setOnRemoveTrigger("MeshAssetOnRemove", "MeshAsset", onRemoveMeshAsset); + ev_shaderloader_setassettype(AssetECS->registerComponent("ShaderAsset", sizeof(ShaderAsset), EV_ALIGNOF(ShaderAsset))); AssetECS->setOnRemoveTrigger("ShaderAssetOnRemove", "ShaderAsset", onRemoveShaderAsset); } @@ -195,6 +211,8 @@ EV_BINDINGS EV_NS_BIND_FN(JSONLoader, loadAsset, ev_jsonloader_loadasset); + EV_NS_BIND_FN(MeshLoader, loadAsset, ev_meshloader_loadasset); + EV_NS_BIND_FN(ShaderLoader, loadAsset, ev_shaderloader_loadasset); return 0;