MapViewModel.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /*
  2. * MapViewModel.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 "MapViewModel.h"
  12. #include "../../lib/int3.h"
  13. void MapViewModel::setTileSize(const Point & newValue)
  14. {
  15. tileSize = newValue;
  16. }
  17. void MapViewModel::setViewCenter(const Point & newValue)
  18. {
  19. viewCenter = newValue;
  20. }
  21. void MapViewModel::setViewDimensions(const Point & newValue)
  22. {
  23. viewDimensions = newValue;
  24. }
  25. void MapViewModel::setLevel(int newLevel)
  26. {
  27. mapLevel = newLevel;
  28. }
  29. Point MapViewModel::getSingleTileSize() const
  30. {
  31. return tileSize;
  32. }
  33. Point MapViewModel::getMapViewCenter() const
  34. {
  35. return viewCenter;
  36. }
  37. Point MapViewModel::getPixelsVisibleDimensions() const
  38. {
  39. return viewDimensions;
  40. }
  41. int MapViewModel::getLevel() const
  42. {
  43. return mapLevel;
  44. }
  45. Point MapViewModel::getTilesVisibleDimensions() const
  46. {
  47. // total number of potentially visible tiles is:
  48. // 1) number of completely visible tiles
  49. // 2) additional tile that might be partially visible from left/top size
  50. // 3) additional tile that might be partially visible from right/bottom size
  51. return {
  52. getPixelsVisibleDimensions().x / getSingleTileSize().x + 2,
  53. getPixelsVisibleDimensions().y / getSingleTileSize().y + 2,
  54. };
  55. }
  56. Rect MapViewModel::getTilesTotalRect() const
  57. {
  58. return Rect(
  59. Point(getTileAtPoint(Point(0,0))),
  60. getTilesVisibleDimensions()
  61. );
  62. }
  63. int3 MapViewModel::getTileAtPoint(const Point & position) const
  64. {
  65. Point topLeftOffset = getMapViewCenter() - getPixelsVisibleDimensions() / 2;
  66. Point absolutePosition = position + topLeftOffset;
  67. // NOTE: using division via double in order to use std::floor
  68. // which rounds to negative infinity and not towards zero (like integer division)
  69. return {
  70. static_cast<int>(std::floor(static_cast<double>(absolutePosition.x) / getSingleTileSize().x)),
  71. static_cast<int>(std::floor(static_cast<double>(absolutePosition.y) / getSingleTileSize().y)),
  72. getLevel()
  73. };
  74. }
  75. Point MapViewModel::getCacheDimensionsPixels() const
  76. {
  77. return getTilesVisibleDimensions() * getSingleTileSize();
  78. }
  79. Rect MapViewModel::getCacheTileArea(const int3 & coordinates) const
  80. {
  81. assert(mapLevel == coordinates.z);
  82. assert(getTilesVisibleDimensions().x + coordinates.x >= 0);
  83. assert(getTilesVisibleDimensions().y + coordinates.y >= 0);
  84. Point tileIndex{
  85. (getTilesVisibleDimensions().x + coordinates.x) % getTilesVisibleDimensions().x,
  86. (getTilesVisibleDimensions().y + coordinates.y) % getTilesVisibleDimensions().y
  87. };
  88. return Rect(tileIndex * tileSize, tileSize);
  89. }
  90. Rect MapViewModel::getTargetTileArea(const int3 & coordinates) const
  91. {
  92. Point topLeftOffset = getMapViewCenter() - getPixelsVisibleDimensions() / 2;
  93. Point tilePosAbsolute = Point(coordinates) * tileSize;
  94. Point tilePosRelative = tilePosAbsolute - topLeftOffset;
  95. return Rect(tilePosRelative, tileSize);
  96. }