Added UI RenderTexture

This commit is contained in:
2025-12-25 13:06:30 +08:00
parent 03cd5d83d1
commit 10d9988f99
3 changed files with 50 additions and 12 deletions

View File

@@ -60,6 +60,7 @@ SDL_AppResult GameApplication::handleInputEvent(SDL_Event* event) {
m_windowManager->setFullscreen(input.isFullscreen);
// 改变窗口时清理旧的缓存
if (event->type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED) {
m_windowManager->onWindowResize();
m_textRenderer->clearCache();
}

View File

@@ -58,7 +58,17 @@ bool WindowManager::Initialize(Config& config) {
);
// 设置纹理缩放模式为最近邻
SDL_SetTextureScaleMode(m_logicalTexture, SDL_SCALEMODE_NEAREST);
// 创建文本渲染层
m_textTexture = SDL_CreateTexture(
m_renderer,
SDL_PIXELFORMAT_RGBA8888,
SDL_TEXTUREACCESS_TARGET,
m_viewport.windowWidth,
m_viewport.windowHeight
);
return true;
}
@@ -73,14 +83,11 @@ void WindowManager::Clear() {
SDL_SetRenderDrawColor(m_renderer, 255, 255, 255, 255);
SDL_RenderClear(m_renderer);
// 清除逻辑纹理(世界层)
SDL_SetRenderTarget(m_renderer, m_logicalTexture);
SDL_SetRenderDrawColor(m_renderer, 0, 0, 0, 0); // 透明黑色
SDL_RenderClear(m_renderer);
onWindowResize();
}
/*
@@ -101,29 +108,47 @@ void WindowManager::Present() {
//SDL_FRect dstRect;
//calculateDstRect(dstRect);
SDL_FRect textDis = {
0.0f,
0.0f,
static_cast<float> (m_viewport.windowWidth),
static_cast<float> (m_viewport.windowHeight)
};
SDL_RenderTexture (
m_renderer,
m_logicalTexture, // 源:你已经画好的逻辑画布
nullptr, // srcRect源区域nullptr = 整张)
&m_viewport.dst // dstRect贴到哪里 & 贴多大
);
SDL_RenderTexture (
m_renderer,
m_textTexture,
nullptr,
&textDis
);
SDL_RenderPresent(m_renderer);
}
void WindowManager::beginWorld() {
// 设置渲染目标为逻辑纹理
// 清除逻辑纹理(世界层)
SDL_SetRenderTarget(m_renderer, m_logicalTexture);
SDL_SetRenderDrawColor(m_renderer, 255, 255, 255, 255);
SDL_RenderClear(m_renderer);
}
void WindowManager::endWorld() {
SDL_SetRenderTarget(m_renderer, nullptr);
}
void WindowManager::beginUI() {
// 设置渲染目标为窗口
SDL_SetRenderTarget(m_renderer, nullptr);
SDL_SetRenderTarget(m_renderer, m_textTexture);
SDL_SetRenderDrawColor(m_renderer, 255, 255, 255, 0);
SDL_RenderClear(m_renderer);
}
void WindowManager::endUI() {
@@ -214,6 +239,17 @@ void WindowManager::onWindowResize() {
// - scale 可供所有系统使用
// - dst 是渲染 & 输入转换的唯一依据
// - windowSize 不需要再到处 SDL_GetWindowSize
// 创建文本渲染层
SDL_DestroyTexture(m_textTexture);
m_textTexture = SDL_CreateTexture(
m_renderer,
SDL_PIXELFORMAT_RGBA8888,
SDL_TEXTUREACCESS_TARGET,
m_viewport.windowWidth,
m_viewport.windowHeight
);
}
Viewport const& WindowManager::getViewport() const {

View File

@@ -29,6 +29,10 @@ public:
SDL_Renderer* GetRenderer();
SDL_Window* GetWindow();
// 计算缩放后的目标矩形
//void calculateDstRect(SDL_FRect& dstRect);
void onWindowResize();
private:
SDL_Window* m_window;
@@ -40,8 +44,5 @@ private:
//int m_windowHeight;
bool m_isFullscreen = false;
SDL_Texture* m_logicalTexture = nullptr;
// 计算缩放后的目标矩形
//void calculateDstRect(SDL_FRect& dstRect);
void onWindowResize();
SDL_Texture* m_textTexture = nullptr;
};