From aa49a32acee9f00d4a2f8284ba7e11d845cfcb2a Mon Sep 17 00:00:00 2001 From: Annika Date: Tue, 7 Jul 2026 07:25:49 -0700 Subject: [PATCH] rewrote example.cpp to use composition --- TODO | 4 +++ datatypes.h | 40 ----------------------------- draw.cpp | 59 +++---------------------------------------- example | Bin 41144 -> 36984 bytes example.cpp | 71 ++++++++++++++++++++++++++++++++++------------------ point.cpp | 28 +++++++++++++++++++++ 6 files changed, 81 insertions(+), 121 deletions(-) create mode 100644 TODO delete mode 100644 datatypes.h create mode 100644 point.cpp diff --git a/TODO b/TODO new file mode 100644 index 0000000..3bf67f4 --- /dev/null +++ b/TODO @@ -0,0 +1,4 @@ +write a monolithic header file +refactor example code using composition +remove draw class entirely +create shader classes with polymorphism \ No newline at end of file diff --git a/datatypes.h b/datatypes.h deleted file mode 100644 index a99eee0..0000000 --- a/datatypes.h +++ /dev/null @@ -1,40 +0,0 @@ -#include - -namespace UwU { - - struct Color { - Color(uint32_t hex); - Color(); - uint8_t r; - uint8_t g; - uint8_t b; - uint8_t a; - }; - - struct Coord2 { - Coord2(uint32_t x, uint32_t y); - Coord2(); - uint32_t x; - uint32_t y; - }; - - struct Trapezoid { - Trapezoid(uint16_t y0, uint16_t y1, uint16_t xl0, uint16_t xl1, uint16_t xr0, uint16_t xr1); - Trapezoid(); - uint16_t y0; - uint16_t y1; - uint16_t xl0; - uint16_t xl1; - uint16_t xr0; - uint16_t xr1; - }; - - struct Buffer { - Buffer(uint8_t* pixels, uint16_t stride, uint16_t height, uint16_t width); - Buffer(); - uint8_t* pixels; - uint16_t stride; - uint16_t height; - uint16_t width; - }; -} \ No newline at end of file diff --git a/draw.cpp b/draw.cpp index 091fb75..47ee8e1 100644 --- a/draw.cpp +++ b/draw.cpp @@ -15,6 +15,7 @@ #include "trapezoid.cpp" #include "line.cpp" #include "rectangle.cpp" +#include "point.cpp" namespace UwU { @@ -128,64 +129,10 @@ namespace UwU { } // Draw a single point - void point (Coord2 point, Color color) { - if (point.x > getWidth() || point.y > getHeight()) {return;}; - // putPixel(point.x, point.y, color.r, color.g, color.b, color.a); - surface.buffer.drawPixel(point, color); + void point (Point point, Color color) { + point.draw(surface.buffer, color); } - // // Uses Bresenham's line algorithm to draw line of any slope - // void line (Coord2 point0, Coord2 point1, Color color) { - // if (point0.x > getWidth() || point0.y > getHeight() || point1.x > getWidth() || point1.y > getHeight()) {return;}; - // int32_t x0 = (int32_t)point0.x; - // int32_t y0 = (int32_t)point0.y; - // int32_t x1 = (int32_t)point1.x; - // int32_t y1 = (int32_t)point1.y; - // if (abs(y1 - y0) < abs(x1 - x0)) { - // if (x0 > x1) { - // lineLow(x1, y1, x0, y0, color); - // } else { - // lineLow(x0, y0, x1, y1, color); - // } - // } else { - // if (y0 > y1) { - // lineHigh(x1, y1, x0, y0, color); - // } else { - // lineHigh(x0, y0, x1, y1, color); - // } - // } - // } - - // // Draw a horizontally bounded trapezoid - // // coords.y1 >= coords.y0 - // // todo move to private and add public checks - // void trapezoid (Trapezoid coords, Color color) { - // printf("(%u, %u, %u, %u, %u, %u)", coords.y0, coords.y1, coords.xl0, coords.xl1, coords.xr0, coords.xr1); - // uint16_t height = 1 + coords.y1 - coords.y0; - // int16_t LeftBound[height]; - // int16_t RightBound[height]; - - // Helpers::bresenham(0, coords.xl0, coords.y1 - coords.y0, coords.xl1, LeftBound); - // Helpers::bresenham(0, coords.xr0, coords.y1 - coords.y0, coords.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); - // surface.buffer.drawPixel(Coord2(x, i + coords.y0), color); - // } - // } - // return; - // } - void line (Line line, Color color) { line.draw(surface.buffer, color); return; diff --git a/example b/example index c4f91fa2961e4e1ef6f36b40d725ed1fc4b5f062..fb375837e2ebdad6395e2c536b41a0f6fbe14109 100755 GIT binary patch literal 36984 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 literal 41144 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 VQ;^8Eok7sA|AS;M(-bt;_`g7d1gro6 diff --git a/example.cpp b/example.cpp index b97fdc0..fc4255c 100644 --- a/example.cpp +++ b/example.cpp @@ -8,12 +8,15 @@ #include #include "datatypes.cpp" -#include "draw.cpp" -#include "trapezoid.cpp" +#include "helpers.cpp" #include "triangle.cpp" #include "buffer.cpp" #include "surface.cpp" +#include "trapezoid.cpp" #include "line.cpp" +#include "rectangle.cpp" +#include "point.cpp" +#include "draw.cpp" static void onKey(void *user, uint32_t keycode, uint32_t state) { if (keycode == 1) { @@ -26,43 +29,61 @@ static void onKey(void *user, uint32_t keycode, uint32_t state) { } int main(void) { - uint32_t w = 800, h = 480; - UwU::Color fuchsia = UwU::Color(0xb00b6940); - UwU::Color red = UwU::Color(0xff0000ff); + uint16_t w = 800, h = 480; + UwU::Color fuchsia = UwU::Color(0xb00b6980); + UwU::Color red = UwU::Color(0xff000080); UwU::Color green = UwU::Color(0x00ff00ff); - UwU::Color blue = UwU::Color(0x0000ffff); + UwU::Color blue = UwU::Color(0x0000ff80); UwU::Color alpha = UwU::Color(0x00000000); printf("r: %u, g:%u, b:%u, a:%u\n", fuchsia.r, fuchsia.g, fuchsia.b, fuchsia.a); // struct waymini *wm = waymini_create(w, h, on_key, NULL); - UwU::Draw draw = UwU::Draw(w, h, onKey); + // UwU::Draw draw = UwU::Draw(w, h, onKey); + UwU::Surface surface = UwU::Surface(w, h, onKey); - draw.rainbow(); + // draw.rainbow(); - - draw.rectangle(UwU::Coord2(69, 69), UwU::Coord2(420, 420), fuchsia); - draw.rectangleGradient(UwU::Coord2(200, 200), UwU::Coord2(600, 400), red, blue, alpha, red); + // draw.rectangle(UwU::Coord2(69, 69), UwU::Coord2(420, 420), fuchsia); + UwU::Rectangle rectangle = UwU::Rectangle(69, 69, 420, 420); + rectangle.draw(surface.buffer, fuchsia); - draw.trapezoid(UwU::Trapezoid(300, 400, 360, 380, 600, 480), green); - draw.triangle(280, 100, 240, 290, 320, 300, green); + // draw.rectangleGradient(UwU::Coord2(200, 200), UwU::Coord2(600, 400), red, blue, alpha, red); + + // draw.trapezoid(UwU::Trapezoid(300, 400, 360, 380, 600, 480), red); + UwU::Trapezoid trapezoid = UwU::Trapezoid(300, 400, 360, 380, 600, 480); + trapezoid.draw(surface.buffer, red); + + // draw.triangle(280, 100, 240, 290, 320, 300, blue); + UwU::Triangle triangle = UwU::Triangle(280, 100, 240, 290, 320, 300); + triangle.draw(surface.buffer, blue); // myTrap = UwU:Trapezoid(300, 400, 360, 380, 600, 480); // myTrap.draw() - draw.point(UwU::Coord2(387, 43), green); - draw.line(UwU::Line(300, 100, 250, 469), green); - draw.line(UwU::Line(250, 100, 300, 469), green); - draw.line(UwU::Line(300, 100, 469, 250), green); - draw.line(UwU::Line(469, 100, 300, 250), green); - draw.line(UwU::Line(100, 300, 250, 469), green); - draw.line(UwU::Line(250, 300, 100, 469), green); - draw.line(UwU::Line(100, 300, 469, 250), green); - draw.line(UwU::Line(469, 300, 100, 250), green); - draw.present(); + // draw.point(UwU::Point(387, 43), green); + UwU::Point point = UwU::Point(387, 43); + point.draw(surface.buffer, green); - while (!draw.shouldClose()) {} + 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) + }; - draw.destroy(); + for (uint16_t i = 0; i < 8; i++) { + lines[i].draw(surface.buffer, green); + } + + surface.present(); + + while (!surface.shouldClose()) {} + + surface.destroy(); return 0; } diff --git a/point.cpp b/point.cpp new file mode 100644 index 0000000..846b120 --- /dev/null +++ b/point.cpp @@ -0,0 +1,28 @@ +#pragma once + +#include + +#include "datatypes.cpp" +#include "helpers.cpp" +#include "buffer.cpp" + +namespace UwU { + // point + class Point { + public: + Point(uint16_t x, uint16_t y) { + this->x = x; + this->y = y; + } + Point() {} + uint16_t x; + uint16_t y; + + // Draw a rectangle + void draw (Buffer buffer, Color color) { + if (x > buffer.width || y > buffer.height) {return;}; + buffer.drawPixel(Coord2(x, y), color); + return; + } + }; +} \ No newline at end of file