Grindstone Game Engine v0.2.0
An open source game engine and toolkit.
Loading...
Searching...
No Matches
AssetManager.hpp
1#pragma once
2
3#include <vector>
4#include <string>
5#include <mutex>
6
7#include <Common/Buffer.hpp>
8#include <EngineCore/Assets/Loaders/AssetLoader.hpp>
9#include <EngineCore/Assets/AssetReference.hpp>
10
11#include "Asset.hpp"
12#include "AssetImporter.hpp"
13
14namespace Grindstone::Assets {
15 class AssetManager {
16 public:
17 AssetManager(AssetLoader* assetLoader);
18 ~AssetManager();
19
20 void ReloadQueuedAssets();
21 virtual AssetImporter* GetManager(AssetType assetType);
22
23 template<typename AssetImporterClass>
24 AssetImporterClass* GetManager() {
25 static_assert(std::is_base_of_v<Grindstone::AssetImporter, AssetImporterClass>, "AssetImporterClass not derived from Grindstone::AssetImporter");
26 return static_cast<AssetImporterClass*>(GetManager(AssetImporterClass::GetStaticAssetType()));
27 }
28
29 virtual void QueueReloadAsset(AssetType assetType, Uuid uuid);
30 virtual void* GetAssetByUuid(AssetType assetType, Uuid uuid);
31 virtual Grindstone::Uuid GetUuidByAddress(AssetType assetType, std::string_view address);
32
33 virtual AssetLoadBinaryResult LoadBinaryByUuid(AssetType assetType, Uuid uuid);
34 virtual AssetLoadTextResult LoadTextByUuid(AssetType assetType, Uuid uuid);
35 virtual const std::string& GetTypeName(AssetType assetType) const;
36
37 virtual void* GetAndIncrementAssetCount(Grindstone::AssetType assetType, Grindstone::Uuid uuid);
38 virtual void IncrementAssetCount(Grindstone::AssetType assetType, Grindstone::Uuid uuid);
39 virtual void DecrementAssetCount(Grindstone::AssetType assetType, Grindstone::Uuid uuid);
40
41 template<typename AssetImporterClass>
42 void RegisterAssetType() {
43 static_assert(std::is_base_of_v<Grindstone::AssetImporter, AssetImporterClass>, "AssetImporterClass not derived from Grindstone::AssetImporter");
44 RegisterAssetType(AssetImporterClass::GetStaticAssetType(), AssetImporterClass::GetStaticAssetTypeName(), Grindstone::Memory::AllocatorCore::Allocate<AssetImporterClass>());
45 }
46
47 template<typename T>
48 Grindstone::AssetReference<T> GetAssetReferenceByUuid(Grindstone::Uuid uuid) {
49 static_assert(std::is_base_of_v<Grindstone::Asset, T>, "T not derived from Grindstone::Asset");
50
51 if (!uuid.IsValid()) {
53 }
54
55 const size_t assetTypeSizeT = static_cast<size_t>(T::GetStaticType());
56 if (assetTypeSizeT < 1 || assetTypeSizeT >= assetTypeImporters.size()) {
58 }
59
60 AssetImporter* assetImporter = assetTypeImporters[assetTypeSizeT];
61
62 return Grindstone::AssetReference<T>::CreateAndIncrement(uuid);
63 }
64
65 template<typename T>
66 Grindstone::AssetReference<T> GetAssetReferenceByAddress(std::string_view address) {
67 static_assert(std::is_base_of_v<Grindstone::Asset, T>, "T not derived from Grindstone::Asset");
68 Grindstone::Uuid uuid = GetUuidByAddress(T::GetStaticType(), address);
69 return GetAssetReferenceByUuid<T>(uuid);
70 }
71
72 template<typename T>
73 T* GetAssetByUuid(Uuid uuid) {
74 static_assert(std::is_base_of_v<Grindstone::Asset, T>, "T not derived from Grindstone::Asset");
75 void* assetPtr = GetAssetByUuid(T::GetStaticType(), uuid);
76 return static_cast<T*>(assetPtr);
77 };
78
79 virtual void RegisterAssetType(AssetType assetType, const char* typeName, AssetImporter* importer);
80 virtual void UnregisterAssetType(AssetType assetType);
81 private:
82
83 bool ownsAssetLoader = false;
84 Grindstone::Assets::AssetLoader* assetLoader = nullptr;
85 std::vector<std::string> assetTypeNames;
86 std::vector<AssetImporter*> assetTypeImporters;
87 std::vector<std::pair<AssetType, Uuid>> queuedAssetReloads;
88 std::mutex reloadMutex;
89 };
90}
Definition AssetImporter.hpp:11
Definition AssetLoader.hpp:32
Definition Uuid.hpp:7
Definition AssetReference.hpp:45
Definition AssetLoader.hpp:20
Definition AssetLoader.hpp:26