diff options
author | WBoerenkamps <wrj.boerenkamps@student.avans.nl> | 2024-10-25 20:59:34 +0200 |
---|---|---|
committer | WBoerenkamps <wrj.boerenkamps@student.avans.nl> | 2024-10-25 20:59:34 +0200 |
commit | 15a4c4a1cf67e13be53ef423c51c56488f332ea9 (patch) | |
tree | 661084fc8171089ce32bf779f2b3a85d634b38e4 /mwe/resource-manager/TextureMap.cpp | |
parent | f472e0ba3bf54fc5055cf9f08925bed3f98a1dbc (diff) | |
parent | b3b762a34e7ccb4a0dcd041a693ac7180af16002 (diff) |
merge conficts fixed
Diffstat (limited to 'mwe/resource-manager/TextureMap.cpp')
-rw-r--r-- | mwe/resource-manager/TextureMap.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/mwe/resource-manager/TextureMap.cpp b/mwe/resource-manager/TextureMap.cpp new file mode 100644 index 0000000..d82975c --- /dev/null +++ b/mwe/resource-manager/TextureMap.cpp @@ -0,0 +1,66 @@ +#include "TextureMap.h" + +#define STB_IMAGE_IMPLEMENTATION +#include "stb_image.h" + +#include <cstdint> +#include <iostream> + +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; +} |