// line_renderer.cpp - Implementació de renderitzat de línies // © 1999 Visente i Sergi (versió Pascal) // © 2025 Port a C++20 amb SDL3 #include "core/rendering/line_renderer.hpp" #include #include "core/rendering/coordinate_transform.hpp" namespace Rendering { // [NUEVO] Color global compartit (actualitzat per ColorOscillator via // SDLManager) SDL_Color g_current_line_color = {255, 255, 255, 255}; // Blanc inicial bool linea(SDL_Renderer* renderer, int x1, int y1, int x2, int y2, bool dibuixar, float brightness) { // Algorisme de Bresenham per dibuixar línies // Basat en el codi Pascal original // Helper function: retorna el signe d'un nombre auto sign = [](int x) -> int { if (x < 0) return -1; if (x > 0) return 1; return 0; }; // Variables per a l'algorisme (no utilitzades fins Fase 10 - detecció de // col·lisions) int x = x1, y = y1; int xs = x2 - x1; int ys = y2 - y1; int // xm = sign(xs); int ym = sign(ys); xs = std::abs(xs); ys = std::abs(ys); // Suprimir warning de variable no usada (void)sign; // Detecció de col·lisió (TODO per Fase 10) // El codi Pascal original llegia pixels del framebuffer bit-packed // i comptava col·lisions. Per ara, usem SDL_RenderDrawLine i retornem false. bool colisio = false; // Dibuixar amb SDL3 (més eficient que Bresenham píxel a píxel) if (dibuixar && renderer) { // Transformar coordenades lògiques (640x480) a físiques (resolució real) float scale = g_current_scale_factor; int px1 = transform_x(x1, scale); int py1 = transform_y(y1, scale); int px2 = transform_x(x2, scale); int py2 = transform_y(y2, scale); // Aplicar brightness al color oscil·lat global SDL_Color color_final; color_final.r = static_cast(g_current_line_color.r * brightness); color_final.g = static_cast(g_current_line_color.g * brightness); color_final.b = static_cast(g_current_line_color.b * brightness); color_final.a = 255; SDL_SetRenderDrawColor(renderer, color_final.r, color_final.g, color_final.b, 255); // Renderitzar amb coordenades físiques SDL_RenderLine(renderer, static_cast(px1), static_cast(py1), static_cast(px2), static_cast(py2)); } // Algorisme de Bresenham original (conservat per a futura detecció de // col·lisió) /* if (xs > ys) { // Línia plana (<45 graus) int count = -(xs / 2); while (x != x2) { count = count + ys; x = x + xm; if (count > 0) { y = y + ym; count = count - xs; } // Aquí aniria la detecció de col·lisió píxel a píxel } } else { // Línia pronunciada (>=45 graus) int count = -(ys / 2); while (y != y2) { count = count + xs; y = y + ym; if (count > 0) { x = x + xm; count = count - ys; } // Aquí aniria la detecció de col·lisió píxel a píxel } } */ return colisio; } // [NUEVO] Establir el color global de les línies void setLineColor(SDL_Color color) { g_current_line_color = color; } } // namespace Rendering