diff options
author | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-06-20 14:33:09 +1000 |
---|---|---|
committer | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-06-20 14:33:09 +1000 |
commit | 6352e8e3196f78388b6c771073f9e03eaa612673 (patch) | |
tree | e23772f79a7fbc41bc9108951e9e136857484bf4 /source/utility/tileset_updater.hpp | |
parent | 6741a057e5639280d85d0f88ba26f000baa58f61 (diff) |
everything everywhere
all at once
Diffstat (limited to 'source/utility/tileset_updater.hpp')
-rw-r--r-- | source/utility/tileset_updater.hpp | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/source/utility/tileset_updater.hpp b/source/utility/tileset_updater.hpp new file mode 100644 index 0000000..8848a00 --- /dev/null +++ b/source/utility/tileset_updater.hpp @@ -0,0 +1,102 @@ +#include "StarImage.hpp" +#include "StarTilesetDatabase.hpp" + +namespace Star { + +STAR_STRUCT(Tile); +STAR_CLASS(TileDatabase); +STAR_CLASS(Tileset); + +struct Tile { + String source, database, tileset, name; + ImageConstPtr image; + Tiled::Properties properties; +}; + +class TileDatabase { +public: + TileDatabase(String const& name); + + void defineTile(TilePtr const& tile); + TilePtr getTile(String const& tileName) const; + String name() const; + StringSet tileNames() const; + +private: + Map<String, TilePtr> m_tiles; + String m_name; +}; + +class Tileset { +public: + Tileset(String const& source, String const& name, TileDatabasePtr const& database); + + void defineTile(TilePtr const& tile); + void exportTileset() const; + + String name() const; + TileDatabasePtr database() const; + +private: + String imageDirName(String const& baseExportDir) const; + String relativePathBase() const; + Json imageFileReference(String const& fileName) const; + Json tileImageReference(String const& tileName, String const& database) const; + + // Exports an image for each tile into its own file. Tiles can represent + // objects with all different sizes, so we use Tiled's "collection of images" + // tileset feature, which puts each image in its own file. + void exportTilesetImages(String const& exportDir) const; + + // Read the tileset from the given path, or create a new tileset root + // structure if it doesn't already exist. + Json getTilesetJson(String const& tilesetPath) const; + + // Determine which tiles already exist in the tileset, returning a map + // which contains the id of each named tile, and the next available Id after + // the highest Id seen in the tileset. + pair<StringMap<size_t>, size_t> indexExistingTiles(Json tileset) const; + + // Update existing and insert new tile definitions in the tileProperties and + // tileImages objects. + StringSet updateTiles(JsonObject& tileProperties, + JsonObject& tileImages, + StringMap<size_t> const& existingTiles, + size_t& nextId, + String const& tilesetPath) const; + + // Mark the given tiles as 'invalid' so they can't be used. (Actually removing + // them from the tileset would cause the tile indices to change and break + // existing maps.) + void invalidateTiles(StringSet const& invalidTiles, + StringMap<size_t> const& existingTiles, + JsonObject& tileProperties, + JsonObject& tileImages, + String const& tilesetPath) const; + + String m_source, m_name; + List<TilePtr> m_tiles; + TileDatabasePtr m_database; +}; + +class TilesetUpdater { +public: + void defineAssetSource(String const& source); + void defineTile(TilePtr const& tile); + void exportTilesets(); + +private: + TileDatabasePtr const& getDatabase(TilePtr const& tile); + TilesetPtr const& getTileset(TilePtr const& tile); + + // Asset Source -> Tileset Name -> Tileset + StringMap<StringMap<TilesetPtr>> m_tilesets; + // Asset Source -> Database Name -> Database + StringMap<StringMap<TileDatabasePtr>> m_databases; + + // Images that existed before running update_tilesets: + // Asset Source -> Database Name -> Tile Name + StringMap<StringMap<StringSet>> m_preexistingImages; +}; + +} |