working on texture manager

This commit is contained in:
Vladislav Khorev 2026-05-01 21:00:51 +03:00
parent e04fcbb9bd
commit be6a8cca9e
9 changed files with 92 additions and 39 deletions

View File

@ -95,7 +95,7 @@ namespace ZL
renderer.shaderManager.AddShaderFromFiles("defaultColor", "resources/shaders/defaultColor.vertex", "resources/shaders/defaultColor_desktop.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("defaultColor", "resources/shaders/defaultColor.vertex", "resources/shaders/defaultColor_desktop.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("default", "resources/shaders/default.vertex", "resources/shaders/default_desktop.fragment", CONST_ZIP_FILE); renderer.shaderManager.AddShaderFromFiles("default", "resources/shaders/default.vertex", "resources/shaders/default_desktop.fragment", CONST_ZIP_FILE);
#endif #endif
loadingTexture = std::make_unique<Texture>(CreateTextureDataFromPng("resources/loading.png", "")); loadingTexture = renderer.textureManager.LoadFromPng("resources/loading.png", "");
float minDimension; float minDimension;
float width = Environment::projectionWidth; float width = Environment::projectionWidth;

View File

@ -49,7 +49,7 @@ namespace ZL
void Location::setup(const LocationSetup& params) void Location::setup(const LocationSetup& params)
{ {
roomTexture = std::make_unique<Texture>(CreateTextureDataFromPng(params.roomTexturePath, CONST_ZIP_FILE)); roomTexture = renderer.textureManager.LoadFromPng(params.roomTexturePath, CONST_ZIP_FILE);
roomMesh.data = LoadFromTextFile02(params.roomMeshPath, CONST_ZIP_FILE); roomMesh.data = LoadFromTextFile02(params.roomMeshPath, CONST_ZIP_FILE);
roomMesh.data.RotateByMatrix(Eigen::Quaternionf(Eigen::AngleAxisf(-M_PI * 0.5, Eigen::Vector3f::UnitY())).toRotationMatrix()); roomMesh.data.RotateByMatrix(Eigen::Quaternionf(Eigen::AngleAxisf(-M_PI * 0.5, Eigen::Vector3f::UnitY())).toRotationMatrix());
roomMesh.RefreshVBO(); roomMesh.RefreshVBO();
@ -62,9 +62,9 @@ namespace ZL
//auto playerTexture = std::make_shared<Texture>(CreateTextureDataFromPng("resources/w/gg/IMG_20260413_182354_992.png", CONST_ZIP_FILE)); //auto playerTexture = std::make_shared<Texture>(CreateTextureDataFromPng("resources/w/gg/IMG_20260413_182354_992.png", CONST_ZIP_FILE));
auto playerTexture = std::make_shared<Texture>(CreateTextureDataFromPng("resources/w/gg/UniV_Grid_2K_Base_color.png", CONST_ZIP_FILE)); auto playerTexture = renderer.textureManager.LoadFromPng("resources/w/gg/UniV_Grid_2K_Base_color.png", CONST_ZIP_FILE);
auto sparkTexture = std::make_shared<Texture>(CreateTextureDataFromPng("resources/w/spark.png", CONST_ZIP_FILE)); auto sparkTexture = renderer.textureManager.LoadFromPng("resources/w/spark.png", CONST_ZIP_FILE);
player = std::make_unique<Character>(); player = std::make_unique<Character>();
/* /*
@ -90,7 +90,7 @@ namespace ZL
player->weaponTexture = std::make_shared<Texture>(CreateTextureDataFromPng("resources/w/white.png", CONST_ZIP_FILE)); player->weaponTexture = renderer.textureManager.LoadFromPng("resources/w/white.png", CONST_ZIP_FILE);
//player->weaponMesh.AssignFrom(LoadFromTextFile02("resources/w/gg/knife001.txt", CONST_ZIP_FILE)); //player->weaponMesh.AssignFrom(LoadFromTextFile02("resources/w/gg/knife001.txt", CONST_ZIP_FILE));
player->weaponMesh.data = LoadFromTextFile02("resources/w/gg/knife002.txt", CONST_ZIP_FILE); player->weaponMesh.data = LoadFromTextFile02("resources/w/gg/knife002.txt", CONST_ZIP_FILE);
@ -132,7 +132,7 @@ namespace ZL
} }
} }
auto sparkTexture2 = std::make_shared<Texture>(CreateTextureDataFromPng("resources/w/star.png", CONST_ZIP_FILE)); auto sparkTexture2 = renderer.textureManager.LoadFromPng("resources/w/star.png", CONST_ZIP_FILE);
// Teleport zone visuals: an upward fountain of sparks parked at the // Teleport zone visuals: an upward fountain of sparks parked at the
// teleport position, so the player can spot the zone from a distance. // teleport position, so the player can spot the zone from a distance.

View File

@ -490,8 +490,7 @@ namespace ZL {
std::string path = t[key].get<std::string>(); std::string path = t[key].get<std::string>();
try { try {
std::cout << "UiManager: loading texture for button '" << btn->name << "' : " << path << " Zip file: " << zipFile << std::endl; std::cout << "UiManager: loading texture for button '" << btn->name << "' : " << path << " Zip file: " << zipFile << std::endl;
auto data = CreateTextureDataFromPng(path.c_str(), zipFile.c_str()); return renderer.textureManager.LoadFromPng(path, zipFile);
return std::make_shared<Texture>(data);
} }
catch (const std::exception& e) { catch (const std::exception& e) {
std::cerr << "UiManager: failed load texture " << path << " : " << e.what() << std::endl; std::cerr << "UiManager: failed load texture " << path << " : " << e.what() << std::endl;
@ -523,8 +522,7 @@ namespace ZL {
std::string path = t[key].get<std::string>(); std::string path = t[key].get<std::string>();
try { try {
std::cout << "UiManager: --loading texture for slider '" << s->name << "' : " << path << " Zip file: " << zipFile << std::endl; std::cout << "UiManager: --loading texture for slider '" << s->name << "' : " << path << " Zip file: " << zipFile << std::endl;
auto data = CreateTextureDataFromPng(path.c_str(), zipFile.c_str()); return renderer.textureManager.LoadFromPng(path, zipFile);
return std::make_shared<Texture>(data);
} }
catch (const std::exception& e) { catch (const std::exception& e) {
std::cerr << "UiManager: failed load texture " << path << " : " << e.what() << std::endl; std::cerr << "UiManager: failed load texture " << path << " : " << e.what() << std::endl;
@ -674,8 +672,7 @@ namespace ZL {
if (!texPath.empty()) { if (!texPath.empty()) {
try { try {
auto data = CreateTextureDataFromPng(texPath.c_str(), zipFile.c_str()); img->texture = renderer.textureManager.LoadFromPng(texPath, zipFile);
img->texture = std::make_shared<Texture>(data);
} }
catch (const std::exception& e) { catch (const std::exception& e) {
std::cerr << "UiManager: failed load texture for StaticImage '" << img->name << "' : " << e.what() << std::endl; std::cerr << "UiManager: failed load texture for StaticImage '" << img->name << "' : " << e.what() << std::endl;
@ -1058,14 +1055,10 @@ namespace ZL {
s->vertical = vertical; s->vertical = vertical;
try { try {
if (!trackPath.empty()) { if (!trackPath.empty())
auto data = CreateTextureDataFromPng(trackPath.c_str(), zipFile.c_str()); s->texTrack = renderer.textureManager.LoadFromPng(trackPath, zipFile);
s->texTrack = std::make_shared<Texture>(data); if (!knobPath.empty())
} s->texKnob = renderer.textureManager.LoadFromPng(knobPath, zipFile);
if (!knobPath.empty()) {
auto data = CreateTextureDataFromPng(knobPath.c_str(), zipFile.c_str());
s->texKnob = std::make_shared<Texture>(data);
}
} }
catch (const std::exception& e) { catch (const std::exception& e) {
std::cerr << "UiManager: addSlider failed to load textures: " << e.what() << std::endl; std::cerr << "UiManager: addSlider failed to load textures: " << e.what() << std::endl;

View File

@ -63,12 +63,12 @@ bool DialogueOverlay::init(Renderer& renderer, const std::string& zipFile) {
rendererRef = &renderer; rendererRef = &renderer;
zipFilename = zipFile; zipFilename = zipFile;
textboxTexture = std::make_shared<Texture>(CreateTextureDataFromPng("resources/dialogue/textbox_bg.png", zipFile)); textboxTexture = renderer.textureManager.LoadFromPng("resources/dialogue/textbox_bg.png", zipFile);
portraitFrameTexture = std::make_shared<Texture>(CreateTextureDataFromPng("resources/dialogue/portrait_frame.png", zipFile)); portraitFrameTexture = renderer.textureManager.LoadFromPng("resources/dialogue/portrait_frame.png", zipFile);
choiceMainTexture = std::make_shared<Texture>(CreateTextureDataFromPng("resources/dialogue/choice_main.png", zipFile)); choiceMainTexture = renderer.textureManager.LoadFromPng("resources/dialogue/choice_main.png", zipFile);
choiceOptionalTexture = std::make_shared<Texture>(CreateTextureDataFromPng("resources/dialogue/choice_optional.png", zipFile)); choiceOptionalTexture = renderer.textureManager.LoadFromPng("resources/dialogue/choice_optional.png", zipFile);
choiceSelectedTexture = std::make_shared<Texture>(CreateTextureDataFromPng("resources/dialogue/choice_selected.png", zipFile)); choiceSelectedTexture = renderer.textureManager.LoadFromPng("resources/dialogue/choice_selected.png", zipFile);
cutsceneSubtitleTexture = std::make_shared<Texture>(CreateTextureDataFromPng("resources/dialogue/cutscene_subtitle_bg.png", zipFile)); cutsceneSubtitleTexture = renderer.textureManager.LoadFromPng("resources/dialogue/cutscene_subtitle_bg.png", zipFile);
nameRenderer = std::make_unique<TextRenderer>(); nameRenderer = std::make_unique<TextRenderer>();
bodyRenderer = std::make_unique<TextRenderer>(); bodyRenderer = std::make_unique<TextRenderer>();
@ -648,14 +648,7 @@ std::shared_ptr<Texture> DialogueOverlay::loadTextureCached(const std::string& p
return nullptr; return nullptr;
} }
auto it = textureCache.find(path); return rendererRef->textureManager.LoadFromPng(path, zipFilename);
if (it != textureCache.end()) {
return it->second;
}
auto texture = std::make_shared<Texture>(CreateTextureDataFromPng(path, zipFilename));
textureCache[path] = texture;
return texture;
} }
void DialogueOverlay::drawQuad(Renderer& renderer, const TexturedQuad& quad, const std::shared_ptr<Texture>& texture) const { void DialogueOverlay::drawQuad(Renderer& renderer, const TexturedQuad& quad, const std::shared_ptr<Texture>& texture) const {

View File

@ -7,7 +7,6 @@
#include "UiManager.h" #include "UiManager.h"
#include <memory> #include <memory>
#include <string> #include <string>
#include <unordered_map>
#include <vector> #include <vector>
namespace ZL::Dialogue { namespace ZL::Dialogue {
@ -90,8 +89,6 @@ private:
TexturedQuad skipProgressFillQuad; TexturedQuad skipProgressFillQuad;
mutable std::vector<TexturedQuad> choiceQuads; mutable std::vector<TexturedQuad> choiceQuads;
std::unordered_map<std::string, std::shared_ptr<Texture>> textureCache;
void drawDialogue(Renderer& renderer, const PresentationModel& model); void drawDialogue(Renderer& renderer, const PresentationModel& model);
void drawCutscene(Renderer& renderer, const PresentationModel& model); void drawCutscene(Renderer& renderer, const PresentationModel& model);

View File

@ -129,7 +129,7 @@ namespace ZL {
// Load texture // Load texture
try { try {
gameObj.texture = std::make_shared<Texture>(CreateTextureDataFromPng(objData.texturePath, zipPath.c_str())); gameObj.texture = renderer.textureManager.LoadFromPng(objData.texturePath, zipPath);
} }
catch (const std::exception& e) { catch (const std::exception& e) {
std::cerr << "GameObjectLoader: Failed to load texture for '" << objData.name << "': " << e.what() << std::endl; std::cerr << "GameObjectLoader: Failed to load texture for '" << objData.name << "': " << e.what() << std::endl;
@ -202,7 +202,7 @@ namespace ZL {
// Load texture // Load texture
try { try {
intObj.texture = std::make_shared<Texture>(CreateTextureDataFromPng(objData.texturePath, zipPath.c_str())); intObj.texture = renderer.textureManager.LoadFromPng(objData.texturePath, zipPath);
} }
catch (const std::exception& e) { catch (const std::exception& e) {
std::cerr << "GameObjectLoader: Failed to load texture for interactive '" << objData.name << "': " << e.what() << std::endl; std::cerr << "GameObjectLoader: Failed to load texture for interactive '" << objData.name << "': " << e.what() << std::endl;

View File

@ -5,6 +5,7 @@
#include <exception> #include <exception>
#include <stdexcept> #include <stdexcept>
#include "ShaderManager.h" #include "ShaderManager.h"
#include "TextureManager.h"
#include <Eigen/Dense> #include <Eigen/Dense>
namespace ZL { namespace ZL {
@ -104,6 +105,7 @@ namespace ZL {
public: public:
ShaderManager shaderManager; ShaderManager shaderManager;
TextureManager textureManager;
void InitOpenGL(); void InitOpenGL();

View File

@ -416,5 +416,54 @@ namespace ZL
#endif #endif
std::string TextureManager::MakeKey(const std::string& fileName, const std::string& zipFile)
{
return zipFile.empty() ? fileName : fileName + "|" + zipFile;
}
std::shared_ptr<Texture> TextureManager::LoadFromBmp24(const std::string& fileName, const std::string& zipFile)
{
std::string key = MakeKey(fileName, zipFile);
auto it = textureMap.find(key);
if (it != textureMap.end())
return it->second;
auto tex = std::make_shared<Texture>(CreateTextureDataFromBmp24(fileName, zipFile));
textureMap[key] = tex;
return tex;
}
std::shared_ptr<Texture> TextureManager::LoadFromBmp32(const std::string& fileName, const std::string& zipFile)
{
std::string key = MakeKey(fileName, zipFile);
auto it = textureMap.find(key);
if (it != textureMap.end())
return it->second;
auto tex = std::make_shared<Texture>(CreateTextureDataFromBmp32(fileName, zipFile));
textureMap[key] = tex;
return tex;
}
#ifdef PNG_ENABLED
std::shared_ptr<Texture> TextureManager::LoadFromPng(const std::string& fileName, const std::string& zipFile)
{
std::string key = MakeKey(fileName, zipFile);
auto it = textureMap.find(key);
if (it != textureMap.end())
return it->second;
auto tex = std::make_shared<Texture>(CreateTextureDataFromPng(fileName, zipFile));
textureMap[key] = tex;
return tex;
}
#endif
void TextureManager::Unload(const std::string& fileName, const std::string& zipFile)
{
textureMap.erase(MakeKey(fileName, zipFile));
}
void TextureManager::UnloadAll()
{
textureMap.clear();
}
} }

View File

@ -2,6 +2,8 @@
#include "render/OpenGlExtensions.h" #include "render/OpenGlExtensions.h"
#include "utils/Utils.h" #include "utils/Utils.h"
#include <memory>
#include <unordered_map>
#if defined EMSCRIPTEN || defined __ANDROID__ #if defined EMSCRIPTEN || defined __ANDROID__
#define PNG_ENABLED #define PNG_ENABLED
@ -30,6 +32,7 @@ namespace ZL
Format format = RGBA; Format format = RGBA;
MipmapType mipmap = GENERATE; MipmapType mipmap = GENERATE;
}; };
class Texture class Texture
{ {
size_t width = 0; size_t width = 0;
@ -59,5 +62,21 @@ namespace ZL
TextureDataStruct CreateTextureDataFromPng(const std::string& fullFileName, const std::string& ZIPFileName = ""); TextureDataStruct CreateTextureDataFromPng(const std::string& fullFileName, const std::string& ZIPFileName = "");
#endif #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);
};
} }