2
0

CBattleRenderer.cpp 2.1 KB

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