1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-23 22:37:55 +02:00
Files
vcmi/mapeditor/scenelayer.h

277 lines
5.9 KiB
C++
Raw Normal View History

2022-10-13 01:51:55 +04:00
/*
* scenelayer.h, part of VCMI engine
*
* Authors: listed in file AUTHORS in main folder
*
* License: GNU General Public License v2.0 or later
* Full text of license available in license.txt file, in main folder
*
*/
2022-09-25 00:55:05 +04:00
#pragma once
2022-09-18 03:23:17 +04:00
#include "../lib/int3.h"
class MapSceneBase;
class MapScene;
class MapController;
class MapHandler;
VCMI_LIB_NAMESPACE_BEGIN
class CMap;
class CGObjectInstance;
VCMI_LIB_NAMESPACE_END
2022-09-18 03:23:17 +04:00
class AbstractLayer : public QObject
{
Q_OBJECT
public:
AbstractLayer(MapSceneBase * s);
void initialize(MapController & controller);
2025-10-06 20:33:09 +02:00
void show(bool show);
virtual void update() = 0;
virtual void redraw() = 0;
2022-09-18 03:23:17 +04:00
protected:
2025-10-06 20:33:09 +02:00
int mapWidthPx() const;
int mapHeightPx() const;
int toInt(double value) const;
2022-09-18 03:23:17 +04:00
MapSceneBase * scene;
CMap * map = nullptr;
MapHandler * handler = nullptr;
bool isShown = false;
2025-10-06 20:33:09 +02:00
const int tileSize = 32;
};
class AbstractFixedLayer : public AbstractLayer
{
Q_OBJECT
public:
AbstractFixedLayer(MapSceneBase * s);
void redraw();
protected:
2022-09-18 03:23:17 +04:00
std::unique_ptr<QPixmap> pixmap;
QPixmap emptyPixmap;
2025-10-06 20:33:09 +02:00
2022-09-18 03:23:17 +04:00
private:
std::unique_ptr<QGraphicsPixmapItem> item;
};
2025-10-06 20:33:09 +02:00
class AbstractViewportLayer : public AbstractLayer
{
public:
AbstractViewportLayer(MapSceneBase * s);
void createLayer();
void setViewport(const QRectF & _viewPort);
void update();
void redraw();
protected:
virtual QGraphicsItem * draw(const QRectF & area) = 0;
void redraw(const std::vector<int3> & tiles);
void redrawWithSurroundingTiles(const std::vector<int3> & tiles);
void redraw(const std::set<CGObjectInstance *> & objects);
void redraw(const std::vector<QRectF> & areas);
2025-10-06 20:52:25 +02:00
QRectF getObjectArea(const CGObjectInstance * object) const;
2025-10-06 20:33:09 +02:00
private:
void addSector(QGraphicsItem * item);
void removeSector(QGraphicsItem * item);
void redrawSectors(std::set<QGraphicsItem *> & items);
2025-10-06 20:52:25 +02:00
const QList<QGraphicsItem *> getAllSectors() const;
2022-09-18 03:23:17 +04:00
2025-10-06 20:52:25 +02:00
std::set<QGraphicsItem *> getContainingSectors(const std::vector<int3> & tiles) const;
std::set<QGraphicsItem *> getIntersectingSectors(const std::vector<QRectF> & areas) const;
2025-10-06 20:33:09 +02:00
std::unique_ptr<QGraphicsItemGroup> items;
const int sectorSizeInTiles = 10;
const int sectorSize = sectorSizeInTiles * tileSize;
};
class EmptyLayer: public AbstractFixedLayer
2022-09-18 03:23:17 +04:00
{
Q_OBJECT
public:
2025-10-06 20:33:09 +02:00
EmptyLayer(MapSceneBase * s);
2022-09-18 03:23:17 +04:00
void update() override;
};
2025-10-06 20:33:09 +02:00
class GridLayer: public AbstractViewportLayer
{
Q_OBJECT
public:
GridLayer(MapSceneBase * s);
protected:
QGraphicsItem * draw(const QRectF & section) override;
};
class PassabilityLayer: public AbstractViewportLayer
2022-09-18 03:23:17 +04:00
{
Q_OBJECT
public:
PassabilityLayer(MapSceneBase * s);
2025-10-06 20:33:09 +02:00
protected:
QGraphicsItem * draw(const QRectF & section) override;
2022-09-18 03:23:17 +04:00
};
2025-10-06 20:33:09 +02:00
class SelectionTerrainLayer: public AbstractViewportLayer
2022-09-18 03:23:17 +04:00
{
Q_OBJECT
public:
SelectionTerrainLayer(MapSceneBase* s);
2025-10-06 20:33:09 +02:00
void select(const std::vector<int3> & tiles);
void erase(const std::vector<int3> & tiles);
2022-09-18 03:23:17 +04:00
void clear();
2025-10-06 20:33:09 +02:00
2022-09-18 03:23:17 +04:00
const std::set<int3> & selection() const;
2025-10-06 20:33:09 +02:00
protected:
QGraphicsItem * draw(const QRectF & section) override;
2022-09-18 03:23:17 +04:00
signals:
void selectionMade(bool anythingSelected);
2022-09-18 03:23:17 +04:00
private:
std::set<int3> area;
std::set<int3> areaAdd;
std::set<int3> areaErase;
2022-09-18 03:23:17 +04:00
void onSelection();
};
2025-10-06 20:33:09 +02:00
class TerrainLayer: public AbstractViewportLayer
2022-09-18 03:23:17 +04:00
{
Q_OBJECT
public:
TerrainLayer(MapSceneBase * s);
2025-10-06 20:33:09 +02:00
void redrawTerrain(const std::vector<int3> & tiles);
protected:
QGraphicsItem * draw(const QRectF & section) override;
2022-09-18 03:23:17 +04:00
};
2025-10-06 20:33:09 +02:00
class ObjectsLayer: public AbstractViewportLayer
2022-09-18 03:23:17 +04:00
{
Q_OBJECT
public:
ObjectsLayer(MapSceneBase * s);
2023-10-13 05:21:09 +02:00
2025-10-06 20:33:09 +02:00
void redrawObjects(const std::set<CGObjectInstance *> & objects);
2023-10-13 05:21:09 +02:00
void setLockObject(const CGObjectInstance * object, bool lock);
void unlockAll();
2025-10-06 20:33:09 +02:00
protected:
QGraphicsItem * draw(const QRectF & section) override;
2022-09-18 03:23:17 +04:00
private:
2023-10-13 05:21:09 +02:00
std::set<const CGObjectInstance *> lockedObjects;
2022-09-18 03:23:17 +04:00
};
2025-10-06 20:33:09 +02:00
class ObjectPickerLayer: public AbstractViewportLayer
2023-09-11 18:01:53 +02:00
{
Q_OBJECT
public:
ObjectPickerLayer(MapSceneBase * s);
bool isVisible() const;
template<class T>
void highlight()
{
highlight([](const CGObjectInstance * o){ return dynamic_cast<T*>(o); });
}
2025-10-06 20:33:09 +02:00
void highlight(const std::function<bool(const CGObjectInstance *)> & predicate);
2023-09-11 18:01:53 +02:00
void clear();
void select(const CGObjectInstance *);
void discard();
2025-10-06 20:33:09 +02:00
protected:
QGraphicsItem * draw(const QRectF & section) override;
2023-09-11 18:01:53 +02:00
signals:
void selectionMade(const CGObjectInstance *);
private:
bool isActive = false;
std::set<const CGObjectInstance *> possibleObjects;
};
2025-10-06 20:33:09 +02:00
class SelectionObjectsLayer: public AbstractViewportLayer
2022-09-18 03:23:17 +04:00
{
Q_OBJECT
public:
2022-10-13 01:40:52 +04:00
enum SelectionMode
{
NOTHING, SELECTION, MOVEMENT
};
2022-09-18 03:23:17 +04:00
SelectionObjectsLayer(MapSceneBase* s);
2025-10-06 20:33:09 +02:00
2022-12-05 01:32:50 +04:00
CGObjectInstance * selectObjectAt(int x, int y, const CGObjectInstance * ignore = nullptr) const;
2022-09-18 03:23:17 +04:00
void selectObjects(int x1, int y1, int x2, int y2);
2025-10-06 20:33:09 +02:00
void selectObject(CGObjectInstance *);
2022-09-18 03:23:17 +04:00
void deselectObject(CGObjectInstance *);
bool isSelected(const CGObjectInstance *) const;
std::set<CGObjectInstance*> getSelection() const;
void clear();
2023-10-13 05:21:09 +02:00
2025-10-06 20:33:09 +02:00
void setShift(int x, int y);
void setLockObject(CGObjectInstance * object, bool lock);
2023-10-13 05:21:09 +02:00
void unlockAll();
std::shared_ptr<CGObjectInstance> newObject;
2025-10-06 20:33:09 +02:00
QPoint shift;
2022-10-13 01:40:52 +04:00
SelectionMode selectionMode = SelectionMode::NOTHING;
2022-09-18 03:23:17 +04:00
2025-10-06 20:33:09 +02:00
protected:
QGraphicsItem * draw(const QRectF & section) override;
2022-09-18 03:23:17 +04:00
signals:
void selectionMade(bool anythingSelected);
2022-09-18 03:23:17 +04:00
private:
2025-10-06 20:33:09 +02:00
void selectObjects(const std::set<CGObjectInstance *> & objs);
2022-09-18 03:23:17 +04:00
std::set<CGObjectInstance *> selectedObjects;
2023-10-13 05:21:09 +02:00
std::set<const CGObjectInstance *> lockedObjects;
2022-09-18 03:23:17 +04:00
void onSelection();
};
2025-10-06 20:33:09 +02:00
class MinimapLayer: public AbstractFixedLayer
2022-09-18 03:23:17 +04:00
{
public:
MinimapLayer(MapSceneBase * s);
void update() override;
};
2025-10-06 20:33:09 +02:00
class MinimapViewLayer: public AbstractFixedLayer
2022-09-18 03:23:17 +04:00
{
public:
MinimapViewLayer(MapSceneBase * s);
void setViewport(int x, int y, int w, int h);
void draw();
void update() override;
int viewportX() const {return x;}
int viewportY() const {return y;}
int viewportWidth() const {return w;}
int viewportHeight() const {return h;}
private:
int x = 0;
int y = 0;
int w = 1;
int h = 1;
2022-09-18 03:23:17 +04:00
};