diff options
| -rw-r--r-- | src/asset-manager.cpp | 38 | ||||
| -rw-r--r-- | src/asset-manager.hpp | 3 |
2 files changed, 30 insertions, 11 deletions
diff --git a/src/asset-manager.cpp b/src/asset-manager.cpp index a902381..37a2a17 100644 --- a/src/asset-manager.cpp +++ b/src/asset-manager.cpp @@ -32,10 +32,7 @@ void AssetManagerInit() { assetBuckets = pke::PkeNew<AssetBucket>(bucketIncrementer); } -AssetHandle RegisterAsset(const void *data, int64_t size, const char *key) { - 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"); +AssetHandle RegisterAsset_Inner(const void *src, void *dst, int64_t size, const char *key) { AssetHandle assetHandle{assetCounter | bucketCounter}; // update our counters and buckets @@ -55,20 +52,41 @@ AssetHandle RegisterAsset(const void *data, int64_t size, const char *key) { } } - void *target = pke::PkeNew(size); - std::memcpy(target, data, size); + if (src != nullptr) { + std::memcpy(dst, src, size); + } Asset *asset = &assetBuckets[GetBucketIndex(assetHandle)].assets[GetAssetIndex(assetHandle)]; - asset->ptr = target; + asset->ptr = dst; asset->size = size; int64_t keyLen = std::strlen(key); std::memcpy(asset->key, key, keyLen > 16 ? 16 : keyLen); return assetHandle; } -AssetHandle RegisterAsset(char *path) { - // TODO load file +AssetHandle RegisterAsset(const void *data, int64_t size, const char *key) { + 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"); + void *target = pke::PkeNew(size); + return RegisterAsset_Inner(data, target, size, key); +} + +AssetHandle RegisterAsset(const char *path) { + std::ifstream file(path, std::ios::ate | std::ios::binary); + if (!file.is_open()) { + throw "failed to open file"; + } + auto fileSize = (int64_t)file.tellg(); + void *target = pke::PkeNew(fileSize); + int64_t pathLen = strlen(path); - return RegisterAsset(nullptr, 0, path + (pathLen > 16 ? pathLen - 16 : 0)); + auto assetHandle = RegisterAsset_Inner(nullptr, target, 0, path + (pathLen > 16 ? pathLen - 16 : 0)); + Asset *asset = &assetBuckets[GetBucketIndex(assetHandle)].assets[GetAssetIndex(assetHandle)]; + file.seekg(0); + file.read(static_cast<char *>(asset->ptr), fileSize); + file.close(); + asset->size = fileSize; + return assetHandle; } void DestroyAsset(AssetHandle assetHandle) { diff --git a/src/asset-manager.hpp b/src/asset-manager.hpp index 2354cba..8a45d48 100644 --- a/src/asset-manager.hpp +++ b/src/asset-manager.hpp @@ -4,6 +4,7 @@ #include "macros.hpp" #include "memory.hpp" +#include <fstream> #include <cstdint> #include <cstring> #include <cassert> @@ -18,7 +19,7 @@ struct Asset{ void AssetManagerInit(); AssetHandle RegisterAsset(const void *data, int64_t size, const char *key); -AssetHandle RegisterAsset(char *path); +AssetHandle RegisterAsset(const char *path); void DestroyAsset(AssetHandle assetHandle); const Asset *GetAsset(AssetHandle assetHandle); |
