summaryrefslogtreecommitdiff
path: root/src/asset-manager.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-05-20 21:08:19 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-05-20 21:08:19 -0400
commit40d69e7e40a18865a31af2f55efcde369d36dbbb (patch)
tree95a2cbbe40192183d13f846f3444b32d7e12b0e8 /src/asset-manager.cpp
parentead9e484db969a880470d625b1884aced296e722 (diff)
pke: serialization overhaul + embedded assets
Diffstat (limited to 'src/asset-manager.cpp')
-rw-r--r--src/asset-manager.cpp38
1 files changed, 32 insertions, 6 deletions
diff --git a/src/asset-manager.cpp b/src/asset-manager.cpp
index 2976643..b7a82fd 100644
--- a/src/asset-manager.cpp
+++ b/src/asset-manager.cpp
@@ -46,10 +46,11 @@ void AM_Load_Task(Asset &asset) {
return;
}
asset.size = std::filesystem::file_size(asset.basePath);
- asset.ptr = pk_new_base(asset.size, alignof(max_align_t));
+ void *ptr = pk_new_base(asset.size, alignof(max_align_t));
file.seekg(0, std::ios::beg);
- file.read(static_cast<char *>(asset.ptr), asset.size);
+ file.read(static_cast<char *>(ptr), asset.size);
file.close();
+ asset.ptr = ptr;
asset.state = PKE_ASSET_LOADING_STATE_LOADED;
}
@@ -85,8 +86,9 @@ AssetHandle AM_Register(AssetKey key, AssetType type, const void *data, int64_t
strncpy(asset.key, key, AssetKeyLength);
asset.basePath = nullptr;
asset.size = size;
- asset.ptr = pk_new_base(size, alignment);
- memcpy(asset.ptr, data, size);
+ void *ptr = pk_new_base(size, alignment);
+ memcpy(ptr, data, size);
+ asset.ptr = ptr;
asset.state = PKE_ASSET_LOADING_STATE_LOADED;
asset.type = type;
return assetHandle;
@@ -149,6 +151,28 @@ AssetHandle AM_Register(const char *path, AssetType type) {
return assetHandle;
}
+AssetHandle AM_Register_Static(AssetKey key, AssetType type, const void *data, int64_t size) {
+ 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");
+ Asset *searchedAsset = AM_Get_Inner(key);
+ if (searchedAsset != nullptr) {
+ return searchedAsset->handle;
+ }
+ AssetHandle assetHandle{Buckets_NewHandle(Asset_BucketContainer)};
+ Asset &asset = Asset_BucketContainer.buckets[assetHandle.bucketIndex][assetHandle.itemIndex];
+ new (&asset) Asset{};
+ asset.handle = assetHandle;
+ strncpy(asset.key, key, AssetKeyLength);
+ asset.basePath = nullptr;
+ asset.size = size;
+ asset.ptr = data;
+ asset.state = PKE_ASSET_LOADING_STATE_LOADED;
+ asset.type = type;
+ asset.flags = PKE_ASSET_FLAGS_MEM_STATIC;
+ return assetHandle;
+}
+
void AM_Release(AssetHandle assetHandle) {
assert(assetHandle != AssetHandle_MAX);
Asset &asset = Asset_BucketContainer.buckets[assetHandle.bucketIndex][assetHandle.itemIndex];
@@ -243,9 +267,11 @@ void AM_GC() {
for (long b = 0; b <= Asset_BucketContainer.pkeHandle.bucketIndex; ++b) {
for (long i = 0; i < Asset_BucketContainer.pkeHandle.itemIndex; ++i) {
Asset &asset = Asset_BucketContainer.buckets[b][i];
- if (asset.referenceCount > 0)
+ if (asset.referenceCount > 0) {
+ fprintf(stderr, "[AM_GC] Asset '%.16s' still in use, count: %i", asset.key, asset.referenceCount);
continue;
- if (asset.ptr != nullptr && asset.ptr != CAFE_BABE(void)) {
+ }
+ if (asset.ptr != nullptr && asset.ptr != CAFE_BABE(void) && !PK_HAS_FLAG(asset.flags, PKE_ASSET_FLAGS_MEM_STATIC)) {
pk_delete_base(asset.ptr, asset.size);
}
asset.size = 0;