diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-08-05 19:07:06 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-08-06 17:00:26 -0400 |
| commit | 9a48fc73d7a25685fc7917c3edc271f595e093da (patch) | |
| tree | 0f400205af7d419e9f4fb40ebd3ad1db12c49219 /src | |
| parent | f7d860cee74ad3b94e0d15ea157783b7760f6d55 (diff) | |
pke: first-pass add asset details
Diffstat (limited to 'src')
| -rw-r--r-- | src/asset-manager.cpp | 32 | ||||
| -rw-r--r-- | src/asset-manager.hpp | 24 | ||||
| -rw-r--r-- | src/font.cpp | 8 | ||||
| -rw-r--r-- | src/project.cpp | 33 |
4 files changed, 77 insertions, 20 deletions
diff --git a/src/asset-manager.cpp b/src/asset-manager.cpp index f0f6d5e..27fbf67 100644 --- a/src/asset-manager.cpp +++ b/src/asset-manager.cpp @@ -28,14 +28,14 @@ AssetKey EngineDefinedAssets[EngineDefinedAssetCount] = { void AM_Init() { new (&asset_mstr.bc) pk_bkt_arr_t<Asset>{ pk_bkt_arr_handle_MAX_constexpr }; asset_mstr.thread_pool = PkeThreads_Init(2, 255); - AM_Register(EngineDefinedAssets[0], PKE_ASSET_TYPE_SHADER, "assets/shaders/present.vert.spv"); - AM_Register(EngineDefinedAssets[1], PKE_ASSET_TYPE_SHADER, "assets/shaders/present.frag.spv"); - AM_Register(EngineDefinedAssets[2], PKE_ASSET_TYPE_SHADER, "assets/shaders/vertex.vert.spv"); - AM_Register(EngineDefinedAssets[3], PKE_ASSET_TYPE_SHADER, "assets/shaders/texture.frag.spv"); - AM_Register(EngineDefinedAssets[4], PKE_ASSET_TYPE_SHADER, "assets/shaders/glyph.vert.spv"); - AM_Register(EngineDefinedAssets[5], PKE_ASSET_TYPE_SHADER, "assets/shaders/glyph.frag.spv"); - AM_Register(EngineDefinedAssets[6], PKE_ASSET_TYPE_SHADER, "assets/shaders/ui-base.vert.spv"); - AM_Register(EngineDefinedAssets[7], PKE_ASSET_TYPE_SHADER, "assets/shaders/ui-base.frag.spv"); + AM_Register(EngineDefinedAssets[0], PKE_ASSET_TYPE_SHADER, "assets/shaders/present.vert.spv", nullptr); + AM_Register(EngineDefinedAssets[1], PKE_ASSET_TYPE_SHADER, "assets/shaders/present.frag.spv", nullptr); + AM_Register(EngineDefinedAssets[2], PKE_ASSET_TYPE_SHADER, "assets/shaders/vertex.vert.spv", nullptr); + AM_Register(EngineDefinedAssets[3], PKE_ASSET_TYPE_SHADER, "assets/shaders/texture.frag.spv", nullptr); + AM_Register(EngineDefinedAssets[4], PKE_ASSET_TYPE_SHADER, "assets/shaders/glyph.vert.spv", nullptr); + AM_Register(EngineDefinedAssets[5], PKE_ASSET_TYPE_SHADER, "assets/shaders/glyph.frag.spv", nullptr); + AM_Register(EngineDefinedAssets[6], PKE_ASSET_TYPE_SHADER, "assets/shaders/ui-base.vert.spv", nullptr); + AM_Register(EngineDefinedAssets[7], PKE_ASSET_TYPE_SHADER, "assets/shaders/ui-base.frag.spv", nullptr); } void AM_Load_Task(Asset &asset) { @@ -65,7 +65,7 @@ inline Asset *AM_Get_Inner(const char (&key)[AssetKeyLength]) { return &asset_mstr.bc[handle]; } -AssetHandle AM_Register(const AssetKey &key, AssetType type, const void *data, int64_t size, std::size_t alignment) { +AssetHandle AM_Register(const AssetKey &key, AssetType type, const void *data, int64_t size, std::size_t alignment, union pke_asset_details *details) { assert(data != nullptr && "Attempt to register invalid asset data"); assert(data != CAFE_BABE(void) && "Attempt to register invalid asset data"); assert(size != 0 && "Attempt to register asset data of size 0"); @@ -76,6 +76,8 @@ AssetHandle AM_Register(const AssetKey &key, AssetType type, const void *data, i AssetHandle assetHandle{pk_bkt_arr_new_handle(&asset_mstr.bc)}; Asset &asset = asset_mstr.bc[assetHandle]; new (&asset) Asset{}; + memset(&asset.details, 0, sizeof(union pke_asset_details)); + if (details != nullptr) asset.details = *details; asset.handle = assetHandle; strncpy(asset.key, key, AssetKeyLength); asset.basePath = nullptr; @@ -88,7 +90,7 @@ AssetHandle AM_Register(const AssetKey &key, AssetType type, const void *data, i return assetHandle; } -AssetHandle AM_Register(const AssetKey &key, AssetType type, const char *path) { +AssetHandle AM_Register(const AssetKey &key, AssetType type, const char *path, union pke_asset_details *details) { Asset *searchedAsset = AM_Get_Inner(key); if (searchedAsset != nullptr) { return searchedAsset->handle; @@ -96,6 +98,8 @@ AssetHandle AM_Register(const AssetKey &key, AssetType type, const char *path) { AssetHandle assetHandle{pk_bkt_arr_new_handle(&asset_mstr.bc)}; Asset &asset = asset_mstr.bc[assetHandle]; new (&asset) Asset{}; + memset(&asset.details, 0, sizeof(union pke_asset_details)); + if (details != nullptr) asset.details = *details; asset.handle = assetHandle; strncpy(asset.key, key, AssetKeyLength); int64_t pathLen = strlen(path); @@ -114,7 +118,7 @@ AssetHandle AM_Register(const AssetKey &key, AssetType type, const char *path) { return assetHandle; } -AssetHandle AM_Register(const char *path, AssetType type) { +AssetHandle AM_Register(const char *path, AssetType type, union pke_asset_details *details) { NULL_CHAR_ARR(assetKey, AssetKeyLength); int64_t pathLen = strlen(path); int64_t pathOffset = (pathLen > AssetKeyLength ? pathLen - AssetKeyLength : 0); @@ -128,6 +132,8 @@ AssetHandle AM_Register(const char *path, AssetType type) { AssetHandle assetHandle{pk_bkt_arr_new_handle(&asset_mstr.bc)}; Asset &asset = asset_mstr.bc[assetHandle]; new (&asset) Asset{}; + memset(&asset.details, 0, sizeof(union pke_asset_details)); + if (details != nullptr) asset.details = *details; asset.handle = assetHandle; strncpy(asset.key, assetKey, AssetKeyLength); auto *copiedPath = pk_new_arr<char>(pathLen + 1); @@ -145,7 +151,7 @@ AssetHandle AM_Register(const char *path, AssetType type) { return assetHandle; } -AssetHandle AM_Register_Static(const AssetKey &key, AssetType type, const void *data, int64_t size) { +AssetHandle AM_Register_Static(const AssetKey &key, AssetType type, const void *data, int64_t size, union pke_asset_details *details) { assert(data != nullptr && "Attempt to register invalid asset data"); assert(data != CAFE_BABE(void) && "Attempt to register invalid asset data"); assert(size != 0 && "Attempt to register asset data of size 0"); @@ -156,6 +162,8 @@ AssetHandle AM_Register_Static(const AssetKey &key, AssetType type, const void * AssetHandle assetHandle{pk_bkt_arr_new_handle(&asset_mstr.bc)}; Asset &asset = asset_mstr.bc[assetHandle]; new (&asset) Asset{}; + memset(&asset.details, 0, sizeof(union pke_asset_details)); + if (details != nullptr) asset.details = *details; asset.handle = assetHandle; strncpy(asset.key, key, AssetKeyLength); asset.basePath = nullptr; diff --git a/src/asset-manager.hpp b/src/asset-manager.hpp index bf065f2..a50aeac 100644 --- a/src/asset-manager.hpp +++ b/src/asset-manager.hpp @@ -36,6 +36,21 @@ const AssetFlags PKE_ASSET_FLAGS_MEM_STATIC = AssetFlags {0x01}; constexpr int64_t EngineDefinedAssetCount = 8; extern AssetKey EngineDefinedAssets[EngineDefinedAssetCount]; +union pke_asset_details { + struct pke_asset_details_shader { + } shader; + struct pke_asset_details_model { + } model; + struct pke_asset_details_texture { + uint32_t width; + uint32_t height; + } texture; + struct pke_asset_details_audio { + } audio; + struct pke_asset_details_font { + } font; +}; + struct Asset { AssetHandle handle{}; AssetKey key = {'\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0'}; @@ -47,13 +62,14 @@ struct Asset { AssetLoadingState state = PKE_ASSET_LOADING_STATE_UNLOADED; AssetType type = PKE_ASSET_TYPE_UNSET; AssetFlags flags = PKE_ASSET_FLAGS_NONE; + union pke_asset_details details; }; void AM_Init(); -AssetHandle AM_Register(const AssetKey &key, AssetType type, const void *data, int64_t size, std::size_t alignment); -AssetHandle AM_Register(const char *path, AssetType type); -AssetHandle AM_Register(const AssetKey &key, AssetType type, const char *path); -AssetHandle AM_Register_Static(const AssetKey &key, AssetType type, const void *data, int64_t size); +AssetHandle AM_Register(const AssetKey &key, AssetType type, const void *data, int64_t size, std::size_t alignment, union pke_asset_details *details = nullptr); +AssetHandle AM_Register(const char *path, AssetType type, union pke_asset_details *details = nullptr); +AssetHandle AM_Register(const AssetKey &key, AssetType type, const char *path, union pke_asset_details *details = nullptr); +AssetHandle AM_Register_Static(const AssetKey &key, AssetType type, const void *data, int64_t size, union pke_asset_details *details = nullptr); void AM_Release(AssetHandle assetHandle); const Asset *AM_Get(AssetHandle assetHandle); const AssetHandle AM_GetHandle(const AssetKey &key); diff --git a/src/font.cpp b/src/font.cpp index deaf956..26004e3 100644 --- a/src/font.cpp +++ b/src/font.cpp @@ -252,9 +252,15 @@ void FontType_Init() { ft->glyphs = nullptr; ft->renders = nullptr; } + union pke_asset_details ak_img_details { + .texture = { + .width = 952, + .height = 952, + }, + }; AssetKey ak_img = "fnt_mquin_img\0\0"; AssetKey ak_glyphs = "fnt_mquin_gly\0\0"; - AssetHandle ah_img = AM_Register_Static(ak_img, PKE_ASSET_TYPE_TEXTURE, embedded_fonts[0].data, embedded_fonts[0].size); + AssetHandle ah_img = AM_Register_Static(ak_img, PKE_ASSET_TYPE_TEXTURE, embedded_fonts[0].data, embedded_fonts[0].size, &ak_img_details); AssetHandle ah_glyphs = AM_Register_Static(ak_glyphs, PKE_ASSET_TYPE_UNSET, embedded_fonts[1].data, embedded_fonts[1].size); FontTypeMSDFSettings msdf_s; msdf_s.minimum_scale = 144; diff --git a/src/project.cpp b/src/project.cpp index 0669c75..cf774a1 100644 --- a/src/project.cpp +++ b/src/project.cpp @@ -3,6 +3,7 @@ #include "asset-manager.hpp" #include "components.hpp" +#include "pk.h" #include "plugins.hpp" #include "entities.hpp" #include "helpers.hpp" @@ -46,6 +47,8 @@ const char* const PKE_PROJ_FILE_ENTITY_TYPE_PHYSICS_STARTING_COLLISION_MASK = "B const char* const PKE_PROJ_FILE_ASSET_KEY = "Asset::Key: "; const char* const PKE_PROJ_FILE_ASSET_BASE_PATH = "Asset::BasePath: "; const char* const PKE_PROJ_FILE_ASSET_TYPE = "Asset::Type: "; +const char* const PKE_PROJ_FILE_ASSET_TXTR_WIDTH = "Asset::Width: "; +const char* const PKE_PROJ_FILE_ASSET_TXTR_HEIGHT = "Asset::Height: "; /* void Proj_SerializeProjectSettings(std::ostream &stream) { @@ -124,6 +127,15 @@ void Proj_SerializeAsset(std::ostream &stream, const Asset &asset) { if (asset.type != a.type) { stream << PKE_PROJ_FILE_ASSET_TYPE << static_cast<uint64_t>(asset.type) << std::endl; } + switch (asset.type) { + case PKE_ASSET_TYPE_TEXTURE: + stream << PKE_PROJ_FILE_ASSET_TXTR_WIDTH << asset.details.texture.width << std::endl; + stream << PKE_PROJ_FILE_ASSET_TXTR_HEIGHT << asset.details.texture.height << std::endl; + break; + default: + /* no-op */ + break; + } } /* @@ -295,15 +307,18 @@ void Proj_DeserializeEntityType(std::istream &stream) { void Proj_DeserializeAssset(std::istream &stream) { size_t prefixLen, strLen; AssetKey keyStr; + union pke_asset_details details; + memset(&details, 0, sizeof(union pke_asset_details)); keyStr[AssetKeyLength-1] = '\0'; const size_t path_len = 256; char basePath[path_len]; basePath[0] = '\0'; basePath[path_len-1] = '\0'; AssetType at{PKE_ASSET_TYPE_UNSET}; + PK_STN_RES result; while (memset(projReadLine, 0, projReadLineLength), stream.getline(projReadLine, projReadLineLength)) { if (strcmp(projReadLine, PKE_PROJ_FILE_OBJ_END) == 0) { - AM_Register(keyStr, at, basePath); + AM_Register(keyStr, at, basePath, &details); return; } if (strstr(projReadLine, PKE_PROJ_FILE_ASSET_KEY) != nullptr) { @@ -322,9 +337,21 @@ void Proj_DeserializeAssset(std::istream &stream) { if (strstr(projReadLine, PKE_PROJ_FILE_ASSET_TYPE) != nullptr) { prefixLen = strlen(PKE_PROJ_FILE_ASSET_TYPE); AssetType_T val{}; - STR2NUM_ERROR result = str2num(val, projReadLine + prefixLen); + result = pk_stn<AssetType_T>(&val, projReadLine + prefixLen, nullptr); at = AssetType{val}; - assert(result == STR2NUM_ERROR::SUCCESS); + assert(result == PK_STN_RES_SUCCESS); + continue; + } + if (strstr(projReadLine, PKE_PROJ_FILE_ASSET_TXTR_WIDTH) != nullptr) { + prefixLen = strlen(PKE_PROJ_FILE_ASSET_TXTR_WIDTH); + result = pk_stn<uint32_t>(&details.texture.width, projReadLine + prefixLen, nullptr); + assert(result == PK_STN_RES_SUCCESS); + continue; + } + if (strstr(projReadLine, PKE_PROJ_FILE_ASSET_TXTR_HEIGHT) != nullptr) { + prefixLen = strlen(PKE_PROJ_FILE_ASSET_TXTR_HEIGHT); + result = pk_stn<uint32_t>(&details.texture.height, projReadLine + prefixLen, nullptr); + assert(result == PK_STN_RES_SUCCESS); continue; } } |
