onejs-sl 0.1.1 → 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.
package/src/weblib.ts DELETED
@@ -1,1303 +0,0 @@
1
- /**
2
- * The shader language's helpers, in GLSL ES 3.00 and WGSL, for the web
3
- * emitters in `web.ts`.
4
- *
5
- * A THIRD AND FOURTH COPY of what `SLCommon.cginc`, `Noise2D.cginc` and
6
- * `SDF2D.cginc` compute for the VM and the HLSL backend, translated by hand.
7
- * Nothing in a browser can compile HLSL, so the copies are the price of
8
- * compiling there at all, and what keeps them honest is the parity harness
9
- * (`Tools/sl-web-parity` in the container): every entry here is rendered
10
- * compiled and through the VM, on both web backends, and must agree within
11
- * 1/255. A translation that is plausible and wrong fails there, not in a game.
12
- *
13
- * Translation rules, applied everywhere below:
14
- * - HLSL `mul(v, float2x2(a, b, c, d))` is written out as
15
- * `(v.x * a + v.y * c, v.x * b + v.y * d)`: the row vector convention,
16
- * spelled so neither language's matrix layout can get it backwards.
17
- * - HLSL `fmod` truncates and GLSL `mod` floors. The shader language's `%`
18
- * is `fmod`, which `web.ts` writes inline as `a - b * trunc(a / b)`.
19
- * `glslMod` in SDF2D.cginc IS the floored one: GLSL `mod` already is, and
20
- * `sd_util` defines it for WGSL.
21
- * - WGSL has no overloading, no swizzle assignment, no ternary and immutable
22
- * parameters: `name1..name4` for widths, whole vector rebuilds, `select`,
23
- * and a `var` copy of any parameter the HLSL reassigns.
24
- *
25
- * Entries are in dependency order, so emitting the needed ones in list order
26
- * always defines a function before its first use.
27
- */
28
-
29
- export interface LibEntry {
30
- name: string
31
- deps: string[]
32
- glsl: string
33
- wgsl: string
34
- }
35
-
36
- /** SDF shape id to the entry name and how its parameters map onto `a` and `b`. */
37
- export interface SdfCall {
38
- fn: string
39
- /**
40
- * Each argument after `p`: indices into [a.x, a.y, a.z, a.w, b.x, b.y], or
41
- * `{ int: i }` for an integer parameter. The shader language always passes
42
- * `b` as zero; the slots exist because the dispatcher it mirrors has them.
43
- */
44
- args: Array<number[] | { int: number }>
45
- }
46
-
47
- export const SDF_CALLS: SdfCall[] = [
48
- { fn: "sdCircle", args: [[0]] },
49
- { fn: "sdRoundedBox", args: [[0, 1], [2, 3, 4, 5]] },
50
- { fn: "sdBox", args: [[0, 1]] },
51
- { fn: "sdOrientedBox", args: [[0, 1], [2, 3], [4]] },
52
- { fn: "sdSegment", args: [[0, 1], [2, 3]] },
53
- { fn: "sdRhombus", args: [[0, 1]] },
54
- { fn: "sdTrapezoid", args: [[0], [1], [2]] },
55
- { fn: "sdParallelogram", args: [[0], [1], [2]] },
56
- { fn: "sdEquilateralTriangle", args: [[0]] },
57
- { fn: "sdTriangleIsosceles", args: [[0, 1]] },
58
- { fn: "sdTriangle", args: [[0, 1], [2, 3], [4, 5]] },
59
- { fn: "sdUnevenCapsule", args: [[0], [1], [2]] },
60
- { fn: "sdPentagon", args: [[0]] },
61
- { fn: "sdHexagon", args: [[0]] },
62
- { fn: "sdOctogon", args: [[0]] },
63
- { fn: "sdHexagram", args: [[0]] },
64
- { fn: "sdStar5", args: [[0], [1]] },
65
- { fn: "sdStar", args: [[0], { int: 1 }, [2]] },
66
- { fn: "sdPie", args: [[0, 1], [2]] },
67
- { fn: "sdCutDisk", args: [[0], [1]] },
68
- { fn: "sdArc", args: [[0, 1], [2], [3]] },
69
- { fn: "sdRing", args: [[0, 1], [2], [3]] },
70
- { fn: "sdHorseshoe", args: [[0, 1], [2], [3, 4]] },
71
- { fn: "sdVesica", args: [[0], [1]] },
72
- { fn: "sdOrientedVesica", args: [[0, 1], [2, 3], [4]] },
73
- { fn: "sdMoon", args: [[0], [1], [2]] },
74
- { fn: "sdRoundedCross", args: [[0]] },
75
- { fn: "sdEgg", args: [[0], [1], [2], [3]] },
76
- { fn: "sdHeart", args: [] },
77
- { fn: "sdCross", args: [[0, 1], [2]] },
78
- { fn: "sdRoundedX", args: [[0], [1]] },
79
- { fn: "sdEllipse", args: [[0, 1]] },
80
- { fn: "sdParabola", args: [[0]] },
81
- { fn: "sdParabolaSegment", args: [[0], [1]] },
82
- { fn: "sdBezier", args: [[0, 1], [2, 3], [4, 5]] },
83
- { fn: "sdBlobbyCross", args: [[0]] },
84
- { fn: "sdTunnel", args: [[0, 1]] },
85
- { fn: "sdStairs", args: [[0, 1], [2]] },
86
- { fn: "sdQuadraticCircle", args: [] },
87
- { fn: "sdHyberbola", args: [[0], [1]] },
88
- { fn: "sdCoolS", args: [] },
89
- { fn: "sdCircleWave", args: [[0], [1]] },
90
- ]
91
-
92
- const e = (name: string, deps: string[], glsl: string, wgsl: string): LibEntry => ({ name, deps, glsl, wgsl })
93
-
94
- export const WEB_LIB: LibEntry[] = [
95
- // ---------------------------------------------------------------- colour
96
- e("sl_toLinear3", [], `
97
- vec3 sl_toLinear3(vec3 c) {
98
- if (sl_Opt.x < 0.5) return c;
99
- return c * (c * (c * 0.305306011 + 0.682171111) + 0.012522878);
100
- }`, `
101
- fn sl_toLinear3(c: vec3f) -> vec3f {
102
- if (sl.opt.x < 0.5) { return c; }
103
- return c * (c * (c * 0.305306011 + 0.682171111) + 0.012522878);
104
- }`),
105
- // Unity's cubic approximation at every width, as SLCommon.cginc has it:
106
- // the VM converts every width that way, so an exact curve for a scalar
107
- // drew up to 5/255 apart from it in the dark range.
108
- e("sl_toLinear1", ["sl_toLinear3"], `
109
- float sl_toLinear1(float c) { return sl_toLinear3(vec3(c, 0.0, 0.0)).x; }`, `
110
- fn sl_toLinear1(c: f32) -> f32 { return sl_toLinear3(vec3f(c, 0.0, 0.0)).x; }`),
111
- e("sl_toLinear2", ["sl_toLinear3"], `
112
- vec2 sl_toLinear2(vec2 c) { return sl_toLinear3(vec3(c, 0.0)).xy; }`, `
113
- fn sl_toLinear2(c: vec2f) -> vec2f { return sl_toLinear3(vec3f(c, 0.0)).xy; }`),
114
- e("sl_toLinear4", ["sl_toLinear3"], `
115
- vec4 sl_toLinear4(vec4 c) { return vec4(sl_toLinear3(c.rgb), c.a); }`, `
116
- fn sl_toLinear4(c: vec4f) -> vec4f { return vec4f(sl_toLinear3(c.rgb), c.a); }`),
117
- e("sl_hsv2rgb", [], `
118
- vec3 sl_hsv2rgb(vec3 c) {
119
- vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
120
- vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
121
- return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
122
- }`, `
123
- fn sl_hsv2rgb(c: vec3f) -> vec3f {
124
- let K = vec4f(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
125
- let p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
126
- return c.z * mix(K.xxx, saturate(p - K.xxx), vec3f(c.y));
127
- }`),
128
-
129
- // HLSL smoothstep is the formula, whatever the edge order. GLSL leaves
130
- // edge0 >= edge1 undefined, so the formula is written out in both.
131
- ...[1, 2, 3, 4].map((w) => {
132
- const g = w === 1 ? "float" : `vec${w}`
133
- const t = w === 1 ? "f32" : `vec${w}f`
134
- return e(`sl_smoothstep${w}`, [], `
135
- ${g} sl_smoothstep${w}(${g} a, ${g} b, ${g} x) {
136
- ${g} t = clamp((x - a) / (b - a), 0.0, 1.0);
137
- return t * t * (3.0 - 2.0 * t);
138
- }`, `
139
- fn sl_smoothstep${w}(a: ${t}, b: ${t}, x: ${t}) -> ${t} {
140
- let t = saturate((x - a) / (b - a));
141
- return t * t * (3.0 - 2.0 * t);
142
- }`)
143
- }),
144
-
145
- // ----------------------------------------------------------------- noise
146
- e("oj_hash21", [], `
147
- float oj_hash21(vec2 p, float seed) {
148
- p = fract(p * vec2(123.34, 456.21) + seed * 0.1731);
149
- p += dot(p, p + 45.32);
150
- return fract(p.x * p.y);
151
- }`, `
152
- fn oj_hash21(pIn: vec2f, seed: f32) -> f32 {
153
- var p = fract(pIn * vec2f(123.34, 456.21) + seed * 0.1731);
154
- p = p + dot(p, p + 45.32);
155
- return fract(p.x * p.y);
156
- }`),
157
- e("oj_vnoise", ["oj_hash21"], `
158
- float oj_vnoise(vec2 p, float seed) {
159
- vec2 i = floor(p), f = fract(p);
160
- f = f * f * (3.0 - 2.0 * f);
161
- float a = oj_hash21(i, seed);
162
- float b = oj_hash21(i + vec2(1.0, 0.0), seed);
163
- float c = oj_hash21(i + vec2(0.0, 1.0), seed);
164
- float d = oj_hash21(i + vec2(1.0, 1.0), seed);
165
- return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
166
- }`, `
167
- fn oj_vnoise(p: vec2f, seed: f32) -> f32 {
168
- let i = floor(p);
169
- var f = fract(p);
170
- f = f * f * (3.0 - 2.0 * f);
171
- let a = oj_hash21(i, seed);
172
- let b = oj_hash21(i + vec2f(1.0, 0.0), seed);
173
- let c = oj_hash21(i + vec2f(0.0, 1.0), seed);
174
- let d = oj_hash21(i + vec2f(1.0, 1.0), seed);
175
- return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
176
- }`),
177
- e("oj_simplexRaw", [], `
178
- vec2 oj_mod289_2(vec2 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }
179
- vec3 oj_mod289_3(vec3 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }
180
- vec3 oj_permute(vec3 x) { return oj_mod289_3(((x * 34.0) + 1.0) * x); }
181
- float oj_simplexRaw(vec2 v) {
182
- const vec4 C = vec4(0.211324865405187, 0.366025403784439, -0.577350269189626, 0.024390243902439);
183
- vec2 i = floor(v + dot(v, C.yy));
184
- vec2 x0 = v - i + dot(i, C.xx);
185
- vec2 i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0);
186
- vec4 x12 = x0.xyxy + C.xxzz;
187
- x12.xy -= i1;
188
- i = oj_mod289_2(i);
189
- vec3 p = oj_permute(oj_permute(i.y + vec3(0.0, i1.y, 1.0)) + i.x + vec3(0.0, i1.x, 1.0));
190
- vec3 m = max(0.5 - vec3(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), 0.0);
191
- m = m * m; m = m * m;
192
- vec3 x = 2.0 * fract(p * C.www) - 1.0;
193
- vec3 h = abs(x) - 0.5;
194
- vec3 ox = floor(x + 0.5);
195
- vec3 a0 = x - ox;
196
- m *= 1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h);
197
- vec3 g;
198
- g.x = a0.x * x0.x + h.x * x0.y;
199
- g.yz = a0.yz * x12.xz + h.yz * x12.yw;
200
- return 130.0 * dot(m, g);
201
- }`, `
202
- fn oj_mod289_2(x: vec2f) -> vec2f { return x - floor(x * (1.0 / 289.0)) * 289.0; }
203
- fn oj_mod289_3(x: vec3f) -> vec3f { return x - floor(x * (1.0 / 289.0)) * 289.0; }
204
- fn oj_permute(x: vec3f) -> vec3f { return oj_mod289_3(((x * 34.0) + 1.0) * x); }
205
- fn oj_simplexRaw(v: vec2f) -> f32 {
206
- let C = vec4f(0.211324865405187, 0.366025403784439, -0.577350269189626, 0.024390243902439);
207
- var i = floor(v + dot(v, C.yy));
208
- let x0 = v - i + dot(i, C.xx);
209
- let i1 = select(vec2f(0.0, 1.0), vec2f(1.0, 0.0), x0.x > x0.y);
210
- var x12 = x0.xyxy + C.xxzz;
211
- x12 = vec4f(x12.xy - i1, x12.zw);
212
- i = oj_mod289_2(i);
213
- let p = oj_permute(oj_permute(i.y + vec3f(0.0, i1.y, 1.0)) + i.x + vec3f(0.0, i1.x, 1.0));
214
- var m = max(0.5 - vec3f(dot(x0, x0), dot(x12.xy, x12.xy), dot(x12.zw, x12.zw)), vec3f(0.0));
215
- m = m * m; m = m * m;
216
- let x = 2.0 * fract(p * C.www) - 1.0;
217
- let h = abs(x) - 0.5;
218
- let ox = floor(x + 0.5);
219
- let a0 = x - ox;
220
- m = m * (1.79284291400159 - 0.85373472095314 * (a0 * a0 + h * h));
221
- let g = vec3f(a0.x * x0.x + h.x * x0.y, a0.yz * x12.xz + h.yz * x12.yw);
222
- return 130.0 * dot(m, g);
223
- }`),
224
- e("oj_simplex", ["oj_simplexRaw"], `
225
- float oj_simplex(vec2 p, float seed) { return oj_simplexRaw(p + seed * 137.13) * 0.5 + 0.5; }`, `
226
- fn oj_simplex(p: vec2f, seed: f32) -> f32 { return oj_simplexRaw(p + seed * 137.13) * 0.5 + 0.5; }`),
227
-
228
- // The four octave kinds. Octaves arrive as a constant 1..4 from the
229
- // program; the loop is bounded at 4 exactly as Noise2D.cginc's is.
230
- ...([
231
- ["oj_fbm", "oj_vnoise", "oj_vnoise(p, seed + float(o) * 19.0)", "oj_vnoise(p, seed + f32(o) * 19.0)"],
232
- ["oj_fbmSimplex", "oj_simplex", "oj_simplex(p, seed + float(o) * 19.0)", "oj_simplex(p, seed + f32(o) * 19.0)"],
233
- ["oj_turbulence", "oj_simplexRaw", "abs(oj_simplexRaw(p + (seed + float(o) * 19.0) * 137.13))",
234
- "abs(oj_simplexRaw(p + (seed + f32(o) * 19.0) * 137.13))"],
235
- ] as const).map(([name, dep, g, w]) => e(name, [dep], `
236
- float ${name}(vec2 p, float seed, int octaves) {
237
- float sum = 0.0, amp = 0.5, norm = 0.0;
238
- for (int o = 0; o < 4; o++) {
239
- if (o >= octaves) break;
240
- sum += ${g} * amp;
241
- norm += amp;
242
- p *= 2.0;
243
- amp *= 0.5;
244
- }
245
- return sum / max(norm, 1e-4);
246
- }`, `
247
- fn ${name}(pIn: vec2f, seed: f32, octaves: i32) -> f32 {
248
- var p = pIn;
249
- var sum = 0.0;
250
- var amp = 0.5;
251
- var norm = 0.0;
252
- for (var o = 0; o < 4; o++) {
253
- if (o >= octaves) { break; }
254
- sum += ${w} * amp;
255
- norm += amp;
256
- p = p * 2.0;
257
- amp *= 0.5;
258
- }
259
- return sum / max(norm, 1e-4);
260
- }`)),
261
- e("oj_ridged", ["oj_simplexRaw"], `
262
- float oj_ridged(vec2 p, float seed, int octaves) {
263
- float sum = 0.0, amp = 0.5, norm = 0.0;
264
- for (int o = 0; o < 4; o++) {
265
- if (o >= octaves) break;
266
- float r = 1.0 - abs(oj_simplexRaw(p + (seed + float(o) * 19.0) * 137.13));
267
- sum += r * r * amp;
268
- norm += amp;
269
- p *= 2.0;
270
- amp *= 0.5;
271
- }
272
- return sum / max(norm, 1e-4);
273
- }`, `
274
- fn oj_ridged(pIn: vec2f, seed: f32, octaves: i32) -> f32 {
275
- var p = pIn;
276
- var sum = 0.0;
277
- var amp = 0.5;
278
- var norm = 0.0;
279
- for (var o = 0; o < 4; o++) {
280
- if (o >= octaves) { break; }
281
- let r = 1.0 - abs(oj_simplexRaw(p + (seed + f32(o) * 19.0) * 137.13));
282
- sum += r * r * amp;
283
- norm += amp;
284
- p = p * 2.0;
285
- amp *= 0.5;
286
- }
287
- return sum / max(norm, 1e-4);
288
- }`),
289
- e("sl_voronoi", [], `
290
- float sl_hash21(vec2 p) {
291
- p = fract(p * vec2(123.34, 456.21));
292
- p += dot(p, p + 45.32);
293
- return fract(p.x * p.y);
294
- }
295
- float sl_voronoi(vec2 p) {
296
- vec2 cell = floor(p);
297
- vec2 f = fract(p);
298
- float best = 8.0;
299
- for (int y = -1; y <= 1; y++) {
300
- for (int x = -1; x <= 1; x++) {
301
- vec2 o = vec2(float(x), float(y));
302
- vec2 jitter = vec2(sl_hash21(cell + o), sl_hash21(cell + o + 37.7));
303
- best = min(best, length(o + jitter - f));
304
- }
305
- }
306
- return best;
307
- }`, `
308
- fn sl_hash21(pIn: vec2f) -> f32 {
309
- var p = fract(pIn * vec2f(123.34, 456.21));
310
- p = p + dot(p, p + 45.32);
311
- return fract(p.x * p.y);
312
- }
313
- fn sl_voronoi(p: vec2f) -> f32 {
314
- let cell = floor(p);
315
- let f = fract(p);
316
- var best = 8.0;
317
- for (var y = -1; y <= 1; y++) {
318
- for (var x = -1; x <= 1; x++) {
319
- let o = vec2f(f32(x), f32(y));
320
- let jitter = vec2f(sl_hash21(cell + o), sl_hash21(cell + o + 37.7));
321
- best = min(best, length(o + jitter - f));
322
- }
323
- }
324
- return best;
325
- }`),
326
-
327
- // ------------------------------------------------------------------- sdf
328
- e("sd_util", [], `
329
- float ndot(vec2 a, vec2 b) { return a.x * b.x - a.y * b.y; }
330
- float dot2(vec2 v) { return dot(v, v); }`, `
331
- fn ndot(a: vec2f, b: vec2f) -> f32 { return a.x * b.x - a.y * b.y; }
332
- fn dot2(v: vec2f) -> f32 { return dot(v, v); }
333
- fn glslMod(x: f32, y: f32) -> f32 { return x - y * floor(x / y); }`),
334
-
335
- e("sdCircle", [], `
336
- float sdCircle(vec2 p, float r) { return length(p) - r; }`, `
337
- fn sdCircle(p: vec2f, r: f32) -> f32 { return length(p) - r; }`),
338
-
339
- e("sdRoundedBox", [], `
340
- float sdRoundedBox(vec2 p, vec2 b, vec4 r) {
341
- r.xy = (p.x > 0.0) ? r.xy : r.zw;
342
- r.x = (p.y > 0.0) ? r.x : r.y;
343
- vec2 q = abs(p) - b + r.x;
344
- return min(max(q.x, q.y), 0.0) + length(max(q, 0.0)) - r.x;
345
- }`, `
346
- fn sdRoundedBox(p: vec2f, b: vec2f, rIn: vec4f) -> f32 {
347
- var r = rIn;
348
- if (!(p.x > 0.0)) { r = vec4f(r.zw, r.zw); }
349
- r.x = select(r.y, r.x, p.y > 0.0);
350
- let q = abs(p) - b + r.x;
351
- return min(max(q.x, q.y), 0.0) + length(max(q, vec2f(0.0))) - r.x;
352
- }`),
353
-
354
- e("sdBox", [], `
355
- float sdBox(vec2 p, vec2 b) {
356
- vec2 d = abs(p) - b;
357
- return length(max(d, 0.0)) + min(max(d.x, d.y), 0.0);
358
- }`, `
359
- fn sdBox(p: vec2f, b: vec2f) -> f32 {
360
- let d = abs(p) - b;
361
- return length(max(d, vec2f(0.0))) + min(max(d.x, d.y), 0.0);
362
- }`),
363
-
364
- e("sdOrientedBox", [], `
365
- float sdOrientedBox(vec2 p, vec2 a, vec2 b, float th) {
366
- float l = length(b - a);
367
- vec2 d = (b - a) / l;
368
- vec2 q = (p - (a + b) * 0.5);
369
- q = vec2(q.x * d.x + q.y * d.y, -q.x * d.y + q.y * d.x);
370
- q = abs(q) - vec2(l, th) * 0.5;
371
- return length(max(q, 0.0)) + min(max(q.x, q.y), 0.0);
372
- }`, `
373
- fn sdOrientedBox(p: vec2f, a: vec2f, b: vec2f, th: f32) -> f32 {
374
- let l = length(b - a);
375
- let d = (b - a) / l;
376
- var q = (p - (a + b) * 0.5);
377
- q = vec2f(q.x * d.x + q.y * d.y, -q.x * d.y + q.y * d.x);
378
- q = abs(q) - vec2f(l, th) * 0.5;
379
- return length(max(q, vec2f(0.0))) + min(max(q.x, q.y), 0.0);
380
- }`),
381
-
382
- e("sdSegment", [], `
383
- float sdSegment(vec2 p, vec2 a, vec2 b) {
384
- vec2 pa = p - a, ba = b - a;
385
- float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);
386
- return length(pa - ba * h);
387
- }`, `
388
- fn sdSegment(p: vec2f, a: vec2f, b: vec2f) -> f32 {
389
- let pa = p - a;
390
- let ba = b - a;
391
- let h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);
392
- return length(pa - ba * h);
393
- }`),
394
-
395
- e("sdRhombus", ["sd_util"], `
396
- float sdRhombus(vec2 p, vec2 b) {
397
- p = abs(p);
398
- float h = clamp(ndot(b - 2.0 * p, b) / dot(b, b), -1.0, 1.0);
399
- float d = length(p - 0.5 * b * vec2(1.0 - h, 1.0 + h));
400
- return d * sign(p.x * b.y + p.y * b.x - b.x * b.y);
401
- }`, `
402
- fn sdRhombus(pIn: vec2f, b: vec2f) -> f32 {
403
- let p = abs(pIn);
404
- let h = clamp(ndot(b - 2.0 * p, b) / dot(b, b), -1.0, 1.0);
405
- let d = length(p - 0.5 * b * vec2f(1.0 - h, 1.0 + h));
406
- return d * sign(p.x * b.y + p.y * b.x - b.x * b.y);
407
- }`),
408
-
409
- e("sdTrapezoid", ["sd_util"], `
410
- float sdTrapezoid(vec2 p, float r1, float r2, float he) {
411
- vec2 k1 = vec2(r2, he);
412
- vec2 k2 = vec2(r2 - r1, 2.0 * he);
413
- p.x = abs(p.x);
414
- vec2 ca = vec2(p.x - min(p.x, (p.y < 0.0) ? r1 : r2), abs(p.y) - he);
415
- vec2 cb = p - k1 + k2 * clamp(dot(k1 - p, k2) / dot2(k2), 0.0, 1.0);
416
- float s = (cb.x < 0.0 && ca.y < 0.0) ? -1.0 : 1.0;
417
- return s * sqrt(min(dot2(ca), dot2(cb)));
418
- }`, `
419
- fn sdTrapezoid(pIn: vec2f, r1: f32, r2: f32, he: f32) -> f32 {
420
- let k1 = vec2f(r2, he);
421
- let k2 = vec2f(r2 - r1, 2.0 * he);
422
- var p = pIn;
423
- p.x = abs(p.x);
424
- let ca = vec2f(p.x - min(p.x, select(r2, r1, p.y < 0.0)), abs(p.y) - he);
425
- let cb = p - k1 + k2 * clamp(dot(k1 - p, k2) / dot2(k2), 0.0, 1.0);
426
- let s = select(1.0, -1.0, cb.x < 0.0 && ca.y < 0.0);
427
- return s * sqrt(min(dot2(ca), dot2(cb)));
428
- }`),
429
-
430
- e("sdParallelogram", [], `
431
- float sdParallelogram(vec2 p, float wi, float he, float sk) {
432
- vec2 e = vec2(sk, he);
433
- p = (p.y < 0.0) ? -p : p;
434
- vec2 w = p - e;
435
- w.x -= clamp(w.x, -wi, wi);
436
- vec2 d = vec2(dot(w, w), -w.y);
437
- float s = p.x * e.y - p.y * e.x;
438
- p = (s < 0.0) ? -p : p;
439
- vec2 v = p - vec2(wi, 0.0);
440
- v -= e * clamp(dot(v, e) / dot(e, e), -1.0, 1.0);
441
- d = min(d, vec2(dot(v, v), wi * he - abs(s)));
442
- return sqrt(d.x) * sign(-d.y);
443
- }`, `
444
- fn sdParallelogram(pIn: vec2f, wi: f32, he: f32, sk: f32) -> f32 {
445
- let e = vec2f(sk, he);
446
- var p = select(pIn, -pIn, pIn.y < 0.0);
447
- var w = p - e;
448
- w.x -= clamp(w.x, -wi, wi);
449
- var d = vec2f(dot(w, w), -w.y);
450
- let s = p.x * e.y - p.y * e.x;
451
- p = select(p, -p, s < 0.0);
452
- var v = p - vec2f(wi, 0.0);
453
- v = v - e * clamp(dot(v, e) / dot(e, e), -1.0, 1.0);
454
- d = min(d, vec2f(dot(v, v), wi * he - abs(s)));
455
- return sqrt(d.x) * sign(-d.y);
456
- }`),
457
-
458
- e("sdEquilateralTriangle", [], `
459
- float sdEquilateralTriangle(vec2 p, float r) {
460
- const float k = sqrt(3.0);
461
- p.x = abs(p.x) - r;
462
- p.y = p.y + r / k;
463
- if (p.x + k * p.y > 0.0) p = vec2(p.x - k * p.y, -k * p.x - p.y) / 2.0;
464
- p.x -= clamp(p.x, -2.0 * r, 0.0);
465
- return -length(p) * sign(p.y);
466
- }`, `
467
- fn sdEquilateralTriangle(pIn: vec2f, r: f32) -> f32 {
468
- let k = sqrt(3.0);
469
- var p = pIn;
470
- p.x = abs(p.x) - r;
471
- p.y = p.y + r / k;
472
- if (p.x + k * p.y > 0.0) { p = vec2f(p.x - k * p.y, -k * p.x - p.y) / 2.0; }
473
- p.x -= clamp(p.x, -2.0 * r, 0.0);
474
- return -length(p) * sign(p.y);
475
- }`),
476
-
477
- e("sdTriangleIsosceles", [], `
478
- float sdTriangleIsosceles(vec2 p, vec2 q) {
479
- p.x = abs(p.x);
480
- vec2 a = p - q * clamp(dot(p, q) / dot(q, q), 0.0, 1.0);
481
- vec2 b = p - q * vec2(clamp(p.x / q.x, 0.0, 1.0), 1.0);
482
- float s = -sign(q.y);
483
- vec2 d = min(vec2(dot(a, a), s * (p.x * q.y - p.y * q.x)), vec2(dot(b, b), s * (p.y - q.y)));
484
- return -sqrt(d.x) * sign(d.y);
485
- }`, `
486
- fn sdTriangleIsosceles(pIn: vec2f, q: vec2f) -> f32 {
487
- var p = pIn;
488
- p.x = abs(p.x);
489
- let a = p - q * clamp(dot(p, q) / dot(q, q), 0.0, 1.0);
490
- let b = p - q * vec2f(clamp(p.x / q.x, 0.0, 1.0), 1.0);
491
- let s = -sign(q.y);
492
- let d = min(vec2f(dot(a, a), s * (p.x * q.y - p.y * q.x)), vec2f(dot(b, b), s * (p.y - q.y)));
493
- return -sqrt(d.x) * sign(d.y);
494
- }`),
495
-
496
- e("sdTriangle", [], `
497
- float sdTriangle(vec2 p, vec2 p0, vec2 p1, vec2 p2) {
498
- vec2 e0 = p1 - p0; vec2 e1 = p2 - p1; vec2 e2 = p0 - p2;
499
- vec2 v0 = p - p0; vec2 v1 = p - p1; vec2 v2 = p - p2;
500
- vec2 pq0 = v0 - e0 * clamp(dot(v0, e0) / dot(e0, e0), 0.0, 1.0);
501
- vec2 pq1 = v1 - e1 * clamp(dot(v1, e1) / dot(e1, e1), 0.0, 1.0);
502
- vec2 pq2 = v2 - e2 * clamp(dot(v2, e2) / dot(e2, e2), 0.0, 1.0);
503
- float s = sign(e0.x * e2.y - e0.y * e2.x);
504
- vec2 d = min(min(vec2(dot(pq0, pq0), s * (v0.x * e0.y - v0.y * e0.x)),
505
- vec2(dot(pq1, pq1), s * (v1.x * e1.y - v1.y * e1.x))),
506
- vec2(dot(pq2, pq2), s * (v2.x * e2.y - v2.y * e2.x)));
507
- return -sqrt(d.x) * sign(d.y);
508
- }`, `
509
- fn sdTriangle(p: vec2f, p0: vec2f, p1: vec2f, p2: vec2f) -> f32 {
510
- let e0 = p1 - p0; let e1 = p2 - p1; let e2 = p0 - p2;
511
- let v0 = p - p0; let v1 = p - p1; let v2 = p - p2;
512
- let pq0 = v0 - e0 * clamp(dot(v0, e0) / dot(e0, e0), 0.0, 1.0);
513
- let pq1 = v1 - e1 * clamp(dot(v1, e1) / dot(e1, e1), 0.0, 1.0);
514
- let pq2 = v2 - e2 * clamp(dot(v2, e2) / dot(e2, e2), 0.0, 1.0);
515
- let s = sign(e0.x * e2.y - e0.y * e2.x);
516
- let d = min(min(vec2f(dot(pq0, pq0), s * (v0.x * e0.y - v0.y * e0.x)),
517
- vec2f(dot(pq1, pq1), s * (v1.x * e1.y - v1.y * e1.x))),
518
- vec2f(dot(pq2, pq2), s * (v2.x * e2.y - v2.y * e2.x)));
519
- return -sqrt(d.x) * sign(d.y);
520
- }`),
521
-
522
- e("sdUnevenCapsule", [], `
523
- float sdUnevenCapsule(vec2 p, float r1, float r2, float h) {
524
- p.x = abs(p.x);
525
- float b = (r1 - r2) / h;
526
- float a = sqrt(1.0 - b * b);
527
- float k = dot(p, vec2(-b, a));
528
- if (k < 0.0) return length(p) - r1;
529
- if (k > a * h) return length(p - vec2(0.0, h)) - r2;
530
- return dot(p, vec2(a, b)) - r1;
531
- }`, `
532
- fn sdUnevenCapsule(pIn: vec2f, r1: f32, r2: f32, h: f32) -> f32 {
533
- var p = pIn;
534
- p.x = abs(p.x);
535
- let b = (r1 - r2) / h;
536
- let a = sqrt(1.0 - b * b);
537
- let k = dot(p, vec2f(-b, a));
538
- if (k < 0.0) { return length(p) - r1; }
539
- if (k > a * h) { return length(p - vec2f(0.0, h)) - r2; }
540
- return dot(p, vec2f(a, b)) - r1;
541
- }`),
542
-
543
- e("sdPentagon", [], `
544
- float sdPentagon(vec2 p, float r) {
545
- const vec3 k = vec3(0.809016994, 0.587785252, 0.726542528);
546
- p.x = abs(p.x);
547
- p -= 2.0 * min(dot(vec2(-k.x, k.y), p), 0.0) * vec2(-k.x, k.y);
548
- p -= 2.0 * min(dot(vec2(k.x, k.y), p), 0.0) * vec2(k.x, k.y);
549
- p -= vec2(clamp(p.x, -r * k.z, r * k.z), r);
550
- return length(p) * sign(p.y);
551
- }`, `
552
- fn sdPentagon(pIn: vec2f, r: f32) -> f32 {
553
- let k = vec3f(0.809016994, 0.587785252, 0.726542528);
554
- var p = pIn;
555
- p.x = abs(p.x);
556
- p = p - 2.0 * min(dot(vec2f(-k.x, k.y), p), 0.0) * vec2f(-k.x, k.y);
557
- p = p - 2.0 * min(dot(vec2f(k.x, k.y), p), 0.0) * vec2f(k.x, k.y);
558
- p = p - vec2f(clamp(p.x, -r * k.z, r * k.z), r);
559
- return length(p) * sign(p.y);
560
- }`),
561
-
562
- e("sdHexagon", [], `
563
- float sdHexagon(vec2 p, float r) {
564
- const vec3 k = vec3(-0.866025404, 0.5, 0.577350269);
565
- p = abs(p);
566
- p -= 2.0 * min(dot(k.xy, p), 0.0) * k.xy;
567
- p -= vec2(clamp(p.x, -k.z * r, k.z * r), r);
568
- return length(p) * sign(p.y);
569
- }`, `
570
- fn sdHexagon(pIn: vec2f, r: f32) -> f32 {
571
- let k = vec3f(-0.866025404, 0.5, 0.577350269);
572
- var p = abs(pIn);
573
- p = p - 2.0 * min(dot(k.xy, p), 0.0) * k.xy;
574
- p = p - vec2f(clamp(p.x, -k.z * r, k.z * r), r);
575
- return length(p) * sign(p.y);
576
- }`),
577
-
578
- e("sdOctogon", [], `
579
- float sdOctogon(vec2 p, float r) {
580
- const vec3 k = vec3(-0.9238795325, 0.3826834323, 0.4142135623);
581
- p = abs(p);
582
- p -= 2.0 * min(dot(vec2(k.x, k.y), p), 0.0) * vec2(k.x, k.y);
583
- p -= 2.0 * min(dot(vec2(-k.x, k.y), p), 0.0) * vec2(-k.x, k.y);
584
- p -= vec2(clamp(p.x, -k.z * r, k.z * r), r);
585
- return length(p) * sign(p.y);
586
- }`, `
587
- fn sdOctogon(pIn: vec2f, r: f32) -> f32 {
588
- let k = vec3f(-0.9238795325, 0.3826834323, 0.4142135623);
589
- var p = abs(pIn);
590
- p = p - 2.0 * min(dot(vec2f(k.x, k.y), p), 0.0) * vec2f(k.x, k.y);
591
- p = p - 2.0 * min(dot(vec2f(-k.x, k.y), p), 0.0) * vec2f(-k.x, k.y);
592
- p = p - vec2f(clamp(p.x, -k.z * r, k.z * r), r);
593
- return length(p) * sign(p.y);
594
- }`),
595
-
596
- e("sdHexagram", [], `
597
- float sdHexagram(vec2 p, float r) {
598
- const vec4 k = vec4(-0.5, 0.8660254038, 0.5773502692, 1.7320508076);
599
- p = abs(p);
600
- p -= 2.0 * min(dot(k.xy, p), 0.0) * k.xy;
601
- p -= 2.0 * min(dot(k.yx, p), 0.0) * k.yx;
602
- p -= vec2(clamp(p.x, r * k.z, r * k.w), r);
603
- return length(p) * sign(p.y);
604
- }`, `
605
- fn sdHexagram(pIn: vec2f, r: f32) -> f32 {
606
- let k = vec4f(-0.5, 0.8660254038, 0.5773502692, 1.7320508076);
607
- var p = abs(pIn);
608
- p = p - 2.0 * min(dot(k.xy, p), 0.0) * k.xy;
609
- p = p - 2.0 * min(dot(k.yx, p), 0.0) * k.yx;
610
- p = p - vec2f(clamp(p.x, r * k.z, r * k.w), r);
611
- return length(p) * sign(p.y);
612
- }`),
613
-
614
- e("sdStar5", [], `
615
- float sdStar5(vec2 p, float r, float rf) {
616
- const vec2 k1 = vec2(0.809016994375, -0.587785252292);
617
- const vec2 k2 = vec2(-k1.x, k1.y);
618
- p.x = abs(p.x);
619
- p -= 2.0 * max(dot(k1, p), 0.0) * k1;
620
- p -= 2.0 * max(dot(k2, p), 0.0) * k2;
621
- p.x = abs(p.x);
622
- p.y -= r;
623
- vec2 ba = rf * vec2(-k1.y, k1.x) - vec2(0.0, 1.0);
624
- float h = clamp(dot(p, ba) / dot(ba, ba), 0.0, r);
625
- return length(p - ba * h) * sign(p.y * ba.x - p.x * ba.y);
626
- }`, `
627
- fn sdStar5(pIn: vec2f, r: f32, rf: f32) -> f32 {
628
- let k1 = vec2f(0.809016994375, -0.587785252292);
629
- let k2 = vec2f(-k1.x, k1.y);
630
- var p = pIn;
631
- p.x = abs(p.x);
632
- p = p - 2.0 * max(dot(k1, p), 0.0) * k1;
633
- p = p - 2.0 * max(dot(k2, p), 0.0) * k2;
634
- p.x = abs(p.x);
635
- p.y -= r;
636
- let ba = rf * vec2f(-k1.y, k1.x) - vec2f(0.0, 1.0);
637
- let h = clamp(dot(p, ba) / dot(ba, ba), 0.0, r);
638
- return length(p - ba * h) * sign(p.y * ba.x - p.x * ba.y);
639
- }`),
640
-
641
- e("sdStar", ["sd_util"], `
642
- float sdStar(vec2 p, float r, int n, float m) {
643
- float an = 3.141593 / float(n);
644
- float en = 3.141593 / m;
645
- vec2 acs = vec2(cos(an), sin(an));
646
- vec2 ecs = vec2(cos(en), sin(en));
647
- float bn = mod(atan(p.x, p.y), 2.0 * an) - an;
648
- p = length(p) * vec2(cos(bn), abs(sin(bn)));
649
- p -= r * acs;
650
- p += ecs * clamp(-dot(p, ecs), 0.0, r * acs.y / ecs.y);
651
- return length(p) * sign(p.x);
652
- }`, `
653
- fn sdStar(pIn: vec2f, r: f32, n: i32, m: f32) -> f32 {
654
- let an = 3.141593 / f32(n);
655
- let en = 3.141593 / m;
656
- let acs = vec2f(cos(an), sin(an));
657
- let ecs = vec2f(cos(en), sin(en));
658
- let bn = glslMod(atan2(pIn.x, pIn.y), 2.0 * an) - an;
659
- var p = length(pIn) * vec2f(cos(bn), abs(sin(bn)));
660
- p = p - r * acs;
661
- p = p + ecs * clamp(-dot(p, ecs), 0.0, r * acs.y / ecs.y);
662
- return length(p) * sign(p.x);
663
- }`),
664
-
665
- e("sdPie", [], `
666
- float sdPie(vec2 p, vec2 c, float r) {
667
- p.x = abs(p.x);
668
- float l = length(p) - r;
669
- float m = length(p - c * clamp(dot(p, c), 0.0, r));
670
- return max(l, m * sign(c.y * p.x - c.x * p.y));
671
- }`, `
672
- fn sdPie(pIn: vec2f, c: vec2f, r: f32) -> f32 {
673
- var p = pIn;
674
- p.x = abs(p.x);
675
- let l = length(p) - r;
676
- let m = length(p - c * clamp(dot(p, c), 0.0, r));
677
- return max(l, m * sign(c.y * p.x - c.x * p.y));
678
- }`),
679
-
680
- e("sdCutDisk", [], `
681
- float sdCutDisk(vec2 p, float r, float h) {
682
- float w = sqrt(r * r - h * h);
683
- p.x = abs(p.x);
684
- float s = max((h - r) * p.x * p.x + w * w * (h + r - 2.0 * p.y), h * p.x - w * p.y);
685
- return (s < 0.0) ? length(p) - r : (p.x < w) ? h - p.y : length(p - vec2(w, h));
686
- }`, `
687
- fn sdCutDisk(pIn: vec2f, r: f32, h: f32) -> f32 {
688
- let w = sqrt(r * r - h * h);
689
- var p = pIn;
690
- p.x = abs(p.x);
691
- let s = max((h - r) * p.x * p.x + w * w * (h + r - 2.0 * p.y), h * p.x - w * p.y);
692
- if (s < 0.0) { return length(p) - r; }
693
- if (p.x < w) { return h - p.y; }
694
- return length(p - vec2f(w, h));
695
- }`),
696
-
697
- e("sdArc", [], `
698
- float sdArc(vec2 p, vec2 sc, float ra, float rb) {
699
- p.x = abs(p.x);
700
- return ((sc.y * p.x > sc.x * p.y) ? length(p - sc * ra) : abs(length(p) - ra)) - rb;
701
- }`, `
702
- fn sdArc(pIn: vec2f, sc: vec2f, ra: f32, rb: f32) -> f32 {
703
- var p = pIn;
704
- p.x = abs(p.x);
705
- return select(abs(length(p) - ra), length(p - sc * ra), sc.y * p.x > sc.x * p.y) - rb;
706
- }`),
707
-
708
- e("sdRing", [], `
709
- float sdRing(vec2 p, vec2 n, float r, float th) {
710
- p.x = abs(p.x);
711
- p = vec2(p.x * n.x - p.y * n.y, p.x * n.y + p.y * n.x);
712
- return max(abs(length(p) - r) - th * 0.5, length(vec2(p.x, max(0.0, abs(r - p.y) - th * 0.5))) * sign(p.x));
713
- }`, `
714
- fn sdRing(pIn: vec2f, n: vec2f, r: f32, th: f32) -> f32 {
715
- var p = pIn;
716
- p.x = abs(p.x);
717
- p = vec2f(p.x * n.x - p.y * n.y, p.x * n.y + p.y * n.x);
718
- 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));
719
- }`),
720
-
721
- e("sdHorseshoe", [], `
722
- float sdHorseshoe(vec2 p, vec2 c, float r, vec2 w) {
723
- p.x = abs(p.x);
724
- float l = length(p);
725
- p = vec2(-p.x * c.x + p.y * c.y, p.x * c.y + p.y * c.x);
726
- p = vec2((p.y > 0.0 || p.x > 0.0) ? p.x : l * sign(-c.x), (p.x > 0.0) ? p.y : l);
727
- p = vec2(p.x, abs(p.y - r)) - w;
728
- return length(max(p, 0.0)) + min(0.0, max(p.x, p.y));
729
- }`, `
730
- fn sdHorseshoe(pIn: vec2f, c: vec2f, r: f32, w: vec2f) -> f32 {
731
- var p = pIn;
732
- p.x = abs(p.x);
733
- let l = length(p);
734
- p = vec2f(-p.x * c.x + p.y * c.y, p.x * c.y + p.y * c.x);
735
- 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));
736
- p = vec2f(p.x, abs(p.y - r)) - w;
737
- return length(max(p, vec2f(0.0))) + min(0.0, max(p.x, p.y));
738
- }`),
739
-
740
- e("sdVesica", [], `
741
- float sdVesica(vec2 p, float r, float d) {
742
- p = abs(p);
743
- float b = sqrt(r * r - d * d);
744
- return ((p.y - b) * d > p.x * b) ? length(p - vec2(0.0, b)) : length(p - vec2(-d, 0.0)) - r;
745
- }`, `
746
- fn sdVesica(pIn: vec2f, r: f32, d: f32) -> f32 {
747
- let p = abs(pIn);
748
- let b = sqrt(r * r - d * d);
749
- if ((p.y - b) * d > p.x * b) { return length(p - vec2f(0.0, b)); }
750
- return length(p - vec2f(-d, 0.0)) - r;
751
- }`),
752
-
753
- e("sdOrientedVesica", [], `
754
- float sdOrientedVesica(vec2 p, vec2 a, vec2 b, float w) {
755
- float r = 0.5 * length(b - a);
756
- float d = 0.5 * (r * r - w * w) / w;
757
- vec2 v = (b - a) / r;
758
- vec2 c = (b + a) * 0.5;
759
- vec2 pc = p - c;
760
- vec2 q = 0.5 * abs(vec2(pc.x * v.y - pc.y * v.x, pc.x * v.x + pc.y * v.y));
761
- vec3 h = (r * q.x < d * (q.y - r)) ? vec3(0.0, r, 0.0) : vec3(-d, 0.0, d + w);
762
- return length(q - h.xy) - h.z;
763
- }`, `
764
- fn sdOrientedVesica(p: vec2f, a: vec2f, b: vec2f, w: f32) -> f32 {
765
- let r = 0.5 * length(b - a);
766
- let d = 0.5 * (r * r - w * w) / w;
767
- let v = (b - a) / r;
768
- let c = (b + a) * 0.5;
769
- let pc = p - c;
770
- let q = 0.5 * abs(vec2f(pc.x * v.y - pc.y * v.x, pc.x * v.x + pc.y * v.y));
771
- let h = select(vec3f(-d, 0.0, d + w), vec3f(0.0, r, 0.0), r * q.x < d * (q.y - r));
772
- return length(q - h.xy) - h.z;
773
- }`),
774
-
775
- e("sdMoon", [], `
776
- float sdMoon(vec2 p, float d, float ra, float rb) {
777
- p.y = abs(p.y);
778
- float a = (ra * ra - rb * rb + d * d) / (2.0 * d);
779
- float b = sqrt(max(ra * ra - a * a, 0.0));
780
- if (d * (p.x * b - p.y * a) > d * d * max(b - p.y, 0.0)) return length(p - vec2(a, b));
781
- return max(length(p) - ra, -(length(p - vec2(d, 0.0)) - rb));
782
- }`, `
783
- fn sdMoon(pIn: vec2f, d: f32, ra: f32, rb: f32) -> f32 {
784
- var p = pIn;
785
- p.y = abs(p.y);
786
- let a = (ra * ra - rb * rb + d * d) / (2.0 * d);
787
- let b = sqrt(max(ra * ra - a * a, 0.0));
788
- if (d * (p.x * b - p.y * a) > d * d * max(b - p.y, 0.0)) { return length(p - vec2f(a, b)); }
789
- return max(length(p) - ra, -(length(p - vec2f(d, 0.0)) - rb));
790
- }`),
791
-
792
- e("sdRoundedCross", ["sd_util"], `
793
- float sdRoundedCross(vec2 p, float h) {
794
- float k = 0.5 * (h + 1.0 / h);
795
- p = abs(p);
796
- return (p.x < 1.0 && p.y < p.x * (k - h) + h)
797
- ? k - sqrt(dot2(p - vec2(1.0, k)))
798
- : sqrt(min(dot2(p - vec2(0.0, h)), dot2(p - vec2(1.0, 0.0))));
799
- }`, `
800
- fn sdRoundedCross(pIn: vec2f, h: f32) -> f32 {
801
- let k = 0.5 * (h + 1.0 / h);
802
- let p = abs(pIn);
803
- if (p.x < 1.0 && p.y < p.x * (k - h) + h) { return k - sqrt(dot2(p - vec2f(1.0, k))); }
804
- return sqrt(min(dot2(p - vec2f(0.0, h)), dot2(p - vec2f(1.0, 0.0))));
805
- }`),
806
-
807
- e("sdEgg", [], `
808
- float sdEgg(vec2 p, float he, float ra, float rb, float bu) {
809
- float r = 0.5 * (he + ra + rb) / bu;
810
- float da = r - ra;
811
- float db = r - rb;
812
- float y = (db * db - da * da - he * he) / (2.0 * he);
813
- float x = sqrt(max(da * da - y * y, 0.0));
814
- p.x = abs(p.x);
815
- p.y += 0.5 * (he + rb - ra);
816
- float k = p.y * x - p.x * y;
817
- if (k > 0.0 && k < he * (p.x + x)) return length(p + vec2(x, y)) - r;
818
- return min(length(p) - ra, length(vec2(p.x, p.y - he)) - rb);
819
- }`, `
820
- fn sdEgg(pIn: vec2f, he: f32, ra: f32, rb: f32, bu: f32) -> f32 {
821
- let r = 0.5 * (he + ra + rb) / bu;
822
- let da = r - ra;
823
- let db = r - rb;
824
- let y = (db * db - da * da - he * he) / (2.0 * he);
825
- let x = sqrt(max(da * da - y * y, 0.0));
826
- var p = pIn;
827
- p.x = abs(p.x);
828
- p.y += 0.5 * (he + rb - ra);
829
- let k = p.y * x - p.x * y;
830
- if (k > 0.0 && k < he * (p.x + x)) { return length(p + vec2f(x, y)) - r; }
831
- return min(length(p) - ra, length(vec2f(p.x, p.y - he)) - rb);
832
- }`),
833
-
834
- e("sdHeart", [], `
835
- float sdHeart(vec2 p) {
836
- p.x = abs(p.x);
837
- if (p.y + p.x > 1.0) return sqrt(dot(p - vec2(0.25, 0.75), p - vec2(0.25, 0.75))) - sqrt(2.0) / 4.0;
838
- return sqrt(min(dot(p - vec2(0.0, 1.0), p - vec2(0.0, 1.0)),
839
- 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);
840
- }`, `
841
- fn sdHeart(pIn: vec2f) -> f32 {
842
- var p = pIn;
843
- p.x = abs(p.x);
844
- if (p.y + p.x > 1.0) { return sqrt(dot(p - vec2f(0.25, 0.75), p - vec2f(0.25, 0.75))) - sqrt(2.0) / 4.0; }
845
- return sqrt(min(dot(p - vec2f(0.0, 1.0), p - vec2f(0.0, 1.0)),
846
- 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);
847
- }`),
848
-
849
- e("sdCross", [], `
850
- float sdCross(vec2 p, vec2 b, float r) {
851
- p = abs(p);
852
- p = (p.y > p.x) ? p.yx : p.xy;
853
- vec2 q = p - b;
854
- float k = max(q.y, q.x);
855
- vec2 w = (k > 0.0) ? q : vec2(b.y - p.x, -k);
856
- return sign(k) * length(max(w, 0.0)) + r;
857
- }`, `
858
- fn sdCross(pIn: vec2f, b: vec2f, r: f32) -> f32 {
859
- var p = abs(pIn);
860
- p = select(p.xy, p.yx, p.y > p.x);
861
- let q = p - b;
862
- let k = max(q.y, q.x);
863
- let w = select(vec2f(b.y - p.x, -k), q, k > 0.0);
864
- return sign(k) * length(max(w, vec2f(0.0))) + r;
865
- }`),
866
-
867
- e("sdRoundedX", [], `
868
- float sdRoundedX(vec2 p, float w, float r) {
869
- p = abs(p);
870
- return length(p - min(p.x + p.y, w) * 0.5) - r;
871
- }`, `
872
- fn sdRoundedX(pIn: vec2f, w: f32, r: f32) -> f32 {
873
- let p = abs(pIn);
874
- return length(p - min(p.x + p.y, w) * 0.5) - r;
875
- }`),
876
-
877
- e("sdEllipse", [], `
878
- float sdEllipse(vec2 p, vec2 ab) {
879
- p = abs(p);
880
- if (p.x > p.y) { p = p.yx; ab = ab.yx; }
881
- float l = ab.y * ab.y - ab.x * ab.x;
882
- float m = ab.x * p.x / l;
883
- float m2 = m * m;
884
- float n = ab.y * p.y / l;
885
- float n2 = n * n;
886
- float c = (m2 + n2 - 1.0) / 3.0;
887
- float c3 = c * c * c;
888
- float q = c3 + m2 * n2 * 2.0;
889
- float d = c3 + m2 * n2;
890
- float g = m + m * n2;
891
- float co;
892
- if (d < 0.0) {
893
- float h = acos(q / c3) / 3.0;
894
- float s = cos(h);
895
- float t = sin(h) * sqrt(3.0);
896
- float rx = sqrt(-c * (s + t + 2.0) + m2);
897
- float ry = sqrt(-c * (s - t + 2.0) + m2);
898
- co = (ry + sign(l) * rx + abs(g) / (rx * ry) - m) / 2.0;
899
- } else {
900
- float h = 2.0 * m * n * sqrt(d);
901
- float s = sign(q + h) * pow(abs(q + h), 1.0 / 3.0);
902
- float u = sign(q - h) * pow(abs(q - h), 1.0 / 3.0);
903
- float rx = -s - u - c * 4.0 + 2.0 * m2;
904
- float ry = (s - u) * sqrt(3.0);
905
- float rm = sqrt(rx * rx + ry * ry);
906
- co = (ry / sqrt(rm - rx) + 2.0 * g / rm - m) / 2.0;
907
- }
908
- vec2 r = ab * vec2(co, sqrt(1.0 - co * co));
909
- return length(r - p) * sign(p.y - r.y);
910
- }`, `
911
- fn sdEllipse(pIn: vec2f, abIn: vec2f) -> f32 {
912
- var p = abs(pIn);
913
- var ab = abIn;
914
- if (p.x > p.y) { p = p.yx; ab = ab.yx; }
915
- let l = ab.y * ab.y - ab.x * ab.x;
916
- let m = ab.x * p.x / l;
917
- let m2 = m * m;
918
- let n = ab.y * p.y / l;
919
- let n2 = n * n;
920
- let c = (m2 + n2 - 1.0) / 3.0;
921
- let c3 = c * c * c;
922
- let q = c3 + m2 * n2 * 2.0;
923
- let d = c3 + m2 * n2;
924
- let g = m + m * n2;
925
- var co: f32;
926
- if (d < 0.0) {
927
- let h = acos(q / c3) / 3.0;
928
- let s = cos(h);
929
- let t = sin(h) * sqrt(3.0);
930
- let rx = sqrt(-c * (s + t + 2.0) + m2);
931
- let ry = sqrt(-c * (s - t + 2.0) + m2);
932
- co = (ry + sign(l) * rx + abs(g) / (rx * ry) - m) / 2.0;
933
- } else {
934
- let h = 2.0 * m * n * sqrt(d);
935
- let s = sign(q + h) * pow(abs(q + h), 1.0 / 3.0);
936
- let u = sign(q - h) * pow(abs(q - h), 1.0 / 3.0);
937
- let rx = -s - u - c * 4.0 + 2.0 * m2;
938
- let ry = (s - u) * sqrt(3.0);
939
- let rm = sqrt(rx * rx + ry * ry);
940
- co = (ry / sqrt(rm - rx) + 2.0 * g / rm - m) / 2.0;
941
- }
942
- let r = ab * vec2f(co, sqrt(1.0 - co * co));
943
- return length(r - p) * sign(p.y - r.y);
944
- }`),
945
-
946
- e("sdParabola", [], `
947
- float sdParabola(vec2 pos, float k) {
948
- pos.x = abs(pos.x);
949
- float ik = 1.0 / k;
950
- float p = ik * (pos.y - 0.5 * ik) / 3.0;
951
- float q = 0.25 * ik * ik * pos.x;
952
- float h = q * q - p * p * p;
953
- float r = sqrt(abs(h));
954
- float x = (h > 0.0)
955
- ? pow(q + r, 1.0 / 3.0) - pow(abs(q - r), 1.0 / 3.0) * sign(r - q)
956
- : 2.0 * cos(atan(r / q) / 3.0) * sqrt(p);
957
- return length(pos - vec2(x, k * x * x)) * sign(pos.x - x);
958
- }`, `
959
- fn sdParabola(posIn: vec2f, k: f32) -> f32 {
960
- var pos = posIn;
961
- pos.x = abs(pos.x);
962
- let ik = 1.0 / k;
963
- let p = ik * (pos.y - 0.5 * ik) / 3.0;
964
- let q = 0.25 * ik * ik * pos.x;
965
- let h = q * q - p * p * p;
966
- let r = sqrt(abs(h));
967
- var x: f32;
968
- if (h > 0.0) { x = pow(q + r, 1.0 / 3.0) - pow(abs(q - r), 1.0 / 3.0) * sign(r - q); }
969
- else { x = 2.0 * cos(atan(r / q) / 3.0) * sqrt(p); }
970
- return length(pos - vec2f(x, k * x * x)) * sign(pos.x - x);
971
- }`),
972
-
973
- e("sdParabolaSegment", [], `
974
- float sdParabolaSegment(vec2 pos, float wi, float he) {
975
- pos.x = abs(pos.x);
976
- float ik = wi * wi / he;
977
- float p = ik * (he - pos.y - 0.5 * ik) / 3.0;
978
- float q = pos.x * ik * ik * 0.25;
979
- float h = q * q - p * p * p;
980
- float r = sqrt(abs(h));
981
- float x = (h > 0.0)
982
- ? pow(q + r, 1.0 / 3.0) - pow(abs(q - r), 1.0 / 3.0) * sign(r - q)
983
- : 2.0 * cos(atan(r / q) / 3.0) * sqrt(p);
984
- x = min(x, wi);
985
- return length(pos - vec2(x, he - x * x / ik)) * sign(ik * (pos.y - he) + pos.x * pos.x);
986
- }`, `
987
- fn sdParabolaSegment(posIn: vec2f, wi: f32, he: f32) -> f32 {
988
- var pos = posIn;
989
- pos.x = abs(pos.x);
990
- let ik = wi * wi / he;
991
- let p = ik * (he - pos.y - 0.5 * ik) / 3.0;
992
- let q = pos.x * ik * ik * 0.25;
993
- let h = q * q - p * p * p;
994
- let r = sqrt(abs(h));
995
- var x: f32;
996
- if (h > 0.0) { x = pow(q + r, 1.0 / 3.0) - pow(abs(q - r), 1.0 / 3.0) * sign(r - q); }
997
- else { x = 2.0 * cos(atan(r / q) / 3.0) * sqrt(p); }
998
- x = min(x, wi);
999
- return length(pos - vec2f(x, he - x * x / ik)) * sign(ik * (pos.y - he) + pos.x * pos.x);
1000
- }`),
1001
-
1002
- e("sdBezier", [], `
1003
- float sdBezier(vec2 pos, vec2 A, vec2 B, vec2 C) {
1004
- vec2 a = B - A;
1005
- vec2 b = A - 2.0 * B + C;
1006
- vec2 c = a * 2.0;
1007
- vec2 d = A - pos;
1008
- float kk = 1.0 / dot(b, b);
1009
- float kx = kk * dot(a, b);
1010
- float ky = kk * (2.0 * dot(a, a) + dot(d, b)) / 3.0;
1011
- float kz = kk * dot(d, a);
1012
- float res = 0.0;
1013
- float p = ky - kx * kx;
1014
- float p3 = p * p * p;
1015
- float q = kx * (2.0 * kx * kx - 3.0 * ky) + kz;
1016
- float h = q * q + 4.0 * p3;
1017
- if (h >= 0.0) {
1018
- h = sqrt(h);
1019
- vec2 x = (vec2(h, -h) - q) * 0.5;
1020
- vec2 uv = sign(x) * pow(abs(x), vec2(1.0 / 3.0, 1.0 / 3.0));
1021
- float t = clamp(uv.x + uv.y - kx, 0.0, 1.0);
1022
- res = dot(d + (c + b * t) * t, d + (c + b * t) * t);
1023
- } else {
1024
- float z = sqrt(-p);
1025
- float v = acos(q / (p * z * 2.0)) / 3.0;
1026
- float m = cos(v);
1027
- float n = sin(v) * 1.732050808;
1028
- vec3 t = clamp(vec3(m + m, -n - m, n - m) * z - kx, 0.0, 1.0);
1029
- res = min(dot(d + (c + b * t.x) * t.x, d + (c + b * t.x) * t.x),
1030
- dot(d + (c + b * t.y) * t.y, d + (c + b * t.y) * t.y));
1031
- }
1032
- return sqrt(res);
1033
- }`, `
1034
- fn sdBezier(pos: vec2f, A: vec2f, B: vec2f, C: vec2f) -> f32 {
1035
- let a = B - A;
1036
- let b = A - 2.0 * B + C;
1037
- let c = a * 2.0;
1038
- let d = A - pos;
1039
- let kk = 1.0 / dot(b, b);
1040
- let kx = kk * dot(a, b);
1041
- let ky = kk * (2.0 * dot(a, a) + dot(d, b)) / 3.0;
1042
- let kz = kk * dot(d, a);
1043
- var res = 0.0;
1044
- let p = ky - kx * kx;
1045
- let p3 = p * p * p;
1046
- let q = kx * (2.0 * kx * kx - 3.0 * ky) + kz;
1047
- var h = q * q + 4.0 * p3;
1048
- if (h >= 0.0) {
1049
- h = sqrt(h);
1050
- let x = (vec2f(h, -h) - q) * 0.5;
1051
- let uv = sign(x) * pow(abs(x), vec2f(1.0 / 3.0, 1.0 / 3.0));
1052
- let t = clamp(uv.x + uv.y - kx, 0.0, 1.0);
1053
- res = dot(d + (c + b * t) * t, d + (c + b * t) * t);
1054
- } else {
1055
- let z = sqrt(-p);
1056
- let v = acos(q / (p * z * 2.0)) / 3.0;
1057
- let m = cos(v);
1058
- let n = sin(v) * 1.732050808;
1059
- let t = clamp(vec3f(m + m, -n - m, n - m) * z - kx, vec3f(0.0), vec3f(1.0));
1060
- res = min(dot(d + (c + b * t.x) * t.x, d + (c + b * t.x) * t.x),
1061
- dot(d + (c + b * t.y) * t.y, d + (c + b * t.y) * t.y));
1062
- }
1063
- return sqrt(res);
1064
- }`),
1065
-
1066
- e("sdBlobbyCross", [], `
1067
- float sdBlobbyCross(vec2 pos, float he) {
1068
- pos = abs(pos);
1069
- pos = vec2(abs(pos.x - pos.y), 1.0 - pos.x - pos.y) / sqrt(2.0);
1070
- float p = (he - pos.y - 0.25 / he) / (6.0 * he);
1071
- float q = pos.x / (he * he * 16.0);
1072
- float h = q * q - p * p * p;
1073
- float x;
1074
- if (h > 0.0) {
1075
- float r = sqrt(h);
1076
- x = pow(q + r, 1.0 / 3.0) - pow(abs(q - r), 1.0 / 3.0) * sign(r - q);
1077
- } else {
1078
- float r = sqrt(p);
1079
- x = 2.0 * r * cos(acos(q / (p * r)) / 3.0);
1080
- }
1081
- x = min(x, sqrt(2.0) / 2.0);
1082
- vec2 z = vec2(x, he * (1.0 - 2.0 * x * x)) - pos;
1083
- return length(z) * sign(z.y);
1084
- }`, `
1085
- fn sdBlobbyCross(posIn: vec2f, he: f32) -> f32 {
1086
- var pos = abs(posIn);
1087
- pos = vec2f(abs(pos.x - pos.y), 1.0 - pos.x - pos.y) / sqrt(2.0);
1088
- let p = (he - pos.y - 0.25 / he) / (6.0 * he);
1089
- let q = pos.x / (he * he * 16.0);
1090
- let h = q * q - p * p * p;
1091
- var x: f32;
1092
- if (h > 0.0) {
1093
- let r = sqrt(h);
1094
- x = pow(q + r, 1.0 / 3.0) - pow(abs(q - r), 1.0 / 3.0) * sign(r - q);
1095
- } else {
1096
- let r = sqrt(p);
1097
- x = 2.0 * r * cos(acos(q / (p * r)) / 3.0);
1098
- }
1099
- x = min(x, sqrt(2.0) / 2.0);
1100
- let z = vec2f(x, he * (1.0 - 2.0 * x * x)) - pos;
1101
- return length(z) * sign(z.y);
1102
- }`),
1103
-
1104
- e("sdTunnel", [], `
1105
- float sdTunnel(vec2 p, vec2 wh) {
1106
- p.x = abs(p.x);
1107
- p.y = -p.y;
1108
- vec2 q = p - wh;
1109
- float d1 = dot(vec2(max(q.x, 0.0), q.y), vec2(max(q.x, 0.0), q.y));
1110
- q.x = (p.y > 0.0) ? q.x : length(p) - wh.x;
1111
- float d2 = dot(vec2(q.x, max(q.y, 0.0)), vec2(q.x, max(q.y, 0.0)));
1112
- float d = sqrt(min(d1, d2));
1113
- return (max(q.x, q.y) < 0.0) ? -d : d;
1114
- }`, `
1115
- fn sdTunnel(pIn: vec2f, wh: vec2f) -> f32 {
1116
- var p = pIn;
1117
- p.x = abs(p.x);
1118
- p.y = -p.y;
1119
- var q = p - wh;
1120
- let d1 = dot(vec2f(max(q.x, 0.0), q.y), vec2f(max(q.x, 0.0), q.y));
1121
- q.x = select(length(p) - wh.x, q.x, p.y > 0.0);
1122
- let d2 = dot(vec2f(q.x, max(q.y, 0.0)), vec2f(q.x, max(q.y, 0.0)));
1123
- let d = sqrt(min(d1, d2));
1124
- return select(d, -d, max(q.x, q.y) < 0.0);
1125
- }`),
1126
-
1127
- e("sdStairs", [], `
1128
- float sdStairs(vec2 p, vec2 wh, float n) {
1129
- vec2 ba = wh * n;
1130
- float d = min(dot(p - vec2(clamp(p.x, 0.0, ba.x), 0.0), p - vec2(clamp(p.x, 0.0, ba.x), 0.0)),
1131
- dot(p - vec2(ba.x, clamp(p.y, 0.0, ba.y)), p - vec2(ba.x, clamp(p.y, 0.0, ba.y))));
1132
- float s = sign(max(-p.y, p.x - ba.x));
1133
- float dia = length(wh);
1134
- p = vec2(p.x * wh.x + p.y * wh.y, -p.x * wh.y + p.y * wh.x) / dia;
1135
- float id = clamp(round(p.x / dia), 0.0, n - 1.0);
1136
- p.x = p.x - id * dia;
1137
- p = vec2(p.x * wh.x - p.y * wh.y, p.x * wh.y + p.y * wh.x) / dia;
1138
- float hh = wh.y / 2.0;
1139
- p.y -= hh;
1140
- if (p.y > hh * sign(p.x)) s = 1.0;
1141
- p = (id < 0.5 || p.x > 0.0) ? p : -p;
1142
- d = min(d, dot(p - vec2(0.0, clamp(p.y, -hh, hh)), p - vec2(0.0, clamp(p.y, -hh, hh))));
1143
- d = min(d, dot(p - vec2(clamp(p.x, 0.0, wh.x), hh), p - vec2(clamp(p.x, 0.0, wh.x), hh)));
1144
- return sqrt(d) * s;
1145
- }`, `
1146
- fn sdStairs(pIn: vec2f, wh: vec2f, n: f32) -> f32 {
1147
- var p = pIn;
1148
- let ba = wh * n;
1149
- var d = min(dot(p - vec2f(clamp(p.x, 0.0, ba.x), 0.0), p - vec2f(clamp(p.x, 0.0, ba.x), 0.0)),
1150
- dot(p - vec2f(ba.x, clamp(p.y, 0.0, ba.y)), p - vec2f(ba.x, clamp(p.y, 0.0, ba.y))));
1151
- var s = sign(max(-p.y, p.x - ba.x));
1152
- let dia = length(wh);
1153
- p = vec2f(p.x * wh.x + p.y * wh.y, -p.x * wh.y + p.y * wh.x) / dia;
1154
- let id = clamp(round(p.x / dia), 0.0, n - 1.0);
1155
- p.x = p.x - id * dia;
1156
- p = vec2f(p.x * wh.x - p.y * wh.y, p.x * wh.y + p.y * wh.x) / dia;
1157
- let hh = wh.y / 2.0;
1158
- p.y -= hh;
1159
- if (p.y > hh * sign(p.x)) { s = 1.0; }
1160
- p = select(-p, p, id < 0.5 || p.x > 0.0);
1161
- d = min(d, dot(p - vec2f(0.0, clamp(p.y, -hh, hh)), p - vec2f(0.0, clamp(p.y, -hh, hh))));
1162
- d = min(d, dot(p - vec2f(clamp(p.x, 0.0, wh.x), hh), p - vec2f(clamp(p.x, 0.0, wh.x), hh)));
1163
- return sqrt(d) * s;
1164
- }`),
1165
-
1166
- e("sdQuadraticCircle", [], `
1167
- float sdQuadraticCircle(vec2 p) {
1168
- p = abs(p);
1169
- if (p.y > p.x) p = p.yx;
1170
- float a = p.x - p.y;
1171
- float b = p.x + p.y;
1172
- float c = (2.0 * b - 1.0) / 3.0;
1173
- float h = a * a + c * c * c;
1174
- float t;
1175
- if (h >= 0.0) {
1176
- h = sqrt(h);
1177
- t = sign(h - a) * pow(abs(h - a), 1.0 / 3.0) - pow(h + a, 1.0 / 3.0);
1178
- } else {
1179
- float z = sqrt(-c);
1180
- float v = acos(a / (c * z)) / 3.0;
1181
- t = -z * (cos(v) + sin(v) * 1.732050808);
1182
- }
1183
- t *= 0.5;
1184
- vec2 w = vec2(-t, t) + 0.75 - t * t - p;
1185
- return length(w) * sign(a * a * 0.5 + b - 1.5);
1186
- }`, `
1187
- fn sdQuadraticCircle(pIn: vec2f) -> f32 {
1188
- var p = abs(pIn);
1189
- if (p.y > p.x) { p = p.yx; }
1190
- let a = p.x - p.y;
1191
- let b = p.x + p.y;
1192
- let c = (2.0 * b - 1.0) / 3.0;
1193
- var h = a * a + c * c * c;
1194
- var t: f32;
1195
- if (h >= 0.0) {
1196
- h = sqrt(h);
1197
- t = sign(h - a) * pow(abs(h - a), 1.0 / 3.0) - pow(h + a, 1.0 / 3.0);
1198
- } else {
1199
- let z = sqrt(-c);
1200
- let v = acos(a / (c * z)) / 3.0;
1201
- t = -z * (cos(v) + sin(v) * 1.732050808);
1202
- }
1203
- t *= 0.5;
1204
- let w = vec2f(-t, t) + 0.75 - t * t - p;
1205
- return length(w) * sign(a * a * 0.5 + b - 1.5);
1206
- }`),
1207
-
1208
- e("sdHyberbola", [], `
1209
- float sdHyberbola(vec2 p, float k, float he) {
1210
- p = abs(p);
1211
- p = vec2(p.x - p.y, p.x + p.y) / sqrt(2.0);
1212
- float x2 = p.x * p.x / 16.0;
1213
- float y2 = p.y * p.y / 16.0;
1214
- float r = k * (4.0 * k - p.x * p.y) / 12.0;
1215
- float q = (x2 - y2) * k * k;
1216
- float h = q * q + r * r * r;
1217
- float u;
1218
- if (h < 0.0) {
1219
- float m = sqrt(-r);
1220
- u = m * cos(acos(q / (r * m)) / 3.0);
1221
- } else {
1222
- float m = pow(sqrt(h) - q, 1.0 / 3.0);
1223
- u = (m - r / m) / 2.0;
1224
- }
1225
- float w = sqrt(u + x2);
1226
- float b = k * p.y - x2 * p.x * 2.0;
1227
- float t = p.x / 4.0 - w + sqrt(2.0 * x2 - u + b / w / 4.0);
1228
- t = max(t, sqrt(he * he * 0.5 + k) - he / sqrt(2.0));
1229
- return length(p - vec2(t, k / t)) * sign(p.x * p.y < k ? 1.0 : -1.0);
1230
- }`, `
1231
- fn sdHyberbola(pIn: vec2f, k: f32, he: f32) -> f32 {
1232
- var p = abs(pIn);
1233
- p = vec2f(p.x - p.y, p.x + p.y) / sqrt(2.0);
1234
- let x2 = p.x * p.x / 16.0;
1235
- let y2 = p.y * p.y / 16.0;
1236
- let r = k * (4.0 * k - p.x * p.y) / 12.0;
1237
- let q = (x2 - y2) * k * k;
1238
- let h = q * q + r * r * r;
1239
- var u: f32;
1240
- if (h < 0.0) {
1241
- let m = sqrt(-r);
1242
- u = m * cos(acos(q / (r * m)) / 3.0);
1243
- } else {
1244
- let m = pow(sqrt(h) - q, 1.0 / 3.0);
1245
- u = (m - r / m) / 2.0;
1246
- }
1247
- let w = sqrt(u + x2);
1248
- let b = k * p.y - x2 * p.x * 2.0;
1249
- var t = p.x / 4.0 - w + sqrt(2.0 * x2 - u + b / w / 4.0);
1250
- t = max(t, sqrt(he * he * 0.5 + k) - he / sqrt(2.0));
1251
- return length(p - vec2f(t, k / t)) * sign(select(-1.0, 1.0, p.x * p.y < k));
1252
- }`),
1253
-
1254
- e("sdCoolS", ["sd_util"], `
1255
- float sdCoolS(vec2 p) {
1256
- float six = (p.y < 0.0) ? -p.x : p.x;
1257
- p.x = abs(p.x);
1258
- p.y = abs(p.y) - 0.2;
1259
- float rex = p.x - min(round(p.x / 0.4), 0.4);
1260
- float aby = abs(p.y - 0.2) - 0.6;
1261
- float d = dot2(vec2(six, -p.y) - clamp(0.5 * (six - p.y), 0.0, 0.2));
1262
- d = min(d, dot2(vec2(p.x, -aby) - clamp(0.5 * (p.x - aby), 0.0, 0.4)));
1263
- d = min(d, dot2(vec2(rex, p.y - clamp(p.y, 0.0, 0.4))));
1264
- float s = 2.0 * p.x + aby + abs(aby + 0.4) - 0.4;
1265
- return sqrt(d) * sign(s);
1266
- }`, `
1267
- fn sdCoolS(pIn: vec2f) -> f32 {
1268
- var p = pIn;
1269
- let six = select(p.x, -p.x, p.y < 0.0);
1270
- p.x = abs(p.x);
1271
- p.y = abs(p.y) - 0.2;
1272
- let rex = p.x - min(round(p.x / 0.4), 0.4);
1273
- let aby = abs(p.y - 0.2) - 0.6;
1274
- var d = dot2(vec2f(six, -p.y) - clamp(0.5 * (six - p.y), 0.0, 0.2));
1275
- d = min(d, dot2(vec2f(p.x, -aby) - clamp(0.5 * (p.x - aby), 0.0, 0.4)));
1276
- d = min(d, dot2(vec2f(rex, p.y - clamp(p.y, 0.0, 0.4))));
1277
- let s = 2.0 * p.x + aby + abs(aby + 0.4) - 0.4;
1278
- return sqrt(d) * sign(s);
1279
- }`),
1280
-
1281
- e("sdCircleWave", ["sd_util"], `
1282
- float sdCircleWave(vec2 p, float tb, float ra) {
1283
- tb = 3.1415927 * 5.0 / 6.0 * max(tb, 0.0001);
1284
- vec2 co = ra * vec2(sin(tb), cos(tb));
1285
- p.x = abs(mod(p.x, co.x * 4.0) - co.x * 2.0);
1286
- vec2 p1 = p;
1287
- vec2 p2 = vec2(abs(p.x - 2.0 * co.x), -p.y + 2.0 * co.y);
1288
- float d1 = ((co.y * p1.x > co.x * p1.y) ? length(p1 - co) : abs(length(p1) - ra));
1289
- float d2 = ((co.y * p2.x > co.x * p2.y) ? length(p2 - co) : abs(length(p2) - ra));
1290
- return min(d1, d2);
1291
- }`, `
1292
- fn sdCircleWave(pIn: vec2f, tbIn: f32, ra: f32) -> f32 {
1293
- let tb = 3.1415927 * 5.0 / 6.0 * max(tbIn, 0.0001);
1294
- let co = ra * vec2f(sin(tb), cos(tb));
1295
- var p = pIn;
1296
- p.x = abs(glslMod(p.x, co.x * 4.0) - co.x * 2.0);
1297
- let p1 = p;
1298
- let p2 = vec2f(abs(p.x - 2.0 * co.x), -p.y + 2.0 * co.y);
1299
- let d1 = select(abs(length(p1) - ra), length(p1 - co), co.y * p1.x > co.x * p1.y);
1300
- let d2 = select(abs(length(p2) - ra), length(p2 - co), co.y * p2.x > co.x * p2.y);
1301
- return min(d1, d2);
1302
- }`),
1303
- ]