diff options
Diffstat (limited to 'src')
| -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 | ||
