diff --git a/src/nostalgia/modules/core/include/nostalgia/core/ptidxconv.hpp b/src/nostalgia/modules/core/include/nostalgia/core/ptidxconv.hpp index ca5ecb47..4de53078 100644 --- a/src/nostalgia/modules/core/include/nostalgia/core/ptidxconv.hpp +++ b/src/nostalgia/modules/core/include/nostalgia/core/ptidxconv.hpp @@ -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(PixelsPerTile); - const auto rowLength = static_cast(static_cast(c / TileWidth) * colLength); - const auto colStart = static_cast(colLength * static_cast(x / TileWidth)); - const auto rowStart = static_cast(rowLength * static_cast(y / TileHeight)); - const auto colOffset = static_cast(x % TileWidth); - const auto rowOffset = static_cast(static_cast(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(pixelsPerTile); + const auto rowLength = static_cast(static_cast(c / tileWidth) * colLength); + const auto colStart = static_cast(colLength * static_cast(x / tileWidth)); + const auto rowStart = static_cast(rowLength * static_cast(y / tileHeight)); + const auto colOffset = static_cast(x % tileWidth); + const auto rowOffset = static_cast(static_cast((y % tileHeight) * tileHeight)); return static_cast(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, }; } diff --git a/src/nostalgia/modules/core/include/nostalgia/core/tilesheet.hpp b/src/nostalgia/modules/core/include/nostalgia/core/tilesheet.hpp index 0aa6a16c..832e8f39 100644 --- a/src/nostalgia/modules/core/include/nostalgia/core/tilesheet.hpp +++ b/src/nostalgia/modules/core/include/nostalgia/core/tilesheet.hpp @@ -565,4 +565,9 @@ oxModelBegin(CompactTileSheet) oxModelField(pixels) oxModelEnd() +ox::Vector resizeTileSheetData( + ox::Vector const&srcPixels, + ox::Size const&srcSize, + int scale = 2) noexcept; + } diff --git a/src/nostalgia/modules/core/src/CMakeLists.txt b/src/nostalgia/modules/core/src/CMakeLists.txt index 2ee95a1a..d7d99c4b 100644 --- a/src/nostalgia/modules/core/src/CMakeLists.txt +++ b/src/nostalgia/modules/core/src/CMakeLists.txt @@ -1,6 +1,7 @@ add_library( NostalgiaCore gfx.cpp + tilesheet.cpp ) add_subdirectory(gba) diff --git a/src/nostalgia/modules/core/src/tilesheet.cpp b/src/nostalgia/modules/core/src/tilesheet.cpp new file mode 100644 index 00000000..df71f206 --- /dev/null +++ b/src/nostalgia/modules/core/src/tilesheet.cpp @@ -0,0 +1,28 @@ + +#include +#include + +#include + +namespace nostalgia::core { + +ox::Vector resizeTileSheetData( + ox::Vector const&srcPixels, + ox::Size const&srcSize, + int scale = 2) noexcept { + ox::Vector dst; + auto dstWidth = srcSize.width * scale; + auto dstHeight = srcSize.height * scale; + const auto pixelCnt = dstWidth * dstHeight; + dst.resize(static_cast(pixelCnt)); + for (auto i = 0; i < pixelCnt; ++i) { + const auto dstPt = idxToPt(i, 1, scale); + const auto srcPt = dstPt / ox::Point{scale, scale}; + const auto srcIdx = ptToIdx(srcPt, 1); + const auto srcPixel = srcPixels[srcIdx]; + dst[static_cast(i)] = srcPixel; + } + return dst; +} + +}