diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2023-12-27 22:04:12 -0500 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2023-12-27 22:04:12 -0500 |
| commit | 3187a32f7f0253ded7a41c4c21612253e525a8fe (patch) | |
| tree | 76d3f6de872927dcd579feccc3c9d874b95e83df /src/asset-manager.cpp | |
| parent | c9db77a8f789858b9e1ceb60edb5c463b30451ed (diff) | |
assets are global and stored in the project file
Diffstat (limited to 'src/asset-manager.cpp')
| -rw-r--r-- | src/asset-manager.cpp | 90 |
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) { |
