diff options
| author | Kelly Rauchenberger <fefferburbia@gmail.com> | 2021-03-05 09:39:31 -0500 |
|---|---|---|
| committer | Kelly Rauchenberger <fefferburbia@gmail.com> | 2021-03-05 09:39:31 -0500 |
| commit | 7e3b59b09399bf8da243fb4122caa2c9c10d2624 (patch) | |
| tree | 34a586249f6cd8ee7acb357642dc87117794348f /src/renderer.cpp | |
| parent | 379f1f8bd8da856a142deb5781c8e9ab15393452 (diff) | |
| download | tanetane-7e3b59b09399bf8da243fb4122caa2c9c10d2624.tar.gz tanetane-7e3b59b09399bf8da243fb4122caa2c9c10d2624.tar.bz2 tanetane-7e3b59b09399bf8da243fb4122caa2c9c10d2624.zip | |
Implemented circle transition effect (for exit area)
Diffstat (limited to 'src/renderer.cpp')
| -rw-r--r-- | src/renderer.cpp | 54 |
1 files changed, 54 insertions, 0 deletions
| 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) { | |||
| 353 | SDL_RenderFillRect(ren_.get(), nullptr); | 353 | SDL_RenderFillRect(ren_.get(), nullptr); |
| 354 | } | 354 | } |
| 355 | 355 | ||
| 356 | if (effects.isCircleTransitionActive()) { | ||
| 357 | if (effects.getCircleTransitionProgress() == 1.0) { | ||
| 358 | SDL_SetRenderTarget(ren_.get(), cameraTex.get()); | ||
| 359 | SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE); | ||
| 360 | SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 255); | ||
| 361 | SDL_RenderClear(ren_.get()); | ||
| 362 | } else { | ||
| 363 | texture_ptr circleEffectTex( | ||
| 364 | SDL_CreateTexture( | ||
| 365 | ren_.get(), | ||
| 366 | SDL_PIXELFORMAT_RGBA8888, | ||
| 367 | SDL_TEXTUREACCESS_TARGET, | ||
| 368 | CANVAS_WIDTH, | ||
| 369 | CANVAS_HEIGHT)); | ||
| 370 | |||
| 371 | if (!circleEffectTex) { | ||
| 372 | throw sdl_error(); | ||
| 373 | } | ||
| 374 | |||
| 375 | SDL_SetRenderTarget(ren_.get(), circleEffectTex.get()); | ||
| 376 | SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE); | ||
| 377 | SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 255); | ||
| 378 | SDL_RenderClear(ren_.get()); | ||
| 379 | |||
| 380 | int circleDiameter = 290 * (1.0 - effects.getCircleTransitionProgress()); | ||
| 381 | SDL_Rect circleSize { | ||
| 382 | CANVAS_WIDTH / 2 - circleDiameter / 2, | ||
| 383 | CANVAS_HEIGHT / 2 - circleDiameter / 2, | ||
| 384 | circleDiameter, | ||
| 385 | circleDiameter | ||
| 386 | }; | ||
| 387 | |||
| 388 | SDL_Rect copyFromCamera = circleSize; | ||
| 389 | if (circleDiameter > CANVAS_WIDTH) { | ||
| 390 | copyFromCamera.x = 0; | ||
| 391 | copyFromCamera.w = CANVAS_WIDTH; | ||
| 392 | } | ||
| 393 | if (circleDiameter > CANVAS_HEIGHT) { | ||
| 394 | copyFromCamera.y = 0; | ||
| 395 | copyFromCamera.h = CANVAS_HEIGHT; | ||
| 396 | } | ||
| 397 | |||
| 398 | SDL_RenderCopy(ren_.get(), cameraTex.get(), ©FromCamera, ©FromCamera); | ||
| 399 | |||
| 400 | int pinholeTexId = loadImageFromFile("../res/pinhole.png"); | ||
| 401 | SDL_SetTextureBlendMode(textures_[pinholeTexId].get(), SDL_BLENDMODE_MOD); | ||
| 402 | SDL_RenderCopy(ren_.get(), textures_[pinholeTexId].get(), nullptr, &circleSize); | ||
| 403 | |||
| 404 | SDL_SetRenderTarget(ren_.get(), cameraTex.get()); | ||
| 405 | SDL_SetTextureBlendMode(circleEffectTex.get(), SDL_BLENDMODE_NONE); | ||
| 406 | SDL_RenderCopy(ren_.get(), circleEffectTex.get(), nullptr, nullptr); | ||
| 407 | } | ||
| 408 | } | ||
| 409 | |||
| 356 | if (game.getSystem<InputSystem>().isDebugConsoleOpen()) { | 410 | if (game.getSystem<InputSystem>().isDebugConsoleOpen()) { |
| 357 | // Not sure why I'm supposed to copy the cached texture to the screen | 411 | // Not sure why I'm supposed to copy the cached texture to the screen |
| 358 | // BEFORE rendering it, but we get flickering if we don't, so. | 412 | // BEFORE rendering it, but we get flickering if we don't, so. |
