diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/AssetManager.cpp | 70 | ||||
-rw-r--r-- | src/core/AssetManager.hpp | 33 | ||||
-rw-r--r-- | src/core/Core.cpp | 9 | ||||
-rw-r--r-- | src/core/Core.hpp | 3 |
4 files changed, 107 insertions, 8 deletions
diff --git a/src/core/AssetManager.cpp b/src/core/AssetManager.cpp new file mode 100644 index 0000000..9913c18 --- /dev/null +++ b/src/core/AssetManager.cpp @@ -0,0 +1,70 @@ +#include <easylogging++.h> +#include <nlohmann/json.hpp> +#include "AssetManager.hpp" + +namespace fs = std::experimental::filesystem; + +const fs::path pathToAssets = "./assets/"; +const fs::path pathToAssetsList = "./items.json"; +const fs::path pathToTextureIndex = "./textures.json"; + +AssetManager::AssetManager() { + for (auto &it:fs::recursive_directory_iterator(pathToAssets)) { + + } + LoadIds(); + LoadTextureResources(); +} + +void AssetManager::LoadIds() { + std::ifstream in(pathToAssetsList); + nlohmann::json index; + in >> index; + for (auto &it:index) { + int id = it["type"].get<int>(); + int state = it["meta"].get<int>(); + std::string blockName = it["text_type"].get<std::string>(); + assetIds[blockName] = Block(id, state, 0); + } + LOG(INFO) << "Loaded " << assetIds.size() << " ids"; +} + +AssetManager::~AssetManager() { + delete textureAtlas; +} + +//TODO: This function must be replaced with runtime texture atlas generating +void AssetManager::LoadTextureResources() { + std::ifstream in(pathToTextureIndex); + nlohmann::json index; + in >> index; + std::string filename = index["meta"]["image"].get<std::string>(); + for (auto &it:index["frames"]) { + auto frame = it["frame"]; + TextureCoord coord; + coord.x = frame["x"].get<int>(); + coord.y = frame["y"].get<int>(); + coord.w = frame["w"].get<int>(); + coord.h = frame["h"].get<int>(); + std::string assetName = it["filename"].get<std::string>(); + assetName.insert(0,"minecraft/textures/"); + assetName.erase(assetName.length()-4); + LOG(ERROR)<<assetName; + assetTextures[assetName]=coord; + } + + textureAtlas = new Texture(filename); + LOG(INFO) << "Texture atlas id is " << textureAtlas->texture; +} + +TextureCoord AssetManager::GetTextureByAssetName(std::string AssetName) { + return TextureCoord{0, 0, 0, 0}; +} + +std::string AssetManager::GetTextureAssetNameByBlockId(unsigned short BlockId, unsigned char BlockSide) { + +} + +const GLuint AssetManager::GetTextureAtlas() { + return textureAtlas->texture; +} diff --git a/src/core/AssetManager.hpp b/src/core/AssetManager.hpp new file mode 100644 index 0000000..23b2ba6 --- /dev/null +++ b/src/core/AssetManager.hpp @@ -0,0 +1,33 @@ +#pragma once + +#include <experimental/filesystem> +#include <map> +#include <GL/glew.h> +#include <glm/vec4.hpp> +#include <nlohmann/json.hpp> +#include "../world/Block.hpp" +#include "../graphics/Texture.hpp" + +struct TextureCoord{ + unsigned int x,y,w,h; +}; + +class AssetManager { + Texture *textureAtlas; + std::map<std::string,Block> assetIds; + std::map<std::string,TextureCoord> assetTextures; +public: + AssetManager(); + + ~AssetManager(); + + void LoadTextureResources(); + + TextureCoord GetTextureByAssetName(std::string AssetName); + + std::string GetTextureAssetNameByBlockId(unsigned short BlockId, unsigned char BlockSide = 0); + + const GLuint GetTextureAtlas(); + + void LoadIds(); +}; diff --git a/src/core/Core.cpp b/src/core/Core.cpp index 54a16a4..7814c32 100644 --- a/src/core/Core.cpp +++ b/src/core/Core.cpp @@ -108,6 +108,7 @@ Core::Core() { gameState = new GameState(client); std::thread loop = std::thread(&Core::UpdateGameState,this); std::swap(loop,gameStateLoopThread); + assetManager = new AssetManager; LOG(INFO) << "Core is initialized"; } @@ -291,13 +292,8 @@ void Core::RenderWorld(World &Target) { glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model)); glUniform1i(blockLoc, block.id); - std::string textureName = AssetManager::GetAssetNameByBlockId(block.id); - if (textureName.find("air") != std::string::npos) - continue; - Texture &texture1 = *(AssetManager::GetAsset(textureName).data.texture); - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, texture1.texture); + //glBindTexture(GL_TEXTURE_2D, texture1.texture); glUniform1i(glGetUniformLocation(shader->Program, "blockTexture"), 0); glDrawArrays(GL_TRIANGLES, 0, 36); @@ -316,7 +312,6 @@ void Core::SetMouseCapture(bool IsCaptured) { } void Core::PrepareToWorldRendering() { - glGenBuffers(1, &VBO); glGenBuffers(1, &VBO2); glGenVertexArrays(1, &VAO); diff --git a/src/core/Core.hpp b/src/core/Core.hpp index a877613..1c2bbc5 100644 --- a/src/core/Core.hpp +++ b/src/core/Core.hpp @@ -10,12 +10,13 @@ #include "../gui/Gui.hpp" #include "../graphics/Camera3D.hpp" #include "../graphics/Shader.hpp" -#include "../graphics/AssetManager.hpp" +#include "AssetManager.hpp" class Core { GameState *gameState; NetworkClient *client; sf::Window *window; + AssetManager *assetManager; bool isMouseCaptured = false, isRunning = true; enum { MainMenu, |