Grindstone Game Engine v0.2.0
An open source game engine and toolkit.
Loading...
Searching...
No Matches
ThumbnailManager.hpp
1#pragma once
2
3#include <unordered_map>
4#include <filesystem>
5#include <vector>
6
7#include <Common/ResourcePipeline/Uuid.hpp>
8#include <EngineCore/Assets/Asset.hpp>
9#include <Common/Graphics/Image.hpp>
10
11namespace Grindstone::GraphicsAPI {
12 class Image;
13 class DescriptorSet;
14}
15
16namespace Grindstone::Editor {
17 using ThumbnailGenerateFn = bool(*)(Grindstone::Uuid uuid);
19 public:
20 struct AtlasCoords {
21 float uv0x;
22 float uv0y;
23 float uv1x;
24 float uv1y;
25 };
26
27 void RegisterGenerator(AssetType type, ThumbnailGenerateFn generator);
28 void DeregisterGenerator(AssetType type, ThumbnailGenerateFn generator);
29
30 bool Initialize();
31
32 Grindstone::GraphicsAPI::DescriptorSet* GetAtlasTextureDescriptorSet();
33
34 AtlasCoords GetCoordsByIndex(uint32_t index) const;
35
36 AtlasCoords GetFolderIconCoords() const;
37 AtlasCoords GetGenericBinaryIconCoords() const;
38 AtlasCoords GetPluginIconCoords() const;
39 AtlasCoords GetDotnetIconCoords() const;
40 AtlasCoords GetCmakeIconCoords() const;
41
42 // This function will get existing icons but will not request new icons to be generated.
43 AtlasCoords GetThumbnailCoordsFromCache(AssetType type, Grindstone::Uuid uuid);
44
45 // Frees existing thumbnails from memory.
46 bool FreeThumbnailFromMemory(Grindstone::Uuid uuid);
47
48 // This function will get existing icons and will request new icons to be generated if none exist.
49 ThumbnailManager::AtlasCoords RequestThumbnail(AssetType type, Grindstone::Uuid uuid);
50
51 // Frees existing thumbnails from storage if it exists.
52 bool DeleteThumbnailFromStorage(Grindstone::Uuid uuid);
53
54 // Creates all thumbnails dispatched via RequestThumbnail.
55 void CreateRequestedThumbnails();
56
57 protected:
58 uint16_t LoadDdsBufferToAtlas(std::string_view name, Grindstone::Containers::BufferSpan inputBuffer);
59 uint16_t LoadNamedAssetToAtlas(std::string_view name);
60 uint16_t LoadThumbnailByPathToAtlas(const std::filesystem::path& path);
61
62 protected:
63 enum class IconStatus {
64 Pending,
65 Failed,
66 Loading,
67 Generating,
68 Resolved
69 };
70 struct IconData {
71 IconStatus status = IconStatus::Pending;
72 AtlasCoords coords;
73 };
74 std::unordered_map<AssetType, ThumbnailGenerateFn> generators;
75 std::unordered_map<Grindstone::Uuid, IconData> iconsByUuid;
76 std::vector<std::pair<Grindstone::AssetType, Grindstone::Uuid>> requestedThumbnails;
77
78 Grindstone::GraphicsAPI::Image* thumbnailAtlasImage = nullptr;
79 Grindstone::GraphicsAPI::DescriptorSet* thumbnailAtlasDescriptorSet = nullptr;
80
81 std::vector<uint16_t> freeIndices;
82
83 struct {
84 uint16_t folder;
85 uint16_t plugin;
86 uint16_t generic;
87 uint16_t dotnet;
88 uint16_t cmake;
89 uint16_t asset[static_cast<size_t>(AssetType::Count)];
90 } defaultIcons;
91
92 uint32_t thumbnailFreeCount = 0;
93 uint32_t thumbnailCapacity = 0;
94 uint32_t thumbnailPixelSize = 0; // Width or height, as thumbnails are square.
95 uint32_t atlasPixelWidth = 0;
96 uint32_t atlasPixelHeight = 0;
97 uint32_t thumbnailsPerAtlasRow = 0;
98 };
99}
Definition ThumbnailManager.hpp:18
Definition DescriptorSet.hpp:15
Definition Image.hpp:49
Definition Uuid.hpp:7
Definition ThumbnailManager.hpp:20
Definition ThumbnailManager.hpp:70