DDNet documentation
Loading...
Searching...
No Matches
layer_tiles.h
Go to the documentation of this file.
1#ifndef GAME_EDITOR_MAPITEMS_LAYER_TILES_H
2#define GAME_EDITOR_MAPITEMS_LAYER_TILES_H
3
4#include "layer.h"
5
6#include <base/dbg.h>
7#include <base/mem.h>
8
10#include <game/editor/enums.h>
11
12#include <map>
13
20
21template<typename T>
22using EditorTileStateChangeHistory = std::map<int, std::map<int, T>>;
23
28enum class EShiftDirection : int
29{
34};
35
37{
38public:
39 int x, y;
40 int w, h;
41};
42
43class CLayerTiles : public CLayer
44{
45protected:
46 template<typename T>
47 void ShiftImpl(T *pTiles, EShiftDirection Direction, int ShiftBy)
48 {
49 switch(Direction)
50 {
52 ShiftBy = minimum(ShiftBy, m_Width);
53 for(int y = 0; y < m_Height; ++y)
54 {
55 if(ShiftBy < m_Width)
56 mem_move(&pTiles[y * m_Width], &pTiles[y * m_Width + ShiftBy], (m_Width - ShiftBy) * sizeof(T));
57 mem_zero(&pTiles[y * m_Width + (m_Width - ShiftBy)], ShiftBy * sizeof(T));
58 }
59 break;
61 ShiftBy = minimum(ShiftBy, m_Width);
62 for(int y = 0; y < m_Height; ++y)
63 {
64 if(ShiftBy < m_Width)
65 mem_move(&pTiles[y * m_Width + ShiftBy], &pTiles[y * m_Width], (m_Width - ShiftBy) * sizeof(T));
66 mem_zero(&pTiles[y * m_Width], ShiftBy * sizeof(T));
67 }
68 break;
70 ShiftBy = minimum(ShiftBy, m_Height);
71 for(int y = ShiftBy; y < m_Height; ++y)
72 {
73 mem_copy(&pTiles[(y - ShiftBy) * m_Width], &pTiles[y * m_Width], m_Width * sizeof(T));
74 }
75 for(int y = m_Height - ShiftBy; y < m_Height; ++y)
76 {
77 mem_zero(&pTiles[y * m_Width], m_Width * sizeof(T));
78 }
79 break;
81 ShiftBy = minimum(ShiftBy, m_Height);
82 for(int y = m_Height - ShiftBy - 1; y >= 0; --y)
83 {
84 mem_copy(&pTiles[(y + ShiftBy) * m_Width], &pTiles[y * m_Width], m_Width * sizeof(T));
85 }
86 for(int y = 0; y < ShiftBy; ++y)
87 {
88 mem_zero(&pTiles[y * m_Width], m_Width * sizeof(T));
89 }
90 break;
91 default:
92 dbg_assert_failed("Direction invalid: %d", (int)Direction);
93 }
94 }
95 template<typename T>
96 void BrushFlipXImpl(T *pTiles)
97 {
98 for(int y = 0; y < m_Height; y++)
99 for(int x = 0; x < m_Width / 2; x++)
100 std::swap(pTiles[y * m_Width + x], pTiles[(y + 1) * m_Width - 1 - x]);
101 }
102 template<typename T>
103 void BrushFlipYImpl(T *pTiles)
104 {
105 for(int y = 0; y < m_Height / 2; y++)
106 for(int x = 0; x < m_Width; x++)
107 std::swap(pTiles[y * m_Width + x], pTiles[(m_Height - 1 - y) * m_Width + x]);
108 }
109
110public:
111 CLayerTiles(CEditorMap *pMap, int w, int h);
112 CLayerTiles(const CLayerTiles &Other);
113 ~CLayerTiles() override;
114
115 [[nodiscard]] virtual CTile GetTile(int x, int y) const;
116 virtual void SetTile(int x, int y, CTile Tile);
117 void SetTileIgnoreHistory(int x, int y, CTile Tile) const;
118
119 virtual void Resize(int NewW, int NewH);
120 virtual void Shift(EShiftDirection Direction);
121
122 void MakePalette() const;
123 void Render(bool Tileset = false) override;
124
125 int ConvertX(float x) const;
126 int ConvertY(float y) const;
127 void Convert(CUIRect Rect, CIntRect *pOut) const;
128 void Snap(CUIRect *pRect) const;
129 void Clamp(CIntRect *pRect) const;
130
131 bool IsEntitiesLayer() const override;
132
133 [[nodiscard]] virtual bool IsEmpty() const;
134 void BrushSelecting(CUIRect Rect) override;
135 int BrushGrab(CLayerGroup *pBrush, CUIRect Rect) override;
136 void FillSelection(bool Empty, CLayer *pBrush, CUIRect Rect) override;
137 void FillGameTiles(EGameTileOp Fill);
138 bool CanFillGameTiles() const;
139 void BrushDraw(CLayer *pBrush, vec2 WorldPos) override;
140 void BrushFlipX() override;
141 void BrushFlipY() override;
142 void BrushRotate(float Amount) override;
143
144 std::shared_ptr<CLayer> Duplicate() const override;
145 const char *TypeName() const override;
146
147 virtual void ShowInfo();
149
151 {
152 enum
153 {
156 };
157 int m_Modified = 0;
158 int m_Width = -1;
159 int m_Height = -1;
160 int m_Color = 0;
161 };
162 static CUi::EPopupMenuFunctionResult RenderCommonProperties(SCommonPropState &State, CEditorMap *pEditorMap, CUIRect *pToolbox, std::vector<std::shared_ptr<CLayerTiles>> &vpLayers, std::vector<int> &vLayerIndices);
163
164 bool IsEnvelopeUsed(int EnvelopeIndex) const override;
165 bool IsImageUsed(int ImageIndex) const override;
166
167 void ModifyImageIndex(const FIndexModifyFunction &IndexModifyFunction) override;
168 void ModifyEnvelopeIndex(const FIndexModifyFunction &IndexModifyFunction) override;
169
170 void PrepareForSave();
171 void ExtractTiles(const CTile *pSavedTiles, size_t SavedTilesSize) const;
172
173 void GetSize(float *pWidth, float *pHeight) override
174 {
175 *pWidth = m_Width * 32.0f;
176 *pHeight = m_Height * 32.0f;
177 }
178
179 void FlagModified(int x, int y, int w, int h);
180
189
190 // DDRace
191
193 bool m_LiveGameTiles = false;
205
207 virtual void ClearHistory() { m_TilesHistory.clear(); }
208
209 static bool HasAutomapEffect(ETilesProp Prop);
210
211protected:
212 void RecordStateChange(int x, int y, CTile Previous, CTile Tile);
213
215
216 friend class CAutoMapper;
217};
218
219#endif
Definition map.h:57
Definition layer_tiles.h:37
int w
Definition layer_tiles.h:40
int x
Definition layer_tiles.h:39
int h
Definition layer_tiles.h:40
int y
Definition layer_tiles.h:39
Definition layer_group.h:12
Definition layer_tiles.h:44
int ConvertY(float y) const
Definition layer_tiles.cpp:205
bool m_HasTele
Definition layer_tiles.h:198
bool m_HasFront
Definition layer_tiles.h:200
void ShiftImpl(T *pTiles, EShiftDirection Direction, int ShiftBy)
Definition layer_tiles.h:47
void BrushFlipX() override
Definition layer_tiles.cpp:596
void ModifyImageIndex(const FIndexModifyFunction &IndexModifyFunction) override
Definition layer_tiles.cpp:1370
int m_AutoMapperReference
Definition layer_tiles.h:195
bool m_HasGame
Definition layer_tiles.h:181
virtual void SetTile(int x, int y, CTile Tile)
Definition layer_tiles.cpp:84
int m_FillGameTile
Definition layer_tiles.h:192
bool IsEntitiesLayer() const override
Definition layer_tiles.cpp:251
void FillGameTiles(EGameTileOp Fill)
Definition layer_tiles.cpp:760
void ModifyEnvelopeIndex(const FIndexModifyFunction &IndexModifyFunction) override
Definition layer_tiles.cpp:1375
void BrushFlipY() override
Definition layer_tiles.cpp:612
bool m_AutoAutoMap
Definition layer_tiles.h:197
friend class CAutoMapper
Definition layer_tiles.h:216
void Clamp(CIntRect *pRect) const
Definition layer_tiles.cpp:225
bool m_LiveGameTiles
Definition layer_tiles.h:193
CColor m_Color
Definition layer_tiles.h:185
virtual void ClearHistory()
Definition layer_tiles.h:207
int m_AutoMapperConfig
Definition layer_tiles.h:194
static CUi::EPopupMenuFunctionResult RenderCommonProperties(SCommonPropState &State, CEditorMap *pEditorMap, CUIRect *pToolbox, std::vector< std::shared_ptr< CLayerTiles > > &vpLayers, std::vector< int > &vLayerIndices)
Definition layer_tiles.cpp:1182
void GetSize(float *pWidth, float *pHeight) override
Definition layer_tiles.h:173
bool m_HasTune
Definition layer_tiles.h:202
const char * TypeName() const override
Definition layer_tiles.cpp:671
virtual bool IsEmpty() const
Definition layer_tiles.cpp:256
void ExtractTiles(const CTile *pSavedTiles, size_t SavedTilesSize) const
Definition layer_tiles.cpp:140
void FillSelection(bool Empty, CLayer *pBrush, CUIRect Rect) override
Definition layer_tiles.cpp:506
int ConvertX(float x) const
Definition layer_tiles.cpp:204
void BrushFlipXImpl(T *pTiles)
Definition layer_tiles.h:96
int BrushGrab(CLayerGroup *pBrush, CUIRect Rect) override
Definition layer_tiles.cpp:299
void RecordStateChange(int x, int y, CTile Previous, CTile Tile)
Definition layer_tiles.cpp:118
~CLayerTiles() override
Definition layer_tiles.cpp:74
bool CanFillGameTiles() const
Definition layer_tiles.cpp:937
CLayerTiles(CEditorMap *pMap, int w, int h)
Definition layer_tiles.cpp:18
void BrushFlipYImpl(T *pTiles)
Definition layer_tiles.h:103
void ShowPreventUnusedTilesWarning()
Definition layer_tiles.cpp:1380
virtual void Resize(int NewW, int NewH)
Definition layer_tiles.cpp:676
void BrushDraw(CLayer *pBrush, vec2 WorldPos) override
Definition layer_tiles.cpp:554
int m_Width
Definition layer_tiles.h:183
bool m_KnownTextModeLayer
Definition layer_tiles.h:204
int m_Seed
Definition layer_tiles.h:196
void BrushSelecting(CUIRect Rect) override
Definition layer_tiles.cpp:271
CTile * m_pTiles
Definition layer_tiles.h:188
char m_aFilename[IO_MAX_PATH_LENGTH]
Definition layer_tiles.h:203
bool IsEnvelopeUsed(int EnvelopeIndex) const override
Definition layer_tiles.cpp:1360
void SetTileIgnoreHistory(int x, int y, CTile Tile) const
Definition layer_tiles.cpp:113
void Render(bool Tileset=false) override
Definition layer_tiles.cpp:161
virtual CTile GetTile(int x, int y) const
Definition layer_tiles.cpp:79
bool IsImageUsed(int ImageIndex) const override
Definition layer_tiles.cpp:1365
int m_ColorEnv
Definition layer_tiles.h:186
bool m_HasSwitch
Definition layer_tiles.h:201
CUi::EPopupMenuFunctionResult RenderProperties(CUIRect *pToolbox) override
Definition layer_tiles.cpp:949
bool m_HasSpeedup
Definition layer_tiles.h:199
int m_Height
Definition layer_tiles.h:184
void PrepareForSave()
Definition layer_tiles.cpp:126
virtual void ShowInfo()
Definition layer_tiles.cpp:717
void MakePalette() const
Definition layer_tiles.cpp:154
void BrushRotate(float Amount) override
Definition layer_tiles.cpp:628
void Snap(CUIRect *pRect) const
Definition layer_tiles.cpp:215
void FlagModified(int x, int y, int w, int h)
Definition layer_tiles.cpp:1351
void Convert(CUIRect Rect, CIntRect *pOut) const
Definition layer_tiles.cpp:207
int m_Image
Definition layer_tiles.h:182
static bool HasAutomapEffect(ETilesProp Prop)
Definition layer_tiles.cpp:1390
EditorTileStateChangeHistory< STileStateChange > m_TilesHistory
Definition layer_tiles.h:206
int m_ColorEnvOffset
Definition layer_tiles.h:187
std::shared_ptr< CLayer > Duplicate() const override
Definition layer_tiles.cpp:666
virtual void Shift(EShiftDirection Direction)
Definition layer_tiles.cpp:712
Definition layer.h:16
CLayer(CEditorMap *pMap, int Type)
Definition layer.cpp:7
Definition mapitems.h:351
Definition ui_rect.h:12
EPopupMenuFunctionResult
Definition ui.h:310
ETilesProp
Definition mapitems.h:70
EGameTileOp
Definition enums.h:20
#define dbg_assert_failed(fmt,...)
Definition dbg.h:47
constexpr auto IO_MAX_PATH_LENGTH
Definition types.h:26
void mem_zero(T *block, size_t size)
Definition mem.h:56
void mem_copy(void *dest, const void *source, size_t size)
Definition mem.cpp:6
void mem_move(void *dest, const void *source, size_t size)
Definition mem.cpp:11
std::function< void(int *pIndex)> FIndexModifyFunction
Definition layer.h:11
std::map< int, std::map< int, T > > EditorTileStateChangeHistory
Definition layer_tiles.h:22
EShiftDirection
Definition layer_tiles.h:29
@ RIGHT
Definition layer_tiles.h:31
@ LEFT
Definition layer_tiles.h:30
@ DOWN
Definition layer_tiles.h:33
@ UP
Definition layer_tiles.h:32
ivec4 CColor
Definition mapitems.h:256
constexpr T minimum(T a, T b)
Definition math.h:137
Direction
Definition nameplates.cpp:212
Definition layer_tiles.h:151
@ MODIFIED_SIZE
Definition layer_tiles.h:154
@ MODIFIED_COLOR
Definition layer_tiles.h:155
int m_Height
Definition layer_tiles.h:159
int m_Modified
Definition layer_tiles.h:157
int m_Color
Definition layer_tiles.h:160
int m_Width
Definition layer_tiles.h:158
Definition layer_tiles.h:15
CTile m_Previous
Definition layer_tiles.h:17
bool m_Changed
Definition layer_tiles.h:16
CTile m_Current
Definition layer_tiles.h:18
vector2_base< float > vec2
Definition vmath.h:161