Tileson 1.4.0
A helpful json parser for Tiled maps
Loading...
Searching...
No Matches
Layer.hpp
Go to the documentation of this file.
1//
2// Created by robin on 22.03.2020.
3//
4
5#ifndef TILESON_LAYER_HPP
6#define TILESON_LAYER_HPP
7
8#include <set>
9//#include "../external/json.hpp"
10#include "../objects/Vector2.hpp"
11#include "../objects/Color.hpp"
12#include "Chunk.hpp"
13#include "Object.hpp"
14#include "../objects/TileObject.hpp"
15#include "../objects/Property.hpp"
16#include "../objects/PropertyCollection.hpp"
17#include "../common/Enums.hpp"
18#include "../objects/FlaggedTile.hpp"
19
20namespace tson
21{
22 class Tile;
23 class Map;
24
25 class Layer
26 {
27 public:
28 inline Layer() = default;
29 inline Layer(IJson &json, tson::Map *map);
30 inline bool parse(IJson &json, tson::Map *map); //Defined in tileson_forward
31
32 [[nodiscard]] inline const std::string &getCompression() const;
33 [[nodiscard]] inline const std::vector<uint32_t> &getData() const;
34 [[nodiscard]] inline const std::string &getBase64Data() const;
35 [[nodiscard]] inline const std::string &getDrawOrder() const;
36 [[nodiscard]] inline const std::string &getEncoding() const;
37 [[nodiscard]] inline int getId() const;
38 [[nodiscard]] inline const std::string &getImage() const;
39 [[nodiscard]] inline const std::string &getName() const;
40 [[nodiscard]] inline const Vector2f &getOffset() const;
41 [[nodiscard]] inline float getOpacity() const;
42 [[nodiscard]] inline const Vector2i &getSize() const;
43 [[nodiscard]] inline const Colori &getTransparentColor() const;
44 [[nodiscard]] inline const Vector2f &getParallax() const;
45 [[nodiscard]] inline bool hasRepeatX() const;
46 [[nodiscard]] inline bool hasRepeatY() const;
47
48 [[nodiscard]] inline LayerType getType() const;
49 [[nodiscard]] inline const std::string &getClassType() const;
50 [[nodiscard]] inline tson::TiledClass *getClass();
52 [[nodiscard]] inline const std::string &getTypeStr() const;
53 [[nodiscard]] inline bool isVisible() const;
54 [[nodiscard]] inline int getX() const;
55 [[nodiscard]] inline int getY() const;
56
57 [[nodiscard]] inline std::vector<tson::Chunk> &getChunks();
58 [[nodiscard]] inline std::vector<tson::Layer> &getLayers();
59 [[nodiscard]] inline std::vector<tson::Object> &getObjects();
60 [[nodiscard]] inline PropertyCollection &getProperties();
61
62 inline tson::Object *getObj(int id);
63 inline tson::Object *firstObj(const std::string &name);
64 inline std::vector<tson::Object> getObjectsByName(const std::string &name);
65 inline std::vector<tson::Object> getObjectsByType(tson::ObjectType type);
66
67 template <typename T>
68 inline T get(const std::string &name);
69 inline tson::Property * getProp(const std::string &name);
70
71 inline void assignTileMap(std::map<uint32_t, tson::Tile*> *tileMap);
72 inline void createTileData(const Vector2i &mapSize, bool isInfiniteMap);
73
74 [[nodiscard]] inline const std::map<std::tuple<int, int>, tson::Tile *> &getTileData() const;
75 inline tson::Tile * getTileData(int x, int y);
76
77 //v1.2.0-stuff
78 [[nodiscard]] inline const Colori &getTintColor() const;
79 [[nodiscard]] inline tson::Map *getMap() const;
80
81 [[nodiscard]] inline std::map<std::tuple<int, int>, tson::TileObject> &getTileObjects();
82 inline tson::TileObject * getTileObject(int x, int y);
83 [[nodiscard]] inline const std::set<uint32_t> &getUniqueFlaggedTiles() const;
84 inline void resolveFlaggedTiles();
85
86 private:
87 inline void setTypeByString();
88
89 std::vector<tson::Chunk> m_chunks;
90 std::string m_compression;
91 std::vector<uint32_t> m_data;
93 std::string m_base64Data;
95 std::string m_drawOrder;
96 std::string m_encoding;
97 int m_id{};
98 std::string m_image;
99 std::vector<tson::Layer> m_layers;
100 std::string m_name;
101 std::vector<tson::Object> m_objects;
102 tson::Vector2f m_offset;
104 float m_opacity{};
105 tson::PropertyCollection m_properties;
106 tson::Vector2i m_size;
108 tson::Colori m_transparentColor;
109 std::string m_typeStr;
111 bool m_visible{};
112 int m_x{};
113 int m_y{};
114 tson::Vector2f m_parallax{1.f, 1.f};
116 bool m_repeatX {};
117 bool m_repeatY {};
119 std::map<uint32_t, tson::Tile*> *m_tileMap;
120 std::map<std::tuple<int, int>, tson::Tile*> m_tileData;
122 //v1.2.0-stuff
123 tson::Colori m_tintColor;
125 inline void decompressData();
126 inline void queueFlaggedTile(size_t x, size_t y, uint32_t id);
128 tson::Map * m_map;
129 std::map<std::tuple<int, int>, tson::TileObject> m_tileObjects;
130 std::set<uint32_t> m_uniqueFlaggedTiles;
131 std::vector<tson::FlaggedTile> m_flaggedTiles;
132
133 std::string m_classType{};
134 std::shared_ptr<tson::TiledClass> m_class {};
135 };
136
143 template<typename T>
144 T Layer::get(const std::string &name)
145 {
146 return m_properties.getValue<T>(name);
147 }
148}
149
155{
156 parse(json, map);
157}
158
159void tson::Layer::queueFlaggedTile(size_t x, size_t y, uint32_t id)
160{
161 uint32_t tileId = id;
162 tileId &= ~(FLIPPED_HORIZONTALLY_FLAG | FLIPPED_VERTICALLY_FLAG | FLIPPED_DIAGONALLY_FLAG);
163 m_uniqueFlaggedTiles.insert(id);
164 m_flaggedTiles.emplace_back(x, y, id, tileId);
165}
166
172std::vector<tson::Object> tson::Layer::getObjectsByName(const std::string &name)
173{
174 std::vector<tson::Object> found;
175
176 std::copy_if(m_objects.begin(), m_objects.end(), std::back_inserter(found), [&](const tson::Object &item)
177 {
178 return item.getName() == name;
179 });
180
181 return found;
182}
183
184
185
191std::vector<tson::Object> tson::Layer::getObjectsByType(tson::ObjectType type)
192{
193 std::vector<tson::Object> found;
194
195 std::copy_if(m_objects.begin(), m_objects.end(), std::back_inserter(found), [&](const tson::Object &item)
196 {
197 return item.getObjectType() == type;
198 });
199
200 return found;
201}
202
208tson::Object *tson::Layer::firstObj(const std::string &name)
209{
210 auto result = std::find_if(m_objects.begin(), m_objects.end(), [&](const tson::Object &obj){return obj.getName() == name; });
211 if(result == m_objects.end())
212 return nullptr;
213
214 return &result.operator*();
215}
216
223{
224 auto result = std::find_if(m_objects.begin(), m_objects.end(), [&](const tson::Object &obj){return obj.getId() == id; });
225 if(result == m_objects.end())
226 return nullptr;
227
228 return &result.operator*();
229}
230
235void tson::Layer::setTypeByString()
236{
237 if(m_typeStr == "tilelayer") m_type = LayerType::TileLayer;
238 else if(m_typeStr == "objectgroup") m_type = LayerType::ObjectGroup;
239 else if(m_typeStr == "imagelayer") m_type = LayerType::ImageLayer;
240 else if(m_typeStr == "group") m_type = LayerType::Group;
241 else m_type = LayerType::Undefined;
242}
243
248const std::string &tson::Layer::getCompression() const
249{
250 return m_compression;
251}
252
257const std::vector<uint32_t> &tson::Layer::getData() const
258{
259 return m_data;
260}
261
266const std::string &tson::Layer::getBase64Data() const
267{
268 return m_base64Data;
269}
270
275const std::string &tson::Layer::getDrawOrder() const
276{
277 return m_drawOrder;
278}
279
284const std::string &tson::Layer::getEncoding() const
285{
286 return m_encoding;
287}
288
294{
295 return m_id;
296}
297
302const std::string &tson::Layer::getImage() const
303{
304 return m_image;
305}
306
311const std::string &tson::Layer::getName() const
312{
313 return m_name;
314}
315
321{
322 return m_offset;
323}
324
330{
331 return m_opacity;
332}
333
340{
341 return m_size;
342}
343
349{
350 return m_transparentColor;
351}
352
357const std::string &tson::Layer::getTypeStr() const
358{
359 return m_typeStr;
360}
361
367{
368 return m_visible;
369}
370
376{
377 return m_x;
378}
379
385{
386 return m_y;
387}
388
393std::vector<tson::Chunk> &tson::Layer::getChunks()
394{
395 return m_chunks;
396}
397
402std::vector<tson::Layer> &tson::Layer::getLayers()
403{
404 return m_layers;
405}
406
411std::vector<tson::Object> &tson::Layer::getObjects()
412{
413 return m_objects;
414}
415
421{
422 return m_properties;
423}
424
430tson::Property *tson::Layer::getProp(const std::string &name)
431{
432 if(m_properties.hasProperty(name))
433 return m_properties.getProperty(name);
434 return nullptr;
435}
436
442{
443 return m_type;
444}
445
450void tson::Layer::assignTileMap(std::map<uint32_t, tson::Tile *> *tileMap)
451{
452 m_tileMap = tileMap;
453}
454
465const std::map<std::tuple<int, int>, tson::Tile *> &tson::Layer::getTileData() const
466{
467 return m_tileData;
468}
469
483{
484 return (m_tileData.count({x, y}) > 0) ? m_tileData[{x,y}] : nullptr;
485}
486
492{
493 return m_map;
494}
495
503void tson::Layer::createTileData(const Vector2i &mapSize, bool isInfiniteMap)
504{
505 size_t x = 0;
506 size_t y = 0;
507 if(!isInfiniteMap)
508 {
509 std::for_each(m_data.begin(), m_data.end(), [&](uint32_t tileId)
510 {
511 if (static_cast<int>(x) == mapSize.x)
512 {
513 ++y;
514 x = 0;
515 }
516
517 if (tileId > 0 && m_tileMap->count(tileId) > 0)
518 {
519 m_tileData[{static_cast<int>(x), static_cast<int>(y)}] = m_tileMap->at(tileId);
520 m_tileObjects[{static_cast<int>(x), static_cast<int>(y)}] = {{static_cast<int>(x), static_cast<int>(y)}, m_tileData[{static_cast<int>(x), static_cast<int>(y)}]};
521 }
522 else if(tileId > 0 && m_tileMap->count(tileId) == 0) //Tile with flip flags!
523 {
524 queueFlaggedTile(x, y, tileId);
525 }
526 x++;
527 });
528
529 }
530}
531
532std::map<std::tuple<int, int>, tson::TileObject> &tson::Layer::getTileObjects()
533{
534 return m_tileObjects;
535}
536
538{
539 return (m_tileObjects.count({x, y}) > 0) ? &m_tileObjects[{x,y}] : nullptr;
540}
541
542const std::set<uint32_t> &tson::Layer::getUniqueFlaggedTiles() const
543{
544 return m_uniqueFlaggedTiles;
545}
546
548{
549 std::for_each(m_flaggedTiles.begin(), m_flaggedTiles.end(), [&](const tson::FlaggedTile &tile)
550 {
551 if (tile.id > 0 && m_tileMap->count(tile.id) > 0)
552 {
553 m_tileData[{static_cast<int>(tile.x), static_cast<int>(tile.y)}] = m_tileMap->at(tile.id);
554 m_tileObjects[{static_cast<int>(tile.x), static_cast<int>(tile.y)}] = {{static_cast<int>(tile.x), static_cast<int>(tile.y)}, m_tileData[{static_cast<int>(tile.x), static_cast<int>(tile.y)}]};
555 }
556 });
557}
558
565{
566 return m_tintColor;
567}
568
575{
576 return m_parallax;
577}
578
585{
586 return m_repeatX;
587}
588
595{
596 return m_repeatY;
597}
598
599const std::string &tson::Layer::getClassType() const
600{
601 return m_classType;
602}
603
604
605#endif //TILESON_LAYER_HPP
Definition FlaggedTile.hpp:11
Definition IJson.hpp:11
Definition Layer.hpp:26
std::vector< tson::Object > getObjectsByType(tson::ObjectType type)
Definition Layer.hpp:191
const std::map< std::tuple< int, int >, tson::Tile * > & getTileData() const
Definition Layer.hpp:465
std::vector< tson::Layer > & getLayers()
Definition Layer.hpp:402
void createTileData(const Vector2i &mapSize, bool isInfiniteMap)
Definition Layer.hpp:503
const std::string & getBase64Data() const
Definition Layer.hpp:266
PropertyCollection & getProperties()
Definition Layer.hpp:420
tson::Object * firstObj(const std::string &name)
Definition Layer.hpp:208
void assignTileMap(std::map< uint32_t, tson::Tile * > *tileMap)
Definition Layer.hpp:450
int getId() const
Definition Layer.hpp:293
bool hasRepeatY() const
Definition Layer.hpp:594
tson::Object * getObj(int id)
Definition Layer.hpp:222
const std::string & getName() const
Definition Layer.hpp:311
bool parse(IJson &json, tson::Map *map)
Definition tileson_forward.hpp:259
std::map< std::tuple< int, int >, tson::TileObject > & getTileObjects()
Definition Layer.hpp:532
LayerType getType() const
Definition Layer.hpp:441
const Vector2i & getSize() const
Definition Layer.hpp:339
T get(const std::string &name)
Definition Layer.hpp:144
tson::TiledClass * getClass()
Definition tileson_forward.hpp:336
std::vector< tson::Chunk > & getChunks()
Definition Layer.hpp:393
tson::Map * getMap() const
Definition Layer.hpp:491
void resolveFlaggedTiles()
Definition Layer.hpp:547
const std::string & getEncoding() const
Definition Layer.hpp:284
float getOpacity() const
Definition Layer.hpp:329
const std::vector< uint32_t > & getData() const
Definition Layer.hpp:257
const std::string & getCompression() const
Definition Layer.hpp:248
bool hasRepeatX() const
Definition Layer.hpp:584
const std::set< uint32_t > & getUniqueFlaggedTiles() const
Definition Layer.hpp:542
const Vector2f & getOffset() const
Definition Layer.hpp:320
tson::Property * getProp(const std::string &name)
Definition Layer.hpp:430
bool isVisible() const
Definition Layer.hpp:366
const std::string & getTypeStr() const
Definition Layer.hpp:357
const std::string & getClassType() const
Definition Layer.hpp:599
const Colori & getTransparentColor() const
Definition Layer.hpp:348
tson::TileObject * getTileObject(int x, int y)
Definition Layer.hpp:537
const Colori & getTintColor() const
Definition Layer.hpp:564
Layer()=default
const std::string & getImage() const
Definition Layer.hpp:302
const Vector2f & getParallax() const
Definition Layer.hpp:574
std::vector< tson::Object > & getObjects()
Definition Layer.hpp:411
int getX() const
Definition Layer.hpp:375
const std::string & getDrawOrder() const
Definition Layer.hpp:275
std::vector< tson::Object > getObjectsByName(const std::string &name)
Definition Layer.hpp:172
int getY() const
Definition Layer.hpp:384
Definition Map.hpp:29
Definition Object.hpp:21
Definition PropertyCollection.hpp:15
T getValue(const std::string &name)
Definition PropertyCollection.hpp:47
Definition Property.hpp:23
Definition TileObject.hpp:14
Definition Tile.hpp:23
Definition TiledClass.hpp:11
Definition Base64.hpp:12
ObjectType
Definition Enums.hpp:58
LayerType
Definition Enums.hpp:34