]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/lib/color.qh
Viewmodels: cl_bobmodel: check onground for other players too
[xonotic/xonotic-data.pk3dir.git] / qcsrc / lib / color.qh
1 #ifndef COLOR_H
2 #define COLOR_H
3
4 #include "string.qh"
5
6 #define colormapPaletteColor(c, isPants) colormapPaletteColor_(c, isPants, time)
7 vector colormapPaletteColor_(int c, bool isPants, float t)
8 {
9         switch (c)
10         {
11                 case  0: return '1.000000 1.000000 1.000000';
12                 case  1: return '1.000000 0.333333 0.000000';
13                 case  2: return '0.000000 1.000000 0.501961';
14                 case  3: return '0.000000 1.000000 0.000000';
15                 case  4: return '1.000000 0.000000 0.000000';
16                 case  5: return '0.000000 0.666667 1.000000';
17                 case  6: return '0.000000 1.000000 1.000000';
18                 case  7: return '0.501961 1.000000 0.000000';
19                 case  8: return '0.501961 0.000000 1.000000';
20                 case  9: return '1.000000 0.000000 1.000000';
21                 case 10: return '1.000000 0.000000 0.501961';
22                 case 11: return '0.000000 0.000000 1.000000';
23                 case 12: return '1.000000 1.000000 0.000000';
24                 case 13: return '0.000000 0.333333 1.000000';
25                 case 14: return '1.000000 0.666667 0.000000';
26                 case 15:
27                         if (isPants)
28                                 return '1 0 0' * (0.502 + 0.498 * sin(t / 2.7182818285 + 0.0000000000))
29                                        + '0 1 0' * (0.502 + 0.498 * sin(t / 2.7182818285 + 2.0943951024))
30                                        + '0 0 1' * (0.502 + 0.498 * sin(t / 2.7182818285 + 4.1887902048));
31                         else
32                                 return '1 0 0' * (0.502 + 0.498 * sin(t / 3.1415926536 + 5.2359877560))
33                                        + '0 1 0' * (0.502 + 0.498 * sin(t / 3.1415926536 + 3.1415926536))
34                                        + '0 0 1' * (0.502 + 0.498 * sin(t / 3.1415926536 + 1.0471975512));
35                 default: return '0.000 0.000 0.000';
36         }
37 }
38
39 float rgb_mi_ma_to_hue(vector rgb, float mi, float ma)
40 {
41         if (mi == ma)
42         {
43                 return 0;
44         }
45         else if (ma == rgb.x)
46         {
47                 if (rgb.y >= rgb.z) return (rgb.y - rgb.z) / (ma - mi);
48                 else return (rgb.y - rgb.z) / (ma - mi) + 6;
49         }
50         else if (ma == rgb.y)
51         {
52                 return (rgb.z - rgb.x) / (ma - mi) + 2;
53         }
54         else  // if(ma == rgb_z)
55         {
56                 return (rgb.x - rgb.y) / (ma - mi) + 4;
57         }
58 }
59
60 vector hue_mi_ma_to_rgb(float hue, float mi, float ma)
61 {
62         vector rgb;
63
64         hue -= 6 * floor(hue / 6);
65
66         // else if(ma == rgb_x)
67         //      hue = 60 * (rgb_y - rgb_z) / (ma - mi);
68         if (hue <= 1)
69         {
70                 rgb.x = ma;
71                 rgb.y = hue * (ma - mi) + mi;
72                 rgb.z = mi;
73         }
74         // else if(ma == rgb_y)
75         //      hue = 60 * (rgb_z - rgb_x) / (ma - mi) + 120;
76         else if (hue <= 2)
77         {
78                 rgb.x = (2 - hue) * (ma - mi) + mi;
79                 rgb.y = ma;
80                 rgb.z = mi;
81         }
82         else if (hue <= 3)
83         {
84                 rgb.x = mi;
85                 rgb.y = ma;
86                 rgb.z = (hue - 2) * (ma - mi) + mi;
87         }
88         // else // if(ma == rgb_z)
89         //      hue = 60 * (rgb_x - rgb_y) / (ma - mi) + 240;
90         else if (hue <= 4)
91         {
92                 rgb.x = mi;
93                 rgb.y = (4 - hue) * (ma - mi) + mi;
94                 rgb.z = ma;
95         }
96         else if (hue <= 5)
97         {
98                 rgb.x = (hue - 4) * (ma - mi) + mi;
99                 rgb.y = mi;
100                 rgb.z = ma;
101         }
102         // else if(ma == rgb_x)
103         //      hue = 60 * (rgb_y - rgb_z) / (ma - mi);
104         else  // if(hue <= 6)
105         {
106                 rgb.x = ma;
107                 rgb.y = mi;
108                 rgb.z = (6 - hue) * (ma - mi) + mi;
109         }
110
111         return rgb;
112 }
113
114 vector rgb_to_hsv(vector rgb)
115 {
116         float mi, ma;
117         vector hsv;
118
119         mi = min(rgb.x, rgb.y, rgb.z);
120         ma = max(rgb.x, rgb.y, rgb.z);
121
122         hsv.x = rgb_mi_ma_to_hue(rgb, mi, ma);
123         hsv.z = ma;
124
125         if (ma == 0) hsv.y = 0;
126         else hsv.y = 1 - mi / ma;
127
128         return hsv;
129 }
130
131 vector hsv_to_rgb(vector hsv)
132 {
133         return hue_mi_ma_to_rgb(hsv.x, hsv.z * (1 - hsv.y), hsv.z);
134 }
135
136 vector rgb_to_hsl(vector rgb)
137 {
138         float mi, ma;
139         vector hsl;
140
141         mi = min(rgb.x, rgb.y, rgb.z);
142         ma = max(rgb.x, rgb.y, rgb.z);
143
144         hsl.x = rgb_mi_ma_to_hue(rgb, mi, ma);
145
146         hsl.z = 0.5 * (mi + ma);
147         if (mi == ma) hsl.y = 0;
148         else if (hsl.z <= 0.5) hsl.y = (ma - mi) / (2 * hsl.z);
149         else  // if(hsl_z > 0.5)
150                 hsl.y = (ma - mi) / (2 - 2 * hsl.z);
151
152         return hsl;
153 }
154
155 vector hsl_to_rgb(vector hsl)
156 {
157         float mi, ma, maminusmi;
158
159         if (hsl.z <= 0.5) maminusmi = hsl.y * 2 * hsl.z;
160         else maminusmi = hsl.y * (2 - 2 * hsl.z);
161
162         // hsl_z     = 0.5 * mi + 0.5 * ma
163         // maminusmi =     - mi +       ma
164         mi = hsl.z - 0.5 * maminusmi;
165         ma = hsl.z + 0.5 * maminusmi;
166
167         return hue_mi_ma_to_rgb(hsl.x, mi, ma);
168 }
169
170 string rgb_to_hexcolor(vector rgb)
171 {
172         return strcat(
173                 "^x",
174                 DEC_TO_HEXDIGIT(floor(rgb.x * 15 + 0.5)),
175                 DEC_TO_HEXDIGIT(floor(rgb.y * 15 + 0.5)),
176                 DEC_TO_HEXDIGIT(floor(rgb.z * 15 + 0.5))
177                      );
178 }
179
180 #endif