#include "splat.h" namespace fmt { void build_splat(const TileMap& tile, int runtime_layer_count, SplatSet& out) { out = SplatSet{}; const int S = SPLAT_RAW_XY; // 258 const auto& t = tile.raw; // 258*258 if ((int)t.size() != S * S) return; // 直方图 + 出现过的图层 int maxidx = 0; for (uint8_t v : t) maxidx = std::max(maxidx, (int)v); out.tile_histogram.assign(maxidx + 1, 0); for (uint8_t v : t) out.tile_histogram[v]++; const int limit = std::max(runtime_layer_count - 1, maxidx); for (int i = 1; i <= limit; ++i) { if (i >= (int)out.tile_histogram.size() || out.tile_histogram[i] == 0) continue; SplatLayer L; L.layer = i; L.alpha.resize(size_t(S) * S); int cov = 0; for (int y = 0; y < S; ++y) { const uint8_t* row = &t[size_t(y) * S]; const uint8_t* up = y > 0 ? row - S : nullptr; const uint8_t* dn = y < S - 1 ? row + S : nullptr; uint8_t* a = &L.alpha[size_t(y) * S]; for (int x = 0; x < S; ++x) { uint8_t tn = row[x]; if (tn == i) { a[x] = 0xFF; ++cov; } else if (tn > i) { bool found = false; if (x > 0 && row[x - 1] == i) found = true; else if (x < S - 1 && row[x + 1] == i) found = true; else if (up) { if (up[x] == i) found = true; else if (x > 0 && up[x - 1] == i) found = true; else if (x < S - 1 && up[x + 1] == i) found = true; } if (!found && dn) { if (dn[x] == i) found = true; else if (x > 0 && dn[x - 1] == i) found = true; else if (x < S - 1 && dn[x + 1] == i) found = true; } a[x] = found ? 0xFF : 0x00; if (found) ++cov; } else { a[x] = 0x00; } } } L.coverage = cov; out.layers.push_back(std::move(L)); } } } // namespace fmt