From e6ce80ce13e86556be79e6ffcde5b79ec08fe046 Mon Sep 17 00:00:00 2001 From: Annika Date: Sat, 25 Jul 2026 21:53:33 -0700 Subject: [PATCH] basic tilemapping --- example | Bin 37000 -> 37000 bytes example.cpp | 16 ++++++++++++---- mappers/tilemapper.cpp | 17 ++++++++++++++--- shaders/buffershader.cpp | 24 ++++++++++++++++++++++++ shaders/shaders.h | 3 ++- 5 files changed, 52 insertions(+), 8 deletions(-) create mode 100644 shaders/buffershader.cpp diff --git a/example b/example index 75f1cd018920d681cbad9ed4fdb9a9927980959d..0609a4640feca7a989a0d59b26133ca5ada9360f 100755 GIT binary patch delta 5754 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 diff --git a/example.cpp b/example.cpp index 9d0a81c..097b078 100644 --- a/example.cpp +++ b/example.cpp @@ -44,10 +44,17 @@ int main(void) { UwU::Color blue = UwU::Color(0x0000ffff); // UwU::ColorShader fuchsia = UwU::ColorShader(UwU::Color(0xb00b69ff)); - UwU::VGradientShader bisexual = UwU::VGradientShader(0, 351, red, blue); - UwU::OffsetMapper offsetMapper = UwU::OffsetMapper(); + UwU::HGradientShader bisexual = UwU::HGradientShader(0, 179, red, blue); + UwU::TileMapper tileMapper = UwU::TileMapper(); + UwU::Buffer fontBuffer = font(); + UwU::BufferShader textMap = UwU::BufferShader(fontBuffer); + tileMapper.tileMap[0] = 0x0000; + tileMapper.tileMap[1] = 0x0111; + tileMapper.tileMap[2] = 0x0000; + tileMapper.tileMap[3] = 0x0222; + tileMapper.tileMap[4] = 0x0333; UwU::Rectangle rectangle = UwU::Rectangle(69, 69, 420, 420); - rectangle.draw(surface.buffer, offsetMapper, bisexual); + rectangle.draw(surface.buffer, tileMapper, textMap); UwU::ColorShader greenShader = UwU::ColorShader(green); UwU::NullMapper nullMapper = UwU::NullMapper(); @@ -60,7 +67,8 @@ int main(void) { UwU::ColorShader redShader = UwU::ColorShader(red); UwU::Triangle triangle = UwU::Triangle(140, 140, 60, 400, 240, 240); - triangle.draw(surface.buffer, nullMapper, redShader); + UwU::OffsetMapper offsetMapper = UwU::OffsetMapper(); + triangle.draw(surface.buffer, offsetMapper, bisexual); // // Benchmarking // struct timespec start, end; diff --git a/mappers/tilemapper.cpp b/mappers/tilemapper.cpp index b86df29..3fd6334 100644 --- a/mappers/tilemapper.cpp +++ b/mappers/tilemapper.cpp @@ -9,11 +9,22 @@ namespace UwU { class TileMapper : public MapperBase { // not actually tilemapping yet public: - TileMapper() {} + TileMapper() { + this->tileMap = new uint16_t[16384]; // the map of tile positions 128x128 8x8 tiles from a 512x512 bitmap space + } + uint16_t* tileMap; Coord2 map(uint16_t x0, uint16_t y0, uint16_t x, uint16_t y) { - uint16_t u = x -x0; - uint16_t v = y -y0; + uint16_t u0 = x - x0; + uint16_t v0 = y - y0; + // returns uv coordinates that point to a specific pixel of a specific tile on a tilesheet buffer + uint16_t mapX = (u0 & 0x03f8) >> 3; + uint16_t mapY = (v0 & 0x03f8) << 4; + uint16_t tileIndex = tileMap[mapY + mapX]; + uint16_t u = (tileIndex & 0x003f) << 3; + u += (u0 & 0x0007); + uint16_t v = (tileIndex & 0x0fc0) >> 3; + v += (v0 & 0x0007); return Coord2(u, v); } }; diff --git a/shaders/buffershader.cpp b/shaders/buffershader.cpp new file mode 100644 index 0000000..d83d1b9 --- /dev/null +++ b/shaders/buffershader.cpp @@ -0,0 +1,24 @@ +#pragma once + +#include + +#include "../datatypes.cpp" +#include "../helpers.cpp" +#include "../buffer.cpp" +#include "shaderbase.cpp" + +namespace UwU { + class BufferShader : public ShaderBase { + public: + BufferShader(Buffer buffer) { + this->buffer = buffer; + } + Buffer buffer; + + Color shade(uint16_t x, uint16_t y) { + uint32_t index = (y * buffer.stride) + (x * 4); + Color c = Color(buffer.pixels[index + 2], buffer.pixels[index + 1], buffer.pixels[index], buffer.pixels[index + 3]); + return c; + } + }; +} \ No newline at end of file diff --git a/shaders/shaders.h b/shaders/shaders.h index 47aa080..9632c93 100644 --- a/shaders/shaders.h +++ b/shaders/shaders.h @@ -1,4 +1,5 @@ #include "shaderbase.cpp" #include "colorshader.cpp" #include "hgradientshader.cpp" -#include "vgradientshader.cpp" \ No newline at end of file +#include "vgradientshader.cpp" +#include "buffershader.cpp" \ No newline at end of file