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