summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/AssetManager.cpp32
-rw-r--r--src/AssetManager.hpp35
2 files changed, 64 insertions, 3 deletions
diff --git a/src/AssetManager.cpp b/src/AssetManager.cpp
index f5284a4..28d6050 100644
--- a/src/AssetManager.cpp
+++ b/src/AssetManager.cpp
@@ -11,7 +11,7 @@
namespace fs = std::experimental::filesystem::v1;
-//const fs::path pathToAssets = "./assets/";
+const fs::path pathToAssets = "./assets/";
//const fs::path pathToAssetsList = "./items.json";
//const fs::path pathToTextureIndex = "./textures.json";
const std::string pathToAssetsList = "./items.json";
@@ -20,10 +20,11 @@ const std::string pathToTextureIndex = "./textures.json";
const fs::path pathToModels = "./assets/minecraft/models/";
AssetManager::AssetManager() {
+ LoadAssets();
LoadIds();
LoadTextureResources();
LoadBlockModels();
- ParseBlockModels();
+ ParseBlockModels();
}
void AssetManager::LoadIds() {
@@ -536,4 +537,29 @@ void AssetManager::ParseBlockModels() {
}
}
}
-} \ No newline at end of file
+}
+
+std::unique_ptr<Asset> ParseAsset(const fs::path &file) {
+ return std::unique_ptr<Asset>();
+}
+
+void WalkDirEntry(const fs::directory_entry &dirEntry, AssetTreeNode *node) {
+ for (auto &file : fs::directory_iterator(dirEntry)) {
+ node->childs.push_back(std::make_unique<AssetTreeNode>());
+ AssetTreeNode *fileNode = node->childs.back().get();
+ fileNode->parent = node;
+ fileNode->name = file.path().stem().string();
+ if (fs::is_directory(file)) {
+ WalkDirEntry(file, fileNode);
+ }
+ else {
+ fileNode->asset = ParseAsset(file);
+ }
+ }
+}
+
+void AssetManager::LoadAssets() {
+ assetTree = std::make_unique<AssetTreeNode>();
+ assetTree->name = "/";
+ WalkDirEntry(fs::directory_entry(pathToAssets), assetTree.get());
+}
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());
+ }
};