From ad2e84c279b3614f2a58378d13a3477d778bbfb8 Mon Sep 17 00:00:00 2001 From: Annika Date: Tue, 7 Jul 2026 12:17:32 -0700 Subject: [PATCH] implemented shaders, gradients, and uv mapping --- TODO | 2 +- buffer.cpp | 8 ++++--- datatypes.cpp | 48 ++++++++++++++++++++++++------------- example | Bin 36984 -> 37424 bytes example.cpp | 11 ++++++--- mapper.cpp | 37 ++++++++++++++++++++++++++++ primatives/rectangle.cpp | 10 ++++++-- shaders/colorshader.cpp | 25 +++++++++++++++++++ shaders/gradientshader.cpp | 29 ++++++++++++++++++++++ shaders/shader.cpp | 6 +++-- 10 files changed, 149 insertions(+), 27 deletions(-) create mode 100644 mapper.cpp create mode 100644 shaders/colorshader.cpp create mode 100644 shaders/gradientshader.cpp diff --git a/TODO b/TODO index 137a585..67a30e5 100644 --- a/TODO +++ b/TODO @@ -1,4 +1,4 @@ [ ] write a monolithic header file [x] refactor example code using composition -[ ] remove draw class entirely +[x] remove draw class entirely [ ] create shader classes with polymorphism \ No newline at end of file diff --git a/buffer.cpp b/buffer.cpp index 419d0eb..2384b87 100644 --- a/buffer.cpp +++ b/buffer.cpp @@ -5,6 +5,8 @@ #include "datatypes.cpp" #include "helpers.cpp" #include "shaders/shader.cpp" +#include "shaders/colorshader.cpp" +#include "shaders/gradientshader.cpp" namespace UwU { // Buffer object - can be a wayland surface or a virtual buffer @@ -44,12 +46,12 @@ namespace UwU { return; } - void drawPixelShader(Coord2 coord, Shader shader) { - size_t i = (size_t)coord.y * stride + (size_t)coord.x * 4; + void drawPixelShader(uint16_t x, uint16_t y, uint16_t u, uint16_t v, Shader& shader) { + size_t i = (size_t)y * stride + (size_t)x * 4; uint8_t b0 = pixels[i + 0]; uint8_t g0 = pixels[i + 1]; uint8_t r0 = pixels[i + 2]; - Color newColor = shader.color(); + Color newColor = shader.color(u, v); uint8_t b = Helpers::lerp8(b0, newColor.b, newColor.a); uint8_t g = Helpers::lerp8(g0, newColor.g, newColor.a); uint8_t r = Helpers::lerp8(r0, newColor.r, newColor.a); diff --git a/datatypes.cpp b/datatypes.cpp index 7ff0edd..ecbd130 100644 --- a/datatypes.cpp +++ b/datatypes.cpp @@ -36,22 +36,38 @@ namespace UwU { uint16_t y; }; - // // trapezoid datatype (horizontally constrained) - // struct Trapezoid { - // Trapezoid(uint16_t y0, uint16_t y1, uint16_t xl0, uint16_t xl1, uint16_t xr0, uint16_t xr1) { - // this->y0 = y0; - // this->y1 = y1; - // this->xl0 = xl0; - // this->xl1 = xl1; - // this->xr0 = xr0; - // this->xr1 = xr1; + // Vec2 datatype for signed x, y coordinates + struct Vec2 { + Vec2(int16_t x, int16_t y) { + this->x = x; + this->y = y; + } + Vec2() {} + int16_t x; + int16_t y; + }; + + // 2x2 matrix, Q15.16 signed fixed point + struct Matrix4 { + Matrix4(int32_t xx, int32_t xy, int32_t yx, int32_t yy) { + this->xx = xx; + this->xy = xy; + this->yx = yx; + this->yy = yy; + } + Matrix4() {} + int32_t xx; // x' = x*xx + y*xy + int32_t xy; + int32_t yx; // y' = x*yx + y*yy + int32_t yy; + }; + + // class Mapper { + // public: + // Mapper() { + // } - // Trapezoid() {} - // uint16_t y0; - // uint16_t y1; - // uint16_t xl0; - // uint16_t xl1; - // uint16_t xr0; - // uint16_t xr1; + // uint16_t *xxMap; + // }; } \ No newline at end of file diff --git a/example b/example index b09f1281ba5522c4a51ae14fa4dc1a3b3d3017f4..70af5f66db091e0bf3120513fbd57d61a9922b21 100755 GIT binary patch literal 37424 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≶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 W#%L`$U3LaR2U(K2P)ne(#=ijq_Vo?` literal 36984 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 YalQ;qLLgIi20<^rT{7os2{hLDKfKSDasU7T diff --git a/example.cpp b/example.cpp index 2b12bf6..eb24798 100644 --- a/example.cpp +++ b/example.cpp @@ -18,6 +18,9 @@ #include "primatives/triangle.cpp" // #include "draw.cpp" #include "shaders/shader.cpp" +#include "shaders/colorshader.cpp" +#include "shaders/gradientshader.cpp" +#include "mapper.cpp" static void onKey(void *user, uint32_t keycode, uint32_t state) { if (keycode == 1) { @@ -31,18 +34,20 @@ static void onKey(void *user, uint32_t keycode, uint32_t state) { int main(void) { uint16_t w = 800, h = 480; - UwU::Shader fuchsia = UwU::Shader(); + UwU::GradientShader fuchsia = UwU::GradientShader(UwU::Color(0xb00b69ff), UwU::Color(0xb00b6940)); + int32_t rectScale = (255 * 65536) / 351; + UwU::Mapper rectMapper = UwU::Mapper(UwU::Vec2(-69, 0), UwU::Vec2(69, 0), UwU::Matrix4(rectScale, 0, 0, 1)); UwU::Color red = UwU::Color(0xff000080); UwU::Color green = UwU::Color(0x00ff00ff); UwU::Color blue = UwU::Color(0x0000ff80); - UwU::Color alpha = UwU::Color(0x00000000); + // UwU::Color alpha = UwU::Color(0x00000000); UwU::Surface surface = UwU::Surface(w, h, onKey); // draw.rainbow(); UwU::Rectangle rectangle = UwU::Rectangle(69, 69, 420, 420); - rectangle.draw(surface.buffer, fuchsia); + rectangle.draw(surface.buffer, rectMapper, fuchsia); // draw.rectangleGradient(UwU::Coord2(200, 200), UwU::Coord2(600, 400), red, blue, alpha, red); diff --git a/mapper.cpp b/mapper.cpp new file mode 100644 index 0000000..4b8a26c --- /dev/null +++ b/mapper.cpp @@ -0,0 +1,37 @@ +#pragma once + +#include +#include +#include +#include + +#include "datatypes.cpp" +#include "helpers.cpp" + +namespace UwU { + class Mapper { + public: + Mapper(Vec2 offset, Vec2 origin, Matrix4 transformation) { + this->offset = offset; + this->origin = origin; + this->transformation = transformation; + } + Vec2 offset; // offset (translation) + Vec2 origin; // origin (for rotation, etc) + Matrix4 transformation; // transformation matrix (for rotation, translation, etc) + + Coord2 map(Coord2 input) { + int64_t x1 = (int64_t)transformation.xx * ((int64_t)input.x - (int64_t)origin.x); + x1 += (int64_t)transformation.xy * ((int64_t)input.y - (int64_t)origin.y); + x1 = x1 / 65536; + x1 += origin.x; + x1 += offset.x; + int64_t y1 = (int64_t)transformation.yx * ((int64_t)input.x - (int64_t)origin.x); + y1 += (int64_t)transformation.yy * ((int64_t)input.y - (int64_t)origin.y); + y1 = y1 / 65536; + y1 += origin.y; + y1 += offset.y; + return Coord2((uint16_t)x1, (uint16_t)y1); + } + }; +} \ No newline at end of file diff --git a/primatives/rectangle.cpp b/primatives/rectangle.cpp index b038055..64598e4 100644 --- a/primatives/rectangle.cpp +++ b/primatives/rectangle.cpp @@ -6,6 +6,9 @@ #include "../helpers.cpp" #include "../buffer.cpp" #include "../shaders/shader.cpp" +#include "../shaders/colorshader.cpp" +#include "../shaders/gradientshader.cpp" +#include "../mapper.cpp" namespace UwU { // rectangle @@ -24,11 +27,14 @@ namespace UwU { uint16_t y1; // Draw a rectangle - void draw (Buffer buffer, Shader shader) { + void draw (Buffer buffer, Mapper mapper, Shader& shader) { + // printf("color: %u, %u, %u, %u", shader.color().r, shader.color().g, shader.color().b, shader.color().a); if (x0 > buffer.width || y0 > buffer.height || x1 > buffer.width || y1 > buffer.height) {return;}; + Coord2 uv = Coord2(); for (uint16_t y = y0; y < y1; y++) { for (uint16_t x = x0; x < x1; x++) { - buffer.drawPixelShader(Coord2(x, y), shader); + uv = mapper.map(Coord2(x, y)); + buffer.drawPixelShader(x, y, uv.x, uv.y, shader); } } return; diff --git a/shaders/colorshader.cpp b/shaders/colorshader.cpp new file mode 100644 index 0000000..baea2fb --- /dev/null +++ b/shaders/colorshader.cpp @@ -0,0 +1,25 @@ +#pragma once + +#include + +#include "../datatypes.cpp" +#include "../helpers.cpp" +#include "../buffer.cpp" +#include "shader.cpp" + +namespace UwU { + class ColorShader : public Shader { + public: + ColorShader(Color color) { + this->shaderColor = color; + } + + Color shaderColor; + + Color color(uint16_t u, uint16_t v) override { + (void)u; + (void)v; + return shaderColor; + } + }; +} \ No newline at end of file diff --git a/shaders/gradientshader.cpp b/shaders/gradientshader.cpp new file mode 100644 index 0000000..267ce20 --- /dev/null +++ b/shaders/gradientshader.cpp @@ -0,0 +1,29 @@ +#pragma once + +#include + +#include "../datatypes.cpp" +#include "../helpers.cpp" +#include "../buffer.cpp" +#include "shader.cpp" + +namespace UwU { + class GradientShader : public Shader { + public: + GradientShader(Color color0, Color color1) { + // this->x0 = x0; + this->shaderColor0 = color0; + // this->x1 = x1; + this->shaderColor1 = color1; + } + // uint16_t x0; + Color shaderColor0; + // uint16_t x1; + Color shaderColor1; + + Color color(uint16_t u, uint16_t v) override { + (void)v; + return Helpers::lerpColor(shaderColor0, shaderColor1, u); + } + }; +} \ No newline at end of file diff --git a/shaders/shader.cpp b/shaders/shader.cpp index a9e6cf2..8f776cb 100644 --- a/shaders/shader.cpp +++ b/shaders/shader.cpp @@ -12,8 +12,10 @@ namespace UwU { public: Shader() {} - Color color() { - return Color(0xb00b69ff); + virtual Color color(uint16_t u, uint16_t v) { + (void)u; + (void)v; + return Color(); } }; } \ No newline at end of file