#pragma once #include #include "../datatypes.cpp" #include "../helpers.cpp" #include "../buffer.cpp" #include "../shader.cpp" namespace UwU { // rectangle class Rectangle { public: Rectangle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { this->x0 = x0; this->y0 = y0; this->x1 = x1; this->y1 = y1; } Rectangle() {} uint16_t x0; uint16_t y0; uint16_t x1; uint16_t y1; // Draw a rectangle void draw (Buffer buffer, Shader 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 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(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; } }; }