From 43c893984fb927a5a1c2a364f3227f5fa7bb9190 Mon Sep 17 00:00:00 2001 From: Annika Date: Wed, 8 Jul 2026 16:15:48 -0700 Subject: [PATCH] added gradient shaders to line --- TODO | 5 ++- example | Bin 41192 -> 41192 bytes primatives/line.cpp | 89 ++++++++++++++++++++++++++++++++++++-------- 3 files changed, 77 insertions(+), 17 deletions(-) diff --git a/TODO b/TODO index 056bbac..69620c9 100644 --- a/TODO +++ b/TODO @@ -2,4 +2,7 @@ [x] refactor example code using composition [x] remove draw class entirely [x] create shader classes with polymorphism -[ ] optimize shader/primative performance (repeat myself!) \ No newline at end of file +[x] optimize shader/primative performance (repeat myself!) +[ ] finish implementing gradient shaders to primatives +[ ] implement buffer shader +[ ] implement more primatives \ No newline at end of file diff --git a/example b/example index c32d5844100ea7e63e88735d60cd6a267306a99c..bd0b5c492074f400fa63fa482733a54ebed2e498 100755 GIT binary patch delta 947 zcmYk3TWkzb7{|}qU7`&>kqV*GkTi@w2pUXU+M_ecY^g>_Jh;8+k$C6>CG^44-3=2t zOU#2y(!}LS2x7?~=x$fqrPyAgC8QO%Y_mjH#WpS--<&nvUu05^HT`nhwi-_b({-yFJPH= zOE_E@U9;rkIImxQ5FJ@w;mz|yOT1Pz6q9IWxtG$isJ5b-(vQ}$m1n(%XtowtR0qIb z?>XwejH`Xn7V^4 zpU}bXtP$lmSTN@5|F6y{2@tNStqlh?nnLl_VCOPV*O;Hvr9gucBx z$M&aX{T2JhQ9ZfcDDf4~M;{1Rqn07+o-c}RVw>3(wv}z$l3=&SWZO};o!xR}bMj+E zKGvEDlvhaa1+Mo1*fCUZmbq7nf@K)vml{zTV!>AGhpWS!VeCtJxEmsOWCWVp1)&5E z>ohJ38gV?H=`d4&nSIFY`@>AhpDj+}tR}{gcA<PJM&mZ2%$3UGMX3^cpsZnB#w?`E^)OTLbKfcp27N` z?mnvLjXHC2;QQb-%tEGm4ij#Xfu#?Ba-8%kyzt}Ep{iGNXub8MZU)VdeyF=Xm)1v5 IAE}-38?&IMr~m)} delta 879 zcmYLGT}V@57(Uf$f=opW1V^`qU!K8HRu+_9l>LA^H-j#u3>7uq8F`Xp z>AA@ZDaf0sP+DVM6#IjmF4H!u*-DE_ChJGp#Z0l&duG_VIN$p{@5l4=zHy%}?$eFm z*6$eFIMF`X>FQ|aZ`np&FOR=H`SXGEp?>>rVo*F4EroZsF^tgj{Occ8y+>LB%Xqqk z>xE9szWbSa3;W5rdeEfLZICaQF?HbaIcuu)gs@Jox}K1Pa`W(Ay+w8@6{h-b3hqW- z|A@vWuo39xbqs@8YlgtOG+yYf+(eFL32X>@%kc)D_Z)cUsN|zkm>Of?iApId1g3!nRqqzqjJ>~YWHe}Lus?1 zneA#3C_4*co2sfDnV}>A?o?t%U?)JdB8G{Vo}#8j`V}t*hSAP%xNL{_N}g5^Bj)h7 z#Vyr%`G^g^-yCe_cV(27qh)aH!C<^>jqdfHp=W6mJx9+s1vVwK|IuH-QyD*ExcC{P zN^A0dlNN%(5a9N5MqKOW@JW({F~}MQ5vkoz>R@a=9mFJHj(jAY0&yh0C0}~rzQnA+ zv9CewLy#mBexE z{3L*u!ii~AM=(bd3MD++WJYl^9!$@~Z~RczxEX&?!ZCz#F4ul2B{pT+T0lyji`K_G LiOo6O*HG{m9tnza diff --git a/primatives/line.cpp b/primatives/line.cpp index 830e9ea..ae0d8a6 100644 --- a/primatives/line.cpp +++ b/primatives/line.cpp @@ -11,7 +11,7 @@ namespace UwU { class Line { private: // plot lines if m <= 1 - void lineLow(int16_t ix0, int16_t iy0, int16_t ix1, int16_t iy1, Buffer buffer, Color color) { + void lineLow(int16_t ix0, int16_t iy0, int16_t ix1, int16_t iy1, Buffer buffer, Shader shader) { int16_t dx = ix1 - ix0; int16_t dy = iy1 - iy0; int16_t yi = 1; @@ -21,20 +21,48 @@ namespace UwU { } int16_t d = (2 * dy) - dx; int16_t y = iy0; - for (int16_t x = ix0; x < ix1; x++) { - buffer.drawPixel((uint16_t)x, (uint16_t)y, color); - if (d > 0) { - y += yi; - d += (2 * (dy - dx)); - } else { - d += (2 * dy); + + if (shader.shaderType == COLOR) { + for (int16_t x = ix0; x < ix1; x++) { + buffer.drawPixel((uint16_t)x, (uint16_t)y, shader.c0); + if (d > 0) { + y += yi; + d += (2 * (dy - dx)); + } else { + d += (2 * dy); + } } + return; + + } else if (shader.shaderType == HGRADIENT) { + for (int16_t x = ix0; x < ix1; x++) { + buffer.drawPixel((uint16_t)x, (uint16_t)y, ShaderMethods::gradient(shader.u0, shader.scale, shader.c0, shader.c1, x)); + if (d > 0) { + y += yi; + d += (2 * (dy - dx)); + } else { + d += (2 * dy); + } + } + return; + + } else if (shader.shaderType == VGRADIENT) { + for (int16_t x = ix0; x < ix1; x++) { + buffer.drawPixel((uint16_t)x, (uint16_t)y, ShaderMethods::gradient(shader.v0, shader.scale, shader.c0, shader.c1, y)); + if (d > 0) { + y += yi; + d += (2 * (dy - dx)); + } else { + d += (2 * dy); + } + } + return; } return; } // plot lines if m >1 - void lineHigh(int16_t ix0, int16_t iy0, int16_t ix1, int16_t iy1, Buffer buffer, Color color) { + void lineHigh(int16_t ix0, int16_t iy0, int16_t ix1, int16_t iy1, Buffer buffer, Shader shader) { int16_t dx = ix1 - ix0; int16_t dy = iy1 - iy0; int16_t xi = 1; @@ -44,8 +72,10 @@ namespace UwU { } int16_t d = (2 * dx) - dy; int16_t x = ix0; - for (int16_t y = iy0; y < iy1; y++) { - buffer.drawPixel((uint16_t)x, (uint16_t)y, color); + + if (shader.shaderType == COLOR) { + for (int16_t y = iy0; y < iy1; y++) { + buffer.drawPixel((uint16_t)x, (uint16_t)y, shader.c0); if (d > 0) { x += xi; d += (2 * (dx - dy)); @@ -54,6 +84,33 @@ namespace UwU { } } return; + + } else if (shader.shaderType == HGRADIENT) { + for (int16_t y = iy0; y < iy1; y++) { + buffer.drawPixel((uint16_t)x, (uint16_t)y, ShaderMethods::gradient(shader.u0, shader.scale, shader.c0, shader.c1, x)); + if (d > 0) { + x += xi; + d += (2 * (dx - dy)); + } else { + d += (2 * dx); + } + } + return; + + } else if (shader.shaderType == VGRADIENT) { + for (int16_t y = iy0; y < iy1; y++) { + buffer.drawPixel((uint16_t)x, (uint16_t)y, ShaderMethods::gradient(shader.v0, shader.scale, shader.c0, shader.c1, y)); + if (d > 0) { + x += xi; + d += (2 * (dx - dy)); + } else { + d += (2 * dx); + } + } + return; + + } + return; } public: @@ -70,7 +127,7 @@ namespace UwU { uint16_t y1; // Uses Bresenham's line algorithm to draw line of any slope - void draw (Buffer buffer, Color color) { + void draw (Buffer buffer, Shader shader) { if (x0 > buffer.width || y0 > buffer.height || x1 > buffer.width || y1 > buffer.height) {return;}; int16_t ix0 = x0; int16_t iy0 = y0; @@ -78,15 +135,15 @@ namespace UwU { int16_t iy1 = y1; if (abs(iy1 - iy0) < abs(ix1 - ix0)) { if (ix0 > ix1) { - lineLow(ix1, iy1, ix0, iy0, buffer, color); + lineLow(ix1, iy1, ix0, iy0, buffer, shader); } else { - lineLow(ix0, iy0, ix1, iy1, buffer, color); + lineLow(ix0, iy0, ix1, iy1, buffer, shader); } } else { if (iy0 > iy1) { - lineHigh(ix1, iy1, ix0, iy0, buffer, color); + lineHigh(ix1, iy1, ix0, iy0, buffer, shader); } else { - lineHigh(ix0, iy0, ix1, iy1, buffer, color); + lineHigh(ix0, iy0, ix1, iy1, buffer, shader); } } return;