From 7e3b59b09399bf8da243fb4122caa2c9c10d2624 Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Fri, 5 Mar 2021 09:39:31 -0500 Subject: Implemented circle transition effect (for exit area) --- src/renderer.cpp | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) (limited to 'src/renderer.cpp') diff --git a/src/renderer.cpp b/src/renderer.cpp index 3007378..5ab623a 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -353,6 +353,60 @@ void Renderer::render(Game& game) { SDL_RenderFillRect(ren_.get(), nullptr); } + if (effects.isCircleTransitionActive()) { + if (effects.getCircleTransitionProgress() == 1.0) { + SDL_SetRenderTarget(ren_.get(), cameraTex.get()); + SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE); + SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 255); + SDL_RenderClear(ren_.get()); + } else { + texture_ptr circleEffectTex( + SDL_CreateTexture( + ren_.get(), + SDL_PIXELFORMAT_RGBA8888, + SDL_TEXTUREACCESS_TARGET, + CANVAS_WIDTH, + CANVAS_HEIGHT)); + + if (!circleEffectTex) { + throw sdl_error(); + } + + SDL_SetRenderTarget(ren_.get(), circleEffectTex.get()); + SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE); + SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 255); + SDL_RenderClear(ren_.get()); + + int circleDiameter = 290 * (1.0 - effects.getCircleTransitionProgress()); + SDL_Rect circleSize { + CANVAS_WIDTH / 2 - circleDiameter / 2, + CANVAS_HEIGHT / 2 - circleDiameter / 2, + circleDiameter, + circleDiameter + }; + + SDL_Rect copyFromCamera = circleSize; + if (circleDiameter > CANVAS_WIDTH) { + copyFromCamera.x = 0; + copyFromCamera.w = CANVAS_WIDTH; + } + if (circleDiameter > CANVAS_HEIGHT) { + copyFromCamera.y = 0; + copyFromCamera.h = CANVAS_HEIGHT; + } + + SDL_RenderCopy(ren_.get(), cameraTex.get(), ©FromCamera, ©FromCamera); + + int pinholeTexId = loadImageFromFile("../res/pinhole.png"); + SDL_SetTextureBlendMode(textures_[pinholeTexId].get(), SDL_BLENDMODE_MOD); + SDL_RenderCopy(ren_.get(), textures_[pinholeTexId].get(), nullptr, &circleSize); + + SDL_SetRenderTarget(ren_.get(), cameraTex.get()); + SDL_SetTextureBlendMode(circleEffectTex.get(), SDL_BLENDMODE_NONE); + SDL_RenderCopy(ren_.get(), circleEffectTex.get(), nullptr, nullptr); + } + } + if (game.getSystem().isDebugConsoleOpen()) { // Not sure why I'm supposed to copy the cached texture to the screen // BEFORE rendering it, but we get flickering if we don't, so. -- cgit 1.4.1