diff options
author | Loek Le Blansch <loek@pipeframe.xyz> | 2024-11-04 08:28:18 +0100 |
---|---|---|
committer | Loek Le Blansch <loek@pipeframe.xyz> | 2024-11-04 08:28:18 +0100 |
commit | 06f65659fc6ffde7cabd2135040cbfbf089e5a24 (patch) | |
tree | e3570bea52b87b6919550ee81d17927ccbc11cc5 /mwe/resource-manager/TextureMap.cpp | |
parent | 128969619a22dfc17a9ea35335c0d21c6ad0c954 (diff) | |
parent | 6aa8fdd04728b6a499f526de727514ae3d0490b4 (diff) |
merge `origin/master` into `master`
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; +} |