summaryrefslogtreecommitdiff
path: root/src/asset-manager.hpp
blob: d52145f227a8df5aa80f58ecb170cfbe036283c1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#ifndef PKE_ASSET_MANAGER_HPP
#define PKE_ASSET_MANAGER_HPP

#include "pk.h"

#include "asset-types.h"

#include <cstdint>
#include <future>

struct AssetHandle : public pk_bkt_arr_handle { };

constexpr AssetHandle AssetHandle_MAX = AssetHandle{ pk_bkt_arr_handle_MAX_constexpr };

TypeSafeInt_constexpr(AssetLoadingState, uint8_t, 0xFF);
TypeSafeInt_constexpr(AssetType, uint8_t, 0xFF);
TypeSafeInt_constexpr(AssetFlags, uint8_t, 0xFF);

const AssetLoadingState PKE_ASSET_LOADING_STATE_UNLOADED = AssetLoadingState {0};
const AssetLoadingState PKE_ASSET_LOADING_STATE_LOADING  = AssetLoadingState {1};
const AssetLoadingState PKE_ASSET_LOADING_STATE_LOADED   = AssetLoadingState {2};
const AssetLoadingState PKE_ASSET_LOADING_STATE_FAILED   = AssetLoadingState {3};

const AssetType PKE_ASSET_TYPE_UNSET   = AssetType {0x00};
const AssetType PKE_ASSET_TYPE_SHADER  = AssetType {0x01};
const AssetType PKE_ASSET_TYPE_MODEL   = AssetType {0x02};
const AssetType PKE_ASSET_TYPE_TEXTURE = AssetType {0x04};
const AssetType PKE_ASSET_TYPE_AUDIO   = AssetType {0x08};
const AssetType PKE_ASSET_TYPE_FONT    = AssetType {0x10};
const AssetType PKE_ASSET_TYPE_ALL     = AssetType {0xFF};

const AssetFlags PKE_ASSET_FLAGS_NONE        = AssetFlags {0x00};
const AssetFlags PKE_ASSET_FLAGS_MEM_STATIC  = AssetFlags {0x01};

union pke_asset_details {
	struct pke_asset_details_shader {
	} shader;
	struct pke_asset_details_model {
	} model;
	struct pke_asset_details_texture {
		uint32_t width;
		uint32_t height;
	} texture;
	struct pke_asset_details_audio {
	} audio;
	struct pke_asset_details_font {
	} font;
};

struct Asset {
	AssetHandle handle{};
	AssetKey key = {'\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0'};
	const char *basePath = nullptr;
	int64_t size = 0;
	const void *ptr = nullptr;
	std::future<void> future;
	int8_t referenceCount = 0;
	AssetLoadingState state = PKE_ASSET_LOADING_STATE_UNLOADED;
	AssetType type = PKE_ASSET_TYPE_UNSET;
	AssetFlags flags = PKE_ASSET_FLAGS_NONE;
	union pke_asset_details details;
};

void AM_Init();
AssetHandle AM_Register(const AssetKey &key, AssetType type, const void *data, int64_t size, std::size_t alignment, union pke_asset_details *details = nullptr);
AssetHandle AM_Register(const char *path, AssetType type, union pke_asset_details *details = nullptr);
AssetHandle AM_Register(const AssetKey &key, AssetType type, const char *path, union pke_asset_details *details = nullptr);
AssetHandle AM_Register_Static(const AssetKey &key, AssetType type, const void *data, int64_t size, union pke_asset_details *details = nullptr);
void AM_Release(AssetHandle assetHandle);
const Asset *AM_Get(AssetHandle assetHandle);
const AssetHandle AM_GetHandle(const AssetKey &key);
pk_bkt_arr *AM_GetAssets();
void AM_Teardown();
void AM_DebugPrint();

#endif /* PKE_ASSET_MANAGER_HPP */