diff options
author | Star Rauchenberger <fefferburbia@gmail.com> | 2021-03-13 09:04:04 -0500 |
---|---|---|
committer | Star Rauchenberger <fefferburbia@gmail.com> | 2021-03-13 15:34:50 -0500 |
commit | 42495836c9ebe1c3914540043d2338eebd85dbab (patch) | |
tree | 1b1276e2832125f657f37f8791d3e66da9afd9e2 | |
parent | 72709189edf800d52fe29eea59880bce28becc82 (diff) | |
download | tanetane-42495836c9ebe1c3914540043d2338eebd85dbab.tar.gz tanetane-42495836c9ebe1c3914540043d2338eebd85dbab.tar.bz2 tanetane-42495836c9ebe1c3914540043d2338eebd85dbab.zip |
Rendered pause menu during animation
Also, the game is not rendered at all if the pause menu is totally open, which makes sense because why are we going to the effort to render it and then just colour over it.
-rw-r--r-- | src/renderer.cpp | 164 | ||||
-rw-r--r-- | src/renderer.h | 10 |
2 files changed, 112 insertions, 62 deletions
diff --git a/src/renderer.cpp b/src/renderer.cpp index 81e6b9c..14eefea 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp | |||
@@ -124,9 +124,47 @@ void Renderer::renderSprite(const Sprite& sprite) { | |||
124 | } | 124 | } |
125 | 125 | ||
126 | void Renderer::render(Game& game) { | 126 | void Renderer::render(Game& game) { |
127 | auto& effects = game.getSystem<EffectSystem>(); | ||
128 | auto& menus = game.getSystem<MenuSystem>(); | 127 | auto& menus = game.getSystem<MenuSystem>(); |
129 | 128 | ||
129 | texture_ptr canvas( | ||
130 | SDL_CreateTexture( | ||
131 | ren_.get(), | ||
132 | SDL_PIXELFORMAT_RGBA8888, | ||
133 | SDL_TEXTUREACCESS_TARGET, | ||
134 | CANVAS_WIDTH, | ||
135 | CANVAS_HEIGHT)); | ||
136 | |||
137 | if (menus.getPauseAnimationProgress() < 1.0) { | ||
138 | renderGame(game); | ||
139 | |||
140 | SDL_SetRenderTarget(ren_.get(), canvas.get()); | ||
141 | SDL_RenderCopy(ren_.get(), cameraTex_.get(), nullptr, nullptr); | ||
142 | } | ||
143 | |||
144 | if (menus.getPauseAnimationProgress() > 0.0) { | ||
145 | renderMenu(game); | ||
146 | |||
147 | SDL_SetRenderTarget(ren_.get(), canvas.get()); | ||
148 | if (menus.getPauseAnimationProgress() == 1.0) { | ||
149 | SDL_RenderCopy(ren_.get(), menuTex_.get(), nullptr, nullptr); | ||
150 | } else { | ||
151 | int barHeight = CANVAS_HEIGHT / 2 * menus.getPauseAnimationProgress(); | ||
152 | SDL_Rect topHalf { 0, 0, CANVAS_WIDTH, barHeight }; | ||
153 | SDL_Rect bottomHalf { 0, CANVAS_HEIGHT - barHeight, CANVAS_WIDTH, barHeight }; | ||
154 | |||
155 | SDL_RenderCopy(ren_.get(), menuTex_.get(), &topHalf, &topHalf); | ||
156 | SDL_RenderCopy(ren_.get(), menuTex_.get(), &bottomHalf, &bottomHalf); | ||
157 | } | ||
158 | } | ||
159 | |||
160 | SDL_SetRenderTarget(ren_.get(), nullptr); | ||
161 | SDL_RenderCopy(ren_.get(), canvas.get(), nullptr, nullptr); | ||
162 | SDL_RenderPresent(ren_.get()); | ||
163 | } | ||
164 | |||
165 | void Renderer::renderGame(Game& game) { | ||
166 | auto& effects = game.getSystem<EffectSystem>(); | ||
167 | |||
130 | if (cachedMapName_ != game.getMap().getName()) { | 168 | if (cachedMapName_ != game.getMap().getName()) { |
131 | cachedMapName_ = game.getMap().getName(); | 169 | cachedMapName_ = game.getMap().getName(); |
132 | renLowerLayer_ = renderMapLayer(game.getMap(), false); | 170 | renLowerLayer_ = renderMapLayer(game.getMap(), false); |
@@ -247,23 +285,25 @@ void Renderer::render(Game& game) { | |||
247 | game.getSystem<CameraSystem>().getFieldOfView().h() | 285 | game.getSystem<CameraSystem>().getFieldOfView().h() |
248 | }; | 286 | }; |
249 | 287 | ||
250 | texture_ptr cameraTex( | 288 | if (!cameraTex_) { |
251 | SDL_CreateTexture( | 289 | cameraTex_.reset( |
252 | ren_.get(), | 290 | SDL_CreateTexture( |
253 | SDL_PIXELFORMAT_RGBA8888, | 291 | ren_.get(), |
254 | SDL_TEXTUREACCESS_TARGET, | 292 | SDL_PIXELFORMAT_RGBA8888, |
255 | CANVAS_WIDTH, | 293 | SDL_TEXTUREACCESS_TARGET, |
256 | CANVAS_HEIGHT)); | 294 | CANVAS_WIDTH, |
295 | CANVAS_HEIGHT)); | ||
257 | 296 | ||
258 | if (!cameraTex) { | 297 | if (!cameraTex_) { |
259 | throw sdl_error(); | 298 | throw sdl_error(); |
299 | } | ||
260 | } | 300 | } |
261 | 301 | ||
262 | SDL_SetRenderTarget(ren_.get(), cameraTex.get()); | 302 | SDL_SetRenderTarget(ren_.get(), cameraTex_.get()); |
263 | SDL_RenderCopy(ren_.get(), canvas.get(), &cameraField, nullptr); | 303 | SDL_RenderCopy(ren_.get(), canvas.get(), &cameraField, nullptr); |
264 | 304 | ||
265 | if (game.getSystem<MessageSystem>().getCutsceneBarsProgress() > 0) { | 305 | if (game.getSystem<MessageSystem>().getCutsceneBarsProgress() > 0) { |
266 | SDL_SetRenderTarget(ren_.get(), cameraTex.get()); | 306 | SDL_SetRenderTarget(ren_.get(), cameraTex_.get()); |
267 | SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE); | 307 | SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE); |
268 | SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 255); | 308 | SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 255); |
269 | 309 | ||
@@ -284,7 +324,7 @@ void Renderer::render(Game& game) { | |||
284 | 324 | ||
285 | { | 325 | { |
286 | SDL_Rect destRect { 0, 111, 57, 13 }; | 326 | SDL_Rect destRect { 0, 111, 57, 13 }; |
287 | SDL_SetRenderTarget(ren_.get(), cameraTex.get()); | 327 | SDL_SetRenderTarget(ren_.get(), cameraTex_.get()); |
288 | SDL_RenderCopy(ren_.get(), textures_.at(speakerHeaderTex_).get(), nullptr, &destRect); | 328 | SDL_RenderCopy(ren_.get(), textures_.at(speakerHeaderTex_).get(), nullptr, &destRect); |
289 | } | 329 | } |
290 | 330 | ||
@@ -299,7 +339,7 @@ void Renderer::render(Game& game) { | |||
299 | MESSAGE_TEXT_WIDTH, | 339 | MESSAGE_TEXT_WIDTH, |
300 | game.getFont().getCharacterHeight() }; | 340 | game.getFont().getCharacterHeight() }; |
301 | 341 | ||
302 | SDL_SetRenderTarget(ren_.get(), cameraTex.get()); | 342 | SDL_SetRenderTarget(ren_.get(), cameraTex_.get()); |
303 | SDL_RenderCopy(ren_.get(), speakerHeaderLine_.renderedTex.get(), nullptr, &destRect); | 343 | SDL_RenderCopy(ren_.get(), speakerHeaderLine_.renderedTex.get(), nullptr, &destRect); |
304 | } | 344 | } |
305 | } | 345 | } |
@@ -323,7 +363,7 @@ void Renderer::render(Game& game) { | |||
323 | srcRect.w, | 363 | srcRect.w, |
324 | srcRect.h }; | 364 | srcRect.h }; |
325 | 365 | ||
326 | SDL_SetRenderTarget(ren_.get(), cameraTex.get()); | 366 | SDL_SetRenderTarget(ren_.get(), cameraTex_.get()); |
327 | SDL_RenderCopy(ren_.get(), messageLines_[lineIndex].renderedTex.get(), &srcRect, &destRect); | 367 | SDL_RenderCopy(ren_.get(), messageLines_[lineIndex].renderedTex.get(), &srcRect, &destRect); |
328 | } | 368 | } |
329 | 369 | ||
@@ -333,7 +373,7 @@ void Renderer::render(Game& game) { | |||
333 | SDL_Rect srcRect { charLoc.x(), charLoc.y(), charSize.w(), charSize.h() }; | 373 | SDL_Rect srcRect { charLoc.x(), charLoc.y(), charSize.w(), charSize.h() }; |
334 | SDL_Rect destRect { 13, 127 + 16 * lineIndex, charSize.w(), charSize.h() }; | 374 | SDL_Rect destRect { 13, 127 + 16 * lineIndex, charSize.w(), charSize.h() }; |
335 | 375 | ||
336 | SDL_SetRenderTarget(ren_.get(), cameraTex.get()); | 376 | SDL_SetRenderTarget(ren_.get(), cameraTex_.get()); |
337 | SDL_RenderCopy(ren_.get(), textures_.at(game.getFont().getTextureId()).get(), &srcRect, &destRect); | 377 | SDL_RenderCopy(ren_.get(), textures_.at(game.getFont().getTextureId()).get(), &srcRect, &destRect); |
338 | } | 378 | } |
339 | } | 379 | } |
@@ -358,7 +398,7 @@ void Renderer::render(Game& game) { | |||
358 | 8, | 398 | 8, |
359 | 8 }; | 399 | 8 }; |
360 | 400 | ||
361 | SDL_SetRenderTarget(ren_.get(), cameraTex.get()); | 401 | SDL_SetRenderTarget(ren_.get(), cameraTex_.get()); |
362 | SDL_RenderCopy(ren_.get(), textures_.at(choiceArrowTex_).get(), nullptr, &destRect); | 402 | SDL_RenderCopy(ren_.get(), textures_.at(choiceArrowTex_).get(), nullptr, &destRect); |
363 | } else { | 403 | } else { |
364 | if (advMsgArrowTex_ == -1) { | 404 | if (advMsgArrowTex_ == -1) { |
@@ -371,7 +411,7 @@ void Renderer::render(Game& game) { | |||
371 | 8, | 411 | 8, |
372 | 8 }; | 412 | 8 }; |
373 | 413 | ||
374 | SDL_SetRenderTarget(ren_.get(), cameraTex.get()); | 414 | SDL_SetRenderTarget(ren_.get(), cameraTex_.get()); |
375 | SDL_RenderCopy(ren_.get(), textures_.at(advMsgArrowTex_).get(), nullptr, &destRect); | 415 | SDL_RenderCopy(ren_.get(), textures_.at(advMsgArrowTex_).get(), nullptr, &destRect); |
376 | } | 416 | } |
377 | } | 417 | } |
@@ -379,7 +419,7 @@ void Renderer::render(Game& game) { | |||
379 | } | 419 | } |
380 | 420 | ||
381 | if (effects.isScreenFaded()) { | 421 | if (effects.isScreenFaded()) { |
382 | SDL_SetRenderTarget(ren_.get(), cameraTex.get()); | 422 | SDL_SetRenderTarget(ren_.get(), cameraTex_.get()); |
383 | SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_BLEND); | 423 | SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_BLEND); |
384 | SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, effects.getScreenFadeProgress() * 255); | 424 | SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, effects.getScreenFadeProgress() * 255); |
385 | SDL_RenderFillRect(ren_.get(), nullptr); | 425 | SDL_RenderFillRect(ren_.get(), nullptr); |
@@ -387,7 +427,7 @@ void Renderer::render(Game& game) { | |||
387 | 427 | ||
388 | if (effects.isCircleTransitionActive()) { | 428 | if (effects.isCircleTransitionActive()) { |
389 | if (effects.getCircleTransitionProgress() == 1.0) { | 429 | if (effects.getCircleTransitionProgress() == 1.0) { |
390 | SDL_SetRenderTarget(ren_.get(), cameraTex.get()); | 430 | SDL_SetRenderTarget(ren_.get(), cameraTex_.get()); |
391 | SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE); | 431 | SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE); |
392 | SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 255); | 432 | SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 255); |
393 | SDL_RenderClear(ren_.get()); | 433 | SDL_RenderClear(ren_.get()); |
@@ -427,13 +467,13 @@ void Renderer::render(Game& game) { | |||
427 | copyFromCamera.h = CANVAS_HEIGHT; | 467 | copyFromCamera.h = CANVAS_HEIGHT; |
428 | } | 468 | } |
429 | 469 | ||
430 | SDL_RenderCopy(ren_.get(), cameraTex.get(), ©FromCamera, ©FromCamera); | 470 | SDL_RenderCopy(ren_.get(), cameraTex_.get(), ©FromCamera, ©FromCamera); |
431 | 471 | ||
432 | int pinholeTexId = loadImageFromFile("../res/pinhole.png"); | 472 | int pinholeTexId = loadImageFromFile("../res/pinhole.png"); |
433 | SDL_SetTextureBlendMode(textures_[pinholeTexId].get(), SDL_BLENDMODE_MOD); | 473 | SDL_SetTextureBlendMode(textures_[pinholeTexId].get(), SDL_BLENDMODE_MOD); |
434 | SDL_RenderCopy(ren_.get(), textures_[pinholeTexId].get(), nullptr, &circleSize); | 474 | SDL_RenderCopy(ren_.get(), textures_[pinholeTexId].get(), nullptr, &circleSize); |
435 | 475 | ||
436 | SDL_SetRenderTarget(ren_.get(), cameraTex.get()); | 476 | SDL_SetRenderTarget(ren_.get(), cameraTex_.get()); |
437 | SDL_SetTextureBlendMode(circleEffectTex.get(), SDL_BLENDMODE_NONE); | 477 | SDL_SetTextureBlendMode(circleEffectTex.get(), SDL_BLENDMODE_NONE); |
438 | SDL_RenderCopy(ren_.get(), circleEffectTex.get(), nullptr, nullptr); | 478 | SDL_RenderCopy(ren_.get(), circleEffectTex.get(), nullptr, nullptr); |
439 | } | 479 | } |
@@ -442,7 +482,7 @@ void Renderer::render(Game& game) { | |||
442 | if (game.getSystem<InputSystem>().isDebugConsoleOpen()) { | 482 | if (game.getSystem<InputSystem>().isDebugConsoleOpen()) { |
443 | // Not sure why I'm supposed to copy the cached texture to the screen | 483 | // Not sure why I'm supposed to copy the cached texture to the screen |
444 | // BEFORE rendering it, but we get flickering if we don't, so. | 484 | // BEFORE rendering it, but we get flickering if we don't, so. |
445 | SDL_SetRenderTarget(ren_.get(), cameraTex.get()); | 485 | SDL_SetRenderTarget(ren_.get(), cameraTex_.get()); |
446 | SDL_RenderCopy(ren_.get(), debugConsoleTex_.get(), nullptr, &debugDestRect_); | 486 | SDL_RenderCopy(ren_.get(), debugConsoleTex_.get(), nullptr, &debugDestRect_); |
447 | 487 | ||
448 | if (!debugConsoleTex_ || cachedDebugText_ != game.getSystem<InputSystem>().getDebugText()) { | 488 | if (!debugConsoleTex_ || cachedDebugText_ != game.getSystem<InputSystem>().getDebugText()) { |
@@ -494,54 +534,54 @@ void Renderer::render(Game& game) { | |||
494 | debugDestRect_ = SDL_Rect { 0, 0, CANVAS_WIDTH, height }; | 534 | debugDestRect_ = SDL_Rect { 0, 0, CANVAS_WIDTH, height }; |
495 | } | 535 | } |
496 | } | 536 | } |
537 | } | ||
497 | 538 | ||
498 | if (menus.isMenuOpen()) { | 539 | void Renderer::renderMenu(Game& game) { |
499 | SDL_SetRenderTarget(ren_.get(), cameraTex.get()); | 540 | auto& menus = game.getSystem<MenuSystem>(); |
500 | SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE); | 541 | |
501 | SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 255); | 542 | if (!menuTex_) { |
502 | SDL_RenderFillRect(ren_.get(), nullptr); | 543 | menuTex_.reset(SDL_CreateTexture( |
544 | ren_.get(), | ||
545 | SDL_PIXELFORMAT_RGBA8888, | ||
546 | SDL_TEXTUREACCESS_TARGET, | ||
547 | CANVAS_WIDTH, | ||
548 | CANVAS_HEIGHT)); | ||
549 | |||
550 | if (!menuTex_) { | ||
551 | throw sdl_error(); | ||
552 | } | ||
553 | } | ||
503 | 554 | ||
504 | const int lineHeight = 16; | 555 | SDL_SetRenderTarget(ren_.get(), menuTex_.get()); |
505 | int totalHeight = menus.getMenu().size() * lineHeight; | 556 | SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE); |
557 | SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 255); | ||
558 | SDL_RenderFillRect(ren_.get(), nullptr); | ||
506 | 559 | ||
507 | int index = 0; | 560 | const int lineHeight = 16; |
508 | for (const MenuItem& menuItem : menus.getMenu()) { | 561 | int totalHeight = menus.getMenu().size() * lineHeight; |
509 | switch (menuItem.type) { | ||
510 | case MenuType::Command: { | ||
511 | MessageCache output; | ||
512 | renderMessageLine(output, menuItem.text, game); | ||
513 | 562 | ||
514 | SDL_Rect dest { | 563 | int index = 0; |
515 | (CANVAS_WIDTH - output.charIndexToWidth.back()) / 2, | 564 | for (const MenuItem& menuItem : menus.getMenu()) { |
516 | (CANVAS_HEIGHT - totalHeight) / 2 + lineHeight * index, | 565 | switch (menuItem.type) { |
517 | MESSAGE_TEXT_WIDTH, | 566 | case MenuType::Command: { |
518 | game.getFont().getCharacterHeight() | 567 | MessageCache output; |
519 | }; | 568 | renderMessageLine(output, menuItem.text, game); |
569 | |||
570 | SDL_Rect dest { | ||
571 | (CANVAS_WIDTH - output.charIndexToWidth.back()) / 2, | ||
572 | (CANVAS_HEIGHT - totalHeight) / 2 + lineHeight * index, | ||
573 | MESSAGE_TEXT_WIDTH, | ||
574 | game.getFont().getCharacterHeight() | ||
575 | }; | ||
520 | 576 | ||
521 | SDL_SetRenderTarget(ren_.get(), cameraTex.get()); | 577 | SDL_SetRenderTarget(ren_.get(), menuTex_.get()); |
522 | SDL_RenderCopy(ren_.get(), output.renderedTex.get(), nullptr, &dest); | 578 | SDL_RenderCopy(ren_.get(), output.renderedTex.get(), nullptr, &dest); |
523 | 579 | ||
524 | break; | 580 | break; |
525 | } | ||
526 | } | 581 | } |
527 | index++; | ||
528 | } | 582 | } |
529 | } else if (menus.getPauseAnimationProgress() > 0.0) { | 583 | index++; |
530 | SDL_SetRenderTarget(ren_.get(), cameraTex.get()); | ||
531 | SDL_SetRenderDrawBlendMode(ren_.get(), SDL_BLENDMODE_NONE); | ||
532 | SDL_SetRenderDrawColor(ren_.get(), 0, 0, 0, 255); | ||
533 | |||
534 | int barHeight = CANVAS_HEIGHT / 2 * menus.getPauseAnimationProgress(); | ||
535 | SDL_Rect topHalf { 0, 0, CANVAS_WIDTH, barHeight }; | ||
536 | SDL_Rect bottomHalf { 0, CANVAS_HEIGHT - barHeight, CANVAS_WIDTH, barHeight }; | ||
537 | |||
538 | SDL_RenderFillRect(ren_.get(), &topHalf); | ||
539 | SDL_RenderFillRect(ren_.get(), &bottomHalf); | ||
540 | } | 584 | } |
541 | |||
542 | SDL_SetRenderTarget(ren_.get(), nullptr); | ||
543 | SDL_RenderCopy(ren_.get(), cameraTex.get(), nullptr, nullptr); | ||
544 | SDL_RenderPresent(ren_.get()); | ||
545 | } | 585 | } |
546 | 586 | ||
547 | int Renderer::loadImageFromFile(std::string filename) { | 587 | int Renderer::loadImageFromFile(std::string filename) { |
diff --git a/src/renderer.h b/src/renderer.h index 4c6ccc4..75bd9fe 100644 --- a/src/renderer.h +++ b/src/renderer.h | |||
@@ -134,6 +134,16 @@ private: | |||
134 | std::vector<texture_ptr> textures_; | 134 | std::vector<texture_ptr> textures_; |
135 | std::map<std::string, int> filenameToTexId_; | 135 | std::map<std::string, int> filenameToTexId_; |
136 | 136 | ||
137 | // Menu rendering | ||
138 | void renderMenu(Game& game); | ||
139 | |||
140 | texture_ptr menuTex_; | ||
141 | |||
142 | // Gameplay rendering | ||
143 | void renderGame(Game& game); | ||
144 | |||
145 | texture_ptr cameraTex_; | ||
146 | |||
137 | // Sprite rendering | 147 | // Sprite rendering |
138 | void renderSprite(const Sprite& sprite); | 148 | void renderSprite(const Sprite& sprite); |
139 | 149 | ||