ServiceMenu: arreglos de colorets

This commit is contained in:
2025-06-21 20:51:10 +02:00
parent b6698043fd
commit 4f81712e3c
6 changed files with 370 additions and 137 deletions

View File

@@ -15,29 +15,6 @@
// Variables
Overrides overrides = Overrides();
// Colores
const Color BG_COLOR = Color(0X27, 0X27, 0X36);
const Color NO_COLOR = Color(0XFF, 0XFF, 0XFF);
const Color SHADOW_TEXT_COLOR = Color(0X43, 0X43, 0X4F);
const Color SEPARATOR_COLOR = Color(0X0D, 0X1A, 0X2B);
const Color SCOREBOARD_EASY_COLOR = Color(0X4B, 0X69, 0X2F);
const Color SCOREBOARD_NORMAL_COLOR = Color(0X2E, 0X3F, 0X47);
const Color SCOREBOARD_HARD_COLOR = Color(0X76, 0X42, 0X8A);
const Color FLASH_COLOR = Color(0XFF, 0XFF, 0XFF);
const Color FADE_COLOR = Color(0X27, 0X27, 0X36);
const Color ORANGE_COLOR = Color(0XFF, 0X7A, 0X00);
const Color ORANGE_SOFT_COLOR = Color(0XFF, 0XA0, 0X33);
const Color ORANGE_SHADOW_COLOR = ORANGE_SOFT_COLOR.darken(100);
const Color GREEN_COLOR = Color(0X5B, 0XEC, 0X95);
const Color BLUE_SKY_COLOR = Color(0X02, 0X88, 0XD1);
const Color PINK_SKY_COLOR = Color(0XFF, 0X6B, 0X97);
const Color GREEN_SKY_COLOR = Color(0X00, 0X79, 0X6B);
const Color SERV_MENU_TITLE_COLOR = Color(0XFF, 0XFF, 0XFF);
const Color SERV_MENU_TEXT_COLOR = Color(0XFF, 0XFF, 0XFF);
const Color SERV_MENU_SELECTED_COLOR = Color(0XFF, 0XFF, 0X00);;
const Color SERV_MENU_BG_COLOR = Color(0x1E, 0x1E, 0x1E);
const Color DEBUG_COLOR = Color(0xFF, 0xFF, 0x00);
// Obtiene un color del vector de colores imitando al Coche Fantástico
Color getColorLikeKnightRider(const std::vector<Color> &colors, int counter_)
{
@@ -313,18 +290,18 @@ void printWithDots(const std::string &text1, const std::string &text2, const std
// Calcula el ancho del campo para text2 restando la longitud de text1 y text3
size_t field_width = TOTAL_WIDTH > (text1.size() + text3.size())
? TOTAL_WIDTH - text1.size() - text3.size()
: 0;
? TOTAL_WIDTH - text1.size() - text3.size()
: 0;
// Prepara el bloque a imprimir a partir de text2
std::string field_text;
if (text2.size() < field_width)
{
{
// Si text2 es más corto, lo rellenamos a la derecha con puntos
field_text = text2 + std::string(field_width - text2.size(), '.');
}
else
{
{
// Si es demasiado largo, lo cortamos
field_text = text2.substr(0, field_width);
}
@@ -414,4 +391,167 @@ std::string getPath(const std::string &full_path)
{
std::filesystem::path path(full_path);
return path.parent_path().string();
}
}
constexpr HSV rgbToHsv(Color color)
{
float r = color.r / 255.0f;
float g = color.g / 255.0f;
float b = color.b / 255.0f;
float max = fmaxf(fmaxf(r, g), b);
float min = fminf(fminf(r, g), b);
float delta = max - min;
float h = 0.0f;
if (delta > 0.00001f)
{
if (max == r)
h = fmodf((g - b) / delta, 6.0f);
else if (max == g)
h = ((b - r) / delta) + 2.0f;
else
h = ((r - g) / delta) + 4.0f;
h *= 60.0f;
if (h < 0.0f)
h += 360.0f;
}
float s = (max <= 0.0f) ? 0.0f : delta / max;
float v = max;
return {h, s, v};
}
constexpr Color hsvToRgb(HSV hsv)
{
float c = hsv.v * hsv.s;
float x = c * (1 - fabsf(fmodf(hsv.h / 60.0f, 2) - 1));
float m = hsv.v - c;
float r = 0, g = 0, b = 0;
if (hsv.h < 60)
{
r = c;
g = x;
b = 0;
}
else if (hsv.h < 120)
{
r = x;
g = c;
b = 0;
}
else if (hsv.h < 180)
{
r = 0;
g = c;
b = x;
}
else if (hsv.h < 240)
{
r = 0;
g = x;
b = c;
}
else if (hsv.h < 300)
{
r = x;
g = 0;
b = c;
}
else
{
r = c;
g = 0;
b = x;
}
return Color(
static_cast<uint8_t>(roundf((r + m) * 255)),
static_cast<uint8_t>(roundf((g + m) * 255)),
static_cast<uint8_t>(roundf((b + m) * 255)));
}
/*ColorCycle generateMirroredCycle(Color base)
{
ColorCycle result{};
HSV baseHSV = rgbToHsv(base);
for (size_t i = 0; i < COLOR_CYCLE_SIZE; ++i)
{
float t = static_cast<float>(i) / (COLOR_CYCLE_SIZE - 1);
float hueShift = 25.0f * t; // reducido de 45 a 25
float satShift = 0.0f; // sin cambio de saturación
float valShift = 0.07f * sinf(t * 3.1415926f); // brillo más suave
HSV adjusted = {
fmodf(baseHSV.h + hueShift, 360.0f),
fminf(1.0f, fmaxf(0.0f, baseHSV.s + satShift)),
fminf(1.0f, fmaxf(0.0f, baseHSV.v + valShift))};
Color c = hsvToRgb(adjusted);
result[i] = c;
result[2 * COLOR_CYCLE_SIZE - 1 - i] = c; // espejo
}
return result;
}*/
ColorCycle generateMirroredCycle(Color base, ColorCycleStyle style)
{
ColorCycle result{};
HSV baseHSV = rgbToHsv(base);
for (size_t i = 0; i < COLOR_CYCLE_SIZE; ++i)
{
float t = static_cast<float>(i) / (COLOR_CYCLE_SIZE - 1); // 0 → 1
float hueShift = 0.0f;
float satShift = 0.0f;
float valShift = 0.0f;
switch (style)
{
case ColorCycleStyle::SubtlePulse:
// Solo brillo suave
valShift = 0.07f * sinf(t * M_PI);
break;
case ColorCycleStyle::HueWave:
// Oscilación leve de tono
hueShift = 15.0f * (t - 0.5f) * 2.0f;
valShift = 0.05f * sinf(t * M_PI);
break;
case ColorCycleStyle::Vibrant:
// Cambios fuertes en tono y brillo
hueShift = 35.0f * sinf(t * M_PI);
valShift = 0.2f * sinf(t * M_PI);
satShift = -0.2f * sinf(t * M_PI);
break;
case ColorCycleStyle::DarkenGlow:
// Se oscurece al centro
valShift = -0.15f * sinf(t * M_PI);
break;
case ColorCycleStyle::LightFlash:
// Se ilumina al centro
valShift = 0.25f * sinf(t * M_PI);
break;
}
HSV adjusted = {
fmodf(baseHSV.h + hueShift + 360.0f, 360.0f),
fminf(1.0f, fmaxf(0.0f, baseHSV.s + satShift)),
fminf(1.0f, fmaxf(0.0f, baseHSV.v + valShift))
};
Color c = hsvToRgb(adjusted);
result[i] = c;
result[2 * COLOR_CYCLE_SIZE - 1 - i] = c; // espejo
}
return result;
}