From 781410537a1c7ddac340efabeedd4c9309e5cf39 Mon Sep 17 00:00:00 2001 From: Jonathan Bradley Date: Fri, 30 May 2025 14:41:54 -0400 Subject: pke: asset: BucketContainer>pk_bkt_arr_t & cleanup --- src/project.cpp | 57 +++++++++++++++++++++++++++++++-------------------------- 1 file changed, 31 insertions(+), 26 deletions(-) (limited to 'src/project.cpp') 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; + 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) { -- cgit v1.2.3