shadow-over-bishkek001/src/render/TextureManager.h
2026-05-01 21:00:51 +03:00

83 lines
1.8 KiB
C++

#pragma once
#include "render/OpenGlExtensions.h"
#include "utils/Utils.h"
#include <memory>
#include <unordered_map>
#if defined EMSCRIPTEN || defined __ANDROID__
#define PNG_ENABLED
#endif
namespace ZL
{
struct TextureDataStruct {
size_t width;
size_t height;
std::vector<char> data;
enum Format {
R8, // Для шрифтов (GL_RED)
RGB, // BS_24BIT
RGBA // BS_32BIT
};
enum MipmapType {
NONE,
GENERATE
};
Format format = RGBA;
MipmapType mipmap = GENERATE;
};
class Texture
{
size_t width = 0;
size_t height = 0;
GLuint texID = 0;
public:
Texture(const TextureDataStruct& texData);
//Cubemap texture:
Texture(const std::array<TextureDataStruct, 6>& texDataArray);
~Texture();
GLuint getTexID();
size_t getWidth();
size_t getHeight();
};
TextureDataStruct CreateTextureDataFromBmp24(const std::string& fullFileName, const std::string& ZIPFileName="");
TextureDataStruct CreateTextureDataFromBmp32(const std::string& fullFileName, const std::string& ZIPFileName="");
#ifdef PNG_ENABLED
TextureDataStruct CreateTextureDataFromPng(const std::string& fullFileName, const std::string& ZIPFileName = "");
#endif
class TextureManager
{
public:
std::shared_ptr<Texture> LoadFromBmp24(const std::string& fileName, const std::string& zipFile = "");
std::shared_ptr<Texture> LoadFromBmp32(const std::string& fileName, const std::string& zipFile = "");
#ifdef PNG_ENABLED
std::shared_ptr<Texture> LoadFromPng(const std::string& fileName, const std::string& zipFile = "");
#endif
void Unload(const std::string& fileName, const std::string& zipFile = "");
void UnloadAll();
private:
std::unordered_map<std::string, std::shared_ptr<Texture>> textureMap;
static std::string MakeKey(const std::string& fileName, const std::string& zipFile);
};
}