From 444143ced9212200369267aa5d8807b9c00409e5 Mon Sep 17 00:00:00 2001 From: Annika Date: Mon, 20 Jul 2026 01:41:10 -0700 Subject: [PATCH] implemented CRTP shader on ColorShader and Rectangle --- TODO | 2 +- example | Bin 45552 -> 37000 bytes example.cpp | 162 ++++++++++++------------------------ primatives/rectangle.cpp | 45 ++-------- shaders/colorshader.cpp | 2 + shaders/hgradientshader.cpp | 29 +++++++ shaders/shaderbase.cpp | 4 +- shaders/vgradientshader.cpp | 29 +++++++ uwugl.h | 10 +++ 9 files changed, 132 insertions(+), 151 deletions(-) create mode 100644 shaders/hgradientshader.cpp create mode 100644 shaders/vgradientshader.cpp create mode 100644 uwugl.h diff --git a/TODO b/TODO index d7c9132..4ff3ed0 100644 --- a/TODO +++ b/TODO @@ -1,4 +1,4 @@ -[ ] write a monolithic header file +[x] write a monolithic header file [x] refactor example code using composition [x] remove draw class entirely [x] create shader classes with polymorphism diff --git a/example b/example index 5fd8bb351b4fa728e24e9e6bd19f654cdcf53ef5..56272d3327e9e6fbb44d6d640edca9256f226892 100755 GIT binary patch literal 37000 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 QF-kkzIW^uSU?P?O1yDRpC;$Ke diff --git a/example.cpp b/example.cpp index 7137591..407950b 100644 --- a/example.cpp +++ b/example.cpp @@ -7,21 +7,22 @@ #include #include -#include "datatypes.cpp" -#include "helpers.cpp" -#include "buffer.cpp" -#include "surface.cpp" -#include "primatives/line.cpp" -#include "primatives/point.cpp" -#include "primatives/rectangle.cpp" -#include "primatives/trapezoid.cpp" -#include "primatives/triangle.cpp" -#include "shader.cpp" +// #include "datatypes.cpp" +// #include "helpers.cpp" +// #include "buffer.cpp" +// #include "surface.cpp" +// #include "primatives/line.cpp" +// #include "primatives/point.cpp" +// #include "primatives/rectangle.cpp" +// #include "primatives/trapezoid.cpp" +// #include "primatives/triangle.cpp" +// #include "shader.cpp" +#include "uwugl.h" #include - #include "font.cpp" + static void onKey(void *user, uint32_t keycode, uint32_t state) { if (keycode == 1) { exit(1); @@ -34,113 +35,56 @@ 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::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 bisexual = UwU::Shader(UwU::Direction::H, 0, 799, UwU::Color(0xff0000ff), UwU::Color(0x0000ffff)); - UwU::Shader aqua = UwU::Shader(UwU::Direction::V, 2, 349, UwU::Color(0x00ff00ff), UwU::Color(0x0000ffff)); - UwU::Shader warmup = UwU::Shader(UwU::Color(0xb00b69ff)); - UwU::Shader green = UwU::Shader(UwU::Color(0x00ff00ff)); - UwU::Color blue = UwU::Color(0x0000ff80); - // UwU::Color alpha = UwU::Color(0x00000000); UwU::Surface surface = UwU::Surface(w, h, onKey); - UwU::Buffer buffer = UwU::Buffer(800, 480); - UwU::Shader gradientBuffer = UwU::Shader(69, 69, buffer); - + + UwU::ColorShader fuchsia = UwU::ColorShader(UwU::Color(0xb00b69ff)); + UwU::Rectangle rectangle = UwU::Rectangle(69, 69, 420, 420); - UwU::Rectangle bgRectangle = UwU::Rectangle(2, 2, 797, 477); - 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); - // Window Header - UwU::Trapezoid trap0 = UwU::Trapezoid(0, 7, 7, 0, 792, 799); - UwU::Rectangle rect1 = UwU::Rectangle(0, 8, 799, 23); - UwU::Trapezoid trap2 = UwU::Trapezoid(24, 31, 0, 0, 71, 63); - UwU::Trapezoid trap3 = UwU::Trapezoid(24, 31, 727, 736, 799, 799); - // trap0.draw(surface.buffer, bisexual); - // rect1.draw(surface.buffer, bisexual); - // trap2.draw(surface.buffer, bisexual); - // trap3.draw(surface.buffer, bisexual); - - // Window Body - UwU::Shader sU1 = UwU::Shader(8, 8, font()); - UwU::Shader sw1 = UwU::Shader(10, 8, font()); - UwU::Shader sU2 = UwU::Shader(28, 8, font()); - UwU::Shader sG1 = UwU::Shader(20, 8, font()); - UwU::Shader sL1 = UwU::Shader(22, 8, font()); - UwU::Rectangle rU1 = UwU::Rectangle(8, 8, 13, 16); - UwU::Rectangle rw1 = UwU::Rectangle(16, 8, 25, 16); - UwU::Rectangle rU2 = UwU::Rectangle(28, 8, 33, 16); - UwU::Rectangle rG1 = UwU::Rectangle(36, 8, 41, 16); - UwU::Rectangle rL1 = UwU::Rectangle(44, 8, 48, 16); - rU1.draw(surface.buffer, sU1); - rw1.draw(surface.buffer, sw1); - rU2.draw(surface.buffer, sU2); - rG1.draw(surface.buffer, sG1); - rL1.draw(surface.buffer, sL1); - - // Window Footer - UwU::Trapezoid trap5 = UwU::Trapezoid(440, 471, 712, 689, 799, 799); - UwU::Trapezoid trap6 = UwU::Trapezoid(472, 479, 0, 7, 799, 792); - trap5.draw(surface.buffer, bisexual); - trap6.draw(surface.buffer, bisexual); - - // Window Buttons - UwU::Trapezoid trap7 = UwU::Trapezoid(448, 455, 728, 720, 791, 791); - UwU::Rectangle rect8 = UwU::Rectangle(720, 456, 791, 463); - UwU::Trapezoid trap9 = UwU::Trapezoid(464, 471, 720, 720, 791, 783); - trap7.draw(surface.buffer, fuchsia); - rect8.draw(surface.buffer, fuchsia); - trap9.draw(surface.buffer, fuchsia); - - bgRectangle.draw(buffer, aqua); + rectangle.draw(surface.buffer, fuchsia); - // Benchmarking - struct timespec start, end; - const int WARMUP = 100; - const int BATCH = 1000; - const int SAMPLES = 10; + // // Benchmarking + // struct timespec start, end; + // const int WARMUP = 100; + // const int BATCH = 1000; + // const int SAMPLES = 10; - for (int i = 0; i < WARMUP; i++) { - rectangle.draw(surface.buffer, gradientBuffer); - } - 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, gradientBuffer); - } - clock_gettime(CLOCK_MONOTONIC, &end); - times[s] = (end.tv_sec - start.tv_sec) * 1000000000L + (end.tv_nsec - start.tv_nsec); - } - long timeAvg = 0; - for (int i = 0; i < SAMPLES; i++) { - timeAvg += times[i]; - } - timeAvg /= SAMPLES; - timeAvg /= BATCH; - printf("Elapsed: %ld ns\n", timeAvg); + // for (int i = 0; i < WARMUP; i++) { + // rectangle.draw(surface.buffer, gradientBuffer); + // } + // 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, gradientBuffer); + // } + // clock_gettime(CLOCK_MONOTONIC, &end); + // times[s] = (end.tv_sec - start.tv_sec) * 1000000000L + (end.tv_nsec - start.tv_nsec); + // } + // long timeAvg = 0; + // for (int i = 0; i < SAMPLES; i++) { + // timeAvg += times[i]; + // } + // timeAvg /= SAMPLES; + // timeAvg /= BATCH; + // printf("Elapsed: %ld ns\n", timeAvg); - triangle.draw(surface.buffer, fuchsia); - trapezoid.draw(surface.buffer, red); - point.draw(surface.buffer, green); - - UwU::Line lines[8] { - UwU::Line(300, 100, 250, 469), - UwU::Line(250, 100, 300, 469), - UwU::Line(300, 100, 469, 250), - UwU::Line(469, 100, 300, 250), - UwU::Line(100, 300, 250, 469), - UwU::Line(250, 300, 100, 469), - UwU::Line(100, 300, 469, 250), - UwU::Line(469, 300, 100, 250) - }; + // UwU::Line lines[8] { + // UwU::Line(300, 100, 250, 469), + // UwU::Line(250, 100, 300, 469), + // UwU::Line(300, 100, 469, 250), + // UwU::Line(469, 100, 300, 250), + // UwU::Line(100, 300, 250, 469), + // UwU::Line(250, 300, 100, 469), + // UwU::Line(100, 300, 469, 250), + // UwU::Line(469, 300, 100, 250) + // }; - for (uint16_t i = 0; i < 8; i++) { - lines[i].draw(surface.buffer, bisexual); - } + // for (uint16_t i = 0; i < 8; i++) { + // lines[i].draw(surface.buffer, bisexual); + // } surface.present(); diff --git a/primatives/rectangle.cpp b/primatives/rectangle.cpp index a6d15e0..5fb6471 100644 --- a/primatives/rectangle.cpp +++ b/primatives/rectangle.cpp @@ -5,7 +5,8 @@ #include "../datatypes.cpp" #include "../helpers.cpp" #include "../buffer.cpp" -#include "../shader.cpp" +#include "../shaders/shaderbase.cpp" +#include "../shaders/colorshader.cpp" namespace UwU { // rectangle @@ -24,47 +25,13 @@ namespace UwU { uint16_t y1; // Draw a rectangle - void draw (Buffer buffer, Shader shader) { + template + void draw (Buffer buffer, ShaderBase& shader) { if (x0 > buffer.width || y0 > buffer.height || x1 > buffer.width || y1 > buffer.height) {return;}; - if (shader.shaderType == COLOR) { - for (uint16_t y = y0; y <= y1; y++) { - for (uint16_t x = x0; x <= x1; x++) { - buffer.drawPixel(x, y, shader.c0); - } - } - return; - - } else if (shader.shaderType == HGRADIENT) { - - // Precompute gradient LUT - Color cols[x1 - x0]; + for (uint16_t y = y0; y <= y1; y++) { for (uint16_t x = x0; x <= x1; x++) { - cols[x - x0] = ShaderMethods::gradient(shader.u0, shader.scale, shader.c0, shader.c1, x); + buffer.drawPixel(x, y, shader.shade(x, y)); } - - for (uint16_t y = y0; y <= y1; y++) { - for (uint16_t x = x0; x <= x1; x++) { - buffer.drawPixel(x, y, cols[x - x0]); - } - } - return; - - } else if (shader.shaderType == VGRADIENT) { - 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(x, y, c); - } - } - 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; } diff --git a/shaders/colorshader.cpp b/shaders/colorshader.cpp index ad0ccc1..927410e 100644 --- a/shaders/colorshader.cpp +++ b/shaders/colorshader.cpp @@ -16,6 +16,8 @@ namespace UwU { Color c; Color shade(uint16_t x, uint16_t y) { + (void)x; + (void)y; return c; } }; diff --git a/shaders/hgradientshader.cpp b/shaders/hgradientshader.cpp new file mode 100644 index 0000000..f6bb993 --- /dev/null +++ b/shaders/hgradientshader.cpp @@ -0,0 +1,29 @@ +#pragma once + +#include + +#include "../datatypes.cpp" +#include "../helpers.cpp" +#include "../buffer.cpp" +#include "shaderbase.cpp" + +namespace UwU { + class HGradienthader : public ShaderBase { + public: + HGradientShader(uint16_t u0, uint16_t u1, Color c0, Color c1) { + this->u0; + this->uScale = 0xffffffff / (1 + (uint32_t)u1 - (uint32_t)u0); + this->c0 = c0; + this->c1 = c1; + } + uint16_t u0; + uint16_t uScale; + Color c0; + Color c1; + + Color shade(uint16_t u, uint16_t u) { + uint32_t t = (((uint32_t)u - (uint32_t)u0) * uScale) / 0x01000000; + return Helpers::lerpColor(c0, c1, (uint8_t)t); + } + }; +} \ No newline at end of file diff --git a/shaders/shaderbase.cpp b/shaders/shaderbase.cpp index fcccfbc..96aa1a5 100644 --- a/shaders/shaderbase.cpp +++ b/shaders/shaderbase.cpp @@ -7,11 +7,11 @@ #include "../buffer.cpp" namespace UwU { - template + template class ShaderBase { public: Color shade(uint16_t x, uint16_t y) { - return static_cast(this)->shade(x, y); + return static_cast(this)->shade(x, y); } }; } \ No newline at end of file diff --git a/shaders/vgradientshader.cpp b/shaders/vgradientshader.cpp new file mode 100644 index 0000000..29c664f --- /dev/null +++ b/shaders/vgradientshader.cpp @@ -0,0 +1,29 @@ +#pragma once + +#include + +#include "../datatypes.cpp" +#include "../helpers.cpp" +#include "../buffer.cpp" +#include "shaderbase.cpp" + +namespace UwU { + class VGradienthader : public ShaderBase { + public: + VGradientShader(uint16_t v0, uint16_t v1, Color c0, Color c1) { + this->v0; + this->vScale = 0xffffffff / (1 + (uint32_t)v1 - (uint32_t)v0); + this->c0 = c0; + this->c1 = c1; + } + uint16_t v0; + uint16_t vScale; + Color c0; + Color c1; + + Color shade(uint16_t u, uint16_t u) { + uint32_t t = (((uint32_t)v - (uint32_t)v0) * vScale) / 0x01000000; + return Helpers::lerpColor(c0, c1, (uint8_t)t); + } + }; +} \ No newline at end of file diff --git a/uwugl.h b/uwugl.h new file mode 100644 index 0000000..04f1ef9 --- /dev/null +++ b/uwugl.h @@ -0,0 +1,10 @@ +#include "datatypes.cpp" +#include "helpers.cpp" +#include "buffer.cpp" +#include "surface.cpp" +#include "primatives/line.cpp" +#include "primatives/point.cpp" +#include "primatives/rectangle.cpp" +#include "primatives/trapezoid.cpp" +#include "primatives/triangle.cpp" +#include "shader.cpp" \ No newline at end of file