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,
23 const std::array<Palette<Rgba32, pal::max_size>, pal::num_pals> &pals)
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 = color_tile_from_index_tile(flipped_tile, pals[entry.pal_index()], extrinsic_transparency_);
48 metatile.set_bottom(i, std::move(rgba_tile));
49 }
50
51 // Process middle layer (entries 4-7)
52 for (std::size_t i = 0; i < metatile::tiles_per_metatile_layer; ++i) {
53 const auto &entry = entries[base_entry_idx + metatile::tiles_per_metatile_layer + i];
54 const auto &index_tile = tiles[entry.tile_index()];
55 auto flipped_tile = index_tile.flip(entry.h_flip(), entry.v_flip());
56 auto rgba_tile = color_tile_from_index_tile(flipped_tile, pals[entry.pal_index()], extrinsic_transparency_);
57 metatile.set_middle(i, std::move(rgba_tile));
58 }
59
60 // Process top layer (entries 8-11)
61 for (std::size_t i = 0; i < metatile::tiles_per_metatile_layer; ++i) {
62 const auto &entry = entries[base_entry_idx + 2 * metatile::tiles_per_metatile_layer + i];
63 const auto &index_tile = tiles[entry.tile_index()];
64 auto flipped_tile = index_tile.flip(entry.h_flip(), entry.v_flip());
65 auto rgba_tile = color_tile_from_index_tile(flipped_tile, pals[entry.pal_index()], extrinsic_transparency_);
66 metatile.set_top(i, std::move(rgba_tile));
67 }
68
69 decompiled.push_back(std::move(metatile));
70 }
71
72 return decompiled;
73}
74
75} // 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:23
ChainableResult< std::vector< Metatile< Rgba32 > > > decompile_metatiles(const std::vector< TilemapEntry > &entries, const Image< IndexPixel > &tiles_png, const std::array< Palette< Rgba32, pal::max_size >, pal::num_pals > &pals)
The core tileset entity - a 2x2 grid of PixelTile objects arranged into three layers.
Definition metatile.hpp:186
A generic palette container for colors that support transparency checking.
Definition palette.hpp:47
constexpr std::size_t entries_per_metatile_triple
Definition metatile.hpp:21
constexpr std::size_t tiles_per_metatile_layer
Definition metatile.hpp:17
constexpr std::size_t num_pals
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).