From f61e3a82379b3e31021e3ca5fc4b592d07177b85 Mon Sep 17 00:00:00 2001 From: Annika Date: Wed, 8 Jul 2026 14:34:55 -0700 Subject: [PATCH] added gradient shader logic to trapezoids --- buffer.cpp | 23 ++------------- example | Bin 41128 -> 41128 bytes example.cpp | 20 ++++++------- primatives/line.cpp | 4 +-- primatives/point.cpp | 2 +- primatives/rectangle.cpp | 9 ++++-- primatives/trapezoid.cpp | 62 +++++++++++++++++++++++++++++---------- primatives/triangle.cpp | 4 +-- 8 files changed, 70 insertions(+), 54 deletions(-) diff --git a/buffer.cpp b/buffer.cpp index d80d15e..f3fbac4 100644 --- a/buffer.cpp +++ b/buffer.cpp @@ -29,9 +29,9 @@ namespace UwU { uint16_t height; uint16_t stride; - void drawPixel(Coord2 coord, Color color) { + void drawPixel(uint16_t x, uint16_t y, Color color) { // if (color.a == 0) {return;} - size_t i = (size_t)coord.y * stride + (size_t)coord.x * 4; + 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]; @@ -41,25 +41,8 @@ namespace UwU { pixels[i + 0] = color.b; // B pixels[i + 1] = color.g; // G pixels[i + 2] = color.r; // R - pixels[i + 3] = 0xff; // A + pixels[i + 3] = 0xff; // A return; } - - // void drawPixelShader(uint16_t x, uint16_t y, Shader& shader) { - // Color newColor = shader.color(x, y); - // if (newColor.a == 0) {return;} - // 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]; - // // 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); - // pixels[i + 0] = newColor.b; // B - // pixels[i + 1] = newColor.g; // G - // pixels[i + 2] = newColor.r; // R - // pixels[i + 3] = 0xff; // A - // return; - // } }; } \ No newline at end of file diff --git a/example b/example index 55e4408983dde06040e85f6cedf2fbf334964fd8..2fceecca360ff01011a4ac5e6bf13bcf7264e3ae 100755 GIT binary patch delta 10465 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 G_xoRO?Z#FB delta 11599 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 o!t`g&Vd>AZvUf&xxcgqR{O;%ut*t<8 diff --git a/example.cpp b/example.cpp index 54e9d52..89c41c2 100644 --- a/example.cpp +++ b/example.cpp @@ -32,9 +32,9 @@ 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, 69, 420, UwU::Color(0xb00b69ff), UwU::Color(0x00000000)); + UwU::Shader fuchsia = UwU::Shader(UwU::Direction::H, 360, 600, 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 red = UwU::Color(0xff000080); UwU::Color green = UwU::Color(0x00ff00ff); UwU::Color blue = UwU::Color(0x0000ff80); // UwU::Color alpha = UwU::Color(0x00000000); @@ -43,7 +43,11 @@ int main(void) { // UwU::Buffer buffer = UwU::Buffer(surface.getWidth(), surface.getHeight()); 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); // Benchmarking struct timespec start, end; @@ -52,13 +56,13 @@ int main(void) { const int SAMPLES = 10; for (int i = 0; i < WARMUP; i++) { - rectangle.draw(surface.buffer, fuchsia); + trapezoid.draw(surface.buffer, fuchsia); } long times[SAMPLES]; for (int s = 0; s < SAMPLES; s++) { clock_gettime(CLOCK_MONOTONIC, &start); for (int i = 0; i < BATCH; i++) { - rectangle.draw(surface.buffer, fuchsia); + trapezoid.draw(surface.buffer, fuchsia); } clock_gettime(CLOCK_MONOTONIC, &end); times[s] = (end.tv_sec - start.tv_sec) * 1000000000L + (end.tv_nsec - start.tv_nsec); @@ -71,14 +75,10 @@ int main(void) { timeAvg /= BATCH; printf("Elapsed: %ld ns\n", timeAvg); - UwU::Trapezoid trapezoid = UwU::Trapezoid(300, 400, 360, 380, 600, 480); - trapezoid.draw(surface.buffer, red); - UwU::Triangle triangle = UwU::Triangle(280, 100, 240, 290, 320, 300); triangle.draw(surface.buffer, blue); - - UwU::Point point = UwU::Point(387, 43); + point.draw(surface.buffer, green); - + UwU::Line lines[8] { UwU::Line(300, 100, 250, 469), UwU::Line(250, 100, 300, 469), diff --git a/primatives/line.cpp b/primatives/line.cpp index 09d1a74..830e9ea 100644 --- a/primatives/line.cpp +++ b/primatives/line.cpp @@ -22,7 +22,7 @@ namespace UwU { int16_t d = (2 * dy) - dx; int16_t y = iy0; for (int16_t x = ix0; x < ix1; x++) { - buffer.drawPixel(Coord2((uint16_t)x, (uint16_t)y), color); + buffer.drawPixel((uint16_t)x, (uint16_t)y, color); if (d > 0) { y += yi; d += (2 * (dy - dx)); @@ -45,7 +45,7 @@ namespace UwU { int16_t d = (2 * dx) - dy; int16_t x = ix0; for (int16_t y = iy0; y < iy1; y++) { - buffer.drawPixel(Coord2((uint16_t)x, (uint16_t)y), color); + buffer.drawPixel((uint16_t)x, (uint16_t)y, color); if (d > 0) { x += xi; d += (2 * (dx - dy)); diff --git a/primatives/point.cpp b/primatives/point.cpp index f043228..c82255d 100644 --- a/primatives/point.cpp +++ b/primatives/point.cpp @@ -21,7 +21,7 @@ namespace UwU { // Draw a rectangle void draw (Buffer buffer, Color color) { if (x > buffer.width || y > buffer.height) {return;}; - buffer.drawPixel(Coord2(x, y), color); + buffer.drawPixel(x, y, color); return; } }; diff --git a/primatives/rectangle.cpp b/primatives/rectangle.cpp index f80bab9..b072550 100644 --- a/primatives/rectangle.cpp +++ b/primatives/rectangle.cpp @@ -29,20 +29,23 @@ namespace UwU { 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(Coord2(x, y), shader.c0); + buffer.drawPixel(x, y, shader.c0); } } 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(Coord2(x, y), cols[x - x0]); + buffer.drawPixel(x, y, cols[x - x0]); } } return; @@ -52,7 +55,7 @@ namespace UwU { 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++) { - buffer.drawPixel(Coord2(x, y), c); + buffer.drawPixel(x, y, c); } } return; diff --git a/primatives/trapezoid.cpp b/primatives/trapezoid.cpp index ec58236..9724d45 100644 --- a/primatives/trapezoid.cpp +++ b/primatives/trapezoid.cpp @@ -5,6 +5,7 @@ #include "../datatypes.cpp" #include "../helpers.cpp" #include "../buffer.cpp" +#include "../shader.cpp" namespace UwU { // trapezoid (horizontally constrained) @@ -28,9 +29,7 @@ namespace UwU { // Draw a horizontally bounded trapezoid // y1 >= y0 - // todo move to private and add public checks - void draw (Buffer buffer, Color color) { - // printf("(%u, %u, %u, %u, %u, %u)", coords.y0, coords.y1, coords.xl0, coords.xl1, coords.xr0, coords.xr1); + void draw (Buffer buffer, Shader shader) { uint16_t height = 1 + y1 - y0; int16_t LeftBound[height]; int16_t RightBound[height]; @@ -38,20 +37,51 @@ namespace UwU { Helpers::bresenham(0, xl0, y1 - y0, xl1, LeftBound); Helpers::bresenham(0, xr0, y1 - y0, xr1, RightBound); - // printf("leftbound\n"); - for (uint16_t i = 0; i < height; i++) { - // printf("(%u, %u)\n", i, LeftBound[i]); - } - // printf("rightbound\n"); - for (uint16_t i = 0; i < height; i++) { - // printf("(%u, %u)\n", i, RightBound[i]); - } - - for (uint16_t i = 0; i < height; i++) { - for (uint16_t x = LeftBound[i]; x <= RightBound[i]; x++) { - // printf("(%u, %u)", x, i + coords.y0); - buffer.drawPixel(Coord2(x, i + y0), color); + if (shader.shaderType == COLOR) { + for (uint16_t i = 0; i < height; i++) { + for (uint16_t x = LeftBound[i]; x <= RightBound[i]; x++) { + buffer.drawPixel(x, i + y0, shader.c0); + } } + return; + + } else if (shader.shaderType == HGRADIENT) { + // find left-right boundaries + uint16_t leftmost, rightmost; + if (xl0 < xl1) { + leftmost = xl0; + } else { + leftmost = xl1; + } + if (xr0 > xr1) { + rightmost = xr0; + } else { + rightmost = xr1; + } + + // precompute gradient LUT + Color cols[rightmost - leftmost]; + for (uint16_t x = leftmost; x < rightmost; x++) { + cols[x - leftmost] = ShaderMethods::gradient(shader.u0, shader.scale, shader.c0, shader.c1, x); + } + + for (uint16_t i = 0; i < height; i++) { + for (uint16_t x = LeftBound[i]; x <= RightBound[i]; x++) { + buffer.drawPixel(x, i + y0, cols[x - leftmost]); + } + } + return; + + } else if (shader.shaderType == VGRADIENT) { + Color c; + for (uint16_t i = 0; i < height; i++) { + c = ShaderMethods::gradient(shader.v0, shader.scale, shader.c0, shader.c1, i + y0); + for (uint16_t x = LeftBound[i]; x <= RightBound[i]; x++) { + buffer.drawPixel(x, i + y0, c); + } + } + return; + } return; } diff --git a/primatives/triangle.cpp b/primatives/triangle.cpp index 73152ce..e0400f1 100644 --- a/primatives/triangle.cpp +++ b/primatives/triangle.cpp @@ -101,7 +101,7 @@ namespace UwU { for (uint16_t i = 0; i < height; i++) { for (uint16_t x = (uint16_t)splitBound[i]; x <= (uint16_t)longBound[i]; x++) { // Helpers::putPixel(buffer, x, i + (uint32_t)top.y, color.r, color.g, color.b, color.a); - buffer.drawPixel(Coord2(x, i + (uint16_t)top.y), color); + buffer.drawPixel(x, i + (uint16_t)top.y, color); } } } else { @@ -115,7 +115,7 @@ namespace UwU { for (uint16_t i = 0; i < height; i++) { for (uint16_t x = (uint16_t)longBound[i]; x <= (uint16_t)splitBound[i]; x++) { // Helpers::putPixel(buffer, x, i + (uint32_t)top.y, color.r, color.g, color.b, color.a); - buffer.drawPixel(Coord2(x, i + (uint16_t)top.y), color); + buffer.drawPixel(x, i + (uint16_t)top.y, color); } } }