summaryrefslogtreecommitdiffstats
path: root/src/AssetManager.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/AssetManager.hpp')
-rw-r--r--src/AssetManager.hpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/AssetManager.hpp b/src/AssetManager.hpp
index c386f7c..5273a2a 100644
--- a/src/AssetManager.hpp
+++ b/src/AssetManager.hpp
@@ -142,6 +142,17 @@ inline bool operator==(const BlockModel::ElementData::FaceData::Uv &lhs,
return lhs.x1 == rhs.x1 && lhs.y1 == rhs.y1 && lhs.x2 == rhs.x2 && lhs.y2 == rhs.y2;
}
+struct Asset {
+ virtual ~Asset();
+};
+
+struct AssetTreeNode {
+ std::vector<std::unique_ptr<AssetTreeNode>> childs;
+ std::string name;
+ AssetTreeNode *parent;
+ std::unique_ptr<Asset> asset;
+};
+
class AssetManager {
Texture *textureAtlas;
std::map<std::string, BlockId> assetIds;
@@ -149,6 +160,7 @@ class AssetManager {
std::map<BlockTextureId,glm::vec4> textureAtlasIndexes;
std::map<std::string, BlockModel> models;
std::map<BlockId, std::string> blockIdToBlockName;
+ std::unique_ptr<AssetTreeNode> assetTree;
public:
AssetManager();
@@ -177,4 +189,27 @@ public:
std::string GetAssetNameByBlockId(BlockId block);
void ParseBlockModels();
+
+ void LoadAssets();
+
+ template <typename T>
+ T *GetAsset(const std::string &assetName) {
+ AssetTreeNode *node = assetTree.get();
+ unsigned int pos = 1;
+ unsigned int prevPos = 1;
+ size_t x = assetName.size();
+ while (pos < assetName.size()) {
+ for (; assetName[pos] != '/' && pos < assetName.size(); pos++);
+ std::string dirName = assetName.substr(prevPos, pos - prevPos);
+ for (const auto &asset : node->childs) {
+ if (asset->name == dirName) {
+ node = asset.get();
+ break;
+ }
+ }
+ pos++;
+ prevPos = pos;
+ }
+ return dynamic_cast<T*>(node->asset.get());
+ }
};