|
|
|
@@ -11,36 +11,42 @@
|
|
|
|
|
namespace nostalgia::core {
|
|
|
|
|
|
|
|
|
|
[[nodiscard]]
|
|
|
|
|
constexpr std::size_t ptToIdx(int x, int y, int c) noexcept {
|
|
|
|
|
constexpr auto colLength = static_cast<std::size_t>(PixelsPerTile);
|
|
|
|
|
const auto rowLength = static_cast<std::size_t>(static_cast<std::size_t>(c / TileWidth) * colLength);
|
|
|
|
|
const auto colStart = static_cast<std::size_t>(colLength * static_cast<std::size_t>(x / TileWidth));
|
|
|
|
|
const auto rowStart = static_cast<std::size_t>(rowLength * static_cast<std::size_t>(y / TileHeight));
|
|
|
|
|
const auto colOffset = static_cast<std::size_t>(x % TileWidth);
|
|
|
|
|
const auto rowOffset = static_cast<std::size_t>(static_cast<std::size_t>(y % TileHeight) * TileHeight);
|
|
|
|
|
constexpr std::size_t ptToIdx(int x, int y, int c, int scale = 1) noexcept {
|
|
|
|
|
const auto tileWidth = TileWidth * scale;
|
|
|
|
|
const auto tileHeight = TileHeight * scale;
|
|
|
|
|
const auto pixelsPerTile = tileWidth * tileHeight;
|
|
|
|
|
const auto colLength = static_cast<std::size_t>(pixelsPerTile);
|
|
|
|
|
const auto rowLength = static_cast<std::size_t>(static_cast<std::size_t>(c / tileWidth) * colLength);
|
|
|
|
|
const auto colStart = static_cast<std::size_t>(colLength * static_cast<std::size_t>(x / tileWidth));
|
|
|
|
|
const auto rowStart = static_cast<std::size_t>(rowLength * static_cast<std::size_t>(y / tileHeight));
|
|
|
|
|
const auto colOffset = static_cast<std::size_t>(x % tileWidth);
|
|
|
|
|
const auto rowOffset = static_cast<std::size_t>(static_cast<std::size_t>((y % tileHeight) * tileHeight));
|
|
|
|
|
return static_cast<std::size_t>(colStart + colOffset + rowStart + rowOffset);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[[nodiscard]]
|
|
|
|
|
constexpr std::size_t ptToIdx(const ox::Point &pt, int c) noexcept {
|
|
|
|
|
return ptToIdx(pt.x, pt.y, c * TileWidth);
|
|
|
|
|
constexpr std::size_t ptToIdx(const ox::Point &pt, int c, int scale = 1) noexcept {
|
|
|
|
|
return ptToIdx(pt.x, pt.y, c * TileWidth, scale);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[[nodiscard]]
|
|
|
|
|
constexpr ox::Point idxToPt(int i, int c) noexcept {
|
|
|
|
|
constexpr ox::Point idxToPt(int i, int c, int scale = 1) noexcept {
|
|
|
|
|
const auto tileWidth = TileWidth * scale;
|
|
|
|
|
const auto tileHeight = TileHeight * scale;
|
|
|
|
|
const auto pixelsPerTile = tileWidth * tileHeight;
|
|
|
|
|
// prevent divide by zeros
|
|
|
|
|
if (!c) {
|
|
|
|
|
++c;
|
|
|
|
|
}
|
|
|
|
|
const auto t = i / PixelsPerTile; // tile number
|
|
|
|
|
const auto iti = i % PixelsPerTile; // in tile index
|
|
|
|
|
const auto t = i / pixelsPerTile; // tile number
|
|
|
|
|
const auto iti = i % pixelsPerTile; // in tile index
|
|
|
|
|
const auto tc = t % c; // tile column
|
|
|
|
|
const auto tr = t / c; // tile row
|
|
|
|
|
const auto itx = iti % TileWidth; // in tile x
|
|
|
|
|
const auto ity = iti / TileHeight; // in tile y
|
|
|
|
|
const auto itx = iti % tileWidth; // in tile x
|
|
|
|
|
const auto ity = iti / tileHeight; // in tile y
|
|
|
|
|
return {
|
|
|
|
|
itx + tc * TileWidth,
|
|
|
|
|
ity + tr * TileHeight,
|
|
|
|
|
itx + tc * tileWidth,
|
|
|
|
|
ity + tr * tileHeight,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|