BattleRenderer.cpp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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 "BattleEffectsController.h"
  14. #include "BattleSiegeController.h"
  15. #include "BattleStacksController.h"
  16. #include "BattleObstacleController.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. assert( object.tile == BattleHex::HEX_AFTER_ALL || object.tile == BattleHex::INVALID);
  35. return GameConstants::BFIELD_HEIGHT;
  36. };
  37. std::stable_sort(objects.begin(), objects.end(), [&](const RenderableInstance & left, const RenderableInstance & right){
  38. if ( getRow(left) != getRow(right))
  39. return getRow(left) < getRow(right);
  40. return left.layer < right.layer;
  41. });
  42. }
  43. void BattleRenderer::renderObjects(BattleRenderer::RendererPtr targetCanvas)
  44. {
  45. for (auto const & object : objects)
  46. object.functor(targetCanvas);
  47. }
  48. BattleRenderer::BattleRenderer(BattleInterface & owner):
  49. owner(owner)
  50. {
  51. }
  52. void BattleRenderer::insert(EBattleFieldLayer layer, BattleHex tile, BattleRenderer::RenderFunctor functor)
  53. {
  54. objects.push_back({functor, layer, tile});
  55. }
  56. void BattleRenderer::execute(BattleRenderer::RendererPtr targetCanvas)
  57. {
  58. collectObjects();
  59. sortObjects();
  60. renderObjects(targetCanvas);
  61. }