scenelayer.h 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. /*
  2. * scenelayer.h, 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. #pragma once
  11. #include "../lib/int3.h"
  12. class MapSceneBase;
  13. class MapScene;
  14. class MapController;
  15. class MapHandler;
  16. VCMI_LIB_NAMESPACE_BEGIN
  17. class CMap;
  18. class CGObjectInstance;
  19. VCMI_LIB_NAMESPACE_END
  20. class AbstractLayer : public QObject
  21. {
  22. Q_OBJECT
  23. public:
  24. AbstractLayer(MapSceneBase * s);
  25. void initialize(MapController & controller);
  26. void show(bool show);
  27. virtual void update() = 0;
  28. virtual void redraw() = 0;
  29. protected:
  30. int mapWidthPx() const;
  31. int mapHeightPx() const;
  32. int toInt(double value) const;
  33. MapSceneBase * scene;
  34. CMap * map = nullptr;
  35. MapHandler * handler = nullptr;
  36. bool isShown = false;
  37. const int tileSize = 32;
  38. };
  39. class AbstractFixedLayer : public AbstractLayer
  40. {
  41. Q_OBJECT
  42. public:
  43. AbstractFixedLayer(MapSceneBase * s);
  44. void redraw();
  45. protected:
  46. std::unique_ptr<QPixmap> pixmap;
  47. QPixmap emptyPixmap;
  48. private:
  49. std::unique_ptr<QGraphicsPixmapItem> item;
  50. };
  51. class AbstractViewportLayer : public AbstractLayer
  52. {
  53. public:
  54. AbstractViewportLayer(MapSceneBase * s);
  55. void createLayer();
  56. void setViewport(const QRectF & _viewPort);
  57. void update();
  58. void redraw();
  59. protected:
  60. virtual QGraphicsItem * draw(const QRectF & area) = 0;
  61. void redraw(const std::vector<int3> & tiles);
  62. void redrawWithSurroundingTiles(const std::vector<int3> & tiles);
  63. void redraw(const std::set<CGObjectInstance *> & objects);
  64. void redraw(const std::vector<QRectF> & areas);
  65. QRectF getObjectArea(const CGObjectInstance * object) const;
  66. private:
  67. void addSector(QGraphicsItem * item);
  68. void removeSector(QGraphicsItem * item);
  69. void redrawSectors(std::set<QGraphicsItem *> & items);
  70. const QList<QGraphicsItem *> getAllSectors() const;
  71. std::set<QGraphicsItem *> getContainingSectors(const std::vector<int3> & tiles) const;
  72. std::set<QGraphicsItem *> getIntersectingSectors(const std::vector<QRectF> & areas) const;
  73. std::unique_ptr<QGraphicsItemGroup> items;
  74. const int sectorSizeInTiles = 10;
  75. const int sectorSize = sectorSizeInTiles * tileSize;
  76. };
  77. class EmptyLayer: public AbstractFixedLayer
  78. {
  79. Q_OBJECT
  80. public:
  81. EmptyLayer(MapSceneBase * s);
  82. void update() override;
  83. };
  84. class GridLayer: public AbstractViewportLayer
  85. {
  86. Q_OBJECT
  87. public:
  88. GridLayer(MapSceneBase * s);
  89. protected:
  90. QGraphicsItem * draw(const QRectF & section) override;
  91. };
  92. class PassabilityLayer: public AbstractViewportLayer
  93. {
  94. Q_OBJECT
  95. public:
  96. PassabilityLayer(MapSceneBase * s);
  97. protected:
  98. QGraphicsItem * draw(const QRectF & section) override;
  99. };
  100. class SelectionTerrainLayer: public AbstractViewportLayer
  101. {
  102. Q_OBJECT
  103. public:
  104. SelectionTerrainLayer(MapSceneBase* s);
  105. void select(const std::vector<int3> & tiles);
  106. void erase(const std::vector<int3> & tiles);
  107. void clear();
  108. const std::set<int3> & selection() const;
  109. protected:
  110. QGraphicsItem * draw(const QRectF & section) override;
  111. signals:
  112. void selectionMade(bool anythingSelected);
  113. private:
  114. std::set<int3> area;
  115. std::set<int3> areaAdd;
  116. std::set<int3> areaErase;
  117. void onSelection();
  118. };
  119. class TerrainLayer: public AbstractViewportLayer
  120. {
  121. Q_OBJECT
  122. public:
  123. TerrainLayer(MapSceneBase * s);
  124. void redrawTerrain(const std::vector<int3> & tiles);
  125. protected:
  126. QGraphicsItem * draw(const QRectF & section) override;
  127. };
  128. class ObjectsLayer: public AbstractViewportLayer
  129. {
  130. Q_OBJECT
  131. public:
  132. ObjectsLayer(MapSceneBase * s);
  133. void redrawObjects(const std::set<CGObjectInstance *> & objects);
  134. void setLockObject(const CGObjectInstance * object, bool lock);
  135. void unlockAll();
  136. protected:
  137. QGraphicsItem * draw(const QRectF & section) override;
  138. private:
  139. std::set<const CGObjectInstance *> lockedObjects;
  140. };
  141. class ObjectPickerLayer: public AbstractViewportLayer
  142. {
  143. Q_OBJECT
  144. public:
  145. ObjectPickerLayer(MapSceneBase * s);
  146. bool isVisible() const;
  147. template<class T>
  148. void highlight()
  149. {
  150. highlight([](const CGObjectInstance * o){ return dynamic_cast<T*>(o); });
  151. }
  152. void highlight(const std::function<bool(const CGObjectInstance *)> & predicate);
  153. void clear();
  154. void select(const CGObjectInstance *);
  155. void discard();
  156. protected:
  157. QGraphicsItem * draw(const QRectF & section) override;
  158. signals:
  159. void selectionMade(const CGObjectInstance *);
  160. private:
  161. bool isActive = false;
  162. std::set<const CGObjectInstance *> possibleObjects;
  163. };
  164. class SelectionObjectsLayer: public AbstractViewportLayer
  165. {
  166. Q_OBJECT
  167. public:
  168. enum SelectionMode
  169. {
  170. NOTHING, SELECTION, MOVEMENT
  171. };
  172. SelectionObjectsLayer(MapSceneBase* s);
  173. CGObjectInstance * selectObjectAt(int x, int y, const CGObjectInstance * ignore = nullptr) const;
  174. void selectObjects(int x1, int y1, int x2, int y2);
  175. void selectObject(CGObjectInstance *);
  176. void deselectObject(CGObjectInstance *);
  177. bool isSelected(const CGObjectInstance *) const;
  178. std::set<CGObjectInstance*> getSelection() const;
  179. void clear();
  180. void setShift(int x, int y);
  181. void setLockObject(CGObjectInstance * object, bool lock);
  182. void unlockAll();
  183. std::shared_ptr<CGObjectInstance> newObject;
  184. QPoint shift;
  185. SelectionMode selectionMode = SelectionMode::NOTHING;
  186. protected:
  187. QGraphicsItem * draw(const QRectF & section) override;
  188. signals:
  189. void selectionMade(bool anythingSelected);
  190. private:
  191. void selectObjects(const std::set<CGObjectInstance *> & objs);
  192. std::set<CGObjectInstance *> selectedObjects;
  193. std::set<const CGObjectInstance *> lockedObjects;
  194. void onSelection();
  195. };
  196. class MinimapLayer: public AbstractFixedLayer
  197. {
  198. public:
  199. MinimapLayer(MapSceneBase * s);
  200. void update() override;
  201. };
  202. class MinimapViewLayer: public AbstractFixedLayer
  203. {
  204. public:
  205. MinimapViewLayer(MapSceneBase * s);
  206. void setViewport(int x, int y, int w, int h);
  207. void draw();
  208. void update() override;
  209. int viewportX() const {return x;}
  210. int viewportY() const {return y;}
  211. int viewportWidth() const {return w;}
  212. int viewportHeight() const {return h;}
  213. private:
  214. int x = 0;
  215. int y = 0;
  216. int w = 1;
  217. int h = 1;
  218. };