Grindstone Game Engine v0.2.0
An open source game engine and toolkit.
Loading...
Searching...
No Matches
AssetImporter.hpp
1#pragma once
2
3#include <string>
4#include <map>
5
6#include <Common/ResourcePipeline/Uuid.hpp>
7#include <Common/ResourcePipeline/AssetType.hpp>
8
9namespace Grindstone {
11 public:
12 virtual ~AssetImporter() {};
13
14 virtual void QueueReloadAsset(Uuid uuid) = 0;
15 virtual void* LoadAsset(Uuid uuid) = 0;
16 virtual bool TryGetIfLoaded(Uuid uuid, void*& output) = 0;
17 virtual void* IncrementAssetUse(Uuid uuid) = 0;
18 virtual void DecrementAssetUse(Uuid uuid) = 0;
19 virtual void IncrementOrLoad(Uuid uuid) = 0;
20 virtual AssetType GetAssetType() { return assetType; }
21
22 protected:
23 AssetType assetType = AssetType::Undefined;
24
25 };
26
27 template<typename AssetStructType, AssetType internalAssetType>
28 class SpecificAssetImporter : public AssetImporter {
29 public:
30
31 SpecificAssetImporter() { assetType = internalAssetType; }
32 static AssetType GetStaticAssetType() { return internalAssetType; }
33 static const char* GetStaticAssetTypeName() { return GetAssetTypeToString(internalAssetType); }
34 virtual void OnDeleteAsset(AssetStructType& asset) {}
35
36 virtual void* IncrementAssetUse(Uuid uuid) override {
37 void* output = nullptr;
38 if (TryGetIfLoaded(uuid, output)) {
39 AssetStructType* asset = static_cast<AssetStructType*>(output);
40
41 if (asset->assetLoadStatus == AssetLoadStatus::Ready) {
42 ++asset->referenceCount;
43 return asset;
44 }
45
46 return nullptr;
47 }
48 else {
49 return LoadAsset(uuid);
50 }
51
52 return nullptr;
53 }
54
55 virtual void DecrementAssetUse(Uuid uuid) override {
56 void* output = nullptr;
57
58 if (TryGetIfLoaded(uuid, output) && output != nullptr) {
59 AssetStructType* asset = static_cast<AssetStructType*>(output);
60 if (asset->referenceCount <= 1) {
61 OnDeleteAsset(*asset);
62 assets.erase(uuid);
63 }
64 else {
65 --asset->referenceCount;
66 }
67 }
68 }
69
70 virtual bool TryGetIfLoaded(Uuid uuid, void*& output) override {
71 auto& assetInMap = assets.find(uuid);
72 if (assetInMap != assets.end()) {
73 output = &assetInMap->second;
74 return true;
75 }
76
77 return false;
78 }
79
80 virtual void IncrementOrLoad(Uuid uuid) override {
81 auto& assetInMap = assets.find(uuid);
82 if (assetInMap != assets.end()) {
83 ++assetInMap->second.referenceCount;
84 }
85
86 LoadAsset(uuid);
87 }
88
89 size_t AssetCount() const { return assets.size(); }
90 bool HasAssets() const { return assets.size() != 0; }
91
92 auto begin() noexcept { return assets.begin(); }
93 auto cbegin() const noexcept { return assets.begin(); }
94 auto end() noexcept { return assets.end(); }
95 auto cend() const noexcept { return assets.cend(); }
96
97 protected:
98 std::map<Uuid, AssetStructType> assets;
99
100 };
101}
Definition AssetImporter.hpp:10
Definition Uuid.hpp:7