BattleRenderer.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. void BattleRenderer::collectObjects()
  20. {
  21. owner.effectsController->collectRenderableObjects(*this);
  22. owner.obstacleController->collectRenderableObjects(*this);
  23. owner.stacksController->collectRenderableObjects(*this);
  24. if (owner.siegeController)
  25. owner.siegeController->collectRenderableObjects(*this);
  26. if (owner.defendingHero)
  27. owner.defendingHero->collectRenderableObjects(*this);
  28. if (owner.attackingHero)
  29. owner.attackingHero->collectRenderableObjects(*this);
  30. }
  31. void BattleRenderer::sortObjects()
  32. {
  33. auto getRow = [](const RenderableInstance & object) -> int
  34. {
  35. if (object.tile.isValid())
  36. return object.tile.getY();
  37. if ( object.tile == BattleHex::HEX_BEFORE_ALL )
  38. return -1;
  39. assert( object.tile == BattleHex::HEX_AFTER_ALL || object.tile == BattleHex::INVALID);
  40. return GameConstants::BFIELD_HEIGHT;
  41. };
  42. std::stable_sort(objects.begin(), objects.end(), [&](const RenderableInstance & left, const RenderableInstance & right){
  43. if ( getRow(left) != getRow(right))
  44. return getRow(left) < getRow(right);
  45. return left.layer < right.layer;
  46. });
  47. }
  48. void BattleRenderer::renderObjects(BattleRenderer::RendererRef targetCanvas)
  49. {
  50. for (auto const & object : objects)
  51. object.functor(targetCanvas);
  52. }
  53. BattleRenderer::BattleRenderer(BattleInterface & owner):
  54. owner(owner)
  55. {
  56. }
  57. void BattleRenderer::insert(EBattleFieldLayer layer, BattleHex tile, BattleRenderer::RenderFunctor functor)
  58. {
  59. objects.push_back({functor, layer, tile});
  60. }
  61. void BattleRenderer::execute(BattleRenderer::RendererRef targetCanvas)
  62. {
  63. collectObjects();
  64. sortObjects();
  65. renderObjects(targetCanvas);
  66. }