From 27b7640c85d685bc0ad0b5c04dc2bc5ff1087b51 Mon Sep 17 00:00:00 2001 From: Annika Date: Wed, 8 Jul 2026 15:08:48 -0700 Subject: [PATCH] added gradient shaders to triangle primative --- example | Bin 41128 -> 41192 bytes example.cpp | 2 +- primatives/trapezoid.cpp | 14 +-- primatives/triangle.cpp | 178 ++++++++++++++++++++++++--------------- 4 files changed, 112 insertions(+), 82 deletions(-) diff --git a/example b/example index 2fceecca360ff01011a4ac5e6bf13bcf7264e3ae..051c198f34b678e0a906b316ad9ea2dbf06255ed 100755 GIT binary patch delta 8810 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 W$H&fGue+H;+?&Vq|4V8&kNPhn!5@fD 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 diff --git a/example.cpp b/example.cpp index 89c41c2..3366573 100644 --- a/example.cpp +++ b/example.cpp @@ -75,7 +75,7 @@ int main(void) { timeAvg /= BATCH; printf("Elapsed: %ld ns\n", timeAvg); - triangle.draw(surface.buffer, blue); + triangle.draw(surface.buffer, fuchsia); point.draw(surface.buffer, green); diff --git a/primatives/trapezoid.cpp b/primatives/trapezoid.cpp index 9724d45..b1bf444 100644 --- a/primatives/trapezoid.cpp +++ b/primatives/trapezoid.cpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include "../datatypes.cpp" #include "../helpers.cpp" @@ -47,17 +48,8 @@ namespace UwU { } 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; - } + uint16_t leftmost = std::min(xl0, xl1); + uint16_t rightmost = std::max(xr0, xr1); // precompute gradient LUT Color cols[rightmost - leftmost]; diff --git a/primatives/triangle.cpp b/primatives/triangle.cpp index e0400f1..7456d0d 100644 --- a/primatives/triangle.cpp +++ b/primatives/triangle.cpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include "../datatypes.cpp" #include "../helpers.cpp" @@ -9,7 +10,6 @@ namespace UwU { class Triangle { private: - public: Triangle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) { @@ -29,95 +29,133 @@ namespace UwU { uint16_t y2; // Draw a triangle - void draw (Buffer buffer, Color color) { - Coord2 top = Coord2(); - Coord2 mid = Coord2(); - Coord2 btm = Coord2(); - // cases: left-handed, right-handed + void draw (Buffer buffer, Shader shader) { + uint16_t topX, topY, midX, midY, btmX, btmY; + // Find top, middle and bottom points of triangle if (y0 <= y1 && y0 <= y2) { - top.x = x0; - top.y = y0; + topX = x0; + topY = y0; if (y1 < y2) { - mid.x = x1; - mid.y = y1; - btm.x = x2; - btm.y = y2; + midX = x1; + midY = y1; + btmX = x2; + btmY = y2; } else { - mid.x = x2; - mid.y = y2; - btm.x = x1; - btm.y = y1; + midX = x2; + midY = y2; + btmX = x1; + btmY = y1; } } else if (y1 <= y0 && y1 <= y2) { - top.x = x1; - top.y = y1; + topX = x1; + topY = y1; if (y0 < y2) { - mid.x = x0; - mid.y = y0; - btm.x = x2; - btm.y = y2; + midX = x0; + midY = y0; + btmX = x2; + btmY = y2; } else { - mid.x = x2; - mid.y = y2; - btm.x = x0; - btm.y = y0; + midX = x2; + midY = y2; + btmX = x0; + btmY = y0; } } else { - top.x = x2; - top.y = y2; + topX = x2; + topY = y2; if (y0 < y1) { - mid.y = y0; - mid.x = x0; - btm.x = x1; - btm.y = y1; + midY = y0; + midX = x0; + btmX = x1; + btmY = y1; } else { - mid.x = x1; - mid.y = y1; - btm.x = x0; - btm.y = y0; + midX = x1; + midY = y1; + btmX = x0; + btmY = y0; } } - // printf("top: (%u, %u)\n", top.x, top.y); - // printf("mid: (%u, %u)\n", mid.x, mid.y); - // printf("btm: (%u, %u)\n", btm.x, btm.y); + + - uint16_t height = 1 + btm.y - top.y; + uint16_t height = 1 + btmY - topY; int16_t longBound[height]; int16_t splitBound[height]; - // int16_t rightBound[height]; - Helpers::bresenham(0, top.x, height - 1, btm.x, longBound); - // printf("longBound\n"); - if ((int16_t)mid.x < longBound[mid.y - top.y]) { - // left-handed triangle - // printf("left-handed\n"); - // rightBound = longBound; - Helpers::bresenham(0, top.x, mid.y - top.y, mid.x, splitBound); - // printf("splitTop\n"); - Helpers::bresenham(mid.y - top.y, mid.x, height - 1, btm.x, splitBound); - // printf("splitBtm\n"); - // for (uint16_t i = 0; i < height; i++) { - // printf("(%u, %u)\n", i, splitBound[i]); - // } - 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(x, i + (uint16_t)top.y, color); + + // Calculate LUT for longest vertical line (from top to bottom) + Helpers::bresenham(0, topX, height - 1, btmX, longBound); + + // Calculate LUT for short two lines + Helpers::bresenham(0, topX, midY - topY, midX, splitBound); + Helpers::bresenham(midY - topY, midX, height - 1, btmX, splitBound); + + if (shader.shaderType == COLOR) { + // Left-handed triangle case (midpoint is left of triangle) + if ((int16_t)midX < longBound[midY - topY]) { + for (uint16_t i = 0; i < height; i++) { + for (uint16_t x = (uint16_t)splitBound[i]; x <= (uint16_t)longBound[i]; x++) { + buffer.drawPixel(x, i + (uint16_t)topY, shader.c0); + } + } + // Right-handed triangle case (midpoint is right of triangle) + } else { + for (uint16_t i = 0; i < height; i++) { + for (uint16_t x = (uint16_t)longBound[i]; x <= (uint16_t)splitBound[i]; x++) { + buffer.drawPixel(x, i + (uint16_t)topY, shader.c0); + } } } - } else { - // right-handed triangle - // printf("right-handed\n"); - // leftBound = longBound; - Helpers::bresenham(0, top.x, mid.y - top.y, mid.x, splitBound); - // printf("splitTop\n"); - Helpers::bresenham(mid.y - top.y, mid.x, height - 1, btm.x, splitBound); - // printf("splitBtm\n"); - 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(x, i + (uint16_t)top.y, color); + return; + + } else if (shader.shaderType == HGRADIENT) { + // find left and right bounds + uint16_t leftmost = std::min(x0, std::min(x1, x2)); + uint16_t rightmost = std::max(x0, std::max(x1, x2)); + + // 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); + } + + // Left-handed triangle case (midpoint is left of triangle) + if ((int16_t)midX < longBound[midY - topY]) { + for (uint16_t i = 0; i < height; i++) { + for (uint16_t x = (uint16_t)splitBound[i]; x <= (uint16_t)longBound[i]; x++) { + buffer.drawPixel(x, i + (uint16_t)topY, cols[x - leftmost]); + } + } + // Right-handed triangle case (midpoint is right of triangle) + } else { + for (uint16_t i = 0; i < height; i++) { + for (uint16_t x = (uint16_t)longBound[i]; x <= (uint16_t)splitBound[i]; x++) { + buffer.drawPixel(x, i + (uint16_t)topY, cols[x - leftmost]); + } } } + return; + + } else if (shader.shaderType == VGRADIENT) { + Color c; + + // Left-handed triangle case (midpoint is left of triangle) + if ((int16_t)midX < longBound[midY - topY]) { + for (uint16_t i = 0; i < height; i++) { + c = ShaderMethods::gradient(shader.v0, shader.scale, shader.c0, shader.c1, i + topY); + for (uint16_t x = (uint16_t)splitBound[i]; x <= (uint16_t)longBound[i]; x++) { + buffer.drawPixel(x, i + (uint16_t)topY, c); + } + } + // Right-handed triangle case (midpoint is right of triangle) + } else { + for (uint16_t i = 0; i < height; i++) { + c = ShaderMethods::gradient(shader.v0, shader.scale, shader.c0, shader.c1, i + topY); + for (uint16_t x = (uint16_t)longBound[i]; x <= (uint16_t)splitBound[i]; x++) { + buffer.drawPixel(x, i + (uint16_t)topY, c); + } + } + } + return; } return; }