prepare to make cache size runtime settable
[ruff:gruff.git] / cache.frag
1 uniform sampler2D tex;
2
3 float lin_interp(float x, float domain_low, float domain_hi, float range_low, float range_hi) {
4   if ((x >= domain_low) && (x <= domain_hi)) {
5     x = (x - domain_low) / (domain_hi - domain_low);
6     x = range_low + x * (range_hi - range_low);
7   }
8   return x;
9 }
10
11 float pvp_adjust_3(float x) {
12   // red
13   x = lin_interp(x, 0.00, 0.125, -0.050, 0.090);
14   // orange
15   x = lin_interp(x, 0.125, 0.25,  0.090, 0.167);
16   // yellow
17   x = lin_interp(x, 0.25, 0.375,  0.167, 0.253);
18   // chartreuse
19   x = lin_interp(x, 0.375, 0.50,  0.253, 0.383);
20   // green
21   x = lin_interp(x, 0.50, 0.625,  0.383, 0.500);
22   // teal
23   x = lin_interp(x, 0.625, 0.75,  0.500, 0.667);
24   // blue
25   x = lin_interp(x, 0.75, 0.875,  0.667, 0.800);
26   // purple
27   x = lin_interp(x, 0.875, 1.00,  0.800, 0.950);
28   return(x);
29 }
30
31 vec3 hsv2rgb(float h, float s, float v)
32 {
33   float i, f, p, q, t, r, g, b;
34   if (s == 0.0) {
35     // Ignore hue
36     r = v;
37     g = v;
38     b = v;
39   } else {
40     /* Apply physiological mapping: red, yellow, green and blue should
41        be equidistant. */
42     h = pvp_adjust_3(h);
43     h = h - floor(h);
44     h = h * 6.0;
45     i = floor(h);
46     f = h - i;
47     p = v*(1.0 - s);  // The "low-flat" curve
48     q = v*(1.0 - (s*f));  // The "falling" curve
49     t = v*(1.0 - (s*(1.0 - f)));  // The "rising" curve
50     if (i < 1.0) { r = v; g = t; b = p; } else
51     if (i < 2.0) { r = q; g = v; b = p; } else
52     if (i < 3.0) { r = p; g = v; b = t; } else
53     if (i < 4.0) { r = p; g = q; b = v; } else
54     if (i < 5.0) { r = t; g = p; b = v; } else
55                  { r = v; g = p; b = q; }
56   }
57   return vec3(r, g, b);
58 }
59
60 void main(void) {
61   float n = texture2D(tex, gl_TexCoord[0].st).x;
62   float h = n;
63   float s = 1.0;
64   float v = clamp(0.0, 1.0, 0.25 + log(h + 1.0));
65   gl_FragColor = vec4(hsv2rgb(h, s, v), 1.0);
66 }