onejs-sl 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,994 @@
1
+ // GENERATED by lib/generate.ts from lib/*.hlsl. Do not edit: change the
2
+ // .hlsl and run `npm run lib`. src/lib/lib.test.ts fails when this is stale.
3
+
4
+ /** WGSL, by `LIB_FUNCTIONS` index. Overloaded names carry their signature, as `LIB_FUNCTIONS[i].wgsl` says. */
5
+ export const LIB_WGSL: ReadonlyArray<string> = [
6
+ `
7
+ fn glslMod(x: f32, y: f32) -> f32 {
8
+ return x - y * floor(x / y);
9
+ }
10
+ `,
11
+ `
12
+ fn ndot(a: vec2f, b: vec2f) -> f32 {
13
+ return a.x * b.x - a.y * b.y;
14
+ }
15
+ `,
16
+ `
17
+ fn dot2(v: vec2f) -> f32 {
18
+ return dot(v, v);
19
+ }
20
+ `,
21
+ `
22
+ fn sdCircle(p: vec2f, r: f32) -> f32 {
23
+ return length(p) - r;
24
+ }
25
+ `,
26
+ `
27
+ fn sdRoundedBox(p: vec2f, b: vec2f, rIn: vec4f) -> f32 {
28
+ var r: vec4f = rIn;
29
+ {
30
+ let sl_v: vec2f = select(r.zw, r.xy, (p.x > 0.0));
31
+ r = vec4f(sl_v.x, sl_v.y, r.z, r.w);
32
+ }
33
+ r.x = select(r.y, r.x, (p.y > 0.0));
34
+ let q: vec2f = abs(p) - b + r.x;
35
+ return min(max(q.x, q.y), 0.0) + length(max(q, vec2f(0.0))) - r.x;
36
+ }
37
+ `,
38
+ `
39
+ fn sdBox(p: vec2f, b: vec2f) -> f32 {
40
+ let d: vec2f = abs(p) - b;
41
+ return length(max(d, vec2f(0.0))) + min(max(d.x, d.y), 0.0);
42
+ }
43
+ `,
44
+ `
45
+ fn sdOrientedBox(p: vec2f, a: vec2f, b: vec2f, th: f32) -> f32 {
46
+ let l: f32 = length(b - a);
47
+ let d: vec2f = (b - a) / l;
48
+ var q: vec2f = (p - (a + b) * 0.5);
49
+ q = vec2f(q.x * d.x + q.y * d.y, q.x * (-d.y) + q.y * d.x);
50
+ q = abs(q) - vec2f(l, th) * 0.5;
51
+ return length(max(q, vec2f(0.0))) + min(max(q.x, q.y), 0.0);
52
+ }
53
+ `,
54
+ `
55
+ fn sdSegment(p: vec2f, a: vec2f, b: vec2f) -> f32 {
56
+ let pa: vec2f = p - a;
57
+ let ba: vec2f = b - a;
58
+ let h: f32 = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);
59
+ return length(pa - ba * h);
60
+ }
61
+ `,
62
+ `
63
+ fn sdRhombus(pIn: vec2f, b: vec2f) -> f32 {
64
+ var p: vec2f = pIn;
65
+ p = abs(p);
66
+ let h: f32 = clamp(ndot(b - 2.0 * p, b) / dot(b, b), -1.0, 1.0);
67
+ let d: f32 = length(p - 0.5 * b * vec2f(1.0 - h, 1.0 + h));
68
+ return d * sign(p.x * b.y + p.y * b.x - b.x * b.y);
69
+ }
70
+ `,
71
+ `
72
+ fn sdTrapezoid(pIn: vec2f, r1: f32, r2: f32, he: f32) -> f32 {
73
+ var p: vec2f = pIn;
74
+ let k1: vec2f = vec2f(r2, he);
75
+ let k2: vec2f = vec2f(r2 - r1, 2.0 * he);
76
+ p.x = abs(p.x);
77
+ let ca: vec2f = vec2f(p.x - min(p.x, select(r2, r1, (p.y < 0.0))), abs(p.y) - he);
78
+ let cb: vec2f = p - k1 + k2 * clamp(dot(k1 - p, k2) / dot2(k2), 0.0, 1.0);
79
+ let s: f32 = select(1.0, -1.0, (cb.x < 0.0 && ca.y < 0.0));
80
+ return s * sqrt(min(dot2(ca), dot2(cb)));
81
+ }
82
+ `,
83
+ `
84
+ fn sdParallelogram(pIn: vec2f, wi: f32, he: f32, sk: f32) -> f32 {
85
+ var p: vec2f = pIn;
86
+ let e: vec2f = vec2f(sk, he);
87
+ p = select(p, -p, (p.y < 0.0));
88
+ var w: vec2f = p - e;
89
+ w.x -= clamp(w.x, -wi, wi);
90
+ var d: vec2f = vec2f(dot(w, w), -w.y);
91
+ let s: f32 = p.x * e.y - p.y * e.x;
92
+ p = select(p, -p, (s < 0.0));
93
+ var v: vec2f = p - vec2f(wi, 0.0);
94
+ v -= e * clamp(dot(v, e) / dot(e, e), -1.0, 1.0);
95
+ d = min(d, vec2f(dot(v, v), wi * he - abs(s)));
96
+ return sqrt(d.x) * sign(-d.y);
97
+ }
98
+ `,
99
+ `
100
+ fn sdEquilateralTriangle(pIn: vec2f, r: f32) -> f32 {
101
+ var p: vec2f = pIn;
102
+ let k: f32 = sqrt(3.0);
103
+ p.x = abs(p.x) - r;
104
+ p.y = p.y + r / k;
105
+ if (p.x + k * p.y > 0.0) {
106
+ p = vec2f(p.x - k * p.y, -k * p.x - p.y) / 2.0;
107
+ }
108
+ p.x -= clamp(p.x, -2.0 * r, 0.0);
109
+ return -length(p) * sign(p.y);
110
+ }
111
+ `,
112
+ `
113
+ fn sdTriangleIsosceles(pIn: vec2f, q: vec2f) -> f32 {
114
+ var p: vec2f = pIn;
115
+ p.x = abs(p.x);
116
+ let a: vec2f = p - q * clamp(dot(p, q) / dot(q, q), 0.0, 1.0);
117
+ let b: vec2f = p - q * vec2f(clamp(p.x / q.x, 0.0, 1.0), 1.0);
118
+ let s: f32 = -sign(q.y);
119
+ let d: vec2f = min(vec2f(dot(a, a), s * (p.x * q.y - p.y * q.x)), vec2f(dot(b, b), s * (p.y - q.y)));
120
+ return -sqrt(d.x) * sign(d.y);
121
+ }
122
+ `,
123
+ `
124
+ fn sdTriangle(p: vec2f, p0: vec2f, p1: vec2f, p2: vec2f) -> f32 {
125
+ let e0: vec2f = p1 - p0;
126
+ let e1: vec2f = p2 - p1;
127
+ let e2: vec2f = p0 - p2;
128
+ let v0: vec2f = p - p0;
129
+ let v1: vec2f = p - p1;
130
+ let v2: vec2f = p - p2;
131
+ let pq0: vec2f = v0 - e0 * clamp(dot(v0, e0) / dot(e0, e0), 0.0, 1.0);
132
+ let pq1: vec2f = v1 - e1 * clamp(dot(v1, e1) / dot(e1, e1), 0.0, 1.0);
133
+ let pq2: vec2f = v2 - e2 * clamp(dot(v2, e2) / dot(e2, e2), 0.0, 1.0);
134
+ let s: f32 = sign(e0.x * e2.y - e0.y * e2.x);
135
+ let d: vec2f = min(min(vec2f(dot(pq0, pq0), s * (v0.x * e0.y - v0.y * e0.x)), vec2f(dot(pq1, pq1), s * (v1.x * e1.y - v1.y * e1.x))), vec2f(dot(pq2, pq2), s * (v2.x * e2.y - v2.y * e2.x)));
136
+ return -sqrt(d.x) * sign(d.y);
137
+ }
138
+ `,
139
+ `
140
+ fn sdUnevenCapsule(pIn: vec2f, r1: f32, r2: f32, h: f32) -> f32 {
141
+ var p: vec2f = pIn;
142
+ p.x = abs(p.x);
143
+ let b: f32 = (r1 - r2) / h;
144
+ let a: f32 = sqrt(1.0 - b * b);
145
+ let k: f32 = dot(p, vec2f(-b, a));
146
+ if (k < 0.0) {
147
+ return length(p) - r1;
148
+ }
149
+ if (k > a * h) {
150
+ return length(p - vec2f(0.0, h)) - r2;
151
+ }
152
+ return dot(p, vec2f(a, b)) - r1;
153
+ }
154
+ `,
155
+ `
156
+ fn sdPentagon(pIn: vec2f, r: f32) -> f32 {
157
+ var p: vec2f = pIn;
158
+ let k: vec3f = vec3f(0.809016994, 0.587785252, 0.726542528);
159
+ p.x = abs(p.x);
160
+ p -= 2.0 * min(dot(vec2f(-k.x, k.y), p), 0.0) * vec2f(-k.x, k.y);
161
+ p -= 2.0 * min(dot(vec2f(k.x, k.y), p), 0.0) * vec2f(k.x, k.y);
162
+ p -= vec2f(clamp(p.x, -r * k.z, r * k.z), r);
163
+ return length(p) * sign(p.y);
164
+ }
165
+ `,
166
+ `
167
+ fn sdHexagon(pIn: vec2f, r: f32) -> f32 {
168
+ var p: vec2f = pIn;
169
+ let k: vec3f = vec3f(-0.866025404, 0.5, 0.577350269);
170
+ p = abs(p);
171
+ p -= 2.0 * min(dot(k.xy, p), 0.0) * k.xy;
172
+ p -= vec2f(clamp(p.x, -k.z * r, k.z * r), r);
173
+ return length(p) * sign(p.y);
174
+ }
175
+ `,
176
+ `
177
+ fn sdOctogon(pIn: vec2f, r: f32) -> f32 {
178
+ var p: vec2f = pIn;
179
+ let k: vec3f = vec3f(-0.9238795325, 0.3826834323, 0.4142135623);
180
+ p = abs(p);
181
+ p -= 2.0 * min(dot(vec2f(k.x, k.y), p), 0.0) * vec2f(k.x, k.y);
182
+ p -= 2.0 * min(dot(vec2f(-k.x, k.y), p), 0.0) * vec2f(-k.x, k.y);
183
+ p -= vec2f(clamp(p.x, -k.z * r, k.z * r), r);
184
+ return length(p) * sign(p.y);
185
+ }
186
+ `,
187
+ `
188
+ fn sdHexagram(pIn: vec2f, r: f32) -> f32 {
189
+ var p: vec2f = pIn;
190
+ let k: vec4f = vec4f(-0.5, 0.8660254038, 0.5773502692, 1.7320508076);
191
+ p = abs(p);
192
+ p -= 2.0 * min(dot(k.xy, p), 0.0) * k.xy;
193
+ p -= 2.0 * min(dot(k.yx, p), 0.0) * k.yx;
194
+ p -= vec2f(clamp(p.x, r * k.z, r * k.w), r);
195
+ return length(p) * sign(p.y);
196
+ }
197
+ `,
198
+ `
199
+ fn sdStar5(pIn: vec2f, r: f32, rf: f32) -> f32 {
200
+ var p: vec2f = pIn;
201
+ let k1: vec2f = vec2f(0.809016994375, -0.587785252292);
202
+ let k2: vec2f = vec2f(-k1.x, k1.y);
203
+ p.x = abs(p.x);
204
+ p -= 2.0 * max(dot(k1, p), 0.0) * k1;
205
+ p -= 2.0 * max(dot(k2, p), 0.0) * k2;
206
+ p.x = abs(p.x);
207
+ p.y -= r;
208
+ let ba: vec2f = rf * vec2f(-k1.y, k1.x) - vec2f(0.0, 1.0);
209
+ let h: f32 = clamp(dot(p, ba) / dot(ba, ba), 0.0, r);
210
+ return length(p - ba * h) * sign(p.y * ba.x - p.x * ba.y);
211
+ }
212
+ `,
213
+ `
214
+ fn sdStar(pIn: vec2f, r: f32, n: i32, m: f32) -> f32 {
215
+ var p: vec2f = pIn;
216
+ let an: f32 = 3.141593 / f32(n);
217
+ let en: f32 = 3.141593 / m;
218
+ let acs: vec2f = vec2f(cos(an), sin(an));
219
+ let ecs: vec2f = vec2f(cos(en), sin(en));
220
+ let bn: f32 = glslMod(atan2(p.x, p.y), 2.0 * an) - an;
221
+ p = length(p) * vec2f(cos(bn), abs(sin(bn)));
222
+ p -= r * acs;
223
+ p += ecs * clamp(-dot(p, ecs), 0.0, r * acs.y / ecs.y);
224
+ return length(p) * sign(p.x);
225
+ }
226
+ `,
227
+ `
228
+ fn sdPie(pIn: vec2f, c: vec2f, r: f32) -> f32 {
229
+ var p: vec2f = pIn;
230
+ p.x = abs(p.x);
231
+ let l: f32 = length(p) - r;
232
+ let m: f32 = length(p - c * clamp(dot(p, c), 0.0, r));
233
+ return max(l, m * sign(c.y * p.x - c.x * p.y));
234
+ }
235
+ `,
236
+ `
237
+ fn sdCutDisk(pIn: vec2f, r: f32, h: f32) -> f32 {
238
+ var p: vec2f = pIn;
239
+ let w: f32 = sqrt(r * r - h * h);
240
+ p.x = abs(p.x);
241
+ let s: f32 = max((h - r) * p.x * p.x + w * w * (h + r - 2.0 * p.y), h * p.x - w * p.y);
242
+ return select(select(length(p - vec2f(w, h)), h - p.y, (p.x < w)), length(p) - r, (s < 0.0));
243
+ }
244
+ `,
245
+ `
246
+ fn sdArc(pIn: vec2f, sc: vec2f, ra: f32, rb: f32) -> f32 {
247
+ var p: vec2f = pIn;
248
+ p.x = abs(p.x);
249
+ return (select(abs(length(p) - ra), length(p - sc * ra), (sc.y * p.x > sc.x * p.y))) - rb;
250
+ }
251
+ `,
252
+ `
253
+ fn sdRing(pIn: vec2f, n: vec2f, r: f32, th: f32) -> f32 {
254
+ var p: vec2f = pIn;
255
+ p.x = abs(p.x);
256
+ p = vec2f(p.x * n.x + p.y * (-n.y), p.x * n.y + p.y * n.x);
257
+ return max(abs(length(p) - r) - th * 0.5, length(vec2f(p.x, max(0.0, abs(r - p.y) - th * 0.5))) * sign(p.x));
258
+ }
259
+ `,
260
+ `
261
+ fn sdHorseshoe(pIn: vec2f, c: vec2f, r: f32, w: vec2f) -> f32 {
262
+ var p: vec2f = pIn;
263
+ p.x = abs(p.x);
264
+ let l: f32 = length(p);
265
+ p = vec2f(p.x * (-c.x) + p.y * c.y, p.x * c.y + p.y * c.x);
266
+ p = vec2f(select(l * sign(-c.x), p.x, (p.y > 0.0 || p.x > 0.0)), select(l, p.y, (p.x > 0.0)));
267
+ p = vec2f(p.x, abs(p.y - r)) - w;
268
+ return length(max(p, vec2f(0.0))) + min(0.0, max(p.x, p.y));
269
+ }
270
+ `,
271
+ `
272
+ fn sdVesica(pIn: vec2f, r: f32, d: f32) -> f32 {
273
+ var p: vec2f = pIn;
274
+ p = abs(p);
275
+ let b: f32 = sqrt(r * r - d * d);
276
+ return select(length(p - vec2f(-d, 0.0)) - r, length(p - vec2f(0.0, b)), ((p.y - b) * d > p.x * b));
277
+ }
278
+ `,
279
+ `
280
+ fn sdOrientedVesica(p: vec2f, a: vec2f, b: vec2f, w: f32) -> f32 {
281
+ let r: f32 = 0.5 * length(b - a);
282
+ let d: f32 = 0.5 * (r * r - w * w) / w;
283
+ let v: vec2f = (b - a) / r;
284
+ let c: vec2f = (b + a) * 0.5;
285
+ let q: vec2f = 0.5 * abs(vec2f((p - c).x * v.y + (p - c).y * (-v.x), (p - c).x * v.x + (p - c).y * v.y));
286
+ let h: vec3f = select(vec3f(-d, 0.0, d + w), vec3f(0.0, r, 0.0), (r * q.x < d * (q.y - r)));
287
+ return length(q - h.xy) - h.z;
288
+ }
289
+ `,
290
+ `
291
+ fn sdMoon(pIn: vec2f, d: f32, ra: f32, rb: f32) -> f32 {
292
+ var p: vec2f = pIn;
293
+ p.y = abs(p.y);
294
+ let a: f32 = (ra * ra - rb * rb + d * d) / (2.0 * d);
295
+ let b: f32 = sqrt(max(ra * ra - a * a, 0.0));
296
+ if (d * (p.x * b - p.y * a) > d * d * max(b - p.y, 0.0)) {
297
+ return length(p - vec2f(a, b));
298
+ }
299
+ return max(length(p) - ra, -(length(p - vec2f(d, 0.0)) - rb));
300
+ }
301
+ `,
302
+ `
303
+ fn sdRoundedCross(pIn: vec2f, h: f32) -> f32 {
304
+ var p: vec2f = pIn;
305
+ let k: f32 = 0.5 * (h + 1.0 / h);
306
+ p = abs(p);
307
+ return select(sqrt(min(dot2(p - vec2f(0.0, h)), dot2(p - vec2f(1.0, 0.0)))), k - sqrt(dot2(p - vec2f(1.0, k))), (p.x < 1.0 && p.y < p.x * (k - h) + h));
308
+ }
309
+ `,
310
+ `
311
+ fn sdEgg(pIn: vec2f, he: f32, ra: f32, rb: f32, bu: f32) -> f32 {
312
+ var p: vec2f = pIn;
313
+ let r: f32 = 0.5 * (he + ra + rb) / bu;
314
+ let da: f32 = r - ra;
315
+ let db: f32 = r - rb;
316
+ let y: f32 = (db * db - da * da - he * he) / (2.0 * he);
317
+ let x: f32 = sqrt(max(da * da - y * y, 0.0));
318
+ p.x = abs(p.x);
319
+ p.y += 0.5 * (he + rb - ra);
320
+ let k: f32 = p.y * x - p.x * y;
321
+ if (k > 0.0 && k < he * (p.x + x)) {
322
+ return length(p + vec2f(x, y)) - r;
323
+ }
324
+ return min(length(p) - ra, length(vec2f(p.x, p.y - he)) - rb);
325
+ }
326
+ `,
327
+ `
328
+ fn sdHeart(pIn: vec2f) -> f32 {
329
+ var p: vec2f = pIn;
330
+ p.x = abs(p.x);
331
+ if (p.y + p.x > 1.0) {
332
+ return sqrt(dot(p - vec2f(0.25, 0.75), p - vec2f(0.25, 0.75))) - sqrt(2.0) / 4.0;
333
+ }
334
+ return sqrt(min(dot(p - vec2f(0.00, 1.00), p - vec2f(0.00, 1.00)), dot(p - 0.5 * max(p.x + p.y, 0.0), p - 0.5 * max(p.x + p.y, 0.0)))) * sign(p.x - p.y);
335
+ }
336
+ `,
337
+ `
338
+ fn sdCross(pIn: vec2f, b: vec2f, r: f32) -> f32 {
339
+ var p: vec2f = pIn;
340
+ p = abs(p);
341
+ p = select(p.xy, p.yx, (p.y > p.x));
342
+ let q: vec2f = p - b;
343
+ let k: f32 = max(q.y, q.x);
344
+ let w: vec2f = select(vec2f(b.y - p.x, -k), q, (k > 0.0));
345
+ return sign(k) * length(max(w, vec2f(0.0))) + r;
346
+ }
347
+ `,
348
+ `
349
+ fn sdRoundedX(pIn: vec2f, w: f32, r: f32) -> f32 {
350
+ var p: vec2f = pIn;
351
+ p = abs(p);
352
+ return length(p - min(p.x + p.y, w) * 0.5) - r;
353
+ }
354
+ `,
355
+ `
356
+ fn sdEllipse(pIn: vec2f, abIn: vec2f) -> f32 {
357
+ var p: vec2f = pIn;
358
+ var ab: vec2f = abIn;
359
+ p = abs(p);
360
+ if (p.x > p.y) {
361
+ p = p.yx;
362
+ ab = ab.yx;
363
+ }
364
+ let l: f32 = ab.y * ab.y - ab.x * ab.x;
365
+ let m: f32 = ab.x * p.x / l;
366
+ let m2: f32 = m * m;
367
+ let n: f32 = ab.y * p.y / l;
368
+ let n2: f32 = n * n;
369
+ let c: f32 = (m2 + n2 - 1.0) / 3.0;
370
+ let c3: f32 = c * c * c;
371
+ let q: f32 = c3 + m2 * n2 * 2.0;
372
+ let d: f32 = c3 + m2 * n2;
373
+ let g: f32 = m + m * n2;
374
+ var co: f32;
375
+ if (d < 0.0) {
376
+ let h: f32 = acos(q / c3) / 3.0;
377
+ let s: f32 = cos(h);
378
+ let t: f32 = sin(h) * sqrt(3.0);
379
+ let rx: f32 = sqrt(-c * (s + t + 2.0) + m2);
380
+ let ry: f32 = sqrt(-c * (s - t + 2.0) + m2);
381
+ co = (ry + sign(l) * rx + abs(g) / (rx * ry) - m) / 2.0;
382
+ } else {
383
+ let h: f32 = 2.0 * m * n * sqrt(d);
384
+ let s: f32 = sign(q + h) * pow(abs(q + h), 1.0 / 3.0);
385
+ let u: f32 = sign(q - h) * pow(abs(q - h), 1.0 / 3.0);
386
+ let rx: f32 = -s - u - c * 4.0 + 2.0 * m2;
387
+ let ry: f32 = (s - u) * sqrt(3.0);
388
+ let rm: f32 = sqrt(rx * rx + ry * ry);
389
+ co = (ry / sqrt(rm - rx) + 2.0 * g / rm - m) / 2.0;
390
+ }
391
+ let r: vec2f = ab * vec2f(co, sqrt(1.0 - co * co));
392
+ return length(r - p) * sign(p.y - r.y);
393
+ }
394
+ `,
395
+ `
396
+ fn sdParabola(posIn: vec2f, k: f32) -> f32 {
397
+ var pos: vec2f = posIn;
398
+ pos.x = abs(pos.x);
399
+ let ik: f32 = 1.0 / k;
400
+ let p: f32 = ik * (pos.y - 0.5 * ik) / 3.0;
401
+ let q: f32 = 0.25 * ik * ik * pos.x;
402
+ let h: f32 = q * q - p * p * p;
403
+ let r: f32 = sqrt(abs(h));
404
+ let x: f32 = select(2.0 * cos(atan(r / q) / 3.0) * sqrt(p), pow(q + r, 1.0 / 3.0) - pow(abs(q - r), 1.0 / 3.0) * sign(r - q), (h > 0.0));
405
+ return length(pos - vec2f(x, k * x * x)) * sign(pos.x - x);
406
+ }
407
+ `,
408
+ `
409
+ fn sdParabolaSegment(posIn: vec2f, wi: f32, he: f32) -> f32 {
410
+ var pos: vec2f = posIn;
411
+ pos.x = abs(pos.x);
412
+ let ik: f32 = wi * wi / he;
413
+ let p: f32 = ik * (he - pos.y - 0.5 * ik) / 3.0;
414
+ let q: f32 = pos.x * ik * ik * 0.25;
415
+ let h: f32 = q * q - p * p * p;
416
+ let r: f32 = sqrt(abs(h));
417
+ var x: f32 = select(2.0 * cos(atan(r / q) / 3.0) * sqrt(p), pow(q + r, 1.0 / 3.0) - pow(abs(q - r), 1.0 / 3.0) * sign(r - q), (h > 0.0));
418
+ x = min(x, wi);
419
+ return length(pos - vec2f(x, he - x * x / ik)) * sign(ik * (pos.y - he) + pos.x * pos.x);
420
+ }
421
+ `,
422
+ `
423
+ fn sdBezier(pos: vec2f, A: vec2f, B: vec2f, C: vec2f) -> f32 {
424
+ let a: vec2f = B - A;
425
+ let b: vec2f = A - 2.0 * B + C;
426
+ let c: vec2f = a * 2.0;
427
+ let d: vec2f = A - pos;
428
+ let kk: f32 = 1.0 / dot(b, b);
429
+ let kx: f32 = kk * dot(a, b);
430
+ let ky: f32 = kk * (2.0 * dot(a, a) + dot(d, b)) / 3.0;
431
+ let kz: f32 = kk * dot(d, a);
432
+ var res: f32 = 0.0;
433
+ let p: f32 = ky - kx * kx;
434
+ let p3: f32 = p * p * p;
435
+ let q: f32 = kx * (2.0 * kx * kx - 3.0 * ky) + kz;
436
+ var h: f32 = q * q + 4.0 * p3;
437
+ if (h >= 0.0) {
438
+ h = sqrt(h);
439
+ let x: vec2f = (vec2f(h, -h) - q) * 0.5;
440
+ let uv: vec2f = sign(x) * pow(abs(x), vec2f(1.0 / 3.0, 1.0 / 3.0));
441
+ let t: f32 = clamp(uv.x + uv.y - kx, 0.0, 1.0);
442
+ res = dot(d + (c + b * t) * t, d + (c + b * t) * t);
443
+ } else {
444
+ let z: f32 = sqrt(-p);
445
+ let v: f32 = acos(q / (p * z * 2.0)) / 3.0;
446
+ let m: f32 = cos(v);
447
+ let n: f32 = sin(v) * 1.732050808;
448
+ let t: vec3f = clamp(vec3f(m + m, -n - m, n - m) * z - kx, vec3f(0.0), vec3f(1.0));
449
+ res = min(dot(d + (c + b * t.x) * t.x, d + (c + b * t.x) * t.x), dot(d + (c + b * t.y) * t.y, d + (c + b * t.y) * t.y));
450
+ }
451
+ return sqrt(res);
452
+ }
453
+ `,
454
+ `
455
+ fn sdBlobbyCross(posIn: vec2f, he: f32) -> f32 {
456
+ var pos: vec2f = posIn;
457
+ pos = abs(pos);
458
+ pos = vec2f(abs(pos.x - pos.y), 1.0 - pos.x - pos.y) / sqrt(2.0);
459
+ let p: f32 = (he - pos.y - 0.25 / he) / (6.0 * he);
460
+ let q: f32 = pos.x / (he * he * 16.0);
461
+ let h: f32 = q * q - p * p * p;
462
+ var x: f32;
463
+ if (h > 0.0) {
464
+ let r: f32 = sqrt(h);
465
+ x = pow(q + r, 1.0 / 3.0) - pow(abs(q - r), 1.0 / 3.0) * sign(r - q);
466
+ } else {
467
+ let r: f32 = sqrt(p);
468
+ x = 2.0 * r * cos(acos(q / (p * r)) / 3.0);
469
+ }
470
+ x = min(x, sqrt(2.0) / 2.0);
471
+ let z: vec2f = vec2f(x, he * (1.0 - 2.0 * x * x)) - pos;
472
+ return length(z) * sign(z.y);
473
+ }
474
+ `,
475
+ `
476
+ fn sdTunnel(pIn: vec2f, wh: vec2f) -> f32 {
477
+ var p: vec2f = pIn;
478
+ p.x = abs(p.x);
479
+ p.y = -p.y;
480
+ var q: vec2f = p - wh;
481
+ let d1: f32 = dot(vec2f(max(q.x, 0.0), q.y), vec2f(max(q.x, 0.0), q.y));
482
+ q.x = select(length(p) - wh.x, q.x, (p.y > 0.0));
483
+ let d2: f32 = dot(vec2f(q.x, max(q.y, 0.0)), vec2f(q.x, max(q.y, 0.0)));
484
+ let d: f32 = sqrt(min(d1, d2));
485
+ return select(d, -d, (max(q.x, q.y) < 0.0));
486
+ }
487
+ `,
488
+ `
489
+ fn sdStairs(pIn: vec2f, wh: vec2f, n: f32) -> f32 {
490
+ var p: vec2f = pIn;
491
+ let ba: vec2f = wh * n;
492
+ var d: f32 = min(dot(p - vec2f(clamp(p.x, 0.0, ba.x), 0.0), p - vec2f(clamp(p.x, 0.0, ba.x), 0.0)), dot(p - vec2f(ba.x, clamp(p.y, 0.0, ba.y)), p - vec2f(ba.x, clamp(p.y, 0.0, ba.y))));
493
+ var s: f32 = sign(max(-p.y, p.x - ba.x));
494
+ let dia: f32 = length(wh);
495
+ p = vec2f(p.x * wh.x + p.y * wh.y, p.x * (-wh.y) + p.y * wh.x) / dia;
496
+ let id: f32 = clamp(round(p.x / dia), 0.0, n - 1.0);
497
+ p.x = p.x - id * dia;
498
+ p = vec2f(p.x * wh.x + p.y * (-wh.y), p.x * wh.y + p.y * wh.x) / dia;
499
+ let hh: f32 = wh.y / 2.0;
500
+ p.y -= hh;
501
+ if (p.y > hh * sign(p.x)) {
502
+ s = 1.0;
503
+ }
504
+ p = select(-p, p, (id < 0.5 || p.x > 0.0));
505
+ d = min(d, dot(p - vec2f(0.0, clamp(p.y, -hh, hh)), p - vec2f(0.0, clamp(p.y, -hh, hh))));
506
+ d = min(d, dot(p - vec2f(clamp(p.x, 0.0, wh.x), hh), p - vec2f(clamp(p.x, 0.0, wh.x), hh)));
507
+ return sqrt(d) * s;
508
+ }
509
+ `,
510
+ `
511
+ fn sdQuadraticCircle(pIn: vec2f) -> f32 {
512
+ var p: vec2f = pIn;
513
+ p = abs(p);
514
+ if (p.y > p.x) {
515
+ p = p.yx;
516
+ }
517
+ let a: f32 = p.x - p.y;
518
+ let b: f32 = p.x + p.y;
519
+ let c: f32 = (2.0 * b - 1.0) / 3.0;
520
+ var h: f32 = a * a + c * c * c;
521
+ var t: f32;
522
+ if (h >= 0.0) {
523
+ h = sqrt(h);
524
+ t = sign(h - a) * pow(abs(h - a), 1.0 / 3.0) - pow(h + a, 1.0 / 3.0);
525
+ } else {
526
+ let z: f32 = sqrt(-c);
527
+ let v: f32 = acos(a / (c * z)) / 3.0;
528
+ t = -z * (cos(v) + sin(v) * 1.732050808);
529
+ }
530
+ t *= 0.5;
531
+ let w: vec2f = vec2f(-t, t) + 0.75 - t * t - p;
532
+ return length(w) * sign(a * a * 0.5 + b - 1.5);
533
+ }
534
+ `,
535
+ `
536
+ fn sdHyberbola(pIn: vec2f, k: f32, he: f32) -> f32 {
537
+ var p: vec2f = pIn;
538
+ p = abs(p);
539
+ p = vec2f(p.x - p.y, p.x + p.y) / sqrt(2.0);
540
+ let x2: f32 = p.x * p.x / 16.0;
541
+ let y2: f32 = p.y * p.y / 16.0;
542
+ let r: f32 = k * (4.0 * k - p.x * p.y) / 12.0;
543
+ let q: f32 = (x2 - y2) * k * k;
544
+ let h: f32 = q * q + r * r * r;
545
+ var u: f32;
546
+ if (h < 0.0) {
547
+ let m: f32 = sqrt(-r);
548
+ u = m * cos(acos(q / (r * m)) / 3.0);
549
+ } else {
550
+ let m: f32 = pow(sqrt(h) - q, 1.0 / 3.0);
551
+ u = (m - r / m) / 2.0;
552
+ }
553
+ let w: f32 = sqrt(u + x2);
554
+ let b: f32 = k * p.y - x2 * p.x * 2.0;
555
+ var t: f32 = p.x / 4.0 - w + sqrt(2.0 * x2 - u + b / w / 4.0);
556
+ t = max(t, sqrt(he * he * 0.5 + k) - he / sqrt(2.0));
557
+ return length(p - vec2f(t, k / t)) * sign(select(-1.0, 1.0, p.x * p.y < k));
558
+ }
559
+ `,
560
+ `
561
+ fn sdCoolS(pIn: vec2f) -> f32 {
562
+ var p: vec2f = pIn;
563
+ let six: f32 = select(p.x, -p.x, (p.y < 0.0));
564
+ p.x = abs(p.x);
565
+ p.y = abs(p.y) - 0.2;
566
+ let rex: f32 = p.x - min(round(p.x / 0.4), 0.4);
567
+ let aby: f32 = abs(p.y - 0.2) - 0.6;
568
+ var d: f32 = dot2(vec2f(six, -p.y) - clamp(0.5 * (six - p.y), 0.0, 0.2));
569
+ d = min(d, dot2(vec2f(p.x, -aby) - clamp(0.5 * (p.x - aby), 0.0, 0.4)));
570
+ d = min(d, dot2(vec2f(rex, p.y - clamp(p.y, 0.0, 0.4))));
571
+ let s: f32 = 2.0 * p.x + aby + abs(aby + 0.4) - 0.4;
572
+ return sqrt(d) * sign(s);
573
+ }
574
+ `,
575
+ `
576
+ fn sdCircleWave(pIn: vec2f, tbIn: f32, ra: f32) -> f32 {
577
+ var p: vec2f = pIn;
578
+ var tb: f32 = tbIn;
579
+ tb = 3.1415927 * 5.0 / 6.0 * max(tb, 0.0001);
580
+ let co: vec2f = ra * vec2f(sin(tb), cos(tb));
581
+ p.x = abs(glslMod(p.x, co.x * 4.0) - co.x * 2.0);
582
+ let p1: vec2f = p;
583
+ let p2: vec2f = vec2f(abs(p.x - 2.0 * co.x), -p.y + 2.0 * co.y);
584
+ let d1: f32 = (select(abs(length(p1) - ra), length(p1 - co), (co.y * p1.x > co.x * p1.y)));
585
+ let d2: f32 = (select(abs(length(p2) - ra), length(p2 - co), (co.y * p2.x > co.x * p2.y)));
586
+ return min(d1, d2);
587
+ }
588
+ `,
589
+ `
590
+ fn onejsHash21(pIn: vec2f, seed: f32) -> f32 {
591
+ var p: vec2f = pIn;
592
+ p = fract(p * vec2f(123.34, 456.21) + seed * 0.1731);
593
+ p += dot(p, p + 45.32);
594
+ return fract(p.x * p.y);
595
+ }
596
+ `,
597
+ `
598
+ fn onejsVNoise(p: vec2f, seed: f32) -> f32 {
599
+ let i: vec2f = floor(p);
600
+ var f: vec2f = fract(p);
601
+ f = f * f * (3.0 - 2.0 * f);
602
+ let a: f32 = onejsHash21(i, seed);
603
+ let b: f32 = onejsHash21(i + vec2f(1.0, 0.0), seed);
604
+ let c: f32 = onejsHash21(i + vec2f(0.0, 1.0), seed);
605
+ let d: f32 = onejsHash21(i + vec2f(1.0, 1.0), seed);
606
+ return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
607
+ }
608
+ `,
609
+ `
610
+ fn onejsFbm_f2_f_i_f_f(pIn: vec2f, seed: f32, octaves: i32, lacunarity: f32, gain: f32) -> f32 {
611
+ var p: vec2f = pIn;
612
+ var sum: f32 = 0.0;
613
+ var amp: f32 = 0.5;
614
+ var norm: f32 = 0.0;
615
+ for (var o: i32 = 0; o < 4; o++) {
616
+ if (o >= octaves) {
617
+ break;
618
+ }
619
+ sum += onejsVNoise(p, seed + f32(o) * 19.0) * amp;
620
+ norm += amp;
621
+ p *= lacunarity;
622
+ amp *= gain;
623
+ }
624
+ return sum / max(norm, 1e-4);
625
+ }
626
+ `,
627
+ `
628
+ fn onejsFbm_f2_f_i(p: vec2f, seed: f32, octaves: i32) -> f32 {
629
+ return onejsFbm_f2_f_i_f_f(p, seed, octaves, 2.0, 0.5);
630
+ }
631
+ `,
632
+ `
633
+ fn onejsMod289_f2(x: vec2f) -> vec2f {
634
+ return x - floor(x * (1.0 / 289.0)) * 289.0;
635
+ }
636
+ `,
637
+ `
638
+ fn onejsMod289_f3(x: vec3f) -> vec3f {
639
+ return x - floor(x * (1.0 / 289.0)) * 289.0;
640
+ }
641
+ `,
642
+ `
643
+ fn onejsPermute(x: vec3f) -> vec3f {
644
+ return onejsMod289_f3(((x * 34.0) + 1.0) * x);
645
+ }
646
+ `,
647
+ `
648
+ fn onejsSimplexRaw(v: vec2f) -> f32 {
649
+ let C: vec4f = vec4f(0.211324865405187, 0.366025403784439, -0.577350269189626, 0.024390243902439);
650
+ var i: vec2f = floor(v + dot(v, C.yy));
651
+ let x0: vec2f = v - i + dot(i, C.xx);
652
+ let i1: vec2f = select(vec2f(0.0, 1.0), vec2f(1.0, 0.0), (x0.x > x0.y));
653
+ var x12: vec4f = x0.xyxy + C.xxzz;
654
+ {
655
+ let sl_v: vec2f = x12.xy - i1;
656
+ x12 = vec4f(sl_v.x, sl_v.y, x12.z, x12.w);
657
+ }
658
+ i = onejsMod289_f2(i);
659
+ let p: vec3f = onejsPermute(onejsPermute(i.y + vec3f(0.0, i1.y, 1.0)) + i.x + vec3f(0.0, i1.x, 1.0));
660
+ var m: vec3f = max(0.5 - vec3f(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), vec3f(0.0));
661
+ m = m * m;
662
+ m = m * m;
663
+ let x: vec3f = 2.0 * fract(p * C.www) - 1.0;
664
+ let h: vec3f = abs(x) - 0.5;
665
+ let ox: vec3f = floor(x + 0.5);
666
+ let a0: vec3f = x - ox;
667
+ m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h);
668
+ var g: vec3f;
669
+ g.x = a0.x * x0.x + h.x * x0.y;
670
+ {
671
+ let sl_v: vec2f = a0.yz * x12.xz + h.yz * x12.yw;
672
+ g = vec3f(g.x, sl_v.x, sl_v.y);
673
+ }
674
+ return 130.0 * dot(m, g);
675
+ }
676
+ `,
677
+ `
678
+ fn onejsSimplex(p: vec2f, seed: f32) -> f32 {
679
+ return onejsSimplexRaw(p + seed * 137.13) * 0.5 + 0.5;
680
+ }
681
+ `,
682
+ `
683
+ fn onejsFbmSimplex(pIn: vec2f, seed: f32, octaves: i32, lacunarity: f32, gain: f32) -> f32 {
684
+ var p: vec2f = pIn;
685
+ var sum: f32 = 0.0;
686
+ var amp: f32 = 0.5;
687
+ var norm: f32 = 0.0;
688
+ for (var o: i32 = 0; o < 4; o++) {
689
+ if (o >= octaves) {
690
+ break;
691
+ }
692
+ sum += onejsSimplex(p, seed + f32(o) * 19.0) * amp;
693
+ norm += amp;
694
+ p *= lacunarity;
695
+ amp *= gain;
696
+ }
697
+ return sum / max(norm, 1e-4);
698
+ }
699
+ `,
700
+ `
701
+ fn onejsTurbulence(pIn: vec2f, seed: f32, octaves: i32, lacunarity: f32, gain: f32) -> f32 {
702
+ var p: vec2f = pIn;
703
+ var sum: f32 = 0.0;
704
+ var amp: f32 = 0.5;
705
+ var norm: f32 = 0.0;
706
+ for (var o: i32 = 0; o < 4; o++) {
707
+ if (o >= octaves) {
708
+ break;
709
+ }
710
+ sum += abs(onejsSimplexRaw(p + (seed + f32(o) * 19.0) * 137.13)) * amp;
711
+ norm += amp;
712
+ p *= lacunarity;
713
+ amp *= gain;
714
+ }
715
+ return sum / max(norm, 1e-4);
716
+ }
717
+ `,
718
+ `
719
+ fn onejsRidged(pIn: vec2f, seed: f32, octaves: i32, lacunarity: f32, gain: f32) -> f32 {
720
+ var p: vec2f = pIn;
721
+ var sum: f32 = 0.0;
722
+ var amp: f32 = 0.5;
723
+ var norm: f32 = 0.0;
724
+ for (var o: i32 = 0; o < 4; o++) {
725
+ if (o >= octaves) {
726
+ break;
727
+ }
728
+ let r: f32 = 1.0 - abs(onejsSimplexRaw(p + (seed + f32(o) * 19.0) * 137.13));
729
+ sum += r * r * amp;
730
+ norm += amp;
731
+ p *= lacunarity;
732
+ amp *= gain;
733
+ }
734
+ return sum / max(norm, 1e-4);
735
+ }
736
+ `,
737
+ `
738
+ fn onejsFbmKind(kind: i32, p: vec2f, seed: f32, octaves: i32, lacunarity: f32, gain: f32) -> f32 {
739
+ if (kind == 2) {
740
+ return onejsTurbulence(p, seed, octaves, lacunarity, gain);
741
+ }
742
+ if (kind == 3) {
743
+ return onejsRidged(p, seed, octaves, lacunarity, gain);
744
+ }
745
+ return select(onejsFbm_f2_f_i_f_f(p, seed, octaves, lacunarity, gain), onejsFbmSimplex(p, seed, octaves, lacunarity, gain), kind == 1);
746
+ }
747
+ `,
748
+ `
749
+ fn sl_hash21(pIn: vec2f) -> f32 {
750
+ var p: vec2f = pIn;
751
+ p = fract(p * vec2f(123.34, 456.21));
752
+ p += dot(p, p + 45.32);
753
+ return fract(p.x * p.y);
754
+ }
755
+ `,
756
+ `
757
+ fn sl_valueNoise(p: vec2f) -> f32 {
758
+ return onejsVNoise(p, 0.0);
759
+ }
760
+ `,
761
+ `
762
+ fn sl_simplex(p: vec2f) -> f32 {
763
+ return onejsSimplex(p, 0.0);
764
+ }
765
+ `,
766
+ `
767
+ fn sl_fbm(p: vec2f, octaves: i32, kind: i32) -> f32 {
768
+ return onejsFbmKind(kind, p, 0.0, clamp(octaves, 1, 4), 2.0, 0.5);
769
+ }
770
+ `,
771
+ `
772
+ fn sl_hsv2rgb(c: vec3f) -> vec3f {
773
+ let K: vec4f = vec4f(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
774
+ let p: vec3f = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
775
+ return c.z * mix(K.xxx, saturate(p - K.xxx), vec3f(c.y));
776
+ }
777
+ `,
778
+ `
779
+ fn sl_sdfDistance(id: i32, p: vec2f, a: vec4f, b: vec2f) -> f32 {
780
+ switch (id) {
781
+ case 0: {
782
+ return sdCircle(p, a.x);
783
+ }
784
+ case 1: {
785
+ return sdRoundedBox(p, a.xy, vec4f(a.z, a.w, b.x, b.y));
786
+ }
787
+ case 2: {
788
+ return sdBox(p, a.xy);
789
+ }
790
+ case 3: {
791
+ return sdOrientedBox(p, a.xy, a.zw, b.x);
792
+ }
793
+ case 4: {
794
+ return sdSegment(p, a.xy, a.zw);
795
+ }
796
+ case 5: {
797
+ return sdRhombus(p, a.xy);
798
+ }
799
+ case 6: {
800
+ return sdTrapezoid(p, a.x, a.y, a.z);
801
+ }
802
+ case 7: {
803
+ return sdParallelogram(p, a.x, a.y, a.z);
804
+ }
805
+ case 8: {
806
+ return sdEquilateralTriangle(p, a.x);
807
+ }
808
+ case 9: {
809
+ return sdTriangleIsosceles(p, a.xy);
810
+ }
811
+ case 10: {
812
+ return sdTriangle(p, a.xy, a.zw, b.xy);
813
+ }
814
+ case 11: {
815
+ return sdUnevenCapsule(p, a.x, a.y, a.z);
816
+ }
817
+ case 12: {
818
+ return sdPentagon(p, a.x);
819
+ }
820
+ case 13: {
821
+ return sdHexagon(p, a.x);
822
+ }
823
+ case 14: {
824
+ return sdOctogon(p, a.x);
825
+ }
826
+ case 15: {
827
+ return sdHexagram(p, a.x);
828
+ }
829
+ case 16: {
830
+ return sdStar5(p, a.x, a.y);
831
+ }
832
+ case 17: {
833
+ return sdStar(p, a.x, i32(a.y), a.z);
834
+ }
835
+ case 18: {
836
+ return sdPie(p, a.xy, a.z);
837
+ }
838
+ case 19: {
839
+ return sdCutDisk(p, a.x, a.y);
840
+ }
841
+ case 20: {
842
+ return sdArc(p, a.xy, a.z, a.w);
843
+ }
844
+ case 21: {
845
+ return sdRing(p, a.xy, a.z, a.w);
846
+ }
847
+ case 22: {
848
+ return sdHorseshoe(p, a.xy, a.z, vec2f(a.w, b.x));
849
+ }
850
+ case 23: {
851
+ return sdVesica(p, a.x, a.y);
852
+ }
853
+ case 24: {
854
+ return sdOrientedVesica(p, a.xy, a.zw, b.x);
855
+ }
856
+ case 25: {
857
+ return sdMoon(p, a.x, a.y, a.z);
858
+ }
859
+ case 26: {
860
+ return sdRoundedCross(p, a.x);
861
+ }
862
+ case 27: {
863
+ return sdEgg(p, a.x, a.y, a.z, a.w);
864
+ }
865
+ case 28: {
866
+ return sdHeart(p);
867
+ }
868
+ case 29: {
869
+ return sdCross(p, a.xy, a.z);
870
+ }
871
+ case 30: {
872
+ return sdRoundedX(p, a.x, a.y);
873
+ }
874
+ case 31: {
875
+ return sdEllipse(p, a.xy);
876
+ }
877
+ case 32: {
878
+ return sdParabola(p, a.x);
879
+ }
880
+ case 33: {
881
+ return sdParabolaSegment(p, a.x, a.y);
882
+ }
883
+ case 34: {
884
+ return sdBezier(p, a.xy, a.zw, b.xy);
885
+ }
886
+ case 35: {
887
+ return sdBlobbyCross(p, a.x);
888
+ }
889
+ case 36: {
890
+ return sdTunnel(p, a.xy);
891
+ }
892
+ case 37: {
893
+ return sdStairs(p, a.xy, a.z);
894
+ }
895
+ case 38: {
896
+ return sdQuadraticCircle(p);
897
+ }
898
+ case 39: {
899
+ return sdHyberbola(p, a.x, a.y);
900
+ }
901
+ case 40: {
902
+ return sdCoolS(p);
903
+ }
904
+ case 41: {
905
+ return sdCircleWave(p, a.x, a.y);
906
+ }
907
+ default: {
908
+ return 1e6;
909
+ }
910
+ }
911
+ }
912
+ `,
913
+ `
914
+ fn sl_voronoi(p: vec2f) -> f32 {
915
+ let cell: vec2f = floor(p);
916
+ let f: vec2f = fract(p);
917
+ var best: f32 = 8.0;
918
+ for (var y: i32 = -1; y <= 1; y++) {
919
+ for (var x: i32 = -1; x <= 1; x++) {
920
+ let o: vec2f = vec2f(f32(x), f32(y));
921
+ let jitter: vec2f = vec2f(sl_hash21(cell + o), sl_hash21(cell + o + 37.7));
922
+ best = min(best, length(o + jitter - f));
923
+ }
924
+ }
925
+ return best;
926
+ }
927
+ `,
928
+ `
929
+ fn sl_luminance(c: vec3f) -> f32 {
930
+ return dot(c, vec3f(0.2126, 0.7152, 0.0722));
931
+ }
932
+ `,
933
+ `
934
+ fn sl_gammaToLinear(c: vec3f) -> vec3f {
935
+ return c * (c * (c * 0.305306011 + 0.682171111) + 0.012522878);
936
+ }
937
+ `,
938
+ `
939
+ fn sl_toLinear_f_gamma(c: f32) -> f32 {
940
+ return c;
941
+ }
942
+ fn sl_toLinear_f_linear(c: f32) -> f32 {
943
+ return sl_gammaToLinear(vec3f(c, 0.0, 0.0)).x;
944
+ }
945
+ fn sl_toLinear_f(c: f32) -> f32 {
946
+ if (sl.opt.x > 0.5) {
947
+ return sl_toLinear_f_linear(c);
948
+ }
949
+ return sl_toLinear_f_gamma(c);
950
+ }
951
+ `,
952
+ `
953
+ fn sl_toLinear_f2_gamma(c: vec2f) -> vec2f {
954
+ return c;
955
+ }
956
+ fn sl_toLinear_f2_linear(c: vec2f) -> vec2f {
957
+ return sl_gammaToLinear(vec3f(c, 0.0)).xy;
958
+ }
959
+ fn sl_toLinear_f2(c: vec2f) -> vec2f {
960
+ if (sl.opt.x > 0.5) {
961
+ return sl_toLinear_f2_linear(c);
962
+ }
963
+ return sl_toLinear_f2_gamma(c);
964
+ }
965
+ `,
966
+ `
967
+ fn sl_toLinear_f3_gamma(c: vec3f) -> vec3f {
968
+ return c;
969
+ }
970
+ fn sl_toLinear_f3_linear(c: vec3f) -> vec3f {
971
+ return sl_gammaToLinear(c);
972
+ }
973
+ fn sl_toLinear_f3(c: vec3f) -> vec3f {
974
+ if (sl.opt.x > 0.5) {
975
+ return sl_toLinear_f3_linear(c);
976
+ }
977
+ return sl_toLinear_f3_gamma(c);
978
+ }
979
+ `,
980
+ `
981
+ fn sl_toLinear_f4_gamma(c: vec4f) -> vec4f {
982
+ return c;
983
+ }
984
+ fn sl_toLinear_f4_linear(c: vec4f) -> vec4f {
985
+ return vec4f(sl_gammaToLinear(c.rgb), c.a);
986
+ }
987
+ fn sl_toLinear_f4(c: vec4f) -> vec4f {
988
+ if (sl.opt.x > 0.5) {
989
+ return sl_toLinear_f4_linear(c);
990
+ }
991
+ return sl_toLinear_f4_gamma(c);
992
+ }
993
+ `,
994
+ ]