BattleRenderer.cpp 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /*
  2. * BattleFieldController.cpp, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #include "StdInc.h"
  11. #include "BattleRenderer.h"
  12. #include "BattleInterface.h"
  13. #include "BattleInterfaceClasses.h"
  14. #include "BattleEffectsController.h"
  15. #include "BattleWindow.h"
  16. #include "BattleSiegeController.h"
  17. #include "BattleStacksController.h"
  18. #include "BattleObstacleController.h"
  19. #include "BattleOverlayLogVisualizer.h"
  20. void BattleRenderer::collectObjects()
  21. {
  22. owner.effectsController->collectRenderableObjects(*this);
  23. owner.obstacleController->collectRenderableObjects(*this);
  24. owner.stacksController->collectRenderableObjects(*this);
  25. if (owner.siegeController)
  26. owner.siegeController->collectRenderableObjects(*this);
  27. if (owner.defendingHero)
  28. owner.defendingHero->collectRenderableObjects(*this);
  29. if (owner.attackingHero)
  30. owner.attackingHero->collectRenderableObjects(*this);
  31. }
  32. void BattleRenderer::sortObjects()
  33. {
  34. auto getRow = [](const RenderableInstance & object) -> int
  35. {
  36. if (object.tile.isValid())
  37. return object.tile.getY();
  38. if ( object.tile == BattleHex::HEX_BEFORE_ALL )
  39. return -1;
  40. assert( object.tile == BattleHex::HEX_AFTER_ALL || object.tile == BattleHex::INVALID);
  41. return GameConstants::BFIELD_HEIGHT;
  42. };
  43. std::stable_sort(objects.begin(), objects.end(), [&](const RenderableInstance & left, const RenderableInstance & right){
  44. if ( getRow(left) != getRow(right))
  45. return getRow(left) < getRow(right);
  46. return left.layer < right.layer;
  47. });
  48. }
  49. void BattleRenderer::renderObjects(BattleRenderer::RendererRef targetCanvas)
  50. {
  51. for (auto const & object : objects)
  52. object.functor(targetCanvas);
  53. }
  54. BattleRenderer::BattleRenderer(BattleInterface & owner):
  55. owner(owner)
  56. {
  57. }
  58. void BattleRenderer::insert(EBattleFieldLayer layer, const BattleHex & tile, BattleRenderer::RenderFunctor functor)
  59. {
  60. objects.push_back({functor, layer, tile});
  61. }
  62. void BattleRenderer::execute(BattleRenderer::RendererRef targetCanvas)
  63. {
  64. collectObjects();
  65. sortObjects();
  66. renderObjects(targetCanvas);
  67. BattleOverlayLogVisualizer r(targetCanvas, owner);
  68. logVisual->visualize(r);
  69. }