Porytiles
Loading...
Searching...
No Matches
metatile_decompiler.cpp
Go to the documentation of this file.
2
3#include <memory>
4#include <vector>
5
17
18namespace porytiles {
19
21 const std::vector<TilemapEntry> &entries,
22 const Image<IndexPixel> &tiles_png,
24{
25 std::vector<Metatile<Rgba32>> decompiled;
26
27 // Precondition: entry vector must be triple-layerized
28 if (entries.size() % metatile::entries_per_metatile_triple != 0) {
29 panic("entry vector size was not divisible 12");
30 }
31
34 tiles, tileizer.tileize(tiles_png), std::vector<Metatile<Rgba32>>, "Failed to tileize tiles.png.");
35
36 // Process metatiles in groups of 12 entries
37 for (std::size_t metatile_idx = 0; metatile_idx < entries.size() / metatile::entries_per_metatile_triple;
38 ++metatile_idx) {
39 Metatile<Rgba32> metatile{};
40 const std::size_t base_entry_idx = metatile_idx * metatile::entries_per_metatile_triple;
41
42 // Process bottom layer (entries 0-3)
43 for (std::size_t i = 0; i < metatile::tiles_per_metatile_layer; ++i) {
44 const auto &entry = entries[base_entry_idx + i];
45 const auto &index_tile = tiles[entry.tile_index()];
46 auto flipped_tile = index_tile.flip(entry.h_flip(), entry.v_flip());
47 auto rgba_tile =
48 color_tile_from_index_tile(flipped_tile, palettes[entry.palette_index()], extrinsic_transparency_);
49 metatile.set_bottom(i, std::move(rgba_tile));
50 }
51
52 // Process middle layer (entries 4-7)
53 for (std::size_t i = 0; i < metatile::tiles_per_metatile_layer; ++i) {
54 const auto &entry = entries[base_entry_idx + metatile::tiles_per_metatile_layer + i];
55 const auto &index_tile = tiles[entry.tile_index()];
56 auto flipped_tile = index_tile.flip(entry.h_flip(), entry.v_flip());
57 auto rgba_tile =
58 color_tile_from_index_tile(flipped_tile, palettes[entry.palette_index()], extrinsic_transparency_);
59 metatile.set_middle(i, std::move(rgba_tile));
60 }
61
62 // Process top layer (entries 8-11)
63 for (std::size_t i = 0; i < metatile::tiles_per_metatile_layer; ++i) {
64 const auto &entry = entries[base_entry_idx + 2 * metatile::tiles_per_metatile_layer + i];
65 const auto &index_tile = tiles[entry.tile_index()];
66 auto flipped_tile = index_tile.flip(entry.h_flip(), entry.v_flip());
67 auto rgba_tile =
68 color_tile_from_index_tile(flipped_tile, palettes[entry.palette_index()], extrinsic_transparency_);
69 metatile.set_top(i, std::move(rgba_tile));
70 }
71
72 decompiled.push_back(std::move(metatile));
73 }
74
75 return decompiled;
76}
77
78} // namespace porytiles
#define PT_TRY_ASSIGN_CHAIN_ERR(var, expr, return_type,...)
Unwraps a ChainableResult, chaining a new error message on failure.
A result type that maintains a chainable sequence of errors for debugging and error reporting.
Service for converting images into collections of 8x8 tiles.
A template for two-dimensional images with arbitrarily typed pixel values.
Definition image.hpp:21
ChainableResult< std::vector< Metatile< Rgba32 > > > decompile_metatiles(const std::vector< TilemapEntry > &entries, const Image< IndexPixel > &tiles_png, const std::array< Palette< Rgba32, palette::max_size >, palette::num_palettes > &palettes)
The core tileset entity - a 2x2 grid of PixelTile objects arranged into three layers.
Definition metatile.hpp:224
A generic palette container for colors that support transparency checking.
Definition palette.hpp:45
constexpr std::size_t entries_per_metatile_triple
Definition metatile.hpp:26
constexpr std::size_t tiles_per_metatile_layer
Definition metatile.hpp:22
constexpr std::size_t num_palettes
Definition palette.hpp:21
void panic(const StringViewSourceLoc &s)
Unconditionally terminates the program with a panic message.
Definition panic.cpp:43
PixelTile< ColorType > color_tile_from_index_tile(const PixelTile< IndexPixel > &index_tile, const Palette< ColorType, N > &palette)
Converts a PixelTile<IndexPixel> to a PixelTile<ColorType> using a palette (intrinsic transparency).