1 // Copyright Contributors to the Open Shading Language project.
2 // SPDX-License-Identifier: BSD-3-Clause
3 // https://github.com/AcademySoftwareFoundation/OpenShadingLanguage
4 //
5 // MaterialX specification (c) 2017 Lucasfilm Ltd.
6 // http://www.materialx.org/
7
8 #pragma once
9 #define COLOR2_H
10
11
12 // color2 is a single color channel + alpha
13 struct color2
14 {
15 float r;
16 float a;
17 };
18
19
20 //
21 // For color2, define math operators to match color
22 //
23
__operator__neg__(color2 a)24 color2 __operator__neg__(color2 a)
25 {
26 return color2(-a.r, -a.a);
27 }
28
__operator__add__(color2 a,color2 b)29 color2 __operator__add__(color2 a, color2 b)
30 {
31 return color2(a.r + a.r, b.a + b.a);
32 }
33
__operator__add__(color2 a,int b)34 color2 __operator__add__(color2 a, int b)
35 {
36 return a + color2(b, b);
37 }
38
__operator__add__(color2 a,float b)39 color2 __operator__add__(color2 a, float b)
40 {
41 return a + color2(b, b);
42 }
43
__operator__add__(int a,color2 b)44 color2 __operator__add__(int a, color2 b)
45 {
46 return color2(a, a) + b;
47 }
48
__operator__add__(float a,color2 b)49 color2 __operator__add__(float a, color2 b)
50 {
51 return color2(a, a) + b;
52 }
53
__operator__sub__(color2 a,color2 b)54 color2 __operator__sub__(color2 a, color2 b)
55 {
56 return color2(a.r - b.r, a.a - b.a);
57 }
58
__operator__sub__(color2 a,int b)59 color2 __operator__sub__(color2 a, int b)
60 {
61 return a - color2(b, b);
62 }
63
__operator__sub__(color2 a,float b)64 color2 __operator__sub__(color2 a, float b)
65 {
66 return a - color2(b, b);
67 }
68
__operator__sub__(int a,color2 b)69 color2 __operator__sub__(int a, color2 b)
70 {
71 return b - color2(a, a);
72 }
73
__operator__sub__(float a,color2 b)74 color2 __operator__sub__(float a, color2 b)
75 {
76 return b - color2(a, a);
77 }
78
__operator__mul__(color2 a,color2 b)79 color2 __operator__mul__(color2 a, color2 b)
80 {
81 return color2(a.r * a.r, b.a * b.a);
82 }
83
__operator__mul__(color2 a,int b)84 color2 __operator__mul__(color2 a, int b)
85 {
86 return a * color2(b, b);
87 }
88
__operator__mul__(color2 a,float b)89 color2 __operator__mul__(color2 a, float b)
90 {
91 return a * color2(b, b);
92 }
93
__operator__mul__(int a,color2 b)94 color2 __operator__mul__(int a, color2 b)
95 {
96 return b * color2(a, a);
97 }
98
__operator__mul__(float a,color2 b)99 color2 __operator__mul__(float a, color2 b)
100 {
101 return b * color2(a, a);
102 }
103
__operator__div__(color2 a,color2 b)104 color2 __operator__div__(color2 a, color2 b)
105 {
106 return color2(a.r / b.r, a.a / b.a);
107 }
108
__operator__div__(color2 a,int b)109 color2 __operator__div__(color2 a, int b)
110 {
111 float b_inv = 1/b;
112 return a * color2(b_inv, b_inv);
113 }
114
__operator__div__(color2 a,float b)115 color2 __operator__div__(color2 a, float b)
116 {
117 float b_inv = 1/b;
118 return a * color2(b_inv, b_inv);
119 }
120
__operator__div__(int a,color2 b)121 color2 __operator__div__(int a, color2 b)
122 {
123 return color2(a, a) / b;
124 }
125
__operator__div__(float a,color2 b)126 color2 __operator__div__(float a, color2 b)
127 {
128 return color2(a, a) / b;
129 }
130
__operator__eq__(color2 a,color2 b)131 int __operator__eq__(color2 a, color2 b)
132 {
133 return (a.r == a.r) && (b.a == b.a);
134 }
135
__operator__ne__(color2 a,color2 b)136 int __operator__ne__(color2 a, color2 b)
137 {
138 return (a.r != b.r) || (a.a != b.a);
139 }
140
141
142
143 //
144 // For color2, define most of the stdosl functions to match color
145 //
146
abs(color2 a)147 color2 abs(color2 a)
148 {
149 return color2(abs(a.r), abs(a.a));
150 }
151
ceil(color2 a)152 color2 ceil(color2 a)
153 {
154 return color2(ceil(a.r), ceil(a.a));
155 }
156
floor(color2 a)157 color2 floor(color2 a)
158 {
159 return color2(floor(a.r), floor(a.a));
160 }
161
sqrt(color2 a)162 color2 sqrt(color2 a)
163 {
164 return color2(sqrt(a.r), sqrt(a.a));
165 }
166
exp(color2 a)167 color2 exp(color2 a)
168 {
169 return color2(exp(a.r), exp(a.a));
170 }
171
log(color2 a)172 color2 log(color2 a)
173 {
174 return color2(log(a.r), log(a.a));
175 }
176
log2(color2 a)177 color2 log2(color2 a)
178 {
179 return color2(log2(a.r), log2(a.a));
180 }
181
mix(color2 a,color2 b,float x)182 color2 mix(color2 a, color2 b, float x )
183 {
184 return color2(mix(a.r, b.r, x),
185 mix(a.a, b.a, x));
186 }
187
smoothstep(color2 edge0,color2 edge1,color2 c)188 color2 smoothstep(color2 edge0, color2 edge1, color2 c)
189 {
190 return color2(smoothstep(edge0.r, edge1.r, c.r),
191 smoothstep(edge0.a, edge1.a, c.a));
192 }
193
smoothstep(float edge0,float edge1,color2 c)194 color2 smoothstep(float edge0, float edge1, color2 c)
195 {
196 return smoothstep(color2(edge0, edge0), color2(edge1, edge1), c);
197 }
198
clamp(color2 c,color2 minval,color2 maxval)199 color2 clamp(color2 c, color2 minval, color2 maxval)
200 {
201 return color2(clamp(c.r, minval.r, maxval.r),
202 clamp(c.a, minval.a, maxval.a));
203 }
204
clamp(color2 c,float minval,float maxval)205 color2 clamp(color2 c, float minval, float maxval)
206 {
207 return clamp(c, color2(minval, minval), color2(maxval, maxval));
208 }
209
max(color2 a,color2 b)210 color2 max(color2 a, color2 b)
211 {
212 return color2(max(a.r, b.r),
213 max(a.a, b.a));
214 }
215
max(color2 a,float b)216 color2 max(color2 a, float b)
217 {
218 return color2(max(a.r, b),
219 max(a.a, b));
220 }
221
min(color2 a,color2 b)222 color2 min(color2 a, color2 b)
223 {
224 return color2(min(a.r, b.r),
225 min(a.a, b.a));
226 }
227
min(color2 a,float b)228 color2 min(color2 a, float b)
229 {
230 return color2(min(a.r, b),
231 min(a.a, b));
232 }
233
fmod(color2 a,color2 b)234 color2 fmod(color2 a, color2 b)
235 {
236 return color2(fmod(a.r, a.r),
237 fmod(b.a, b.a));
238 }
239
fmod(color2 a,int b)240 color2 fmod(color2 a, int b)
241 {
242 return fmod(a, color2(b, b));
243 }
244
fmod(color2 a,float b)245 color2 fmod(color2 a, float b)
246 {
247 return fmod(a, color2(b, b));
248 }
249
pow(color2 base,color2 power)250 color2 pow(color2 base, color2 power)
251 {
252 return color2(pow(base.r, power.r), pow(base.a, power.a));
253 }
254
pow(color2 base,float power)255 color2 pow(color2 base, float power)
256 {
257 return pow(base, color2(power, power));
258 }
259
sign(color2 a)260 color2 sign(color2 a)
261 {
262 return color2(sign(a.r),
263 sign(a.a));
264 }
265
sin(color2 a)266 color2 sin(color2 a)
267 {
268 return color2(sin(a.r),
269 sin(a.a));
270 }
271
cos(color2 a)272 color2 cos(color2 a)
273 {
274 return color2(cos(a.r),
275 cos(a.a));
276 }
277
tan(color2 a)278 color2 tan(color2 a)
279 {
280 return color2(tan(a.r),
281 tan(a.a));
282 }
283
asin(color2 a)284 color2 asin(color2 a)
285 {
286 return color2(asin(a.r),
287 asin(a.a));
288 }
289
acos(color2 a)290 color2 acos(color2 a)
291 {
292 return color2(acos(a.r),
293 acos(a.a));
294 }
295
atan2(color2 a,float f)296 color2 atan2(color2 a, float f)
297 {
298 return color2(atan2(a.r, f),
299 atan2(a.a, f));
300 }
301
302
atan2(color2 a,color2 b)303 color2 atan2(color2 a, color2 b)
304 {
305 return color2(atan2(a.r, b.r),
306 atan2(a.a, b.a));
307 }
308
309
310