From 08144affdf685160248c7fb474014c36112d9a22 Mon Sep 17 00:00:00 2001 From: Tommy Date: Wed, 25 Oct 2023 16:22:18 +1300 Subject: [PATCH] Allow draw::set_render_target to switch to the main render buffer. This is done by passing it an empty texture. --- src/draw.cpp | 16 ++++++++++++---- src/draw.hpp | 4 +++- src/video.cpp | 7 ++++++- src/video.hpp | 3 +++ 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/draw.cpp b/src/draw.cpp index ed911c317c8..f0af9473315 100644 --- a/src/draw.cpp +++ b/src/draw.cpp @@ -577,7 +577,7 @@ draw::render_target_setter::render_target_setter(const texture& t) , viewport_() { // Validate we can render to this texture. - assert(t.get_access() == SDL_TEXTUREACCESS_TARGET); + assert(!t || t.get_access() == SDL_TEXTUREACCESS_TARGET); if (!renderer()) { WRN_D << "can't set render target with null renderer"; @@ -587,7 +587,11 @@ draw::render_target_setter::render_target_setter(const texture& t) target_ = video::get_render_target(); SDL_RenderGetViewport(renderer(), &viewport_); - video::force_render_target(t); + if (t) { + video::force_render_target(t); + } else { + video::reset_render_target(); + } } draw::render_target_setter::~render_target_setter() @@ -602,7 +606,11 @@ draw::render_target_setter::~render_target_setter() draw::render_target_setter draw::set_render_target(const texture& t) { - DBG_D << "setting render target to " - << t.w() << 'x' << t.h() << " texture"; + if (t) { + DBG_D << "setting render target to " + << t.w() << 'x' << t.h() << " texture"; + } else { + DBG_D << "setting render target to main render buffer"; + } return draw::render_target_setter(t); } diff --git a/src/draw.hpp b/src/draw.hpp index 3e61976ff0b..b7aa11ac33a 100644 --- a/src/draw.hpp +++ b/src/draw.hpp @@ -446,7 +446,9 @@ private: * SDL_TEXTUREACCESS_TARGET access mode. * * @param t The new render target. This must be a texture created - * with SDL_TEXTUREACCESS_TARGET. + * with SDL_TEXTUREACCESS_TARGET, or an empty texture. + * If empty, it will set the render target to Wesnoth's + * primary render buffer. * @returns A render_target_setter object. When this object is * destroyed the render target will be restored to * whatever it was before this call. diff --git a/src/video.cpp b/src/video.cpp index e8d500b33b7..d62f5bed9df 100644 --- a/src/video.cpp +++ b/src/video.cpp @@ -522,6 +522,11 @@ void clear_render_target() force_render_target({}); } +void reset_render_target() +{ + force_render_target(render_texture_); +} + texture get_render_target() { // This should always be up-to-date, but assert for sanity. @@ -564,7 +569,7 @@ void render_screen() SDL_RenderPresent(*window); // Reset the render target to the render texture. - force_render_target(render_texture_); + reset_render_target(); } surface read_pixels(SDL_Rect* r) diff --git a/src/video.hpp b/src/video.hpp index 47573f8ce68..633ac56c81b 100644 --- a/src/video.hpp +++ b/src/video.hpp @@ -290,6 +290,9 @@ void force_render_target(const texture& t); /** Reset the render target to the main window / screen. */ void clear_render_target(); +/** Reset the render target to the primary render buffer. */ +void reset_render_target(); + /** Get the current render target. * * Will return an empty texture if the render target is the underlying