summaryrefslogtreecommitdiff
path: root/src/project.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-05-30 14:41:54 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-05-30 14:41:54 -0400
commit781410537a1c7ddac340efabeedd4c9309e5cf39 (patch)
tree7253babcfc7fd8766095fdf89eca7a9fd3952912 /src/project.cpp
parent6ff0a1f8f7775752db8219dc270a56c4e64b4c7e (diff)
pke: asset: BucketContainer>pk_bkt_arr_t & cleanup
Diffstat (limited to 'src/project.cpp')
-rw-r--r--src/project.cpp57
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) {