1
0
Fork 0
mirror of https://github.com/TerryCavanagh/VVVVVV.git synced 2024-12-23 01:59:43 +01:00

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.
This commit is contained in:
Misa 2021-08-29 13:31:42 -07:00
parent 23a2f57a70
commit c58c357a81
4 changed files with 29 additions and 70 deletions

View file

@ -3038,41 +3038,14 @@ void Graphics::setcol( int t )
void Graphics::menuoffrender(void) void Graphics::menuoffrender(void)
{ {
SDL_Rect offsetRect1; const int usethisoffset = lerp(oldmenuoffset, menuoffset);
setRect (offsetRect1, 0, 0, backBuffer->w ,backBuffer->h); SDL_Rect offsetRect = {0, usethisoffset, backBuffer->w, backBuffer->h};
//put the back buffer in the menubuffer
BlitSurfaceStandard(backBuffer, NULL, menubuffer, NULL); BlitSurfaceStandard(backBuffer, NULL, menubuffer, NULL);
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); BlitSurfaceStandard(tempBuffer, NULL, backBuffer, NULL);
BlitSurfaceStandard(menubuffer, NULL, backBuffer, &offsetRect);
SDL_Rect offsetRect; screenbuffer->UpdateScreen(backBuffer, NULL);
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);
ClearSurface(backBuffer); ClearSurface(backBuffer);
} }
@ -3192,20 +3165,8 @@ void Graphics::flashlight(void)
void Graphics::screenshake(void) void Graphics::screenshake(void)
{ {
if(flipmode) SDL_Rect shakeRect = {screenshake_x, screenshake_y, backBuffer->w, backBuffer->h};
{ screenbuffer->UpdateScreen(backBuffer, &shakeRect);
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);
}
ClearSurface(backBuffer); ClearSurface(backBuffer);
} }
@ -3218,27 +3179,12 @@ void Graphics::updatescreenshake(void)
void Graphics::render(void) void Graphics::render(void)
{ {
if(screenbuffer == NULL) if (screenbuffer == NULL)
{ {
return; return;
} }
if(flipmode)
{ screenbuffer->UpdateScreen(backBuffer, NULL);
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);
}
} }
void Graphics::renderwithscreeneffects(void) void Graphics::renderwithscreeneffects(void)

View file

@ -306,19 +306,32 @@ const SDL_PixelFormat* Screen::GetFormat(void)
return m_screen->format; 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( SDL_UpdateTexture(
m_screenTexture, m_screenTexture,
NULL, NULL,
m_screen->pixels, m_screen->pixels,
m_screen->pitch m_screen->pitch
); );
SDL_RenderCopy( SDL_RenderCopyEx(
m_renderer, m_renderer,
m_screenTexture, m_screenTexture,
isFiltered ? &filterSubrect : NULL, isFiltered ? &filterSubrect : NULL,
NULL NULL,
0.0,
NULL,
flip_flags
); );
SDL_RenderPresent(m_renderer); SDL_RenderPresent(m_renderer);
SDL_RenderClear(m_renderer); SDL_RenderClear(m_renderer);

View file

@ -20,7 +20,7 @@ public:
void GetWindowSize(int* x, int* y); void GetWindowSize(int* x, int* y);
void UpdateScreen(SDL_Surface* buffer, SDL_Rect* rect); void UpdateScreen(SDL_Surface* buffer, SDL_Rect* rect);
void FlipScreen(void); void FlipScreen(bool flipmode);
const SDL_PixelFormat* GetFormat(void); const SDL_PixelFormat* GetFormat(void);

View file

@ -750,7 +750,7 @@ static void inline deltaloop(void)
{ {
implfunc->func(); implfunc->func();
gameScreen.FlipScreen(); gameScreen.FlipScreen(graphics.flipmode);
} }
} }
} }
@ -781,7 +781,7 @@ static void unfocused_run(void)
#undef FLIP #undef FLIP
} }
graphics.render(); graphics.render();
gameScreen.FlipScreen(); gameScreen.FlipScreen(graphics.flipmode);
//We are minimised, so lets put a bit of a delay to save CPU //We are minimised, so lets put a bit of a delay to save CPU
#ifndef __EMSCRIPTEN__ #ifndef __EMSCRIPTEN__
SDL_Delay(100); SDL_Delay(100);