Porytiles
Loading...
Searching...
No Matches
metatile_decompiler.cpp
Go to the documentation of this file.
2
3#include <memory>
4#include <vector>
5
16
17namespace porytiles2 {
18
19namespace {
20
33PixelTile<Rgba32> convert_tile(
34 const PixelTile<IndexPixel> &index_tile,
35 unsigned int pal_index,
36 const std::array<Palette<Rgba32>, pal::num_pals> &pals)
37{
38 std::array<Rgba32, tile::size_pix> rgba_pixels{};
39 const auto &palette_colors = pals[pal_index].colors();
40
41 for (std::size_t i = 0; i < tile::size_pix; ++i) {
42 const unsigned int color_index = index_tile.at(i).index();
43 // TODO: we should normalize transparency here based on user extrinsic transparency setting
44 rgba_pixels[i] = palette_colors[color_index];
45 }
46
47 return PixelTile{rgba_pixels};
48}
49
50} // namespace
51
53 const std::vector<TilemapEntry> &entries,
54 const Image<IndexPixel> &tiles_png,
55 const std::array<Palette<Rgba32>, pal::num_pals> &pals)
56{
57 std::vector<Metatile<Rgba32>> decompiled;
58
59 // Precondition: entry vector must be triple-layerized
60 if (entries.size() % metatile::entries_per_metatile_triple != 0) {
61 panic("entry vector size was not divisible 12");
62 }
63
66 tiles, tileizer.tileize(tiles_png), "failed to tileize tiles.png", std::vector<Metatile<Rgba32>>);
67
68 // Process metatiles in groups of 12 entries
69 for (std::size_t metatile_idx = 0; metatile_idx < entries.size() / metatile::entries_per_metatile_triple;
70 ++metatile_idx) {
71 Metatile<Rgba32> metatile{};
72 const std::size_t base_entry_idx = metatile_idx * metatile::entries_per_metatile_triple;
73
74 // Process bottom layer (entries 0-3)
75 for (std::size_t i = 0; i < metatile::tiles_per_metatile_layer; ++i) {
76 const auto &entry = entries[base_entry_idx + i];
77 const auto &index_tile = tiles[entry.tile_index()];
78 auto flipped_tile = index_tile.flip(entry.hflip(), entry.vflip());
79 auto rgba_tile = convert_tile(flipped_tile, entry.pal_index(), pals);
80 metatile.set_bottom(i, std::move(rgba_tile));
81 }
82
83 // Process middle layer (entries 4-7)
84 for (std::size_t i = 0; i < metatile::tiles_per_metatile_layer; ++i) {
85 const auto &entry = entries[base_entry_idx + metatile::tiles_per_metatile_layer + i];
86 const auto &index_tile = tiles[entry.tile_index()];
87 auto flipped_tile = index_tile.flip(entry.hflip(), entry.vflip());
88 auto rgba_tile = convert_tile(flipped_tile, entry.pal_index(), pals);
89 metatile.set_middle(i, std::move(rgba_tile));
90 }
91
92 // Process top layer (entries 8-11)
93 for (std::size_t i = 0; i < metatile::tiles_per_metatile_layer; ++i) {
94 const auto &entry = entries[base_entry_idx + 2 * metatile::tiles_per_metatile_layer + i];
95 const auto &index_tile = tiles[entry.tile_index()];
96 auto flipped_tile = index_tile.flip(entry.hflip(), entry.vflip());
97 auto rgba_tile = convert_tile(flipped_tile, entry.pal_index(), pals);
98 metatile.set_top(i, std::move(rgba_tile));
99 }
100
101 decompiled.push_back(std::move(metatile));
102 }
103
104 return decompiled;
105}
106
107} // namespace porytiles2
#define PT_TRY_ASSIGN_CHAIN_ERR(var, expr, msg, 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:24
ChainableResult< std::vector< Metatile< Rgba32 > > > decompile_metatiles(const std::vector< TilemapEntry > &entries, const Image< IndexPixel > &tiles_png, const std::array< Palette< Rgba32 >, pal::num_pals > &pals)
The core tileset entity - a 2x2 grid of PixelTile objects arranged into three layers.
Definition metatile.hpp:95
A palette container for colors that support transparency checking.
Definition palette.hpp:34
constexpr std::size_t tiles_per_metatile_layer
Definition metatile.hpp:14
constexpr std::size_t entries_per_metatile_triple
Definition metatile.hpp:18
constexpr std::size_t num_pals
Definition palette.hpp:16
constexpr std::size_t size_pix
void panic(const StringViewSourceLoc &s)
Unconditionally terminates the program with a panic message.
Definition panic.hpp:53