diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/AssetManager.cpp | 156 | ||||
-rw-r--r-- | src/AssetManager.hpp | 64 | ||||
-rw-r--r-- | src/Render.cpp | 1 | ||||
-rw-r--r-- | src/RendererSectionData.cpp | 3 | ||||
-rw-r--r-- | src/RendererWorld.cpp | 6 | ||||
-rw-r--r-- | src/Texture.cpp | 91 | ||||
-rw-r--r-- | src/Texture.hpp | 14 |
7 files changed, 6 insertions, 329 deletions
diff --git a/src/AssetManager.cpp b/src/AssetManager.cpp index 0579b5d..7f4bf7d 100644 --- a/src/AssetManager.cpp +++ b/src/AssetManager.cpp @@ -9,7 +9,6 @@ #include <SDL.h> #include <SDL_image.h> -#include "Texture.hpp" #include "Utility.hpp" namespace fs = std::experimental::filesystem::v1; @@ -34,7 +33,6 @@ AssetManager::AssetManager() { LoadTextures(); LoadIds(); - LoadTextureResources(); ParseBlockModels(); } @@ -52,160 +50,6 @@ void AssetManager::LoadIds() { } 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>(); - float textureWidth = index["meta"]["size"]["w"].get<int>(); - float textureHeight = index["meta"]["size"]["h"].get<int>(); - size_t sizeName = 0,sizeTexture = 0; - for (auto &it:index["frames"]) { - auto frame = it["frame"]; - TextureCoordinates coord; - coord.x = frame["x"].get<int>() / textureWidth; - coord.y = frame["y"].get<int>() / textureHeight; - coord.w = frame["w"].get<int>() / textureWidth; - coord.h = frame["h"].get<int>() / textureHeight; - std::string assetName = it["filename"].get<std::string>(); - assetName.insert(0, "minecraft/textures/"); - assetName.erase(assetName.length() - 4); - assetName.shrink_to_fit(); - sizeName += sizeof(assetName) + assetName.capacity(); - sizeTexture += sizeof(coord); - assetTextures[assetName] = coord; - } - textureAtlas = new Texture(filename); - LOG(INFO) << "Texture atlas id is " << textureAtlas->texture; -} - -TextureCoordinates AssetManager::GetTextureByAssetName(const std::string &AssetName) { - auto it = assetTextures.find(AssetName); - if (it != assetTextures.end()) - return it->second; - else - return TextureCoordinates{-1, -1, -1, -1}; -} - -std::string AssetManager::GetTextureAssetNameByBlockId(BlockTextureId block) { - //Block sides: 0 - bottom, 1 - top, 2 - north, 3 - south, 4 - west, 5 - east 6 - every side - const std::map<BlockTextureId, std::string> lookupTable = { - {BlockTextureId(0, 0), "minecraft/textures/blocks/air"}, - {BlockTextureId(1, 0), "minecraft/textures/blocks/stone"}, - {BlockTextureId(1, 1), "minecraft/textures/blocks/stone_granite"}, - - {BlockTextureId(2, 0, 0), "minecraft/textures/blocks/dirt"}, - {BlockTextureId(2, 0, 1), "minecraft/textures/blocks/grass_top"}, - {BlockTextureId(2, 0, 2), "minecraft/textures/blocks/grass_side"}, - {BlockTextureId(2, 0, 3), "minecraft/textures/blocks/grass_side"}, - {BlockTextureId(2, 0, 4), "minecraft/textures/blocks/grass_side"}, - {BlockTextureId(2, 0, 5), "minecraft/textures/blocks/grass_side"}, - - {BlockTextureId(3, 0), "minecraft/textures/blocks/dirt"}, - {BlockTextureId(4, 0), "minecraft/textures/blocks/cobblestone"}, - {BlockTextureId(5, 0), "minecraft/textures/blocks/planks"}, - - {BlockTextureId(7, 0), "minecraft/textures/blocks/bedrock"}, - - {BlockTextureId(17, 0, 0), "minecraft/textures/blocks/log_oak_top"}, - {BlockTextureId(17, 0, 1), "minecraft/textures/blocks/log_oak_top"}, - {BlockTextureId(17, 0, 2), "minecraft/textures/blocks/log_oak"}, - {BlockTextureId(17, 0, 3), "minecraft/textures/blocks/log_oak"}, - {BlockTextureId(17, 0, 4), "minecraft/textures/blocks/log_oak"}, - {BlockTextureId(17, 0, 5), "minecraft/textures/blocks/log_oak"}, - - {BlockTextureId(17, 1, 0), "minecraft/textures/blocks/log_spruce_top"}, - {BlockTextureId(17, 1, 1), "minecraft/textures/blocks/log_spruce_top"}, - {BlockTextureId(17, 1, 2), "minecraft/textures/blocks/log_spruce"}, - {BlockTextureId(17, 1, 3), "minecraft/textures/blocks/log_spruce"}, - {BlockTextureId(17, 1, 4), "minecraft/textures/blocks/log_spruce"}, - {BlockTextureId(17, 1, 5), "minecraft/textures/blocks/log_spruce"}, - - {BlockTextureId(17, 2, 0), "minecraft/textures/blocks/log_birch_top"}, - {BlockTextureId(17, 2, 1), "minecraft/textures/blocks/log_birch_top"}, - {BlockTextureId(17, 2, 2), "minecraft/textures/blocks/log_birch"}, - {BlockTextureId(17, 2, 3), "minecraft/textures/blocks/log_birch"}, - {BlockTextureId(17, 2, 4), "minecraft/textures/blocks/log_birch"}, - {BlockTextureId(17, 2, 5), "minecraft/textures/blocks/log_birch"}, - - {BlockTextureId(17, 3, 0), "minecraft/textures/blocks/log_jungle_top"}, - {BlockTextureId(17, 3, 1), "minecraft/textures/blocks/log_jungle_top"}, - {BlockTextureId(17, 3, 2), "minecraft/textures/blocks/log_jungle"}, - {BlockTextureId(17, 3, 3), "minecraft/textures/blocks/log_jungle"}, - {BlockTextureId(17, 3, 4), "minecraft/textures/blocks/log_jungle"}, - {BlockTextureId(17, 3, 5), "minecraft/textures/blocks/log_jungle"}, - - {BlockTextureId(18, 0), "minecraft/textures/blocks/leaves_oak"}, - {BlockTextureId(18, 1), "minecraft/textures/blocks/leaves_spruce"}, - {BlockTextureId(18, 2), "minecraft/textures/blocks/leaves_birch"}, - {BlockTextureId(18, 3), "minecraft/textures/blocks/leaves_jungle"}, - - {BlockTextureId(61, 0, 0), "minecraft/textures/blocks/furnace_side"}, - {BlockTextureId(61, 0, 1), "minecraft/textures/blocks/furnace_top"}, - {BlockTextureId(61, 0, 2), "minecraft/textures/blocks/furnace_front_off"}, - {BlockTextureId(61, 0, 3), "minecraft/textures/blocks/furnace_side"}, - {BlockTextureId(61, 0, 4), "minecraft/textures/blocks/furnace_side"}, - {BlockTextureId(61, 0, 5), "minecraft/textures/blocks/furnace_side"}, - - {BlockTextureId(62, 0, 0), "minecraft/textures/blocks/furnace_side"}, - {BlockTextureId(62, 0, 1), "minecraft/textures/blocks/furnace_top"}, - {BlockTextureId(62, 0, 2), "minecraft/textures/blocks/furnace_front_on"}, - {BlockTextureId(62, 0, 3), "minecraft/textures/blocks/furnace_side"}, - {BlockTextureId(62, 0, 4), "minecraft/textures/blocks/furnace_side"}, - {BlockTextureId(62, 0, 5), "minecraft/textures/blocks/furnace_side"}, - - - {BlockTextureId(31, 0), "minecraft/textures/blocks/deadbush"}, - {BlockTextureId(31, 1), "minecraft/textures/blocks/tallgrass"}, - {BlockTextureId(31, 2), "minecraft/textures/blocks/fern"}, - }; - - auto ret = lookupTable.find(block); - return (ret == lookupTable.end()) ? "" : ret->second; -} - -GLuint AssetManager::GetTextureAtlas() { - return textureAtlas->texture; -} - -TextureCoordinates AssetManager::GetTextureByBlock(BlockTextureId block) { - std::string assetName = this->GetTextureAssetNameByBlockId(block); - return this->GetTextureByAssetName(assetName); -} - -const std::map<BlockTextureId, glm::vec4> &AssetManager::GetTextureAtlasIndexes() { - if (!textureAtlasIndexes.empty()) - return textureAtlasIndexes; - - LOG(INFO) << "Initializing texture atlas..."; - for (int id = 1; id < 128; id++) { - for (int state = 0; state < 16; state++) { - BlockTextureId blockTextureId(id, state, 6); - if (!this->GetTextureByBlock(blockTextureId) && - !this->GetTextureByBlock(BlockTextureId(id, state, 0))) { - continue; - } - - if (this->GetTextureByBlock(blockTextureId)) { - for (int i = 0; i < 6; i++) { - TextureCoordinates tc = this->GetTextureByBlock(BlockTextureId(id, state, 6)); - textureAtlasIndexes[BlockTextureId(id, state, i)] = glm::vec4(tc.x, tc.y, tc.w, tc.h); - } - } else { - for (int i = 0; i < 6; i++) { - TextureCoordinates tc = this->GetTextureByBlock(BlockTextureId(id, state, i)); - textureAtlasIndexes[BlockTextureId(id, state, i)] = glm::vec4(tc.x, tc.y, tc.w, tc.h); - } - } - } - } - LOG(INFO) << "Created " << textureAtlasIndexes.size() << " texture indexes"; - - return textureAtlasIndexes; } AssetManager &AssetManager::Instance() { diff --git a/src/AssetManager.hpp b/src/AssetManager.hpp index 0663f48..3975b37 100644 --- a/src/AssetManager.hpp +++ b/src/AssetManager.hpp @@ -13,53 +13,6 @@ #include "Block.hpp" #include "TextureAtlas.hpp" -class Texture; - -struct TextureCoordinates { - TextureCoordinates(float x = -1, float y = -1, float w = -1, float h = -1) - : x(x), y(y), w(w), h(h) {} - - bool operator==(const TextureCoordinates &rhs) const { - return x == rhs.x && - y == rhs.y && - w == rhs.w && - h == rhs.h; - } - - explicit operator bool() const { - return !(*this == TextureCoordinates(-1, -1, -1, -1)); - } - - double x, y, w, h; - - operator glm::vec4() const { - return glm::vec4(x, y, w, h); - } -}; - -struct BlockTextureId { - //Block sides: 0 - bottom, 1 - top, 2 - north, 3 - south, 4 - west, 5 - east 6 - every side - BlockTextureId(int id = 0, int state = 0, int side = 6) - : id(id), state(state), side(side) {} - - int id : 9; - int state : 4; - int side : 3; - - - bool operator<(const BlockTextureId &rhs) const { - if (id < rhs.id) - return true; - if (rhs.id < id) - return false; - if (state < rhs.state) - return true; - if (rhs.state < state) - return false; - return side < rhs.side; - } -}; - struct BlockModel { bool IsBlock = false; std::string BlockName; @@ -167,10 +120,7 @@ struct AssetTexture : Asset { }; class AssetManager { - Texture *textureAtlas; std::map<std::string, BlockId> assetIds; - std::map<std::string, TextureCoordinates> assetTextures; - std::map<BlockTextureId,glm::vec4> textureAtlasIndexes; std::map<BlockId, std::string> blockIdToBlockName; std::unique_ptr<AssetTreeNode> assetTree; std::unique_ptr<TextureAtlas> atlas; @@ -178,21 +128,9 @@ public: AssetManager(); ~AssetManager(); - - void LoadTextureResources(); - - TextureCoordinates GetTextureByAssetName(const std::string &AssetName); - - std::string GetTextureAssetNameByBlockId(BlockTextureId block); - - GLuint GetTextureAtlas(); - - const std::map<BlockTextureId,glm::vec4> &GetTextureAtlasIndexes(); - + void LoadIds(); - TextureCoordinates GetTextureByBlock(BlockTextureId block); - static AssetManager& Instance(); const BlockModel *GetBlockModelByBlockId(BlockId block); diff --git a/src/Render.cpp b/src/Render.cpp index 1bd5273..88fe2cc 100644 --- a/src/Render.cpp +++ b/src/Render.cpp @@ -94,7 +94,6 @@ void Render::PrepareToRendering() { //TextureAtlas texture glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D_ARRAY, AssetManager::Instance().GetTextureAtlasId()); - AssetManager::Instance().GetTextureAtlasIndexes(); ImGui_ImplSdlGL3_Init(window); } diff --git a/src/RendererSectionData.cpp b/src/RendererSectionData.cpp index de79da4..fb2135a 100644 --- a/src/RendererSectionData.cpp +++ b/src/RendererSectionData.cpp @@ -162,8 +162,7 @@ RendererSectionData ParseSection(const SectionsData §ions) std::array<BlockId, 4096> blockIdData = SetBlockIdData(sections); std::array<unsigned char, 4096> blockVisibility = GetBlockVisibilityData(sections, blockIdData, idModels); std::string textureName; - - const std::map<BlockTextureId, glm::vec4> &textureAtlas = AssetManager::Instance().GetTextureAtlasIndexes(); + data.hash = sections.section.GetHash(); data.sectionPos = sections.section.GetPosition(); diff --git a/src/RendererWorld.cpp b/src/RendererWorld.cpp index 5d0d6a8..ed4a4a3 100644 --- a/src/RendererWorld.cpp +++ b/src/RendererWorld.cpp @@ -427,12 +427,14 @@ void RendererWorld::PrepareRender() { skyShader = new Shader("./shaders/sky.vs", "./shaders/sky.fs"); skyShader->Use(); glUniform1i(glGetUniformLocation(skyShader->Program, "textureAtlas"), 0); - TextureCoordinates sunTexture = AssetManager::Instance().GetTextureByAssetName("minecraft/textures/environment/sun"); + TextureCoord sunTexture = AssetManager::Instance().GetTexture("/minecraft/textures/environment/sun"); glUniform4f(glGetUniformLocation(skyShader->Program, "sunTexture"), sunTexture.x, sunTexture.y, sunTexture.w, sunTexture.h); - TextureCoordinates moonTexture = AssetManager::Instance().GetTextureByAssetName("minecraft/textures/environment/moon_phases"); + glUniform1f(glGetUniformLocation(skyShader->Program, "sunTextureLayer"), sunTexture.layer); + TextureCoord moonTexture = AssetManager::Instance().GetTexture("/minecraft/textures/environment/moon_phases"); moonTexture.w /= 4.0f; //First phase will be fine for now moonTexture.h /= 2.0f; glUniform4f(glGetUniformLocation(skyShader->Program, "moonTexture"), moonTexture.x, moonTexture.y, moonTexture.w, moonTexture.h); + glUniform1f(glGetUniformLocation(skyShader->Program, "moonTextureLayer"), moonTexture.layer); } void RendererWorld::Update(double timeToUpdate) { diff --git a/src/Texture.cpp b/src/Texture.cpp deleted file mode 100644 index 5693682..0000000 --- a/src/Texture.cpp +++ /dev/null @@ -1,91 +0,0 @@ -#include "Texture.hpp" - -#include <SDL.h> -#include <SDL_image.h> -#include <easylogging++.h> - - -bool IsImgInitialized = false; - -Texture::Texture(std::string filename, GLenum textureWrapping, GLenum textureFiltering) { - glGenTextures(1, &texture); - glBindTexture(GL_TEXTURE_2D, texture); - - //Texture options - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, textureWrapping); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, textureWrapping); - - //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - - //Initialize SDL2_image - if (!IsImgInitialized) { - IsImgInitialized = true; - int imgFlags = IMG_INIT_PNG; - if (!(IMG_Init(imgFlags) & imgFlags)) - { - throw std::runtime_error("IMG Not initialized: " + std::string(IMG_GetError())); - } - } - - //Load image - SDL_Surface *image = IMG_Load(filename.c_str()); - if (!image) - throw std::runtime_error("Image not loaded: " + std::string(IMG_GetError())); - - if (image->format->BytesPerPixel != 4) - throw std::runtime_error("PNG format is not RGBA"); - - //Flip surface - SDL_LockSurface(image); - - { - int pitch = image->pitch; - int height = image->h; - void* image_pixels = image->pixels; - - int index; - void* temp_row; - int height_div_2; - - temp_row = (void *)malloc(pitch); - if (!temp_row) - throw std::runtime_error("Not enough memory for texture flipping"); - - height_div_2 = (int)(height * .5); - for (index = 0; index < height_div_2; index++) { - memcpy((Uint8 *)temp_row, - (Uint8 *)(image_pixels)+ - pitch * index, - pitch); - - memcpy( - (Uint8 *)(image_pixels)+ - pitch * index, - (Uint8 *)(image_pixels)+ - pitch * (height - index - 1), - pitch); - memcpy( - (Uint8 *)(image_pixels)+ - pitch * (height - index - 1), - temp_row, - pitch); - } - free(temp_row); - } - - //Creating texture - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image->w,image->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, - (GLvoid *) image->pixels); - SDL_UnlockSurface(image); - - //glGenerateMipmap(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, 0); - - SDL_FreeSurface(image); -} - -Texture::~Texture() { - glDeleteTextures(1, &texture); -} diff --git a/src/Texture.hpp b/src/Texture.hpp deleted file mode 100644 index cda3e36..0000000 --- a/src/Texture.hpp +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include <string> - -#include <GL/glew.h> - -class Texture { - Texture(Texture&); - Texture&operator=(Texture&); -public: - GLuint texture; - Texture(std::string filename, GLenum textureWrapping = GL_CLAMP_TO_BORDER, GLenum textureFiltering = GL_NEAREST); - ~Texture(); -};
\ No newline at end of file |