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