summaryrefslogtreecommitdiff
path: root/src/asset-manager.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2023-12-27 22:04:12 -0500
committerJonathan Bradley <jcb@pikum.xyz>2023-12-27 22:04:12 -0500
commit3187a32f7f0253ded7a41c4c21612253e525a8fe (patch)
tree76d3f6de872927dcd579feccc3c9d874b95e83df /src/asset-manager.cpp
parentc9db77a8f789858b9e1ceb60edb5c463b30451ed (diff)
assets are global and stored in the project file
Diffstat (limited to 'src/asset-manager.cpp')
-rw-r--r--src/asset-manager.cpp90
1 files changed, 83 insertions, 7 deletions
diff --git a/src/asset-manager.cpp b/src/asset-manager.cpp
index 9fda1c1..b93a568 100644
--- a/src/asset-manager.cpp
+++ b/src/asset-manager.cpp
@@ -37,17 +37,37 @@ void AM_Load_Task(Asset &asset) {
asset.state = PKE_ASSET_LOADING_STATE_LOADED;
}
-AssetHandle AM_Register(const void *data, int64_t size, std::size_t alignment, const char *key) {
+inline Asset *AM_Get_Inner(AssetKey key) {
+ for (long b = 0; b <= Asset_BucketContainer.pkeHandle.bucketIndex; ++b) {
+ uint64_t count = 0;
+ if (b == Asset_BucketContainer.pkeHandle.bucketIndex) {
+ count = Asset_BucketContainer.pkeHandle.itemIndex;
+ } else {
+ count = maxAssetItemsPerBucket;
+ }
+ for (long i = 0; i < count; ++i) {
+ if (strncmp(key, Asset_BucketContainer.buckets[b].assets[i].key, 16) == 0) {
+ return &Asset_BucketContainer.buckets[b].assets[i];
+ }
+ }
+ }
+ return nullptr;
+}
+
+AssetHandle AM_Register(AssetKey key, const void *data, int64_t size, std::size_t alignment) {
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;
+ }
bool moved;
AssetHandle assetHandle{Buckets_NewHandle<AssetBucket>(maxAssetItemsPerBucket, Asset_BucketContainer, moved)};
Asset &asset = Asset_BucketContainer.buckets[assetHandle.bucketIndex].assets[assetHandle.itemIndex];
new (&asset) Asset{};
- int64_t keyLen = strlen(key);
- int64_t keyOffset = (keyLen > 16 ? keyLen - 16 : 0);
- strncpy(asset.key, key + keyOffset, 16);
+ asset.handle = assetHandle;
+ strncpy(asset.key, key, AssetKeyLength);
asset.basePath = nullptr;
asset.size = size;
asset.ptr = Pke_New(size, alignment);
@@ -56,14 +76,49 @@ AssetHandle AM_Register(const void *data, int64_t size, std::size_t alignment, c
return assetHandle;
}
-AssetHandle AM_Register(const char *path) {
+AssetHandle AM_Register(AssetKey key, const char *path) {
+ Asset *searchedAsset = AM_Get_Inner(key);
+ if (searchedAsset != nullptr) {
+ return searchedAsset->handle;
+ }
bool moved = false;
AssetHandle assetHandle{Buckets_NewHandle<AssetBucket>(maxAssetItemsPerBucket, Asset_BucketContainer, moved)};
Asset &asset = Asset_BucketContainer.buckets[assetHandle.bucketIndex].assets[assetHandle.itemIndex];
new (&asset) Asset{};
+ asset.handle = assetHandle;
+ strncpy(asset.key, key, AssetKeyLength);
+ int64_t pathLen = strlen(path);
+ auto *copiedPath = Pke_New<char>(pathLen + 1);
+ copiedPath[pathLen] = '\0';
+ strncpy(copiedPath, path, pathLen);
+ asset.basePath = copiedPath;
+ asset.state = PKE_ASSET_LOADING_STATE_LOADING;
+ std::packaged_task<void()> *task = Pke_New<std::packaged_task<void()>>();
+ new (task) std::packaged_task<void()>( [&asset] {
+ AM_Load_Task(asset);
+ });
+ asset.future = task->get_future();
+ PkeThreads_Enqueue(assetThreadPool, task);
+ return assetHandle;
+}
+
+AssetHandle AM_Register(const char *path) {
+ NULL_CHAR_ARR(assetKey, AssetKeyLength);
int64_t pathLen = strlen(path);
- int64_t pathOffset = (pathLen > 16 ? pathLen - 16 : 0);
- strncpy(asset.key, path + pathOffset, 16);
+ int64_t pathOffset = (pathLen > AssetKeyLength ? pathLen - AssetKeyLength : 0);
+ strncpy(assetKey, path + pathOffset, AssetKeyLength);
+
+ Asset *searchedAsset = AM_Get_Inner(assetKey);
+ if (searchedAsset != nullptr) {
+ return searchedAsset->handle;
+ }
+
+ bool moved = false;
+ AssetHandle assetHandle{Buckets_NewHandle<AssetBucket>(maxAssetItemsPerBucket, Asset_BucketContainer, moved)};
+ Asset &asset = Asset_BucketContainer.buckets[assetHandle.bucketIndex].assets[assetHandle.itemIndex];
+ new (&asset) Asset{};
+ asset.handle = assetHandle;
+ strncpy(asset.key, assetKey, AssetKeyLength);
auto *copiedPath = Pke_New<char>(pathLen + 1);
copiedPath[pathLen] = '\0';
strncpy(copiedPath, path, pathLen);
@@ -120,6 +175,27 @@ const Asset *AM_Get(AssetHandle assetHandle) {
return &asset;
}
+const AssetHandle AM_GetHandle(AssetKey key) {
+ Asset *searchedAsset = AM_Get_Inner(key);
+ if (searchedAsset != nullptr) {
+ return searchedAsset->handle;
+ }
+ return AssetHandle_MAX;
+}
+
+uint64_t AM_GetBucketCount() {
+ return Asset_BucketContainer.pkeHandle.bucketIndex + 1;
+}
+
+Asset *AM_GetAssets(uint64_t bucketIndex, uint64_t &itemCount) {
+ if (bucketIndex == Asset_BucketContainer.pkeHandle.bucketIndex) {
+ itemCount = Asset_BucketContainer.pkeHandle.itemIndex;
+ } else {
+ itemCount = maxAssetItemsPerBucket;
+ }
+ return Asset_BucketContainer.buckets[bucketIndex].assets;
+}
+
void AM_DebugPrint() {
printf("Asset Manager printout:\n");
for (uint64_t b = 0; b <= Asset_BucketContainer.pkeHandle.bucketIndex; ++b) {