From c58c357a81f3e41c8e2baa41f484a36af2c3eb0d Mon Sep 17 00:00:00 2001 From: Misa Date: Sun, 29 Aug 2021 13:31:42 -0700 Subject: [PATCH] Simplify Flip Mode rendering code with SDL_RenderCopyEx Previously, Flip Mode rendering had to be complicated and allocate another buffer to call FlipSurfaceVerticle, and it was just a mess. Instead, why not just do SDL_RenderCopyEx, and let SDL flip the screen for us? This ends up pretty massively simplifying the rendering code. --- desktop_version/src/Graphics.cpp | 74 +++++--------------------------- desktop_version/src/Screen.cpp | 19 ++++++-- desktop_version/src/Screen.h | 2 +- desktop_version/src/main.cpp | 4 +- 4 files changed, 29 insertions(+), 70 deletions(-) diff --git a/desktop_version/src/Graphics.cpp b/desktop_version/src/Graphics.cpp index 44aee77b..d9d86485 100644 --- a/desktop_version/src/Graphics.cpp +++ b/desktop_version/src/Graphics.cpp @@ -3038,41 +3038,14 @@ void Graphics::setcol( int t ) void Graphics::menuoffrender(void) { - SDL_Rect offsetRect1; - setRect (offsetRect1, 0, 0, backBuffer->w ,backBuffer->h); + const int usethisoffset = lerp(oldmenuoffset, menuoffset); + SDL_Rect offsetRect = {0, usethisoffset, backBuffer->w, backBuffer->h}; - //put the back buffer in the menubuffer BlitSurfaceStandard(backBuffer, NULL, menubuffer, NULL); + BlitSurfaceStandard(tempBuffer, NULL, backBuffer, NULL); + BlitSurfaceStandard(menubuffer, NULL, backBuffer, &offsetRect); - - - int usethisoffset = lerp(oldmenuoffset, menuoffset); - if(flipmode) - { - SDL_Surface* tempbufferFlipped = FlipSurfaceVerticle(tempBuffer); - //put the stored backbuffer in the backbuffer. - ClearSurface(backBuffer); - BlitSurfaceStandard(tempbufferFlipped, NULL, backBuffer, NULL); - SDL_FreeSurface(tempbufferFlipped); - SDL_Rect offsetRect; - setRect (offsetRect, 0, -usethisoffset, backBuffer->w ,backBuffer->h); - SDL_Surface* temp = FlipSurfaceVerticle(menubuffer); - BlitSurfaceStandard(temp,NULL,backBuffer,&offsetRect); - SDL_FreeSurface(temp); - } - else - { - //put the stored backbuffer in the backbuffer. - BlitSurfaceStandard(tempBuffer, NULL, backBuffer, NULL); - - SDL_Rect offsetRect; - setRect (offsetRect, 0, usethisoffset, backBuffer->w ,backBuffer->h); - BlitSurfaceStandard(menubuffer,NULL,backBuffer,&offsetRect); - } - - SDL_Rect rect; - setRect(rect, 0, 0, backBuffer->w, backBuffer->h); - screenbuffer->UpdateScreen(backBuffer,&rect); + screenbuffer->UpdateScreen(backBuffer, NULL); ClearSurface(backBuffer); } @@ -3192,20 +3165,8 @@ void Graphics::flashlight(void) void Graphics::screenshake(void) { - if(flipmode) - { - SDL_Rect shakeRect; - setRect(shakeRect,screenshake_x, screenshake_y, backBuffer->w, backBuffer->h); - SDL_Surface* flipBackBuffer = FlipSurfaceVerticle(backBuffer); - screenbuffer->UpdateScreen( flipBackBuffer, &shakeRect); - SDL_FreeSurface(flipBackBuffer); - } - else - { - SDL_Rect shakeRect; - setRect(shakeRect,screenshake_x, screenshake_y, backBuffer->w, backBuffer->h); - screenbuffer->UpdateScreen( backBuffer, &shakeRect); - } + SDL_Rect shakeRect = {screenshake_x, screenshake_y, backBuffer->w, backBuffer->h}; + screenbuffer->UpdateScreen(backBuffer, &shakeRect); ClearSurface(backBuffer); } @@ -3218,27 +3179,12 @@ void Graphics::updatescreenshake(void) void Graphics::render(void) { - if(screenbuffer == NULL) + if (screenbuffer == NULL) { return; } - if(flipmode) - { - SDL_Rect rect; - setRect(rect, 0, 0, backBuffer->w, backBuffer->h); - SDL_Surface* tempsurface = FlipSurfaceVerticle(backBuffer); - if(tempsurface != NULL) - { - screenbuffer->UpdateScreen( tempsurface, &rect); - SDL_FreeSurface(tempsurface); - } - } - else - { - SDL_Rect rect; - setRect(rect, 0, 0, backBuffer->w, backBuffer->h); - screenbuffer->UpdateScreen( backBuffer, &rect); - } + + screenbuffer->UpdateScreen(backBuffer, NULL); } void Graphics::renderwithscreeneffects(void) diff --git a/desktop_version/src/Screen.cpp b/desktop_version/src/Screen.cpp index 282f15ad..e0836e1e 100644 --- a/desktop_version/src/Screen.cpp +++ b/desktop_version/src/Screen.cpp @@ -306,19 +306,32 @@ const SDL_PixelFormat* Screen::GetFormat(void) return m_screen->format; } -void Screen::FlipScreen(void) +void Screen::FlipScreen(const bool flipmode) { + SDL_RendererFlip flip_flags; + if (flipmode) + { + flip_flags = SDL_FLIP_VERTICAL; + } + else + { + flip_flags = SDL_FLIP_NONE; + } + SDL_UpdateTexture( m_screenTexture, NULL, m_screen->pixels, m_screen->pitch ); - SDL_RenderCopy( + SDL_RenderCopyEx( m_renderer, m_screenTexture, isFiltered ? &filterSubrect : NULL, - NULL + NULL, + 0.0, + NULL, + flip_flags ); SDL_RenderPresent(m_renderer); SDL_RenderClear(m_renderer); diff --git a/desktop_version/src/Screen.h b/desktop_version/src/Screen.h index 360fd3ce..90a40817 100644 --- a/desktop_version/src/Screen.h +++ b/desktop_version/src/Screen.h @@ -20,7 +20,7 @@ public: void GetWindowSize(int* x, int* y); void UpdateScreen(SDL_Surface* buffer, SDL_Rect* rect); - void FlipScreen(void); + void FlipScreen(bool flipmode); const SDL_PixelFormat* GetFormat(void); diff --git a/desktop_version/src/main.cpp b/desktop_version/src/main.cpp index 02146edf..0146f991 100644 --- a/desktop_version/src/main.cpp +++ b/desktop_version/src/main.cpp @@ -750,7 +750,7 @@ static void inline deltaloop(void) { implfunc->func(); - gameScreen.FlipScreen(); + gameScreen.FlipScreen(graphics.flipmode); } } } @@ -781,7 +781,7 @@ static void unfocused_run(void) #undef FLIP } graphics.render(); - gameScreen.FlipScreen(); + gameScreen.FlipScreen(graphics.flipmode); //We are minimised, so lets put a bit of a delay to save CPU #ifndef __EMSCRIPTEN__ SDL_Delay(100);