mirror of
https://github.com/zhenyan121/SporeBG-Conid.git
synced 2026-04-10 06:14:08 +08:00
feat: add TextureManager class
This commit is contained in:
81
src/graphics/texture/TextureManager.cpp
Normal file
81
src/graphics/texture/TextureManager.cpp
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
#include "TextureManager.h"
|
||||||
|
|
||||||
|
TextureManager::TextureManager(SDL_Renderer* renderer) :
|
||||||
|
m_renderer(renderer)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
TextureManager::~TextureManager() {
|
||||||
|
cleanupAllTexture();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TextureManager::cleanupAllTexture() {
|
||||||
|
|
||||||
|
for (auto [id, texture] : m_cacheTexture) {
|
||||||
|
SDL_DestroyTexture(texture);
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_Log("TextureManager: cleanup all texture successful\n");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
SDL_Texture* TextureManager::createTextureFromRect(int x, int y, SDL_FRect& rect, SDL_Color& color) {
|
||||||
|
|
||||||
|
// 先在缓存中查找是否存在
|
||||||
|
auto it = getTexture(x, y);
|
||||||
|
if(it) {
|
||||||
|
return it;
|
||||||
|
}
|
||||||
|
if (!m_renderer) {
|
||||||
|
SDL_Log("TextureManager renderer is null\n");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
auto newTexture = SDL_CreateTexture(
|
||||||
|
m_renderer,
|
||||||
|
SDL_PIXELFORMAT_RGBA8888,
|
||||||
|
SDL_TEXTUREACCESS_TARGET,
|
||||||
|
rect.w,
|
||||||
|
rect.h
|
||||||
|
);
|
||||||
|
// 保存当前的渲染目标
|
||||||
|
auto currentTexture = SDL_GetRenderTarget(m_renderer);
|
||||||
|
|
||||||
|
SDL_SetRenderTarget(m_renderer, newTexture);
|
||||||
|
SDL_SetRenderDrawColor(m_renderer, color.r, color.g, color.b, color.a);
|
||||||
|
// 因为修改了渲染目标,所以坐标系不一样了
|
||||||
|
SDL_FRect renderRect = {0, 0, rect.w, rect.h};
|
||||||
|
SDL_RenderFillRect(m_renderer, &renderRect);
|
||||||
|
|
||||||
|
m_cacheTexture.emplace(makeHash(x, y), newTexture);
|
||||||
|
|
||||||
|
// 恢复渲染目标
|
||||||
|
SDL_SetRenderTarget(m_renderer, currentTexture);
|
||||||
|
return newTexture;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t TextureManager::makeHash(int x, int y) {
|
||||||
|
// 分别计算字体名称和大小的哈希值
|
||||||
|
size_t h1 = std::hash<int>{}(x);
|
||||||
|
size_t h2 = std::hash<int>{}(y);
|
||||||
|
|
||||||
|
// 组合两个哈希值:使用XOR运算和位左移组合两个独立的哈希值
|
||||||
|
// 这样可以确保不同的fontID或ptSize组合都会产生不同的哈希值
|
||||||
|
return h1 ^ (h2 << 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_Texture* TextureManager::getTexture(int x, int y) {
|
||||||
|
auto key = makeHash(x, y);
|
||||||
|
auto it = m_cacheTexture.find(key);
|
||||||
|
|
||||||
|
if (it != m_cacheTexture.end()) {
|
||||||
|
return it->second;
|
||||||
|
} else {
|
||||||
|
SDL_Log("TextureManager: texture %d %d not exist!", x, y);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
27
src/graphics/texture/TextureManager.h
Normal file
27
src/graphics/texture/TextureManager.h
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <SDL3/SDL.h>
|
||||||
|
#include <unordered_map>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
class TextureManager {
|
||||||
|
public:
|
||||||
|
|
||||||
|
TextureManager(SDL_Renderer* renderer);
|
||||||
|
~TextureManager();
|
||||||
|
|
||||||
|
|
||||||
|
SDL_Texture* createTextureFromRect(int x, int y, SDL_FRect& rect, SDL_Color& coler);
|
||||||
|
|
||||||
|
void cleanupAllTexture();
|
||||||
|
|
||||||
|
SDL_Texture* getTexture(int x, int y);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
SDL_Renderer* m_renderer = nullptr;
|
||||||
|
|
||||||
|
std::unordered_map<size_t, SDL_Texture*> m_cacheTexture;
|
||||||
|
|
||||||
|
size_t makeHash(int x, int y);
|
||||||
|
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user