From 89afdfce9b5d18e79665ffed4b7510cd23bb049b Mon Sep 17 00:00:00 2001 From: Annika Date: Wed, 8 Jul 2026 16:50:17 -0700 Subject: [PATCH] created buffer shader and added shader logic to rectangle --- buffer.cpp | 2 +- datatypes.cpp | 67 ++++++++++++++++++++------------------- example | Bin 41192 -> 41192 bytes example.cpp | 10 +++--- primatives/line.cpp | 1 + primatives/point.cpp | 1 + primatives/rectangle.cpp | 16 +++++++--- primatives/triangle.cpp | 1 + shader.cpp | 25 +++++++++++---- 9 files changed, 73 insertions(+), 50 deletions(-) diff --git a/buffer.cpp b/buffer.cpp index f3fbac4..ddbe894 100644 --- a/buffer.cpp +++ b/buffer.cpp @@ -4,7 +4,7 @@ #include "datatypes.cpp" #include "helpers.cpp" -#include "shader.cpp" +// #include "shader.cpp" namespace UwU { // Buffer object - can be a wayland surface or a virtual buffer diff --git a/datatypes.cpp b/datatypes.cpp index 47659d8..a27de46 100644 --- a/datatypes.cpp +++ b/datatypes.cpp @@ -26,41 +26,41 @@ namespace UwU { }; // Coord2 datatype for xy coordinates, from top-left of surface - struct Coord2 { - Coord2(uint16_t x, uint16_t y) { - this->x = x; - this->y = y; - } - Coord2() {} - uint16_t x; - uint16_t y; - }; + // struct Coord2 { + // Coord2(uint16_t x, uint16_t y) { + // this->x = x; + // this->y = y; + // } + // Coord2() {} + // uint16_t x; + // uint16_t y; + // }; // 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; - }; + // 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; - }; + // // 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: @@ -74,7 +74,8 @@ namespace UwU { enum ShaderType { COLOR, HGRADIENT, - VGRADIENT + VGRADIENT, + BUFFER }; enum Direction { diff --git a/example b/example index bd0b5c492074f400fa63fa482733a54ebed2e498..9f33114caebd21d139e913f320e6a64401c363e6 100755 GIT binary patch delta 9971 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 delta 10123 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 RI93X-^Uz#%Wc|>%{{dEb;bH&) diff --git a/example.cpp b/example.cpp index 3366573..d1edb9a 100644 --- a/example.cpp +++ b/example.cpp @@ -32,7 +32,7 @@ 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::Direction::H, 360, 600, UwU::Color(0xb00b69ff), UwU::Color(0x00000000)); + UwU::Shader fuchsia = UwU::Shader(UwU::Direction::V, 100, 300, UwU::Color(0xb00b69ff), UwU::Color(0x00000000)); UwU::Shader red = UwU::Shader(UwU::Direction::V, 69, 420, UwU::Color(0xff0000ff), UwU::Color(0x00000000)); UwU::Shader warmup = UwU::Shader(UwU::Color(0xb00b69ff)); UwU::Color green = UwU::Color(0x00ff00ff); @@ -40,14 +40,17 @@ int main(void) { // UwU::Color alpha = UwU::Color(0x00000000); UwU::Surface surface = UwU::Surface(w, h, onKey); - // UwU::Buffer buffer = UwU::Buffer(surface.getWidth(), surface.getHeight()); + UwU::Buffer buffer = UwU::Buffer(800, 480); + UwU::Shader triangleBuffer = UwU::Shader(69, 69, buffer); UwU::Rectangle rectangle = UwU::Rectangle(69, 69, 420, 420); UwU::Trapezoid trapezoid = UwU::Trapezoid(300, 400, 360, 380, 600, 480); UwU::Triangle triangle = UwU::Triangle(280, 100, 240, 290, 320, 300); UwU::Point point = UwU::Point(387, 43); - rectangle.draw(surface.buffer, red); + + triangle.draw(buffer, fuchsia); + rectangle.draw(surface.buffer, triangleBuffer); // Benchmarking struct timespec start, end; @@ -75,7 +78,6 @@ int main(void) { timeAvg /= BATCH; printf("Elapsed: %ld ns\n", timeAvg); - triangle.draw(surface.buffer, fuchsia); point.draw(surface.buffer, green); diff --git a/primatives/line.cpp b/primatives/line.cpp index ae0d8a6..210acf7 100644 --- a/primatives/line.cpp +++ b/primatives/line.cpp @@ -5,6 +5,7 @@ #include "../datatypes.cpp" #include "../helpers.cpp" #include "../buffer.cpp" +#include "../shader.cpp" namespace UwU { // line diff --git a/primatives/point.cpp b/primatives/point.cpp index bda72e6..861f5a0 100644 --- a/primatives/point.cpp +++ b/primatives/point.cpp @@ -5,6 +5,7 @@ #include "../datatypes.cpp" #include "../helpers.cpp" #include "../buffer.cpp" +#include "../shader.cpp" namespace UwU { // point diff --git a/primatives/rectangle.cpp b/primatives/rectangle.cpp index b072550..1f26ac3 100644 --- a/primatives/rectangle.cpp +++ b/primatives/rectangle.cpp @@ -25,8 +25,8 @@ namespace UwU { // Draw a rectangle void draw (Buffer buffer, Shader shader) { + if (x0 > buffer.width || y0 > buffer.height || x1 > buffer.width || y1 > buffer.height) {return;}; if (shader.shaderType == COLOR) { - if (x0 > buffer.width || y0 > buffer.height || x1 > buffer.width || y1 > buffer.height) {return;}; for (uint16_t y = y0; y < y1; y++) { for (uint16_t x = x0; x < x1; x++) { buffer.drawPixel(x, y, shader.c0); @@ -35,14 +35,13 @@ namespace UwU { return; } else if (shader.shaderType == HGRADIENT) { - if (x0 > buffer.width || y0 > buffer.height || x1 > buffer.width || y1 > buffer.height) {return;}; // Precompute gradient LUT Color cols[x1 - x0]; for (uint16_t x = x0; x < x1; x++) { cols[x - x0] = ShaderMethods::gradient(shader.u0, shader.scale, shader.c0, shader.c1, x); } - + for (uint16_t y = y0; y < y1; y++) { for (uint16_t x = x0; x < x1; x++) { buffer.drawPixel(x, y, cols[x - x0]); @@ -51,7 +50,6 @@ namespace UwU { return; } else if (shader.shaderType == VGRADIENT) { - if (x0 > buffer.width || y0 > buffer.height || x1 > buffer.width || y1 > buffer.height) {return;}; for (uint16_t y = y0; y < y1; y++) { Color c = ShaderMethods::gradient(shader.v0, shader.scale, shader.c0, shader.c1, y); for (uint16_t x = x0; x < x1; x++) { @@ -59,8 +57,16 @@ namespace UwU { } } return; + + } else if (shader.shaderType == BUFFER) { + for (uint16_t y = y0; y < y1; y++) { + for (uint16_t x = x0; x < x1; x++) { + buffer.drawPixel(x, y, ShaderMethods::buffer(shader.u0, shader.v0, shader.buffer, x, y)); + } + } + return; } - + return; } }; } \ No newline at end of file diff --git a/primatives/triangle.cpp b/primatives/triangle.cpp index 7456d0d..acb30e6 100644 --- a/primatives/triangle.cpp +++ b/primatives/triangle.cpp @@ -6,6 +6,7 @@ #include "../datatypes.cpp" #include "../helpers.cpp" #include "../buffer.cpp" +#include "../shader.cpp" namespace UwU { class Triangle { diff --git a/shader.cpp b/shader.cpp index adb2bf1..c99036b 100644 --- a/shader.cpp +++ b/shader.cpp @@ -35,11 +35,12 @@ namespace UwU { } // BUFFER shader - // Shader(uint16_t u, uint16_t v, Buffer buffer) { - // this->shaderType = BUFFER; - // this->u0 = u; - // this->v0 = v; - // } + Shader(uint16_t u, uint16_t v, Buffer buffer) { + this->shaderType = BUFFER; + this->u0 = u; + this->v0 = v; + this->buffer = buffer; + } ShaderType shaderType; uint16_t u0; @@ -47,13 +48,23 @@ namespace UwU { Color c0; Color c1; uint32_t scale; + Buffer buffer; }; class ShaderMethods { public: - static Color gradient(uint16_t uv0, uint32_t scale, Color c0, Color c1, uint16_t uv) { - uint32_t t = (((uint32_t)uv - (uint32_t)uv0) * scale) / 0x01000000; + static Color gradient(uint16_t uv0, uint32_t scale, Color c0, Color c1, uint16_t xy) { + uint32_t t = (((uint32_t)xy - (uint32_t)uv0) * scale) / 0x01000000; return Helpers::lerpColor(c0, c1, (uint8_t)t); } + + static Color buffer(uint16_t u0, uint16_t v0, Buffer buffer, uint16_t x, uint16_t y) { + size_t i = ((size_t)y - (size_t)v0) * buffer.stride + ((size_t)x - (size_t)u0) * 4; + uint8_t b = buffer.pixels[i + 0]; + uint8_t g = buffer.pixels[i + 1]; + uint8_t r = buffer.pixels[i + 2]; + uint8_t a = buffer.pixels[i + 3]; + return Color(r, g, b, a); + } }; } \ No newline at end of file