Blender V4.3
color_util.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#pragma once
6
8
10{
11 return interp(col1, col2, t);
12}
13
15{
16 return interp(col1, col1 + col2, t);
17}
18
20{
21 return interp(col1, col1 * col2, t);
22}
23
25{
26 float tm = 1.0f - t;
27 float3 one = make_float3(1.0f, 1.0f, 1.0f);
28 float3 tm3 = make_float3(tm, tm, tm);
29
30 return one - (tm3 + t * (one - col2)) * (one - col1);
31}
32
34{
35 float tm = 1.0f - t;
36
37 float3 outcol = col1;
38
39 if (outcol.x < 0.5f)
40 outcol.x *= tm + 2.0f * t * col2.x;
41 else
42 outcol.x = 1.0f - (tm + 2.0f * t * (1.0f - col2.x)) * (1.0f - outcol.x);
43
44 if (outcol.y < 0.5f)
45 outcol.y *= tm + 2.0f * t * col2.y;
46 else
47 outcol.y = 1.0f - (tm + 2.0f * t * (1.0f - col2.y)) * (1.0f - outcol.y);
48
49 if (outcol.z < 0.5f)
50 outcol.z *= tm + 2.0f * t * col2.z;
51 else
52 outcol.z = 1.0f - (tm + 2.0f * t * (1.0f - col2.z)) * (1.0f - outcol.z);
53
54 return outcol;
55}
56
58{
59 return interp(col1, col1 - col2, t);
60}
61
63{
64 float tm = 1.0f - t;
65
66 float3 outcol = col1;
67
68 if (col2.x != 0.0f)
69 outcol.x = tm * outcol.x + t * outcol.x / col2.x;
70 if (col2.y != 0.0f)
71 outcol.y = tm * outcol.y + t * outcol.y / col2.y;
72 if (col2.z != 0.0f)
73 outcol.z = tm * outcol.z + t * outcol.z / col2.z;
74
75 return outcol;
76}
77
79{
80 return interp(col1, fabs(col1 - col2), t);
81}
82
84{
85 return max(interp(col1, col1 + col2 - 2.0f * col1 * col2, t), zero_float3());
86}
87
89{
90 return interp(col1, min(col1, col2), t);
91}
92
94{
95 return interp(col1, max(col1, col2), t);
96}
97
99{
100 float3 outcol = col1;
101
102 if (outcol.x != 0.0f) {
103 float tmp = 1.0f - t * col2.x;
104 if (tmp <= 0.0f)
105 outcol.x = 1.0f;
106 else if ((tmp = outcol.x / tmp) > 1.0f)
107 outcol.x = 1.0f;
108 else
109 outcol.x = tmp;
110 }
111 if (outcol.y != 0.0f) {
112 float tmp = 1.0f - t * col2.y;
113 if (tmp <= 0.0f)
114 outcol.y = 1.0f;
115 else if ((tmp = outcol.y / tmp) > 1.0f)
116 outcol.y = 1.0f;
117 else
118 outcol.y = tmp;
119 }
120 if (outcol.z != 0.0f) {
121 float tmp = 1.0f - t * col2.z;
122 if (tmp <= 0.0f)
123 outcol.z = 1.0f;
124 else if ((tmp = outcol.z / tmp) > 1.0f)
125 outcol.z = 1.0f;
126 else
127 outcol.z = tmp;
128 }
129
130 return outcol;
131}
132
134{
135 float tmp, tm = 1.0f - t;
136
137 float3 outcol = col1;
138
139 tmp = tm + t * col2.x;
140 if (tmp <= 0.0f)
141 outcol.x = 0.0f;
142 else if ((tmp = (1.0f - (1.0f - outcol.x) / tmp)) < 0.0f)
143 outcol.x = 0.0f;
144 else if (tmp > 1.0f)
145 outcol.x = 1.0f;
146 else
147 outcol.x = tmp;
148
149 tmp = tm + t * col2.y;
150 if (tmp <= 0.0f)
151 outcol.y = 0.0f;
152 else if ((tmp = (1.0f - (1.0f - outcol.y) / tmp)) < 0.0f)
153 outcol.y = 0.0f;
154 else if (tmp > 1.0f)
155 outcol.y = 1.0f;
156 else
157 outcol.y = tmp;
158
159 tmp = tm + t * col2.z;
160 if (tmp <= 0.0f)
161 outcol.z = 0.0f;
162 else if ((tmp = (1.0f - (1.0f - outcol.z) / tmp)) < 0.0f)
163 outcol.z = 0.0f;
164 else if (tmp > 1.0f)
165 outcol.z = 1.0f;
166 else
167 outcol.z = tmp;
168
169 return outcol;
170}
171
173{
174 float3 outcol = col1;
175
176 float3 hsv2 = rgb_to_hsv(col2);
177
178 if (hsv2.y != 0.0f) {
179 float3 hsv = rgb_to_hsv(outcol);
180 hsv.x = hsv2.x;
181 float3 tmp = hsv_to_rgb(hsv);
182
183 outcol = interp(outcol, tmp, t);
184 }
185
186 return outcol;
187}
188
190{
191 float tm = 1.0f - t;
192
193 float3 outcol = col1;
194
195 float3 hsv = rgb_to_hsv(outcol);
196
197 if (hsv.y != 0.0f) {
198 float3 hsv2 = rgb_to_hsv(col2);
199
200 hsv.y = tm * hsv.y + t * hsv2.y;
201 outcol = hsv_to_rgb(hsv);
202 }
203
204 return outcol;
205}
206
208{
209 float tm = 1.0f - t;
210
211 float3 hsv = rgb_to_hsv(col1);
212 float3 hsv2 = rgb_to_hsv(col2);
213
214 hsv.z = tm * hsv.z + t * hsv2.z;
215
216 return hsv_to_rgb(hsv);
217}
218
220{
221 float3 outcol = col1;
222 float3 hsv2 = rgb_to_hsv(col2);
223
224 if (hsv2.y != 0.0f) {
225 float3 hsv = rgb_to_hsv(outcol);
226 hsv.x = hsv2.x;
227 hsv.y = hsv2.y;
228 float3 tmp = hsv_to_rgb(hsv);
229
230 outcol = interp(outcol, tmp, t);
231 }
232
233 return outcol;
234}
235
237{
238 float tm = 1.0f - t;
239
240 float3 one = make_float3(1.0f, 1.0f, 1.0f);
241 float3 scr = one - (one - col2) * (one - col1);
242
243 return tm * col1 + t * ((one - col1) * col2 * col1 + col1 * scr);
244}
245
247{
248 return col1 + t * (2.0f * col2 + make_float3(-1.0f, -1.0f, -1.0f));
249}
250
255
257{
258 switch (type) {
259 case NODE_MIX_BLEND:
260 return svm_mix_blend(t, c1, c2);
261 case NODE_MIX_ADD:
262 return svm_mix_add(t, c1, c2);
263 case NODE_MIX_MUL:
264 return svm_mix_mul(t, c1, c2);
265 case NODE_MIX_SCREEN:
266 return svm_mix_screen(t, c1, c2);
267 case NODE_MIX_OVERLAY:
268 return svm_mix_overlay(t, c1, c2);
269 case NODE_MIX_SUB:
270 return svm_mix_sub(t, c1, c2);
271 case NODE_MIX_DIV:
272 return svm_mix_div(t, c1, c2);
273 case NODE_MIX_DIFF:
274 return svm_mix_diff(t, c1, c2);
276 return svm_mix_exclusion(t, c1, c2);
277 case NODE_MIX_DARK:
278 return svm_mix_dark(t, c1, c2);
279 case NODE_MIX_LIGHT:
280 return svm_mix_light(t, c1, c2);
281 case NODE_MIX_DODGE:
282 return svm_mix_dodge(t, c1, c2);
283 case NODE_MIX_BURN:
284 return svm_mix_burn(t, c1, c2);
285 case NODE_MIX_HUE:
286 return svm_mix_hue(t, c1, c2);
287 case NODE_MIX_SAT:
288 return svm_mix_sat(t, c1, c2);
289 case NODE_MIX_VAL:
290 return svm_mix_val(t, c1, c2);
291 case NODE_MIX_COL:
292 return svm_mix_color(t, c1, c2);
293 case NODE_MIX_SOFT:
294 return svm_mix_soft(t, c1, c2);
295 case NODE_MIX_LINEAR:
296 return svm_mix_linear(t, c1, c2);
297 case NODE_MIX_CLAMP:
298 return svm_mix_clamp(c1);
299 }
300
301 return make_float3(0.0f, 0.0f, 0.0f);
302}
303
305{
306 float fac = saturatef(t);
307 return svm_mix(type, fac, c1, c2);
308}
309
310ccl_device_inline float3 svm_brightness_contrast(float3 color, float brightness, float contrast)
311{
312 float a = 1.0f + contrast;
313 float b = brightness - contrast * 0.5f;
314
315 color.x = max(a * color.x + b, 0.0f);
316 color.y = max(a * color.y + b, 0.0f);
317 color.z = max(a * color.z + b, 0.0f);
318
319 return color;
320}
321
323{
324 switch (type) {
326 return hsv_to_rgb(color);
328 return hsl_to_rgb(color);
330 default:
331 return color;
332 }
333}
334
336{
337 switch (type) {
339 return rgb_to_hsv(color);
341 return rgb_to_hsl(color);
343 default:
344 return color;
345 }
346}
347
void rgb_to_hsl(float r, float g, float b, float *r_h, float *r_s, float *r_l)
void rgb_to_hsv(float r, float g, float b, float *r_h, float *r_s, float *r_v)
void hsv_to_rgb(float h, float s, float v, float *r_r, float *r_g, float *r_b)
Definition math_color.cc:21
void hsl_to_rgb(float h, float s, float l, float *r_r, float *r_g, float *r_b)
Definition math_color.cc:38
#define saturate(a)
@ NODE_COMBSEP_COLOR_RGB
@ NODE_COMBSEP_COLOR_HSV
@ NODE_COMBSEP_COLOR_HSL
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Brightness Control the brightness and contrast of the input color Vector Map input vector components with curves Camera Retrieve information about the camera and how it relates to the current shading point s position Clamp a value between a minimum and a maximum Vector Perform vector math operation Invert Invert a color
ccl_device float3 svm_mix_dodge(float t, float3 col1, float3 col2)
Definition color_util.h:98
ccl_device float3 svm_mix_overlay(float t, float3 col1, float3 col2)
Definition color_util.h:33
ccl_device float3 svm_mix_clamp(float3 col)
Definition color_util.h:251
ccl_device float3 svm_combine_color(NodeCombSepColorType type, float3 color)
Definition color_util.h:322
ccl_device float3 svm_mix_val(float t, float3 col1, float3 col2)
Definition color_util.h:207
ccl_device float3 svm_mix_screen(float t, float3 col1, float3 col2)
Definition color_util.h:24
ccl_device float3 svm_mix_soft(float t, float3 col1, float3 col2)
Definition color_util.h:236
ccl_device float3 svm_mix_add(float t, float3 col1, float3 col2)
Definition color_util.h:14
ccl_device float3 svm_separate_color(NodeCombSepColorType type, float3 color)
Definition color_util.h:335
ccl_device_noinline_cpu float3 svm_mix(NodeMix type, float t, float3 c1, float3 c2)
Definition color_util.h:256
ccl_device float3 svm_mix_dark(float t, float3 col1, float3 col2)
Definition color_util.h:88
ccl_device float3 svm_mix_diff(float t, float3 col1, float3 col2)
Definition color_util.h:78
ccl_device float3 svm_mix_mul(float t, float3 col1, float3 col2)
Definition color_util.h:19
ccl_device float3 svm_mix_sub(float t, float3 col1, float3 col2)
Definition color_util.h:57
ccl_device float3 svm_mix_light(float t, float3 col1, float3 col2)
Definition color_util.h:93
ccl_device float3 svm_mix_sat(float t, float3 col1, float3 col2)
Definition color_util.h:189
ccl_device float3 svm_mix_exclusion(float t, float3 col1, float3 col2)
Definition color_util.h:83
ccl_device float3 svm_mix_color(float t, float3 col1, float3 col2)
Definition color_util.h:219
ccl_device float3 svm_mix_burn(float t, float3 col1, float3 col2)
Definition color_util.h:133
ccl_device_noinline_cpu float3 svm_mix_clamped_factor(NodeMix type, float t, float3 c1, float3 c2)
Definition color_util.h:304
ccl_device float3 svm_mix_div(float t, float3 col1, float3 col2)
Definition color_util.h:62
CCL_NAMESPACE_BEGIN ccl_device float3 svm_mix_blend(float t, float3 col1, float3 col2)
Definition color_util.h:9
ccl_device float3 svm_mix_hue(float t, float3 col1, float3 col2)
Definition color_util.h:172
ccl_device_inline float3 svm_brightness_contrast(float3 color, float brightness, float contrast)
Definition color_util.h:310
ccl_device float3 svm_mix_linear(float t, float3 col1, float3 col2)
Definition color_util.h:246
local_group_size(16, 16) .push_constant(Type b
#define ccl_device
#define ccl_device_noinline_cpu
#define ccl_device_inline
#define CCL_NAMESPACE_END
#define saturatef(x)
ccl_device_forceinline float3 make_float3(const float x, const float y, const float z)
uint col
@ NODE_MIX_DIV
@ NODE_MIX_SOFT
@ NODE_MIX_CLAMP
@ NODE_MIX_COL
@ NODE_MIX_LIGHT
@ NODE_MIX_MUL
@ NODE_MIX_DIFF
@ NODE_MIX_BURN
@ NODE_MIX_SUB
@ NODE_MIX_LINEAR
@ NODE_MIX_DARK
@ NODE_MIX_SAT
@ NODE_MIX_EXCLUSION
@ NODE_MIX_SCREEN
@ NODE_MIX_HUE
@ NODE_MIX_BLEND
@ NODE_MIX_OVERLAY
@ NODE_MIX_DODGE
@ NODE_MIX_VAL
@ NODE_MIX_ADD
NodeCombSepColorType
ccl_device_inline float2 fabs(const float2 a)
ccl_device_inline float2 interp(const float2 a, const float2 b, float t)
CCL_NAMESPACE_BEGIN ccl_device_inline float3 zero_float3()
Definition math_float3.h:15
#define min(a, b)
Definition sort.c:32
float z
Definition sky_float3.h:27
float y
Definition sky_float3.h:27
float x
Definition sky_float3.h:27
float max