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;
37 [[nodiscard]]
inline int getMargin()
const;
38 [[nodiscard]]
inline const std::string &
getName()
const;
44 [[nodiscard]]
inline const std::string &
getType()
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;
56 inline T
get(
const std::string &name);
71 #ifndef TSON_TEST_ENABLED
74 inline void generateMissingTiles();
90 std::vector<tson::Tile> m_tiles;
91 std::vector<tson::WangSet> m_wangsets;
94 std::vector<tson::Terrain> m_terrains;
104 fs::path m_source {};
106 Transformations m_transformations {};
119 return m_properties.getValue<T>(name);
131 bool allFound =
true;
133 if(json.
count(
"firstgid") > 0) m_firstgid = json[
"firstgid"].
get<
int>();
else allFound =
false;
136 if(json.
count(
"source") > 0)
141 std::string sourceStr = json[
"source"].
get<std::string>();
142 m_source = fs::path(sourceStr);
145 if(!json.
parse(m_path))
150 if(json.
count(
"columns") > 0) m_columns = json[
"columns"].
get<
int>();
else allFound =
false;
152 if(json.
count(
"image") > 0) m_image = fs::path(json[
"image"].get<std::string>());
else allFound =
false;
154 if(json.
count(
"margin") > 0) m_margin = json[
"margin"].get<int>();
else allFound =
false;
155 if(json.
count(
"name") > 0) m_name = json[
"name"].get<std::string>();
else allFound =
false;
156 if(json.
count(
"spacing") > 0) m_spacing = json[
"spacing"].get<int>();
else allFound =
false;
157 if(json.
count(
"tilecount") > 0) m_tileCount = json[
"tilecount"].get<int>();
else allFound =
false;
158 if(json.
count(
"transparentcolor") > 0) m_transparentColor =
tson::Colori(json[
"transparentcolor"].get<std::string>());
159 if(json.
count(
"type") > 0) m_type = json[
"type"].get<std::string>();
162 if(json.
count(
"imagewidth") > 0 && json.
count(
"imageheight") > 0)
163 m_imageSize = {json[
"imagewidth"].
get<
int>(), json[
"imageheight"].get<int>()};
else allFound =
false;
164 if(json.
count(
"tilewidth") > 0 && json.
count(
"tileheight") > 0)
165 m_tileSize = {json[
"tilewidth"].
get<
int>(), json[
"tileheight"].get<int>()};
else allFound =
false;
166 if(json.
count(
"tileoffset") > 0)
167 m_tileOffset = {json[
"tileoffset"][
"x"].
get<
int>(), json[
"tileoffset"][
"y"].get<int>()};
170 if(json.
count(
"wangsets") > 0 && json[
"wangsets"].
isArray())
172 auto &wangsets = json.
array(
"wangsets");
173 std::for_each(wangsets.begin(), wangsets.end(), [&](std::unique_ptr<IJson> &item) { m_wangsets.emplace_back(*item); });
177 auto &tiles = json.
array(
"tiles");
178 std::for_each(tiles.begin(), tiles.end(), [&](std::unique_ptr<IJson> &item) { m_tiles.emplace_back(*item, this, m_map); });
180 if(json.
count(
"terrains") > 0 && json[
"terrains"].
isArray())
182 auto &terrains = json.
array(
"terrains");
183 std::for_each(terrains.begin(), terrains.end(), [&](std::unique_ptr<IJson> &item) { m_terrains.emplace_back(*item); });
186 if(json.
count(
"properties") > 0 && json[
"properties"].
isArray())
188 auto &properties = json.
array(
"properties");
189 std::for_each(properties.begin(), properties.end(), [&](std::unique_ptr<IJson> &item) { m_properties.add(*item); });
192 if(json.
count(
"objectalignment") > 0)
194 std::string alignment = json[
"objectalignment"].
get<std::string>();
195 m_objectAlignment = StringToAlignment(alignment);
198 if(json.
count(
"transformations") > 0)
200 m_transformations.parse(json[
"transformations"]);
203 generateMissingTiles();
293 return m_transparentColor;
375 auto result = std::find_if(m_tiles.begin(), m_tiles.end(), [&](
const tson::Tile & item) { return item.getId() == id;});
376 if(result == m_tiles.end())
379 return &result.operator*();
389 auto result = std::find_if(m_terrains.begin(), m_terrains.end(), [&](
const tson::Terrain & item) { return item.getName() == name;});
390 if(result == m_terrains.end())
393 return &result.operator*();
403 if(m_properties.hasProperty(name))
404 return m_properties.getProperty(name);
412 void tson::Tileset::generateMissingTiles()
414 std::vector<uint32_t> tileIds;
415 for(
auto &tile : m_tiles)
416 tileIds.push_back(tile.getId());
418 for(uint32_t i = m_firstgid; i < m_firstgid + (uint32_t) m_tileCount; ++i)
420 if(std::count(tileIds.begin(), tileIds.end(), i) == 0)
422 m_tiles.emplace_back(
Tile(i,
this, m_map));
459 return m_objectAlignment;
471 if(m_margin == 0 && m_spacing == 0)
474 tson::Vector2i offset {(posInTileUnits.
x * m_spacing) + m_margin, (posInTileUnits.
y * m_spacing) + m_margin};
485 auto wangset = std::find_if(m_wangsets.begin(), m_wangsets.end(), [&](
const auto &w) { return w.getName() == name; });
487 if(wangset != m_wangsets.end())
488 return &wangset.operator*();
501 return m_transformations;
virtual bool parse(const fs::path &path)=0
T get(std::string_view key)
Definition: IJson.hpp:72
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:21
Definition: Terrain.hpp:14
Definition: Tileset.hpp:24
const std::string & getType() const
Definition: Tileset.hpp:300
const std::vector< tson::Terrain > & getTerrains() const
Definition: Tileset.hpp:343
const Vector2i & getImageSize() const
Definition: Tileset.hpp:237
static tson::ObjectAlignment StringToAlignment(std::string_view str)
Definition: Tileset.hpp:441
ObjectAlignment getObjectAlignment() const
Definition: Tileset.hpp:457
const fs::path & getImage() const
Definition: Tileset.hpp:310
int getSpacing() const
Definition: Tileset.hpp:264
const Grid & getGrid() const
Definition: Tileset.hpp:362
const Vector2i & getTileOffset() const
Definition: Tileset.hpp:352
int getMargin() const
Definition: Tileset.hpp:246
const fs::path & getImagePath() const
Definition: Tileset.hpp:231
T get(const std::string &name)
Definition: Tileset.hpp:117
const Vector2i & getTileSize() const
Definition: Tileset.hpp:282
bool parse(IJson &json, tson::Map *map)
Definition: Tileset.hpp:128
tson::Property * getProp(const std::string &name)
Definition: Tileset.hpp:401
tson::Map * getMap() const
Definition: Tileset.hpp:431
const Transformations & getTransformations() const
Definition: Tileset.hpp:499
int getFirstgid() const
Definition: Tileset.hpp:221
int getTileCount() const
Definition: Tileset.hpp:273
tson::Tile * getTile(uint32_t id)
Definition: Tileset.hpp:373
PropertyCollection & getProperties()
Definition: Tileset.hpp:334
const std::vector< tson::WangSet > & getWangsets() const
Definition: Tileset.hpp:325
int getColumns() const
Definition: Tileset.hpp:212
const Colori & getTransparentColor() const
Definition: Tileset.hpp:291
const std::string & getName() const
Definition: Tileset.hpp:255
std::vector< tson::Tile > & getTiles()
Definition: Tileset.hpp:316
tson::Terrain * getTerrain(const std::string &name)
Definition: Tileset.hpp:387
tson::WangSet * getWangset(const std::string &name)
Definition: Tileset.hpp:483
tson::Vector2i getMarginSpacingOffset(const tson::Vector2i &posInTileUnits)
Definition: Tileset.hpp:469
T y
Definition: Vector2.hpp:22
T x
Definition: Vector2.hpp:21
Definition: WangSet.hpp:16
Definition: Base64.hpp:12
ObjectAlignment
Definition: Enums.hpp:85