5#ifndef TILESON_TILESET_HPP
6#define TILESON_TILESET_HPP
10#include "../objects/Vector2.hpp"
11#include "../objects/Color.hpp"
12#include "../objects/PropertyCollection.hpp"
33 [[nodiscard]]
inline const fs::path &
getImagePath()
const;
34 [[nodiscard]]
inline const fs::path &
getImage()
const;
36 [[nodiscard]]
inline int getMargin()
const;
37 [[nodiscard]]
inline const std::string &
getName()
const;
42 [[nodiscard]]
inline const std::string &
getType()
const;
43 [[nodiscard]]
inline const std::string &
getClassType()
const;
45 [[nodiscard]]
inline std::vector<tson::Tile> &
getTiles();
46 [[nodiscard]]
inline const std::vector<tson::WangSet> &
getWangsets()
const;
48 [[nodiscard]]
inline const std::vector<tson::Terrain> &
getTerrains()
const;
58 inline T
get(
const std::string &name);
73 #ifndef TSON_TEST_ENABLED
76 inline void generateMissingTiles();
92 std::vector<tson::Tile> m_tiles;
93 std::vector<tson::WangSet> m_wangsets;
96 std::vector<tson::Terrain> m_terrains;
106 fs::path m_source {};
108 Transformations m_transformations {};
117 std::string m_classType {};
118 std::shared_ptr<tson::TiledClass> m_class {};
130 return m_properties.getValue<T>(name);
142 bool allFound =
true;
144 if(json.
count(
"firstgid") > 0) m_firstgid = json[
"firstgid"].
get<
int>();
else allFound =
false;
147 if(json.
count(
"source") > 0)
152 std::string sourceStr = json[
"source"].
get<std::string>();
153 m_source = fs::path(sourceStr);
156 if(!json.
parse(m_path))
161 if(json.
count(
"columns") > 0) m_columns = json[
"columns"].
get<
int>();
else allFound =
false;
163 if(json.
count(
"image") > 0) m_image = fs::path(json[
"image"].get<std::string>());
else allFound =
false;
165 if(json.
count(
"margin") > 0) m_margin = json[
"margin"].get<int>();
else allFound =
false;
166 if(json.
count(
"name") > 0) m_name = json[
"name"].get<std::string>();
else allFound =
false;
167 if(json.
count(
"spacing") > 0) m_spacing = json[
"spacing"].get<int>();
else allFound =
false;
168 if(json.
count(
"tilecount") > 0) m_tileCount = json[
"tilecount"].get<int>();
else allFound =
false;
169 if(json.
count(
"transparentcolor") > 0) m_transparentColor =
tson::Colori(json[
"transparentcolor"].get<std::string>());
170 if(json.
count(
"type") > 0) m_type = json[
"type"].get<std::string>();
172 if(json.
count(
"class") > 0) m_classType = json[
"class"].get<std::string>();
174 if(json.
count(
"imagewidth") > 0 && json.
count(
"imageheight") > 0)
175 m_imageSize = {json[
"imagewidth"].
get<
int>(), json[
"imageheight"].get<int>()};
else allFound =
false;
176 if(json.
count(
"tilewidth") > 0 && json.
count(
"tileheight") > 0)
177 m_tileSize = {json[
"tilewidth"].
get<
int>(), json[
"tileheight"].get<int>()};
else allFound =
false;
178 if(json.
count(
"tileoffset") > 0)
179 m_tileOffset = {json[
"tileoffset"][
"x"].
get<
int>(), json[
"tileoffset"][
"y"].get<int>()};
181 if(json.
count(
"tilerendersize") > 0)
183 std::string tileRenderStr = json[
"tilerendersize"].
get<std::string>();
188 if(json.
count(
"fillmode") > 0)
190 std::string fillmode = json[
"fillmode"].
get<std::string>();
196 if(json.
count(
"wangsets") > 0 && json[
"wangsets"].
isArray())
198 auto &wangsets = json.
array(
"wangsets");
199 std::for_each(wangsets.begin(), wangsets.end(), [&](std::unique_ptr<IJson> &item) { m_wangsets.emplace_back(*item, m_map); });
203 auto &tiles = json.
array(
"tiles");
204 std::for_each(tiles.begin(), tiles.end(), [&](std::unique_ptr<IJson> &item) { m_tiles.emplace_back(*item, this, m_map); });
206 if(json.
count(
"terrains") > 0 && json[
"terrains"].
isArray())
208 auto &terrains = json.
array(
"terrains");
209 std::for_each(terrains.begin(), terrains.end(), [&](std::unique_ptr<IJson> &item) { m_terrains.emplace_back(*item); });
212 if(json.
count(
"properties") > 0 && json[
"properties"].
isArray())
214 auto &properties = json.
array(
"properties");
215 std::for_each(properties.begin(), properties.end(), [&](std::unique_ptr<IJson> &item) { m_properties.add(*item); });
218 if(json.
count(
"objectalignment") > 0)
220 std::string alignment = json[
"objectalignment"].
get<std::string>();
221 m_objectAlignment = StringToAlignment(alignment);
224 if(json.
count(
"transformations") > 0)
226 m_transformations.parse(json[
"transformations"]);
229 generateMissingTiles();
319 return m_transparentColor;
401 auto result = std::find_if(m_tiles.begin(), m_tiles.end(), [&](
const tson::Tile & item) { return item.getId() == id;});
402 if(result == m_tiles.end())
405 return &result.operator*();
415 auto result = std::find_if(m_terrains.begin(), m_terrains.end(), [&](
const tson::Terrain & item) { return item.getName() == name;});
416 if(result == m_terrains.end())
419 return &result.operator*();
429 if(m_properties.hasProperty(name))
430 return m_properties.getProperty(name);
438void tson::Tileset::generateMissingTiles()
440 std::vector<uint32_t> tileIds;
441 for(
auto &tile : m_tiles)
442 tileIds.push_back(tile.getId());
444 for(uint32_t i = m_firstgid; i < m_firstgid + (uint32_t) m_tileCount; ++i)
446 if(std::count(tileIds.begin(), tileIds.end(), i) == 0)
448 m_tiles.emplace_back(
Tile(i,
this, m_map));
485 return m_objectAlignment;
497 if(m_margin == 0 && m_spacing == 0)
500 tson::Vector2i offset {(posInTileUnits.
x * m_spacing) + m_margin, (posInTileUnits.
y * m_spacing) + m_margin};
511 auto wangset = std::find_if(m_wangsets.begin(), m_wangsets.end(), [&](
const auto &w) { return w.getName() == name; });
513 if(wangset != m_wangsets.end())
514 return &wangset.operator*();
527 return m_transformations;
532 return m_tileRenderSize;
virtual bool parse(const fs::path &path)=0
T get(std::string_view key)
Definition IJson.hpp:82
virtual bool isArray() const =0
virtual fs::path directory() const =0
virtual size_t count(std::string_view key) const =0
virtual std::vector< std::unique_ptr< IJson > > array()=0
Definition PropertyCollection.hpp:15
Definition Property.hpp:23
Definition Terrain.hpp:14
Definition TiledClass.hpp:11
Definition Tileset.hpp:24
const std::string & getType() const
Definition Tileset.hpp:326
const std::vector< tson::Terrain > & getTerrains() const
Definition Tileset.hpp:369
const Vector2i & getImageSize() const
Definition Tileset.hpp:263
tson::TiledClass * getClass()
Definition tileson_forward.hpp:183
static tson::ObjectAlignment StringToAlignment(std::string_view str)
Definition Tileset.hpp:467
ObjectAlignment getObjectAlignment() const
Definition Tileset.hpp:483
TileRenderSize getTileRenderSize() const
Definition Tileset.hpp:530
const std::string & getClassType() const
Definition Tileset.hpp:540
const fs::path & getImage() const
Definition Tileset.hpp:336
int getSpacing() const
Definition Tileset.hpp:290
const Grid & getGrid() const
Definition Tileset.hpp:388
const Vector2i & getTileOffset() const
Definition Tileset.hpp:378
int getMargin() const
Definition Tileset.hpp:272
const fs::path & getImagePath() const
Definition Tileset.hpp:257
T get(const std::string &name)
Definition Tileset.hpp:128
FillMode getFillMode() const
Definition Tileset.hpp:535
const Vector2i & getTileSize() const
Definition Tileset.hpp:308
bool parse(IJson &json, tson::Map *map)
Definition Tileset.hpp:139
tson::Property * getProp(const std::string &name)
Definition Tileset.hpp:427
tson::Map * getMap() const
Definition Tileset.hpp:457
const Transformations & getTransformations() const
Definition Tileset.hpp:525
int getFirstgid() const
Definition Tileset.hpp:247
int getTileCount() const
Definition Tileset.hpp:299
tson::Tile * getTile(uint32_t id)
Definition Tileset.hpp:399
PropertyCollection & getProperties()
Definition Tileset.hpp:360
const std::vector< tson::WangSet > & getWangsets() const
Definition Tileset.hpp:351
int getColumns() const
Definition Tileset.hpp:238
const Colori & getTransparentColor() const
Definition Tileset.hpp:317
const std::string & getName() const
Definition Tileset.hpp:281
std::vector< tson::Tile > & getTiles()
Definition Tileset.hpp:342
tson::Terrain * getTerrain(const std::string &name)
Definition Tileset.hpp:413
tson::WangSet * getWangset(const std::string &name)
Definition Tileset.hpp:509
tson::Vector2i getMarginSpacingOffset(const tson::Vector2i &posInTileUnits)
Definition Tileset.hpp:495
T y
Definition Vector2.hpp:22
T x
Definition Vector2.hpp:21
Definition WangSet.hpp:16
TileRenderSize
Definition Enums.hpp:119
FillMode
Definition Enums.hpp:129
ObjectAlignment
Definition Enums.hpp:88