diff options
Diffstat (limited to 'mwe/resource-manager/TextureMap.cpp')
-rw-r--r-- | mwe/resource-manager/TextureMap.cpp | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/mwe/resource-manager/TextureMap.cpp b/mwe/resource-manager/TextureMap.cpp new file mode 100644 index 0000000..847bab9 --- /dev/null +++ b/mwe/resource-manager/TextureMap.cpp @@ -0,0 +1,74 @@ +#include "TextureMap.h" + + +#define STB_IMAGE_IMPLEMENTATION +#include "stb_image.h" + +#include <iostream> +#include <cstdint> + +TextureMap::TextureMap() + : m_texture(nullptr) +{ + +} + +TextureMap::~TextureMap() +{ + if (m_texture) + { + SDL_DestroyTexture(m_texture); + } +} + +//public +bool TextureMap::loadFromFile(const std::string& path, SDL_Renderer* renderer) +{ + assert(renderer != nullptr); + assert(!path.empty()); + + std::int32_t x = 0; + std::int32_t y = 0; + std::int32_t c = 0; + unsigned char* data = stbi_load(path.c_str(), &x, &y, &c, 0); + + if (data) + { + std::int32_t pitch = x * c; + pitch = (pitch + 3) & ~3; + + constexpr std::int32_t rmask = 0x000000ff; + constexpr std::int32_t gmask = 0x0000ff00; + constexpr std::int32_t bmask = 0x00ff0000; + const std::int32_t amask = c == 4 ? 0xff000000 : 0; + + auto* surface = SDL_CreateRGBSurfaceFrom(data, x, y, c * 8, pitch, rmask, gmask, bmask, amask); + + if (!surface) + { + std::cerr << "Unable to create texture surface: " << SDL_GetError() << "\n"; + stbi_image_free(data); + return false; + } + + m_texture = SDL_CreateTextureFromSurface(renderer, surface); + + SDL_FreeSurface(surface); + stbi_image_free(data); + + if (!m_texture) + { + std::cerr << "Failed to create texture for " << path << "\n"; + return false; + } + + //sets alpha blending + //SDL_SetTextureBlendMode(m_texture, SDL_BLENDMODE_BLEND); + m_size.x = x; + m_size.y = y; + + return true; + } + + return false; +} |