From 78b0e8dd625add18ea9a62dcd72a820e1a0beab5 Mon Sep 17 00:00:00 2001 From: Misha Date: Tue, 27 Jun 2023 18:35:58 +0300 Subject: [PATCH] improve accuracy --- LEGO1/legobackgroundcolor.cpp | 22 +++++++++----------- LEGO1/legoutil.cpp | 38 +++++++++++++++++------------------ LEGO1/legoutil.h | 2 +- LEGO1/mxbackgroundcolor.h | 6 +++--- 4 files changed, 33 insertions(+), 35 deletions(-) diff --git a/LEGO1/legobackgroundcolor.cpp b/LEGO1/legobackgroundcolor.cpp index db4e743e..83683a82 100644 --- a/LEGO1/legobackgroundcolor.cpp +++ b/LEGO1/legobackgroundcolor.cpp @@ -33,22 +33,20 @@ void LegoBackgroundColor::SetColorString(const char *colorString) char *colorStringSplit = strtok(colorStringCopy, Delimiter); if (!strcmp(colorStringSplit, set)) { - //TODO: the names of these variables are incorrect as I can't figure out what color format ConvertColor() uses - char *blue = strtok(0, Delimiter); - if (blue) - b = atoi(blue) * 0.01; - char *green = strtok(0, Delimiter); - if (green) - g = atoi(green) * 0.01; - char *red = strtok(0, Delimiter); - if (red) - r = atoi(red) * 0.01; + char *hue = strtok(0, Delimiter); + if (hue) + h = atoi(hue) * 0.01; + char *sat = strtok(0, Delimiter); + if (sat) + s = atoi(sat) * 0.01; + char *val = strtok(0, Delimiter); + if (val) + v = atoi(val) * 0.01; } else if (!strcmp(colorStringSplit, reset)) { // reset it - - ConvertColor(this->b, this->g, this->r, &converted_r, &converted_g, &converted_b); + ConvertHSVToRGB(this->h, this->s, this->v, &converted_r, &converted_g, &converted_b); videomanager->SetSkyColor(converted_r, converted_g, converted_b); } free(colorStringCopy); diff --git a/LEGO1/legoutil.cpp b/LEGO1/legoutil.cpp index f50e490a..8614be41 100644 --- a/LEGO1/legoutil.cpp +++ b/LEGO1/legoutil.cpp @@ -1,65 +1,65 @@ #include "legoutil.h" // OFFSET: LEGO1 0x1003eae0 -void ConvertColor(float h, float s, float v, float *r_out, float *b_out, float *g_out) +void ConvertHSVToRGB(float h, float s, float v, float *r_out, float *b_out, float *g_out) { - double calc; // st7 - double v11; - int hue_index; + double calc; + double p; + long hue_index; double v9; double v12; double v13; - if (s >= 0.5) - calc = (1.0 - v) * s + v; + if (s > 0.5f) + calc = ((1.0f - v) * s + v); // else calc = (v + 1.0) * s; if (calc <= 0.0) { - *g_out = 0.0; - *b_out = 0.0; - *r_out = 0.0; + *g_out = 0.0f; + *b_out = 0.0f; + *r_out = 0.0f; return; } - v11 = s * 2.0 - calc; + p = s * 2.0 - calc; hue_index = h * 6.0; - v9 = (h * 6.0 - (float)hue_index) * ((calc - v11) / calc) * calc; - v12 = v11 + v9; + v9 = (h * 6.0 - (float)hue_index) * ((calc - p) / calc) * calc; + v12 = p + v9; v13 = calc - v9; switch (hue_index) { case 0: *r_out = calc; *b_out = v12; - *g_out = v11; + *g_out = p; break; case 1: *r_out = v13; *b_out = calc; - *g_out = v11; + *g_out = p; break; case 2: - *r_out = v11; + *r_out = p; *b_out = calc; *g_out = v12; break; case 3: - *r_out = v11; + *r_out = p; *b_out = v13; *g_out = calc; break; case 4: *r_out = v12; - *b_out = v11; + *b_out = p; *g_out = calc; break; case 5: *r_out = calc; - *b_out = v11; + *b_out = p; *g_out = v13; break; case 6: *r_out = calc; - *b_out = v11; + *b_out = p; *g_out = v13; break; default: diff --git a/LEGO1/legoutil.h b/LEGO1/legoutil.h index 4dc2cf5b..659baf82 100644 --- a/LEGO1/legoutil.h +++ b/LEGO1/legoutil.h @@ -6,5 +6,5 @@ inline T Abs(T p_t) { return p_t < 0 ? -p_t : p_t; } -void ConvertColor(float r, float g, float b, float* out_r, float* out_g, float* out_b); +void ConvertHSVToRGB(float r, float g, float b, float* out_r, float* out_g, float* out_b); #endif // LEGOUTIL_H \ No newline at end of file diff --git a/LEGO1/mxbackgroundcolor.h b/LEGO1/mxbackgroundcolor.h index fae1741b..da83a355 100644 --- a/LEGO1/mxbackgroundcolor.h +++ b/LEGO1/mxbackgroundcolor.h @@ -14,9 +14,9 @@ class MxBackgroundColor protected: MxString m_name; MxString m_colorString; - float b; - float g; - float r; + float h; + float s; + float v; }; #endif // MXBACKGROUNDCOLOR_H