diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2025-05-30 14:41:54 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2025-05-30 14:41:54 -0400 |
| commit | 781410537a1c7ddac340efabeedd4c9309e5cf39 (patch) | |
| tree | 7253babcfc7fd8766095fdf89eca7a9fd3952912 /src/project.cpp | |
| parent | 6ff0a1f8f7775752db8219dc270a56c4e64b4c7e (diff) | |
pke: asset: BucketContainer>pk_bkt_arr_t & cleanup
Diffstat (limited to 'src/project.cpp')
| -rw-r--r-- | src/project.cpp | 57 |
1 files changed, 31 insertions, 26 deletions
diff --git a/src/project.cpp b/src/project.cpp index 546ac8a..dcb84ae 100644 --- a/src/project.cpp +++ b/src/project.cpp @@ -1,6 +1,7 @@ #include "project.hpp" +#include "asset-manager.hpp" #include "components.hpp" #include "plugins.hpp" #include "entities.hpp" @@ -292,11 +293,13 @@ void Proj_DeserializeEntityType(std::istream &stream) { } void Proj_DeserializeAssset(std::istream &stream) { - char keyStr[AssetKeyLength + 1]; - keyStr[AssetKeyLength] = '\0'; - char basePath[256]; + size_t prefixLen, strLen; + AssetKey keyStr; + keyStr[AssetKeyLength-1] = '\0'; + const size_t path_len = 256; + char basePath[path_len]; basePath[0] = '\0'; - basePath[255] = '\0'; + basePath[path_len-1] = '\0'; AssetType at{PKE_ASSET_TYPE_UNSET}; while (memset(projReadLine, 0, projReadLineLength), stream.getline(projReadLine, projReadLineLength)) { if (strcmp(projReadLine, PKE_PROJ_FILE_OBJ_END) == 0) { @@ -304,18 +307,20 @@ void Proj_DeserializeAssset(std::istream &stream) { return; } if (strstr(projReadLine, PKE_PROJ_FILE_ASSET_KEY) != nullptr) { - uint64_t prefixLen = strlen(PKE_PROJ_FILE_ASSET_KEY); - strncpy(keyStr, projReadLine + prefixLen, AssetKeyLength); + prefixLen = strlen(PKE_PROJ_FILE_ASSET_KEY); + strLen = strlen(projReadLine) - prefixLen; + memset(keyStr, '\0', AssetKeyLength); + memcpy(keyStr, projReadLine + prefixLen, PK_MIN(AssetKeyLength, strLen)); continue; } if (strstr(projReadLine, PKE_PROJ_FILE_ASSET_BASE_PATH) != nullptr) { - uint64_t prefixLen = strlen(PKE_PROJ_FILE_ASSET_BASE_PATH); + prefixLen = strlen(PKE_PROJ_FILE_ASSET_BASE_PATH); uint64_t strLen = strlen(projReadLine) - prefixLen; - strncpy(basePath, projReadLine + prefixLen, strLen + 1); + strncpy(basePath, projReadLine + prefixLen, PK_MIN(strLen + 1, path_len)); continue; } if (strstr(projReadLine, PKE_PROJ_FILE_ASSET_TYPE) != nullptr) { - uint64_t prefixLen = strlen(PKE_PROJ_FILE_ASSET_TYPE); + prefixLen = strlen(PKE_PROJ_FILE_ASSET_TYPE); AssetType_T val{}; STR2NUM_ERROR result = str2num(val, projReadLine + prefixLen); at = AssetType{val}; @@ -375,25 +380,25 @@ void PkeProject_Save(const char *filePath) { f << PKE_PROJ_FILE_OBJ_END << std::endl; */ - pk_handle_bucket_index_T assetB = AM_GetBucketCount(); - for (pk_handle_bucket_index_T b = 0; b < assetB; ++b) { - pk_handle_item_index_T assetI = 0; - auto *assets = AM_GetAssets(b, assetI); - for (pk_handle_item_index_T i = 0; i < assetI; ++i) { - if (PK_HAS_FLAG(assets[i].flags, PKE_ASSET_FLAGS_MEM_STATIC)) continue; - bool isGlobalAsset = false; - for (long k = 0; k < EngineDefinedAssetCount; ++k) { - if (strncmp(EngineDefinedAssets[k], assets[i].key, AssetKeyLength) == 0) { - isGlobalAsset = true; - break; - } + using AssetLoopFn = pk_tmpln_1<void, Asset *, void *>; + AssetLoopFn asset_loop_cb{}; + asset_loop_cb.func = [&stream](Asset *arr_obj_data) { + if (PK_HAS_FLAG(arr_obj_data->flags, PKE_ASSET_FLAGS_MEM_STATIC)) return; + // TODO 2025-05-30 JCB + // This should be a flag + bool isGlobalAsset = false; + for (long k = 0; k < EngineDefinedAssetCount; ++k) { + if (strncmp(EngineDefinedAssets[k], arr_obj_data->key, AssetKeyLength) == 0) { + isGlobalAsset = true; + break; } - if (isGlobalAsset) continue; - stream << PKE_PROJ_FILE_OBJ_ASSET << std::endl; - Proj_SerializeAsset(stream, assets[i]); - stream << PKE_PROJ_FILE_OBJ_END << std::endl; } - } + if (isGlobalAsset) return; + stream << PKE_PROJ_FILE_OBJ_ASSET << std::endl; + Proj_SerializeAsset(stream, *arr_obj_data); + stream << PKE_PROJ_FILE_OBJ_END << std::endl; + }; + pk_bkt_arr_iterate(AM_GetAssets(), &AssetLoopFn::invoke, &asset_loop_cb); const auto entBucketCount = EntityType_GetBucketCount(); for (pk_handle_bucket_index_T b = 0; b < entBucketCount; ++b) { |
