X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=util.h;h=4a0aed85214805714d680a3a6d6a736586f64257;hb=3795723be95f2fe82f3c8b8b45b1a905b2c811fd;hp=91ed0a20fa7e765760e8507029b4ecee4a893ab0;hpb=c871e86acb0359489b2b6e10343899771e659d3d;p=nageru diff --git a/util.h b/util.h index 91ed0a2..4a0aed8 100644 --- a/util.h +++ b/util.h @@ -1,10 +1,10 @@ #ifndef _UTIL_H #define _UTIL_H 1 -#include -#include #include +#include #include +#include struct Vec2 { float du, dv; @@ -22,29 +22,37 @@ inline void flow2rgb(float du, float dv, uint8_t *rr, uint8_t *gg, uint8_t *bb) { float angle = atan2(dv, du); float magnitude = std::min(hypot(du, dv) / 20.0, 1.0); - + // HSV to RGB (from Wikipedia). Saturation is 1. float c = magnitude; float h = (angle + M_PI) * 6.0 / (2.0 * M_PI); float X = c * (1.0 - fabs(fmod(h, 2.0) - 1.0)); float r = 0.0f, g = 0.0f, b = 0.0f; if (h <= 1.0f) { - r = c; g = X; + r = c; + g = X; } else if (h <= 2.0f) { - r = X; g = c; + r = X; + g = c; } else if (h <= 3.0f) { - g = c; b = X; + g = c; + b = X; } else if (h <= 4.0f) { - g = X; b = c; + g = X; + b = c; } else if (h <= 5.0f) { - r = X; b = c; + r = X; + b = c; } else if (h <= 6.0f) { - r = c; b = X; + r = c; + b = X; } else { // h is NaN, so black is fine. } float m = magnitude - c; - r += m; g += m; b += m; + r += m; + g += m; + b += m; r = std::max(std::min(r, 1.0f), 0.0f); g = std::max(std::min(g, 1.0f), 0.0f); b = std::max(std::min(b, 1.0f), 0.0f);