17 layer_mode, component.
detect_layer_mode(), std::vector<TilemapEntry>,
"Layer mode detection failed.");
28 std::vector<TilemapEntry> result;
34 for (std::size_t i = 0; i < num_metatiles; ++i) {
36 constexpr std::size_t transparent_entries = 4;
37 const auto &attribute = metatile_attributes[i];
40 switch (attribute.layer_type()) {
43 for (std::size_t j = 0; j < transparent_entries; ++j) {
44 result.push_back(transparent);
48 result.push_back(metatiles_bin[input_offset + j]);
55 result.push_back(metatiles_bin[input_offset + j]);
58 for (std::size_t j = 0; j < transparent_entries; ++j) {
59 result.push_back(transparent);
65 for (std::size_t j = 0; j < transparent_entries; ++j) {
66 result.push_back(metatiles_bin[input_offset + j]);
69 for (std::size_t j = 0; j < transparent_entries; ++j) {
70 result.push_back(transparent);
74 result.push_back(metatiles_bin[input_offset + j]);
84 const std::vector<TilemapEntry> &entries,
const std::vector<
Metatile<Rgba32>> &source_metatiles)
87 if (entries.size() != expected_entries_size) {
89 "entries vector size " + std::to_string(entries.size()) +
" did not match expected size " +
90 std::to_string(expected_entries_size));
93 std::vector<TilemapEntry> result;
96 for (std::size_t i = 0; i < source_metatiles.size(); ++i) {
97 const auto &metatile = source_metatiles[i];
101 const LayerMode layer_mode = metatile.infer_layer_mode(extrinsic_transparency_);
103 panic(
"metatile " + std::to_string(i) +
" has implied LayerMode::triple, cannot dual_layerize");
107 const LayerType layer_type = metatile.infer_layer_type(extrinsic_transparency_);
109 switch (layer_type) {
113 result.push_back(entries[input_offset + j]);
120 result.push_back(entries[input_offset + j]);
126 for (std::size_t j = 0; j < 4; ++j) {
127 result.push_back(entries[input_offset + j]);
130 result.push_back(entries[input_offset + j]);
#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.
std::vector< TilemapEntry > dual_layerize(const std::vector< TilemapEntry > &entries, const std::vector< Metatile< Rgba32 > > &source_metatiles)
Converts a tileset from triple-layer format to dual-layer format.
ChainableResult< std::vector< TilemapEntry > > triple_layerize(const PorymapTilesetComponent &component)
Converts a tileset component to triple-layer format.
const std::vector< TilemapEntry > & metatiles_bin() const
ChainableResult< 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.
LayerMode
Specifies whether a metatile uses dual-layer or triple-layer mode.
void panic(const StringViewSourceLoc &s)
Unconditionally terminates the program with a panic message.
LayerType
Specifies which layers of a metatile are used for rendering.