Porytiles
Loading...
Searching...
No Matches
layer_mode_converter.cpp
Go to the documentation of this file.
2
11
12namespace porytiles2 {
13
15{
17 layer_mode, component.detect_layer_mode(), "layer mode detection failed", std::vector<TilemapEntry>);
18 if (layer_mode == tileset::LayerMode::triple) {
19 // No-op case
20 return component.metatiles_bin();
21 }
22
23 const auto &metatiles_bin = component.metatiles_bin();
24 const auto &metatile_attributes = component.metatile_attributes_bin();
25
26 const std::size_t num_metatiles = metatiles_bin.size() / metatile::entries_per_metatile_dual;
27
28 std::vector<TilemapEntry> result;
29 result.reserve(num_metatiles * metatile::entries_per_metatile_triple);
30
31 // Create a transparent entry (tile_index = 0, pal_index = 0, no flips)
32 const TilemapEntry transparent{0, 0, false, false};
33
34 for (std::size_t i = 0; i < num_metatiles; ++i) {
35 // Number of transparent entries to insert
36 constexpr std::size_t transparent_entries = 4;
37 const auto &attribute = metatile_attributes[i];
38 const std::size_t input_offset = i * metatile::entries_per_metatile_dual;
39
40 switch (attribute.layer_type()) {
42 // Insert 4 transparent entries at the start
43 for (std::size_t j = 0; j < transparent_entries; ++j) {
44 result.push_back(transparent);
45 }
46 // Copy the 8 original entries
47 for (std::size_t j = 0; j < metatile::entries_per_metatile_dual; ++j) {
48 result.push_back(metatiles_bin[input_offset + j]);
49 }
50 break;
51
53 // Copy the 8 original entries
54 for (std::size_t j = 0; j < metatile::entries_per_metatile_dual; ++j) {
55 result.push_back(metatiles_bin[input_offset + j]);
56 }
57 // Insert 4 transparent entries at the end
58 for (std::size_t j = 0; j < transparent_entries; ++j) {
59 result.push_back(transparent);
60 }
61 break;
62
64 // Copy the first 4 entries
65 for (std::size_t j = 0; j < transparent_entries; ++j) {
66 result.push_back(metatiles_bin[input_offset + j]);
67 }
68 // Insert 4 transparent entries in the middle
69 for (std::size_t j = 0; j < transparent_entries; ++j) {
70 result.push_back(transparent);
71 }
72 // Copy the last 4 entries
73 for (std::size_t j = transparent_entries; j < metatile::entries_per_metatile_dual; ++j) {
74 result.push_back(metatiles_bin[input_offset + j]);
75 }
76 break;
77 }
78 }
79
80 return result;
81}
82
84{
86 layer_mode, component.detect_layer_mode(), "layer mode detection failed", std::vector<TilemapEntry>);
87 if (layer_mode == tileset::LayerMode::dual) {
88 // No-op case
89 return component.metatiles_bin();
90 }
91 // Iterate over component tilemap entries and attributes.
92 panic("TODO: implement");
93}
94
95} // 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.
ChainableResult< std::vector< TilemapEntry > > triple_layerize(const PorymapTilesetComponent &component)
Converts a tileset component to triple-layer format.
ChainableResult< std::vector< TilemapEntry > > dual_layerize(const PorymapTilesetComponent &component)
TODO.
const std::vector< TilemapEntry > & metatiles_bin() const
ChainableResult< tileset::LayerMode > detect_layer_mode() const
const std::vector< MetatileAttribute > & metatile_attributes_bin() const
Represents a tilemap entry referencing a tile with palette and flip attributes.
constexpr std::size_t entries_per_metatile_dual
Definition metatile.hpp:17
constexpr std::size_t entries_per_metatile_triple
Definition metatile.hpp:18
void panic(const StringViewSourceLoc &s)
Unconditionally terminates the program with a panic message.
Definition panic.hpp:53