5 #ifndef TILESON_LAYER_HPP
6 #define TILESON_LAYER_HPP
10 #include "../objects/Vector2.hpp"
11 #include "../objects/Color.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"
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;
48 [[nodiscard]]
inline const std::string &
getTypeStr()
const;
49 [[nodiscard]]
inline bool isVisible()
const;
50 [[nodiscard]]
inline int getX()
const;
51 [[nodiscard]]
inline int getY()
const;
53 [[nodiscard]]
inline std::vector<tson::Chunk> &
getChunks();
54 [[nodiscard]]
inline std::vector<tson::Layer> &
getLayers();
55 [[nodiscard]]
inline std::vector<tson::Object> &
getObjects();
64 inline T
get(
const std::string &name);
67 inline void assignTileMap(std::map<uint32_t, tson::Tile*> *tileMap);
83 inline void setTypeByString();
85 std::vector<tson::Chunk> m_chunks;
86 std::string m_compression;
87 std::vector<uint32_t> m_data;
89 std::string m_base64Data;
91 std::string m_drawOrder;
92 std::string m_encoding;
95 std::vector<tson::Layer> m_layers;
97 std::vector<tson::Object> m_objects;
105 std::string m_typeStr;
113 std::map<uint32_t, tson::Tile*> *m_tileMap;
114 std::map<std::tuple<int, int>,
tson::Tile*> m_tileData;
119 inline void decompressData();
120 inline void queueFlaggedTile(
size_t x,
size_t y, uint32_t
id);
124 std::set<uint32_t> m_uniqueFlaggedTiles;
125 std::vector<tson::FlaggedTile> m_flaggedTiles;
138 return m_properties.
getValue<T>(name);
151 void tson::Layer::queueFlaggedTile(
size_t x,
size_t y, uint32_t
id)
153 uint32_t tileId = id;
154 tileId &= ~(FLIPPED_HORIZONTALLY_FLAG | FLIPPED_VERTICALLY_FLAG | FLIPPED_DIAGONALLY_FLAG);
155 m_uniqueFlaggedTiles.insert(
id);
156 m_flaggedTiles.emplace_back(x, y,
id, tileId);
168 bool allFound =
true;
169 if(json.
count(
"tintcolor") > 0) m_tintcolor =
tson::Colori(json[
"tintcolor"].get<std::string>());
170 if(json.
count(
"compression") > 0) m_compression = json[
"compression"].
get<std::string>();
171 if(json.
count(
"draworder") > 0) m_drawOrder = json[
"draworder"].get<std::string>();
172 if(json.
count(
"encoding") > 0) m_encoding = json[
"encoding"].get<std::string>();
173 if(json.
count(
"id") > 0) m_id = json[
"id"].get<int>();
174 if(json.
count(
"image") > 0) m_image = json[
"image"].get<std::string>();
175 if(json.
count(
"name") > 0) m_name = json[
"name"].get<std::string>();
else allFound =
false;
176 if(json.
count(
"offsetx") > 0 && json.
count(
"offsety") > 0)
177 m_offset = {json[
"offsetx"].
get<
float>(), json[
"offsety"].get<float>()};
178 if(json.
count(
"opacity") > 0) m_opacity = json[
"opacity"].get<float>();
else allFound =
false;
179 if(json.
count(
"width") > 0 && json.
count(
"height") > 0)
180 m_size = {json[
"width"].
get<
int>(), json[
"height"].get<int>()};
181 if(json.
count(
"transparentcolor") > 0) m_transparentcolor =
tson::Colori(json[
"transparentcolor"].get<std::string>());
182 if(json.
count(
"type") > 0) m_typeStr = json[
"type"].get<std::string>();
else allFound =
false;
183 if(json.
count(
"visible") > 0) m_visible = json[
"visible"].get<bool>();
else allFound =
false;
184 if(json.
count(
"x") > 0) m_x = json[
"x"].get<int>();
else allFound =
false;
185 if(json.
count(
"y") > 0) m_y = json[
"y"].get<int>();
else allFound =
false;
188 if(json.
count(
"parallaxx") > 0)
189 parallax.
x = json[
"parallaxx"].
get<
float>();
190 if(json.
count(
"parallaxy") > 0)
191 parallax.y = json[
"parallaxy"].
get<
float>();
193 m_parallax = parallax;
196 if(json.
count(
"data") > 0)
198 if(json[
"data"].isArray())
200 auto &array = json.
array(
"data");
201 std::for_each(array.begin(), array.end(), [&](std::unique_ptr<IJson> &item) { m_data.push_back(item->get<uint32_t>()); });
205 m_base64Data = json[
"data"].
get<std::string>();
211 if(json.
count(
"chunks") > 0 && json[
"chunks"].
isArray())
213 auto &chunks = json.
array(
"chunks");
214 std::for_each(chunks.begin(), chunks.end(), [&](std::unique_ptr<IJson> &item) { m_chunks.emplace_back(*item); });
216 if(json.
count(
"layers") > 0 && json[
"layers"].
isArray())
218 auto &layers = json.
array(
"layers");
219 std::for_each(layers.begin(), layers.end(), [&](std::unique_ptr<IJson> &item) { m_layers.emplace_back(*item, m_map); });
221 if(json.
count(
"objects") > 0 && json[
"objects"].
isArray())
223 auto &objects = json.
array(
"objects");
224 std::for_each(objects.begin(), objects.end(), [&](std::unique_ptr<IJson> &item) { m_objects.emplace_back(*item); });
226 if(json.
count(
"properties") > 0 && json[
"properties"].
isArray())
228 auto &properties = json.
array(
"properties");
229 std::for_each(properties.begin(), properties.end(), [&](std::unique_ptr<IJson> &item) { m_properties.add(*item); });
244 std::vector<tson::Object> found;
246 std::copy_if(m_objects.begin(), m_objects.end(), std::back_inserter(found), [&](
const tson::Object &item)
248 return item.getName() == name;
263 std::vector<tson::Object> found;
265 std::copy_if(m_objects.begin(), m_objects.end(), std::back_inserter(found), [&](
const tson::Object &item)
267 return item.getObjectType() == type;
280 auto result = std::find_if(m_objects.begin(), m_objects.end(), [&](
const tson::Object &obj){return obj.getName() == name; });
281 if(result == m_objects.end())
284 return &result.operator*();
294 auto result = std::find_if(m_objects.begin(), m_objects.end(), [&](
const tson::Object &obj){return obj.getId() == id; });
295 if(result == m_objects.end())
298 return &result.operator*();
305 void tson::Layer::setTypeByString()
320 return m_compression;
420 return m_transparentcolor;
502 if(m_properties.hasProperty(name))
503 return m_properties.getProperty(name);
554 return (m_tileData.count({x, y}) > 0) ? m_tileData[{x,y}] :
nullptr;
579 std::for_each(m_data.begin(), m_data.end(), [&](uint32_t tileId)
587 if (tileId > 0 && m_tileMap->count(tileId) > 0)
589 m_tileData[{x, y}] = m_tileMap->at(tileId);
590 m_tileObjects[{x, y}] = {{x, y}, m_tileData[{x, y}]};
592 else if(tileId > 0 && m_tileMap->count(tileId) == 0)
594 queueFlaggedTile(x, y, tileId);
604 return m_tileObjects;
609 return (m_tileObjects.count({x, y}) > 0) ? &m_tileObjects[{x,y}] :
nullptr;
614 return m_uniqueFlaggedTiles;
619 std::for_each(m_flaggedTiles.begin(), m_flaggedTiles.end(), [&](
const tson::FlaggedTile &tile)
621 if (tile.id > 0 && m_tileMap->count(tile.id) > 0)
623 m_tileData[{tile.x, tile.y}] = m_tileMap->at(tile.id);
624 m_tileObjects[{tile.x, tile.y}] = {{tile.x, tile.y}, m_tileData[{tile.x, tile.y}]};
Definition: FlaggedTile.hpp:11
T get(std::string_view key)
Definition: IJson.hpp:72
virtual bool isArray() const =0
virtual size_t count(std::string_view key) const =0
virtual std::vector< std::unique_ptr< IJson > > array()=0
std::vector< tson::Object > getObjectsByType(tson::ObjectType type)
Definition: Layer.hpp:261
const std::map< std::tuple< int, int >, tson::Tile * > & getTileData() const
Definition: Layer.hpp:535
std::vector< tson::Layer > & getLayers()
Definition: Layer.hpp:472
void createTileData(const Vector2i &mapSize, bool isInfiniteMap)
Definition: Layer.hpp:573
const std::string & getBase64Data() const
Definition: Layer.hpp:336
PropertyCollection & getProperties()
Definition: Layer.hpp:490
tson::Object * firstObj(const std::string &name)
Definition: Layer.hpp:278
void assignTileMap(std::map< uint32_t, tson::Tile * > *tileMap)
Definition: Layer.hpp:520
int getId() const
Definition: Layer.hpp:363
tson::Object * getObj(int id)
Definition: Layer.hpp:292
const std::string & getName() const
Definition: Layer.hpp:381
bool parse(IJson &json, tson::Map *map)
Definition: Layer.hpp:164
std::map< std::tuple< int, int >, tson::TileObject > & getTileObjects()
Definition: Layer.hpp:602
LayerType getType() const
Definition: Layer.hpp:511
const Vector2i & getSize() const
Definition: Layer.hpp:409
T get(const std::string &name)
Definition: Layer.hpp:136
std::vector< tson::Chunk > & getChunks()
Definition: Layer.hpp:463
tson::Map * getMap() const
Definition: Layer.hpp:561
void resolveFlaggedTiles()
Definition: Layer.hpp:617
const std::string & getEncoding() const
Definition: Layer.hpp:354
float getOpacity() const
Definition: Layer.hpp:399
const std::vector< uint32_t > & getData() const
Definition: Layer.hpp:327
const std::string & getCompression() const
Definition: Layer.hpp:318
const std::set< uint32_t > & getUniqueFlaggedTiles() const
Definition: Layer.hpp:612
const Vector2f & getOffset() const
Definition: Layer.hpp:390
tson::Property * getProp(const std::string &name)
Definition: Layer.hpp:500
bool isVisible() const
Definition: Layer.hpp:436
const std::string & getTypeStr() const
Definition: Layer.hpp:427
const Colori & getTransparentColor() const
Definition: Layer.hpp:418
tson::TileObject * getTileObject(int x, int y)
Definition: Layer.hpp:607
const Colori & getTintColor() const
Definition: Layer.hpp:634
const std::string & getImage() const
Definition: Layer.hpp:372
const Vector2f & getParallax() const
Definition: Layer.hpp:644
std::vector< tson::Object > & getObjects()
Definition: Layer.hpp:481
int getX() const
Definition: Layer.hpp:445
const std::string & getDrawOrder() const
Definition: Layer.hpp:345
std::vector< tson::Object > getObjectsByName(const std::string &name)
Definition: Layer.hpp:242
int getY() const
Definition: Layer.hpp:454
Definition: Object.hpp:18
Definition: PropertyCollection.hpp:15
T getValue(const std::string &name)
Definition: PropertyCollection.hpp:46
Definition: Property.hpp:21
Definition: TileObject.hpp:14
T x
Definition: Vector2.hpp:21
Definition: Base64.hpp:12
ObjectType
Definition: Enums.hpp:55
LayerType
Definition: Enums.hpp:31
Color< uint8_t > Colori
Definition: Color.hpp:89