@openmockup-studio/player 0.0.0-stage → 0.2.0

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,1956 @@
1
+ import { t as e } from "./rolldown-runtime-CGnMp29N.js";
2
+ import { A as t, B as n, D as r, E as i, F as a, G as o, J as s, K as c, N as l, O as u, P as d, Q as f, R as p, S as m, T as h, V as g, X as _, Y as v, Z as y, _ as b, a as x, b as S, c as C, g as w, j as T, l as E, m as D, o as O, q as k, s as A, t as j, u as M, w as N, x as P, y as F, z as I } from "./three-o_76Nw0r.js";
3
+ import { C as L, S as R, T as z, _ as B, b as V, g as H, h as U, v as W, w as G, x as K, y as q } from "./device-phone-DxWL5LkW.js";
4
+ // ../engine/src/backdrop-math.ts
5
+ var ee = "#f6f6f4";
6
+ function te(e, t) {
7
+ let n = e.color ?? e.inner ?? e.outer ?? ee;
8
+ if (e.kind === "image") return t ? {
9
+ kind: "image",
10
+ fallback: n
11
+ } : {
12
+ kind: "flat",
13
+ color: n
14
+ };
15
+ if (e.kind === "gradient") {
16
+ let { inner: t, outer: n, angle: r } = e;
17
+ return t && n ? r !== void 0 && Number.isFinite(r) ? {
18
+ kind: "linear",
19
+ inner: t,
20
+ outer: n,
21
+ angle: r
22
+ } : {
23
+ kind: "radial",
24
+ inner: t,
25
+ outer: n
26
+ } : {
27
+ kind: "flat",
28
+ color: t ?? n ?? e.color ?? ee
29
+ };
30
+ }
31
+ return {
32
+ kind: "flat",
33
+ color: n
34
+ };
35
+ }
36
+ function ne(e, t) {
37
+ let n = e * Math.PI / 180, r = Math.sin(n), i = Math.cos(n);
38
+ return {
39
+ x: r,
40
+ y: i,
41
+ length: Math.abs(t * r) + Math.abs(i)
42
+ };
43
+ }
44
+ function re(e, t) {
45
+ return G(e, t, "cover");
46
+ }
47
+ // ../engine/src/backdrop.ts
48
+ function ie() {
49
+ let e = new n({
50
+ depthTest: !1,
51
+ depthWrite: !1,
52
+ toneMapped: !1,
53
+ uniforms: {
54
+ inner: { value: new D("#f6f6f4") },
55
+ outer: { value: new D("#d5d5d1") },
56
+ center: { value: new v(.5, .4) },
57
+ aspect: { value: 1 },
58
+ mode: { value: 0 },
59
+ axis: { value: new _(0, -1, 1) },
60
+ map: { value: null },
61
+ uvRepeat: { value: new v(1, 1) },
62
+ uvOffset: { value: new v(0, 0) }
63
+ },
64
+ vertexShader: "\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = vec4(position.xy, 0.0, 1.0);\n }\n ",
65
+ fragmentShader: "\n #include <common>\n uniform vec3 inner;\n uniform vec3 outer;\n uniform vec2 center;\n uniform float aspect;\n uniform int mode;\n uniform vec3 axis;\n uniform sampler2D map;\n uniform vec2 uvRepeat;\n uniform vec2 uvOffset;\n varying vec2 vUv;\n vec3 srgbToLinear(vec3 c) {\n return mix(pow((c + 0.055) / 1.055, vec3(2.4)), c / 12.92, vec3(lessThanEqual(c, vec3(0.04045))));\n }\n void main() {\n vec3 rgb;\n if (mode == 3) {\n // Image: the sRGB texture is already decoded to linear by the GPU.\n rgb = texture2D(map, vUv * uvRepeat + uvOffset).rgb;\n } else {\n vec3 srgb = inner;\n if (mode == 2) {\n // CSS linear-gradient(<angle>, inner, outer): project onto the gradient line.\n vec2 p = (vUv - 0.5) * vec2(aspect, 1.0);\n float t = clamp(dot(p, axis.xy) / axis.z + 0.5, 0.0, 1.0);\n srgb = mix(inner, outer, t);\n } else if (mode == 1) {\n // CSS radial-gradient(circle ...): radius reaches the farthest corner.\n vec2 d = (vUv - center) * vec2(aspect, 1.0);\n vec2 far = max(center, 1.0 - center) * vec2(aspect, 1.0);\n float t = clamp(length(d) / length(far), 0.0, 1.0);\n srgb = mix(inner, outer, t);\n }\n rgb = srgbToLinear(srgb);\n }\n gl_FragColor = vec4(rgb, 1.0);\n #include <colorspace_fragment>\n }\n "
66
+ }), t = new r(new d(2, 2), e);
67
+ t.frustumCulled = !1;
68
+ let i = new I();
69
+ i.add(t);
70
+ let a = new T(-1, 1, 1, -1, 0, 1), o = new v(), s = (e, t) => e.setStyle(t, N), c = null, l = 1;
71
+ return {
72
+ setImage(e, t = 1) {
73
+ c = e, l = t;
74
+ },
75
+ render(t, n) {
76
+ if (n.kind === "transparent") return;
77
+ let r = e.uniforms;
78
+ t.getDrawingBufferSize(o);
79
+ let u = t.getRenderTarget(), d = u ? u.width / u.height : o.x / o.y;
80
+ r.aspect.value = d;
81
+ let f = te(n, c !== null);
82
+ if (f.kind === "image") {
83
+ let { repeat: e, offset: t } = re(l, d);
84
+ r.uvRepeat.value.set(e[0], e[1]), r.uvOffset.value.set(t[0], t[1]), r.map.value = c, r.mode.value = 3;
85
+ } else if (f.kind === "flat") s(r.inner.value, f.color), r.mode.value = 0;
86
+ else if (s(r.inner.value, f.inner), s(r.outer.value, f.outer), f.kind === "linear") {
87
+ let e = ne(f.angle, d);
88
+ r.axis.value.set(e.x, e.y, e.length), r.mode.value = 2;
89
+ } else r.mode.value = 1;
90
+ t.render(i, a);
91
+ },
92
+ dispose() {
93
+ t.geometry.dispose(), e.dispose();
94
+ }
95
+ };
96
+ }
97
+ // ../engine/src/camera.ts
98
+ var ae = Math.PI / 180, oe = new _(), se = new _();
99
+ function ce(e, t) {
100
+ e.position.set(t.position[0], t.position[1], t.position[2]), oe.set(t.target[0], t.target[1], t.target[2]).sub(e.position).normalize(), se.set(0, 1, 0).applyAxisAngle(oe, t.roll * ae), e.up.copy(se), e.lookAt(t.target[0], t.target[1], t.target[2]), e.fov !== t.fov && (e.fov = t.fov, e.updateProjectionMatrix());
101
+ }
102
+ // ../engine/src/environment/recipes.ts
103
+ var le = {
104
+ studio: {
105
+ room: [
106
+ [0, "#55555a"],
107
+ [.38, "#3a3a3e"],
108
+ [.5, "#262629"],
109
+ [.62, "#323236"],
110
+ [1, "#4a4a4e"]
111
+ ],
112
+ feather: .15,
113
+ keySize: 1,
114
+ gain: {
115
+ key: 1,
116
+ overhead: 1,
117
+ strip: 1,
118
+ rim: 1,
119
+ rear: 1,
120
+ fill: 1,
121
+ bounce: 1,
122
+ sweep: 1
123
+ },
124
+ shadow: {
125
+ opacity: 1,
126
+ radius: 28
127
+ }
128
+ },
129
+ soft: {
130
+ room: [
131
+ [0, "#5e5e63"],
132
+ [.38, "#4c4c51"],
133
+ [.5, "#3e3e43"],
134
+ [.62, "#47474b"],
135
+ [1, "#55555a"]
136
+ ],
137
+ feather: .3,
138
+ keySize: 1.5,
139
+ gain: {
140
+ key: .72,
141
+ overhead: 1.25,
142
+ strip: .55,
143
+ rim: .5,
144
+ rear: .6,
145
+ fill: 1.25,
146
+ bounce: 1.2,
147
+ sweep: 1
148
+ },
149
+ shadow: {
150
+ opacity: .75,
151
+ radius: 40
152
+ }
153
+ },
154
+ contrast: {
155
+ room: [
156
+ [0, "#46464c"],
157
+ [.38, "#27272b"],
158
+ [.5, "#111113"],
159
+ [.62, "#1b1b1e"],
160
+ [1, "#35353a"]
161
+ ],
162
+ feather: .1,
163
+ keySize: .85,
164
+ gain: {
165
+ key: 1.45,
166
+ overhead: .8,
167
+ strip: 1.5,
168
+ rim: 1.5,
169
+ rear: 1.3,
170
+ fill: .45,
171
+ bounce: .4,
172
+ sweep: .35
173
+ },
174
+ shadow: {
175
+ opacity: 1.25,
176
+ radius: 20
177
+ }
178
+ },
179
+ night: {
180
+ room: [
181
+ [0, "#17181e"],
182
+ [.38, "#0b0c10"],
183
+ [.5, "#050506"],
184
+ [.62, "#08080a"],
185
+ [1, "#0f1014"]
186
+ ],
187
+ feather: .22,
188
+ keySize: .9,
189
+ gain: {
190
+ key: .55,
191
+ overhead: .7,
192
+ strip: .9,
193
+ rim: 1.1,
194
+ rear: .8,
195
+ fill: .18,
196
+ bounce: .15,
197
+ sweep: .1
198
+ },
199
+ shadow: {
200
+ opacity: .6,
201
+ radius: 30
202
+ }
203
+ }
204
+ };
205
+ function ue(e) {
206
+ return e !== void 0 && Object.hasOwn(le, e) ? e : "studio";
207
+ }
208
+ // ../engine/src/environment/studio.ts
209
+ function de(e, t = "studio") {
210
+ let n = le[t], i = new I(), a = [], s = pe(1, 256, n.room), c = new o(60, 48, 24), l = new u({
211
+ map: s,
212
+ side: 1
213
+ });
214
+ i.add(new r(c, l)), a.push(s, c, l);
215
+ let f = me("none", n.feather), p = me("top", n.feather), m = me("left", n.feather);
216
+ a.push(f, p, m);
217
+ let h = (e, t, o, s, c, l) => {
218
+ let f = new d(t, o), p = new u({
219
+ side: 2,
220
+ map: l,
221
+ transparent: !0,
222
+ blending: 2,
223
+ depthWrite: !1
224
+ });
225
+ p.color.setScalar(s * n.gain[e]);
226
+ let m = new r(f, p);
227
+ m.position.set(...c), m.lookAt(0, 0, 0), i.add(m), a.push(f, p);
228
+ };
229
+ h("key", 22 * n.keySize, 16 * n.keySize, 3.2, [
230
+ -11,
231
+ 8,
232
+ 12
233
+ ], p), h("overhead", 30, 20, 1.3, [
234
+ 0,
235
+ 18,
236
+ 2
237
+ ], f), h("strip", 5, 26, 6.5, [
238
+ 16,
239
+ 2,
240
+ 4
241
+ ], f), h("rim", 5, 26, 4.5, [
242
+ -16,
243
+ 1,
244
+ -5
245
+ ], f), h("rear", 20, 12, 2, [
246
+ 4,
247
+ 7,
248
+ -16
249
+ ], p), h("fill", 30, 18, .85, [
250
+ -4,
251
+ 4,
252
+ 26
253
+ ], m), h("bounce", 26, 8, .6, [
254
+ 3,
255
+ -6,
256
+ 18
257
+ ], f), h("sweep", 56, 56, .55, [
258
+ 0,
259
+ -14,
260
+ 3
261
+ ], f);
262
+ let g = new x(e), _ = g.fromScene(i, .035).texture;
263
+ g.dispose();
264
+ for (let e of a) e.dispose();
265
+ return _;
266
+ }
267
+ function fe(e, t) {
268
+ let n = document.createElement("canvas");
269
+ return n.width = e, n.height = t, [n, n.getContext("2d")];
270
+ }
271
+ function pe(e, t, n) {
272
+ let [r, i] = fe(e, t);
273
+ if (i) {
274
+ let r = i.createLinearGradient(0, 0, 0, t);
275
+ for (let [e, t] of n) r.addColorStop(e, t);
276
+ i.fillStyle = r, i.fillRect(0, 0, e, t);
277
+ }
278
+ let a = new M(r);
279
+ return a.colorSpace = p, a;
280
+ }
281
+ function me(e, t) {
282
+ let [n, r] = fe(128, 128);
283
+ if (r) {
284
+ let n = r.createImageData(128, 128), i = (e, t, n) => {
285
+ let r = Math.min(1, Math.max(0, (n - e) / (t - e)));
286
+ return r * r * (3 - 2 * r);
287
+ };
288
+ for (let r = 0; r < 128; r++) for (let a = 0; a < 128; a++) {
289
+ let o = (a + .5) / 128, s = (r + .5) / 128, c = i(0, t, Math.min(o, 1 - o, s, 1 - s));
290
+ e === "top" && (c *= .35 + .65 * (1 - s)), e === "left" && (c *= .3 + .7 * (1 - o));
291
+ let l = Math.round(c * 255), u = (r * 128 + a) * 4;
292
+ n.data[u] = n.data[u + 1] = n.data[u + 2] = l, n.data[u + 3] = 255;
293
+ }
294
+ r.putImageData(n, 0, 0);
295
+ }
296
+ return new M(n);
297
+ }
298
+ // ../engine/src/floor.ts
299
+ function he(e, t) {
300
+ let n = new b(16777215, .6);
301
+ n.position.set(.6, 30, 1.2), n.castShadow = !0, n.shadow.mapSize.set(512, 512), Object.assign(n.shadow.camera, {
302
+ left: -12,
303
+ right: 12,
304
+ top: 12,
305
+ bottom: -12,
306
+ near: 1,
307
+ far: 60
308
+ }), n.shadow.radius = 28, n.shadow.blurSamples = 25, n.shadow.bias = -5e-4, e.add(n, n.target);
309
+ let i = new g({ opacity: .22 }), a = new r(new d(80, 80), i);
310
+ return a.rotation.x = -Math.PI / 2, a.position.y = t, a.receiveShadow = !0, e.add(a), {
311
+ light: n,
312
+ ground: a,
313
+ setY(e) {
314
+ a.position.y = e;
315
+ },
316
+ setOpacity(e) {
317
+ i.opacity = e;
318
+ },
319
+ setVisible(e) {
320
+ a.visible = e;
321
+ },
322
+ fit(e) {
323
+ let t = Math.max(4, e * 1.3), r = n.shadow.camera;
324
+ r.right !== t && (Object.assign(r, {
325
+ left: -t,
326
+ right: t,
327
+ top: t,
328
+ bottom: -t,
329
+ far: Math.max(60, t * 6)
330
+ }), n.position.set(.6, Math.max(30, t * 2.5), 1.2), r.updateProjectionMatrix(), a.scale.setScalar(Math.max(1, t / 10)));
331
+ },
332
+ dispose() {
333
+ e.remove(n, n.target, a), a.geometry.dispose(), i.dispose(), n.dispose();
334
+ }
335
+ };
336
+ }
337
+ // ../engine/src/glow.ts
338
+ var J = 4;
339
+ function ge(e) {
340
+ let t = /* @__PURE__ */ new Map(), i = new f(J, J, { type: s }), a = /* @__PURE__ */ new Uint8Array(64), o = new n({
341
+ uniforms: { map: { value: null } },
342
+ vertexShader: "\n varying vec2 vUv;\n void main() { vUv = uv; gl_Position = vec4(position.xy, 0.0, 1.0); }\n ",
343
+ fragmentShader: `
344
+ uniform sampler2D map;
345
+ varying vec2 vUv;
346
+ void main() {
347
+ vec2 cell = vec2(${(1 / J).toFixed(4)});
348
+ vec2 origin = floor(vUv * ${J.toFixed(1)}) * cell;
349
+ vec3 sum = vec3(0.0);
350
+ for (int y = 0; y < 4; y++) for (int x = 0; x < 4; x++) {
351
+ sum += texture2D(map, origin + (vec2(x, y) + 0.5) * cell / 4.0).rgb;
352
+ }
353
+ // sqrt keeps precision in the darks through the 8-bit target.
354
+ gl_FragColor = vec4(sqrt(sum / 16.0), 1.0);
355
+ }
356
+ `,
357
+ depthTest: !1,
358
+ depthWrite: !1
359
+ }), l = new r(new d(2, 2), o);
360
+ l.frustumCulled = !1;
361
+ let u = new I();
362
+ u.add(l);
363
+ let p = new T(-1, 1, 1, -1, 0, 1);
364
+ function m(t, n) {
365
+ o.uniforms.map.value = t;
366
+ let r = e.getRenderTarget();
367
+ e.setRenderTarget(i), e.render(u, p), e.readRenderTargetPixels(i, 0, 0, J, J, a), e.setRenderTarget(r);
368
+ let s = 0, c = 0, l = 0;
369
+ for (let e = 0; e < a.length; e += 4) s += (a[e] / 255) ** 2, c += (a[e + 1] / 255) ** 2, l += (a[e + 2] / 255) ** 2;
370
+ n.setRGB(s / 16, c / 16, l / 16, N);
371
+ }
372
+ function g(e) {
373
+ let n = t.get(e);
374
+ if (n) return n;
375
+ let r = e.mesh.geometry;
376
+ r.computeBoundingBox();
377
+ let i = r.boundingBox, a = i.max.x - i.min.x, o = i.max.y - i.min.y, s = (i.max.x + i.min.x) / 2, l = (i.max.y + i.min.y) / 2, u = i.max.z + .05, d = [];
378
+ for (let t of [-o / 4, o / 4]) {
379
+ let n = new c(16777215, 0, 0, h.degToRad(88), 1, 2);
380
+ n.position.set(s, l + t, u), n.target.position.set(s, l + t, u + 10), e.mesh.add(n, n.target), d.push(n);
381
+ }
382
+ return n = {
383
+ surface: e,
384
+ lights: d,
385
+ area: a * o,
386
+ color: new D(0, 0, 0),
387
+ measured: ""
388
+ }, t.set(e, n), n;
389
+ }
390
+ function _(e) {
391
+ for (let t of e.lights) t.parent?.remove(t, t.target), t.dispose();
392
+ }
393
+ return {
394
+ update(e, n) {
395
+ let r = new Set(e.map((e) => e.surface));
396
+ for (let [e, n] of t) r.has(e) || (_(n), t.delete(e));
397
+ if (!(n <= 0 && t.size === 0)) for (let { surface: t, texture: r } of e) {
398
+ let e = g(t), i = r ? `${r.uuid}:${r.version}` : "";
399
+ i !== e.measured && (e.measured = i, r ? m(r, e.color) : e.color.setRGB(0, 0, 0));
400
+ let a = n * e.area * 1.2;
401
+ for (let t of e.lights) t.color.copy(e.color), t.intensity = a, t.visible = n > 0;
402
+ }
403
+ },
404
+ dispose() {
405
+ for (let e of t.values()) _(e);
406
+ t.clear(), i.dispose(), o.dispose(), l.geometry.dispose();
407
+ }
408
+ };
409
+ }
410
+ var _e = Math.PI / 180, ve = .25, ye = .012, be = .016, xe = .7, Se = .3, Ce = .9, we = 5, Te = 24, Ee = 12, De = 24, Y = (e) => typeof e == "number" && e > 0 ? e : 0;
411
+ function Oe(e) {
412
+ return Y(e.fisheye) > 0 || Y(e.chromatic) > 0 || Y(e.vignette) > 0 || Y(e.bloom) > 0 || Y(e.grain) > 0 || Y(e.blur) > 0 || Y(e.fade) > 0;
413
+ }
414
+ var X = "\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = vec4(position.xy, 0.0, 1.0);\n }\n", ke = "\n uniform float camNear;\n uniform float camFar;\n uniform float focus;\n uniform float maxCoc; // blur * MAX_COC * frame height, in pixels\n\n float viewZ(float d) {\n if (d >= 0.99999) return camFar;\n float z = d * 2.0 - 1.0;\n return 2.0 * camNear * camFar / (camFar + camNear - z * (camFar - camNear));\n }\n float cocOf(float d) {\n return maxCoc * clamp(abs(1.0 - focus / viewZ(d)), 0.0, 1.0);\n }\n";
415
+ function Ae(e, t = 4) {
416
+ let i = 1, a = 1, o = 1, c = new w(1, 1, F), l = new f(1, 1, {
417
+ type: m,
418
+ colorSpace: N,
419
+ samples: t,
420
+ depthBuffer: !0,
421
+ depthTexture: c
422
+ }), p = new f(1, 1, {
423
+ type: s,
424
+ samples: t,
425
+ depthBuffer: !0
426
+ }), h = new u({ color: 0 }), g = new u({ color: 16777215 }), _ = new f(1, 1, {
427
+ type: m,
428
+ colorSpace: N,
429
+ depthBuffer: !1,
430
+ count: 2
431
+ }), y = [];
432
+ for (let e = 0; e < we; e++) y.push(new f(1, 1, {
433
+ type: m,
434
+ colorSpace: N,
435
+ depthBuffer: !1
436
+ }));
437
+ let b = new n({
438
+ glslVersion: S,
439
+ depthTest: !1,
440
+ depthWrite: !1,
441
+ toneMapped: !1,
442
+ uniforms: {
443
+ tColor: { value: l.texture },
444
+ tMask: { value: p.texture },
445
+ tDepth: { value: c },
446
+ texel: { value: new v(1, 1) },
447
+ camNear: { value: 1 },
448
+ camFar: { value: 100 },
449
+ focus: { value: 1 },
450
+ maxCoc: { value: 0 }
451
+ },
452
+ vertexShader: X,
453
+ fragmentShader: `
454
+ uniform sampler2D tColor;
455
+ uniform sampler2D tMask;
456
+ uniform sampler2D tDepth;
457
+ uniform vec2 texel; // 1 / full-resolution size
458
+ ${ke}
459
+ varying vec2 vUv;
460
+ layout(location = 0) out highp vec4 outColor;
461
+ layout(location = 1) out highp vec4 outMask;
462
+
463
+ float ign(vec2 p) {
464
+ return fract(52.9829189 * fract(dot(p, vec2(0.06711056, 0.00583715))));
465
+ }
466
+
467
+ void main() {
468
+ float d0 = texture2D(tDepth, vUv).x;
469
+ float c0 = cocOf(d0);
470
+ vec4 col0 = texture2D(tColor, vUv);
471
+ vec2 m0 = texture2D(tMask, vUv).rg;
472
+ if (c0 < 0.5) {
473
+ outColor = col0;
474
+ outMask = vec4(m0, 0.0, 1.0);
475
+ return;
476
+ }
477
+ float z0 = viewZ(d0);
478
+ float turn = 6.2831853 * ign(gl_FragCoord.xy);
479
+ vec4 acc = col0;
480
+ vec2 macc = m0;
481
+ float wsum = 1.0;
482
+ // Small blurs need few taps; only wide ones pay for the full disc.
483
+ float taps = clamp(8.0 + c0 * 0.7, 8.0, float(${Te}));
484
+ const int N = ${Te};
485
+ for (int i = 0; i < N; i++) {
486
+ if (float(i) >= taps) break;
487
+ float r = sqrt((float(i) + 0.5) / taps);
488
+ float a = float(i) * 2.39996323 + turn;
489
+ float dist = r * c0;
490
+ vec2 uv = vUv + vec2(cos(a), sin(a)) * dist * texel;
491
+ float d = texture2D(tDepth, uv).x;
492
+ float cs = cocOf(d);
493
+ // A sample behind the centre can't blur over it more than the centre itself blurs.
494
+ if (viewZ(d) > z0) cs = min(cs, c0);
495
+ float w = clamp(cs - dist + 1.0, 0.0, 1.0);
496
+ acc += texture2D(tColor, uv) * w;
497
+ macc += texture2D(tMask, uv).rg * w;
498
+ wsum += w;
499
+ }
500
+ outColor = acc / wsum;
501
+ outMask = vec4(macc / wsum, 0.0, 1.0);
502
+ }
503
+ `
504
+ }), x = new n({
505
+ depthTest: !1,
506
+ depthWrite: !1,
507
+ toneMapped: !1,
508
+ uniforms: {
509
+ tSrc: { value: l.texture },
510
+ tSrcMask: { value: p.texture },
511
+ texel: { value: new v(1, 1) },
512
+ threshold: { value: xe },
513
+ knee: { value: Se }
514
+ },
515
+ vertexShader: X,
516
+ fragmentShader: "\n uniform sampler2D tSrc;\n uniform sampler2D tSrcMask; // r: exact pixel, g: display\n uniform vec2 texel; // of the source\n uniform float threshold;\n uniform float knee;\n varying vec2 vUv;\n\n vec3 bright(vec2 uv) {\n vec3 c = min(texture2D(tSrc, uv).rgb, vec3(8.0));\n vec2 m = texture2D(tSrcMask, uv).rg;\n float geometry = 1.0 - m.r * (1.0 - m.g); // 0 on the bare backdrop\n float l = dot(c, vec3(0.2126, 0.7152, 0.0722));\n float rq = clamp(l - threshold + knee, 0.0, 2.0 * knee);\n rq = rq * rq / (4.0 * knee + 1e-4);\n float w = max(rq, l - threshold) / max(l, 1e-4);\n return c * w * geometry;\n }\n\n void main() {\n vec3 s = bright(vUv + texel * vec2(-1.0, -1.0))\n + bright(vUv + texel * vec2( 1.0, -1.0))\n + bright(vUv + texel * vec2(-1.0, 1.0))\n + bright(vUv + texel * vec2( 1.0, 1.0));\n gl_FragColor = vec4(s * 0.25, 1.0);\n }\n "
517
+ }), C = new n({
518
+ depthTest: !1,
519
+ depthWrite: !1,
520
+ toneMapped: !1,
521
+ uniforms: {
522
+ tSrc: { value: null },
523
+ texel: { value: new v(1, 1) }
524
+ },
525
+ vertexShader: X,
526
+ fragmentShader: "\n uniform sampler2D tSrc;\n uniform vec2 texel; // of the source\n varying vec2 vUv;\n void main() {\n vec3 s = texture2D(tSrc, vUv).rgb * 4.0;\n s += texture2D(tSrc, vUv + texel * vec2(-1.0, -1.0)).rgb;\n s += texture2D(tSrc, vUv + texel * vec2( 1.0, -1.0)).rgb;\n s += texture2D(tSrc, vUv + texel * vec2(-1.0, 1.0)).rgb;\n s += texture2D(tSrc, vUv + texel * vec2( 1.0, 1.0)).rgb;\n gl_FragColor = vec4(s * 0.125, 1.0);\n }\n "
527
+ }), E = new n({
528
+ depthTest: !1,
529
+ depthWrite: !1,
530
+ toneMapped: !1,
531
+ blending: 5,
532
+ blendEquation: 100,
533
+ blendSrc: 201,
534
+ blendDst: 201,
535
+ blendSrcAlpha: 200,
536
+ blendDstAlpha: 201,
537
+ uniforms: {
538
+ tSrc: { value: null },
539
+ texel: { value: new v(1, 1) }
540
+ },
541
+ vertexShader: X,
542
+ fragmentShader: "\n uniform sampler2D tSrc;\n uniform vec2 texel; // of the (smaller) source\n varying vec2 vUv;\n void main() {\n vec2 h = texel * 0.5;\n vec3 s = texture2D(tSrc, vUv + vec2(-2.0 * h.x, 0.0)).rgb;\n s += texture2D(tSrc, vUv + vec2( 2.0 * h.x, 0.0)).rgb;\n s += texture2D(tSrc, vUv + vec2(0.0, -2.0 * h.y)).rgb;\n s += texture2D(tSrc, vUv + vec2(0.0, 2.0 * h.y)).rgb;\n s += texture2D(tSrc, vUv + vec2(-h.x, -h.y)).rgb * 2.0;\n s += texture2D(tSrc, vUv + vec2( h.x, -h.y)).rgb * 2.0;\n s += texture2D(tSrc, vUv + vec2(-h.x, h.y)).rgb * 2.0;\n s += texture2D(tSrc, vUv + vec2( h.x, h.y)).rgb * 2.0;\n gl_FragColor = vec4(s / 12.0, 1.0);\n }\n "
543
+ }), D = new n({
544
+ depthTest: !1,
545
+ depthWrite: !1,
546
+ uniforms: {
547
+ tColor: { value: l.texture },
548
+ tMask: { value: p.texture },
549
+ tDepth: { value: c },
550
+ tDofColor: { value: _.textures[0] },
551
+ tDofMask: { value: _.textures[1] },
552
+ tBloom: { value: y[0].texture },
553
+ overscan: { value: 1 },
554
+ aspect: { value: 1 },
555
+ barrel: { value: 0 },
556
+ chromatic: { value: 0 },
557
+ vignette: { value: 0 },
558
+ dofOn: { value: 0 },
559
+ bloomAmount: { value: 0 },
560
+ grain: { value: 0 },
561
+ frame: { value: 0 },
562
+ fade: { value: 0 },
563
+ camNear: { value: 1 },
564
+ camFar: { value: 100 },
565
+ focus: { value: 1 },
566
+ maxCoc: { value: 0 }
567
+ },
568
+ vertexShader: X,
569
+ fragmentShader: `
570
+ // three injects <common> and the tone-mapping functions into every program prefix.
571
+ uniform sampler2D tColor;
572
+ uniform sampler2D tMask;
573
+ uniform sampler2D tDepth;
574
+ uniform sampler2D tDofColor;
575
+ uniform sampler2D tDofMask;
576
+ uniform sampler2D tBloom;
577
+ uniform float overscan;
578
+ uniform float aspect;
579
+ uniform float barrel;
580
+ uniform float chromatic;
581
+ uniform float vignette;
582
+ uniform float dofOn;
583
+ uniform float bloomAmount;
584
+ uniform float grain;
585
+ uniform float frame;
586
+ uniform float fade;
587
+ ${ke}
588
+ varying vec2 vUv;
589
+
590
+ // Normalised so r = 1 at the frame corners.
591
+ vec2 toP(vec2 uv) { return (uv - 0.5) * 2.0 * vec2(aspect, 1.0) / sqrt(aspect * aspect + 1.0); }
592
+ vec2 toUv(vec2 p) { return p * sqrt(aspect * aspect + 1.0) / vec2(aspect, 1.0) * 0.5 / overscan + 0.5; }
593
+
594
+ vec2 warp(vec2 p, float scale) {
595
+ float r2 = dot(p, p);
596
+ return p * (1.0 + barrel * r2) * scale;
597
+ }
598
+
599
+ uint pcg(uint v) {
600
+ uint s = v * 747796405u + 2891336453u;
601
+ uint w = ((s >> ((s >> 28u) + 4u)) ^ s) * 277803737u;
602
+ return (w >> 22u) ^ w;
603
+ }
604
+
605
+ void main() {
606
+ vec2 p = toP(vUv);
607
+ float r2 = dot(p, p);
608
+ vec2 uvG = toUv(warp(p, 1.0));
609
+ vec4 g0 = texture2D(tColor, uvG);
610
+ vec4 g = g0;
611
+ float m = texture2D(tMask, uvG).r;
612
+
613
+ if (dofOn > 0.5) {
614
+ // Sharp where the pixel is in focus, the half-resolution gather elsewhere.
615
+ float w = smoothstep(0.5, 2.0, cocOf(texture2D(tDepth, uvG).x));
616
+ if (w > 0.0) {
617
+ g = mix(g0, texture2D(tDofColor, uvG), w);
618
+ m = mix(m, texture2D(tDofMask, uvG).r, w);
619
+ }
620
+ }
621
+
622
+ vec3 rgb = g.rgb;
623
+ if (chromatic > 0.0) {
624
+ // Fringe from the sharp image, applied on top of the (possibly blurred) base.
625
+ vec2 uvR = toUv(warp(p, 1.0 + chromatic * r2));
626
+ vec2 uvB = toUv(warp(p, 1.0 - chromatic * r2));
627
+ rgb.r += texture2D(tColor, uvR).r - g0.r;
628
+ rgb.b += texture2D(tColor, uvB).b - g0.b;
629
+ }
630
+ rgb = max(rgb, 0.0);
631
+ float alpha = g.a;
632
+
633
+ if (bloomAmount > 0.0) rgb += texture2D(tBloom, uvG).rgb * bloomAmount;
634
+
635
+ vec3 mapped = rgb;
636
+ #ifdef TONE_MAPPING
637
+ mapped = toneMapping(rgb);
638
+ #endif
639
+ rgb = mix(mapped, rgb, m);
640
+ rgb *= 1.0 - vignette * smoothstep(0.35, 1.25, sqrt(r2));
641
+
642
+ if (grain > 0.0) {
643
+ // Noise lives in a perceptual space so it reads evenly; highlights get less.
644
+ uvec2 px = uvec2(gl_FragCoord.xy);
645
+ uint h1 = pcg(px.x + pcg(px.y + pcg(uint(frame))));
646
+ uint h2 = pcg(h1 ^ 2654435769u);
647
+ float n = (float(h1) + float(h2)) * (1.0 / 4294967295.0) - 1.0; // triangular, -1..1
648
+ vec3 e = pow(rgb, vec3(1.0 / 2.2));
649
+ float l = dot(e, vec3(0.299, 0.587, 0.114));
650
+ float shade = 1.0 - 0.5 * smoothstep(0.5, 0.95, l);
651
+ e += n * grain * 0.16 * shade * alpha;
652
+ rgb = pow(max(e, 0.0), vec3(2.2));
653
+ }
654
+
655
+ rgb *= 1.0 - fade;
656
+ alpha = mix(alpha, 1.0, fade);
657
+ gl_FragColor = vec4(rgb, alpha);
658
+ #include <colorspace_fragment>
659
+ }
660
+ `
661
+ }), O = new r(new d(2, 2), D);
662
+ O.frustumCulled = !1;
663
+ let k = new I();
664
+ k.add(O);
665
+ let A = new T(-1, 1, 1, -1, 0, 1);
666
+ function j(t, n) {
667
+ O.material = t, e.setRenderTarget(n), e.render(k, A);
668
+ }
669
+ let M = 2;
670
+ function P() {
671
+ _.setSize(Math.max(1, Math.ceil(l.width / M)), Math.max(1, Math.ceil(l.height / M)));
672
+ }
673
+ function L(e) {
674
+ let t = Math.ceil(e / .04) * .04, n = Math.max(1, Math.round(i * t)), r = Math.max(1, Math.round(a * t));
675
+ (t !== o || l.width !== n || l.height !== r) && (o = t, l.setSize(n, r), p.setSize(n, r), P(), y.forEach((e, t) => {
676
+ let i = 2 ** (t + 1);
677
+ e.setSize(Math.max(1, Math.ceil(n / i)), Math.max(1, Math.ceil(r / i)));
678
+ }));
679
+ }
680
+ let R = new v();
681
+ return {
682
+ setSize(e, t) {
683
+ i = e, a = t, L(o);
684
+ },
685
+ render(t, n, r, s, c, u = [], d = 0) {
686
+ let f = Y(c.fisheye), m = Y(c.chromatic), v = Y(c.vignette), S = Math.min(1, Y(c.bloom)), w = Math.min(1, Y(c.grain)), T = Math.min(1, Y(c.blur)), O = Math.min(1, Y(c.fade)), k = Y(c.focus), A = T > 0 && k > 0, N = ve * f;
687
+ L(1 + N + ye * m + .005);
688
+ let F = n.fov;
689
+ n.fov = 2 * Math.atan(Math.tan(F * _e / 2) * o) / _e, n.updateProjectionMatrix(), l.resolveDepthBuffer = A, e.setRenderTarget(l), e.clear(), r.render(e, s), e.render(t, n);
690
+ let I = e.shadowMap.autoUpdate;
691
+ e.shadowMap.autoUpdate = !1, e.setRenderTarget(p), e.setClearColor(16711680, 1), e.clear();
692
+ let z = u.filter((e) => e.visible);
693
+ for (let e of z) e.visible = !1;
694
+ t.overrideMaterial = h, e.render(t, n), n.layers.set(1), t.overrideMaterial = g, e.render(t, n), n.layers.set(0), t.overrideMaterial = null;
695
+ for (let e of z) e.visible = !0;
696
+ e.setClearColor(0, 0), e.shadowMap.autoUpdate = I, n.fov = F, n.updateProjectionMatrix();
697
+ let B = T * be * a;
698
+ if (A) {
699
+ let e = B >= Ee ? 4 : 2;
700
+ e !== M && (M = e, P());
701
+ let t = b.uniforms;
702
+ R.set(1 / l.width, 1 / l.height), t.texel.value.copy(R), t.camNear.value = n.near, t.camFar.value = n.far, t.focus.value = k, t.maxCoc.value = B, j(b, _);
703
+ }
704
+ if (S > 0) {
705
+ let e = x.uniforms;
706
+ e.tSrc.value = A ? _.textures[0] : l.texture, e.tSrcMask.value = A ? _.textures[1] : p.texture;
707
+ let t = A ? _ : l;
708
+ e.texel.value.set(1 / t.width, 1 / t.height), j(x, y[0]);
709
+ for (let e = 1; e < we; e++) {
710
+ let t = y[e - 1];
711
+ C.uniforms.tSrc.value = t.texture, C.uniforms.texel.value.set(1 / t.width, 1 / t.height), j(C, y[e]);
712
+ }
713
+ for (let e = 3; e >= 0; e--) {
714
+ let t = y[e + 1];
715
+ E.uniforms.tSrc.value = t.texture, E.uniforms.texel.value.set(1 / t.width, 1 / t.height), j(E, y[e]);
716
+ }
717
+ }
718
+ let V = D.uniforms;
719
+ V.overscan.value = o, V.aspect.value = i / a, V.barrel.value = N, V.chromatic.value = ye * m, V.vignette.value = v, V.dofOn.value = +!!A, V.camNear.value = n.near, V.camFar.value = n.far, V.focus.value = k, V.maxCoc.value = B, V.bloomAmount.value = S * Ce, V.grain.value = w, V.frame.value = Math.floor(Math.max(0, d) * De + 1e-6), V.fade.value = O, e.setRenderTarget(null), e.clear(), j(D, null);
720
+ },
721
+ dispose() {
722
+ l.dispose(), c.dispose(), p.dispose(), _.dispose();
723
+ for (let e of y) e.dispose();
724
+ h.dispose(), g.dispose(), O.geometry.dispose(), D.dispose(), b.dispose(), x.dispose(), C.dispose(), E.dispose();
725
+ }
726
+ };
727
+ }
728
+ // ../engine/src/set/stone.ts
729
+ function je(e) {
730
+ let n = new t({
731
+ color: e,
732
+ roughness: .72,
733
+ metalness: 0
734
+ });
735
+ return n.onBeforeCompile = (e) => {
736
+ e.vertexShader = e.vertexShader.replace("#include <common>", "#include <common>\n attribute float aCavity;\n varying float vCavity;\n varying vec3 vStonePos;").replace("#include <begin_vertex>", "#include <begin_vertex>\n vCavity = aCavity;\n vStonePos = position;"), e.fragmentShader = e.fragmentShader.replace("#include <common>", `#include <common>
737
+ varying float vCavity;
738
+ varying vec3 vStonePos;
739
+ ${Me}
740
+ vec3 hash3(vec3 p) {
741
+ p = vec3(dot(p, vec3(127.1, 311.7, 74.7)), dot(p, vec3(269.5, 183.3, 246.1)), dot(p, vec3(113.5, 271.9, 124.6)));
742
+ return fract(sin(p) * 43758.5453123);
743
+ }
744
+ // Lumps: one tilted paraboloid per cell; x is the lowest (the dome this point
745
+ // belongs to), y the next lowest. Negated, x is a field of domes that is continuous
746
+ // across cells, and y - x falls to zero along the crack where two domes meet.
747
+ vec2 lumpField(vec3 p) {
748
+ vec3 base = floor(p);
749
+ vec2 h = vec2(8.0);
750
+ for (int z = -1; z <= 1; z++) for (int y = -1; y <= 1; y++) for (int x = -1; x <= 1; x++) {
751
+ vec3 cell = base + vec3(x, y, z);
752
+ vec3 d = p - (cell + hash3(cell));
753
+ float v = dot(d, d) + dot(d, (hash3(cell + 31.7) - 0.5) * 1.2);
754
+ if (v < h.x) h = vec2(v, h.x);
755
+ else if (v < h.y) h.y = v;
756
+ }
757
+ return h;
758
+ }
759
+ // Fades a detail layer out as its wavelength (cm) nears the pixel footprint, so
760
+ // distant stone stays crisp instead of turning to fuzz.
761
+ float lod(float wavelength, float footprint) {
762
+ return 1.0 - smoothstep(wavelength * 0.12, wavelength * 0.45, footprint);
763
+ }
764
+ // Relief detail shared by the height, albedo and roughness: x = height,
765
+ // y = hollow (1 in the low ground between lumps and in cracks), z = crown (1 on top
766
+ // of a lump).
767
+ vec3 stoneDetail(vec3 p, float footprint) {
768
+ // Warped so cells never line up into a visible tiling.
769
+ vec3 q = p + vec3(snoise(p * 0.11), snoise(p * 0.11 + 17.0), snoise(p * 0.11 - 9.0)) * 3.0;
770
+ // Lump size drifts across the stone (~1.8–3.5 cm) and fades out in patches, so
771
+ // the cells never read as a repeating skin.
772
+ float sizeDrift = 0.4 * exp2(snoise(p * 0.03 + 2.0) * 0.5);
773
+ vec2 small = lumpField(q * sizeDrift);
774
+ vec2 large = lumpField(q * 0.14 + 5.0);
775
+ float near = lod(2.5, footprint) * smoothstep(-0.6, 0.3, snoise(p * 0.06 - 4.0));
776
+ // Lumps sink into soft hollows rather than outlined cells; only a few of the
777
+ // large cell boundaries open into real cracks.
778
+ float hollow = smoothstep(0.17, 0.3, small.x) * near;
779
+ float crack = (1.0 - smoothstep(0.0, 0.035, large.y - large.x)) * smoothstep(0.35, 0.65, snoise(p * 0.045 + 8.0));
780
+ crack *= lod(4.0, footprint);
781
+ float crown = smoothstep(0.2, 0.0, small.x) * near;
782
+ float pits = -pow(max(0.0, snoise(p * 0.9 + 3.0)), 3.0);
783
+ float tooth = snoise(p * 2.6 - 7.3);
784
+ // Ridged grit at ~8 mm: crisp little edges that catch the key light.
785
+ float grit = 1.0 - abs(snoise(p * 1.25 + 2.0));
786
+ float h = snoise(p * 0.07) * 0.6
787
+ - small.x * 1.3 * near
788
+ - large.x * 1.4 * lod(7.0, footprint)
789
+ - crack * 0.3
790
+ + pits * 0.5 * lod(1.1, footprint)
791
+ + grit * grit * 0.4 * lod(0.8, footprint)
792
+ + tooth * 0.14 * lod(0.4, footprint);
793
+ return vec3(h, max(hollow * 0.45, crack), crown);
794
+ }
795
+ vec3 stonePerturb(vec3 surfPos, vec3 surfNorm, float h, float faceDirection) {
796
+ vec2 dHdxy = vec2(dFdx(h), dFdy(h));
797
+ vec3 vSigmaX = normalize(dFdx(surfPos));
798
+ vec3 vSigmaY = normalize(dFdy(surfPos));
799
+ vec3 vN = surfNorm;
800
+ vec3 R1 = cross(vSigmaY, vN);
801
+ vec3 R2 = cross(vN, vSigmaX);
802
+ float fDet = dot(vSigmaX, R1) * faceDirection;
803
+ vec3 vGrad = sign(fDet) * (dHdxy.x * R1 + dHdxy.y * R2);
804
+ return normalize(abs(fDet) * surfNorm - vGrad);
805
+ }`).replace("#include <color_fragment>", "#include <color_fragment>\n float stoneFootprint = length(fwidth(vStonePos));\n vec3 stoneD = stoneDetail(vStonePos, stoneFootprint);\n float stoneH = stoneD.x;\n float mottle = snoise(vStonePos * 0.04 + 3.0) * 0.6 + snoise(vStonePos * 0.17) * 0.3;\n // Mineral speckle: scattered dark grains (light ones bloom into droplets).\n float speck = snoise(vStonePos * 1.7 + 21.0) * lod(0.6, stoneFootprint);\n mottle -= smoothstep(0.55, 0.85, -speck) * 0.3;\n float wear = smoothstep(0.42, 0.15, vCavity);\n float crease = smoothstep(0.55, 0.9, vCavity);\n diffuseColor.rgb *= (0.82 + 0.22 * mottle) * (1.0 + 0.35 * wear) * (1.0 - 0.45 * crease);\n // Millimetre grain in the colour, as any photographed stone has; it is what makes\n // a surface read sharp at a glance.\n float grain = snoise(vStonePos * 3.6 + 40.0) * 0.6 + snoise(vStonePos * 7.5 - 13.0) * 0.4;\n diffuseColor.rgb *= 1.0 + 0.22 * grain * lod(0.3, stoneFootprint);\n // Small-scale contrast: dark hollows and cracks, lighter crowns.\n diffuseColor.rgb *= (1.0 - 0.4 * stoneD.y) * (0.92 + 0.18 * stoneD.z);").replace("#include <roughnessmap_fragment>", "#include <roughnessmap_fragment>\n // Crowns are polished a little by weather; cracks and creases hold dust.\n roughnessFactor = clamp(roughnessFactor - 0.17 * stoneD.z + 0.12 * max(crease, stoneD.y), 0.45, 1.0);").replace("#include <normal_fragment_maps>", "#include <normal_fragment_maps>\n // Height in cm-ish units; the gain sets how deep the grain reads.\n normal = stonePerturb(-vViewPosition, normal, stoneH * 0.5, faceDirection);").replace("#include <aomap_fragment>", "#include <aomap_fragment>\n float stoneAO = mix(1.0, 0.35, crease) * (1.0 - 0.4 * stoneD.y);\n reflectedLight.indirectDiffuse *= stoneAO;\n reflectedLight.indirectSpecular *= stoneAO;");
806
+ }, n.customProgramCacheKey = () => "openmockup-stone-13", n;
807
+ }
808
+ var Me = "\nvec3 mod289(vec3 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }\nvec4 mod289(vec4 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; }\nvec4 permute(vec4 x) { return mod289(((x * 34.0) + 10.0) * x); }\nvec4 taylorInvSqrt(vec4 r) { return 1.79284291400159 - 0.85373472095314 * r; }\nfloat snoise(vec3 v) {\n const vec2 C = vec2(1.0 / 6.0, 1.0 / 3.0);\n const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);\n vec3 i = floor(v + dot(v, C.yyy));\n vec3 x0 = v - i + dot(i, C.xxx);\n vec3 g = step(x0.yzx, x0.xyz);\n vec3 l = 1.0 - g;\n vec3 i1 = min(g.xyz, l.zxy);\n vec3 i2 = max(g.xyz, l.zxy);\n vec3 x1 = x0 - i1 + C.xxx;\n vec3 x2 = x0 - i2 + C.yyy;\n vec3 x3 = x0 - D.yyy;\n i = mod289(i);\n vec4 p = permute(permute(permute(i.z + vec4(0.0, i1.z, i2.z, 1.0)) + i.y + vec4(0.0, i1.y, i2.y, 1.0)) + i.x + vec4(0.0, i1.x, i2.x, 1.0));\n float n_ = 0.142857142857;\n vec3 ns = n_ * D.wyz - D.xzx;\n vec4 j = p - 49.0 * floor(p * ns.z * ns.z);\n vec4 x_ = floor(j * ns.z);\n vec4 y_ = floor(j - 7.0 * x_);\n vec4 x = x_ * ns.x + ns.yyyy;\n vec4 y = y_ * ns.x + ns.yyyy;\n vec4 h = 1.0 - abs(x) - abs(y);\n vec4 b0 = vec4(x.xy, y.xy);\n vec4 b1 = vec4(x.zw, y.zw);\n vec4 s0 = floor(b0) * 2.0 + 1.0;\n vec4 s1 = floor(b1) * 2.0 + 1.0;\n vec4 sh = -step(h, vec4(0.0));\n vec4 a0 = b0.xzyw + s0.xzyw * sh.xxyy;\n vec4 a1 = b1.xzyw + s1.xzyw * sh.zzww;\n vec3 p0 = vec3(a0.xy, h.x);\n vec3 p1 = vec3(a0.zw, h.y);\n vec3 p2 = vec3(a1.xy, h.z);\n vec3 p3 = vec3(a1.zw, h.w);\n vec4 norm = taylorInvSqrt(vec4(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3)));\n p0 *= norm.x;\n p1 *= norm.y;\n p2 *= norm.z;\n p3 *= norm.w;\n vec4 m = max(0.5 - vec4(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), 0.0);\n m = m * m;\n return 105.0 * dot(m * m, vec4(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3)));\n}\n";
809
+ // ../engine/src/set/concrete.ts
810
+ function Ne(e) {
811
+ let n = new t({
812
+ color: e,
813
+ roughness: .9,
814
+ metalness: 0
815
+ });
816
+ return n.onBeforeCompile = (e) => {
817
+ e.vertexShader = e.vertexShader.replace("#include <common>", "#include <common>\n varying vec3 vConcretePos;").replace("#include <begin_vertex>", "#include <begin_vertex>\n vConcretePos = position;"), e.fragmentShader = e.fragmentShader.replace("#include <common>", `#include <common>
818
+ varying vec3 vConcretePos;
819
+ ${Me}
820
+ float lod(float wavelength, float footprint) {
821
+ return 1.0 - smoothstep(wavelength * 0.12, wavelength * 0.45, footprint);
822
+ }
823
+ // Bug holes: sparse round voids a few millimetres across. x = depth (0..1), so the
824
+ // pit both darkens and dents.
825
+ float bugHoles(vec3 p, float footprint) {
826
+ float holes = smoothstep(0.78, 0.92, snoise(p * 2.6 + 11.0)) * smoothstep(0.1, 0.7, snoise(p * 0.12 - 6.0));
827
+ return holes * lod(0.5, footprint);
828
+ }
829
+ vec3 concretePerturb(vec3 surfPos, vec3 surfNorm, float h, float faceDirection) {
830
+ vec2 dHdxy = vec2(dFdx(h), dFdy(h));
831
+ vec3 vSigmaX = normalize(dFdx(surfPos));
832
+ vec3 vSigmaY = normalize(dFdy(surfPos));
833
+ vec3 R1 = cross(vSigmaY, surfNorm);
834
+ vec3 R2 = cross(surfNorm, vSigmaX);
835
+ float fDet = dot(vSigmaX, R1) * faceDirection;
836
+ vec3 vGrad = sign(fDet) * (dHdxy.x * R1 + dHdxy.y * R2);
837
+ return normalize(abs(fDet) * surfNorm - vGrad);
838
+ }`).replace("#include <color_fragment>", "#include <color_fragment>\n float concreteFootprint = length(fwidth(vConcretePos));\n vec3 cp = vConcretePos;\n // Pour mottling: big soft clouds with a smaller layer riding on them.\n float clouds = snoise(cp * 0.018) * 0.6 + snoise(cp * 0.06 + 4.0) * 0.4;\n // Formwork stains: faint horizontal bands where each lift of the pour set.\n float bands = snoise(vec3(cp.x * 0.01, cp.y * 0.22, cp.z * 0.01) + 9.0);\n float sand = (snoise(cp * 4.2 + 30.0) * 0.6 + snoise(cp * 9.0 - 3.0) * 0.4) * lod(0.25, concreteFootprint);\n float concreteHoles = bugHoles(cp, concreteFootprint);\n diffuseColor.rgb *= (0.88 + 0.24 * clouds) * (1.0 - 0.08 * smoothstep(0.2, 0.8, bands)) * (1.0 + 0.14 * sand);\n diffuseColor.rgb *= 1.0 - 0.4 * concreteHoles;").replace("#include <roughnessmap_fragment>", "#include <roughnessmap_fragment>\n roughnessFactor = clamp(roughnessFactor - 0.06 * clouds + 0.08 * concreteHoles, 0.7, 1.0);").replace("#include <normal_fragment_maps>", "#include <normal_fragment_maps>\n float concreteH = -concreteHoles * 0.15 + sand * 0.05 + snoise(cp * 0.4 + 2.0) * 0.06 * lod(2.0, concreteFootprint);\n normal = concretePerturb(-vViewPosition, normal, concreteH, faceDirection);").replace("#include <aomap_fragment>", "#include <aomap_fragment>\n float concreteRoom = 0.1 * (1.0 - 0.5 * concreteHoles);\n reflectedLight.indirectDiffuse *= concreteRoom;\n reflectedLight.indirectSpecular *= concreteRoom;");
839
+ }, n.customProgramCacheKey = () => "openmockup-concrete-4", n;
840
+ }
841
+ // ../engine/src/set/block.ts
842
+ function Pe({ color: e, subject: t }) {
843
+ let n = new P();
844
+ n.name = "set:block";
845
+ let i = Ne(e), a = t.getCenter(new _()), o = t.getSize(new _()), s = Math.max(o.x * 3, 90), l = Math.max(o.z * 2.4, 60), u = Math.max(o.y * 6, s), d = t.min.x + o.x * .3, f = t.max.z + .6, p = t.min.y, m = new j(s, u, l, 3, .35), h = new r(m, i);
846
+ h.position.set(d + s / 2, p - u / 2, f - l / 2), h.castShadow = !1, h.receiveShadow = !0, n.add(h);
847
+ let g = Math.max(o.length() * 3.2, 110), v = new c(16184818, 1, g * 4, .62, .85, 2);
848
+ v.position.set(a.x - g, a.y + g * .25, f - g * .12), v.target.position.set(d, p - o.y, f), v.castShadow = !0, v.shadow.mapSize.set(2048, 2048), v.shadow.camera.near = g * .3, v.shadow.camera.far = g * 3, v.shadow.radius = 6, v.shadow.blurSamples = 16, v.shadow.bias = -2e-4, v.shadow.normalBias = .3;
849
+ let y = new c(14673134, 1, g * 4, .8, 1, 2);
850
+ y.position.set(a.x - g * .3, a.y - g * .2, a.z + g * 1.2), y.target.position.set(d, p - o.y, f), n.add(v, v.target, y, y.target);
851
+ let b = v.position.distanceTo(v.target.position), x = y.position.distanceTo(y.target.position);
852
+ return {
853
+ group: n,
854
+ update(e, t) {
855
+ i.color.set(e.color), v.intensity = 4 * b * b * t, y.intensity = .12 * x * x * t;
856
+ },
857
+ dispose() {
858
+ m.dispose(), i.dispose(), v.shadow.map?.dispose(), v.dispose(), y.dispose();
859
+ }
860
+ };
861
+ }
862
+ // ../engine/src/set/noise.ts
863
+ function Fe(e) {
864
+ let t = e * 2654435761 >>> 0 || 1;
865
+ return () => {
866
+ t = t + 1831565813 >>> 0;
867
+ let e = t;
868
+ return e = Math.imul(e ^ e >>> 15, e | 1), e ^= e + Math.imul(e ^ e >>> 7, e | 61), ((e ^ e >>> 14) >>> 0) / 4294967296;
869
+ };
870
+ }
871
+ var Ie = new Float32Array([
872
+ 1,
873
+ 1,
874
+ 0,
875
+ -1,
876
+ 1,
877
+ 0,
878
+ 1,
879
+ -1,
880
+ 0,
881
+ -1,
882
+ -1,
883
+ 0,
884
+ 1,
885
+ 0,
886
+ 1,
887
+ -1,
888
+ 0,
889
+ 1,
890
+ 1,
891
+ 0,
892
+ -1,
893
+ -1,
894
+ 0,
895
+ -1,
896
+ 0,
897
+ 1,
898
+ 1,
899
+ 0,
900
+ -1,
901
+ 1,
902
+ 0,
903
+ 1,
904
+ -1,
905
+ 0,
906
+ -1,
907
+ -1
908
+ ]), Le = 1 / 3, Z = 1 / 6;
909
+ function Re(e) {
910
+ let t = Fe(e), n = /* @__PURE__ */ new Uint8Array(256);
911
+ for (let e = 0; e < 256; e++) n[e] = e;
912
+ for (let e = 255; e > 0; e--) {
913
+ let r = Math.floor(t() * (e + 1)), i = n[e];
914
+ n[e] = n[r], n[r] = i;
915
+ }
916
+ let r = /* @__PURE__ */ new Uint8Array(512), i = /* @__PURE__ */ new Uint8Array(512);
917
+ for (let e = 0; e < 512; e++) r[e] = n[e & 255], i[e] = r[e] % 12;
918
+ return (e, t, n) => {
919
+ let a = (e + t + n) * Le, o = Math.floor(e + a), s = Math.floor(t + a), c = Math.floor(n + a), l = (o + s + c) * Z, u = e - (o - l), d = t - (s - l), f = n - (c - l), p = 0, m = 0, h = 0, g = 0, _ = 0, v = 0;
920
+ u >= d ? d >= f ? (p = 1, g = 1, _ = 1) : u >= f ? (p = 1, g = 1, v = 1) : (h = 1, g = 1, v = 1) : d < f ? (h = 1, _ = 1, v = 1) : u < f ? (m = 1, _ = 1, v = 1) : (m = 1, g = 1, _ = 1);
921
+ let y = u - p + Z, b = d - m + Z, x = f - h + Z, S = u - g + 2 * Z, C = d - _ + 2 * Z, w = f - v + 2 * Z, T = u - 1 + 3 * Z, E = d - 1 + 3 * Z, D = f - 1 + 3 * Z, O = o & 255, k = s & 255, A = c & 255, j = ze(i[O + r[k + r[A]]], u, d, f), M = ze(i[O + p + r[k + m + r[A + h]]], y, b, x), N = ze(i[O + g + r[k + _ + r[A + v]]], S, C, w), P = ze(i[O + 1 + r[k + 1 + r[A + 1]]], T, E, D);
922
+ return 32 * (j + M + N + P);
923
+ };
924
+ }
925
+ function ze(e, t, n, r) {
926
+ let i = .6 - t * t - n * n - r * r;
927
+ if (i < 0) return 0;
928
+ i *= i;
929
+ let a = e * 3;
930
+ return i * i * (Ie[a] * t + Ie[a + 1] * n + Ie[a + 2] * r);
931
+ }
932
+ function Be(e, t, n, r, i, a = .5) {
933
+ let o = 0, s = 1, c = 1, l = 0;
934
+ for (let u = 0; u < i; u++) o += s * e(t * c, n * c, r * c), l += s, s *= a, c *= 2;
935
+ return o / l;
936
+ }
937
+ // ../engine/src/set/rock.ts
938
+ function Ve({ seed: e, size: t, detail: n = 5, sides: i = 6, notches: a, relief: o = 1, shape: s = "pillar", color: c }) {
939
+ let l = Fe(e), u = Re(e), d = new _(t[0] / 2, t[1] / 2, t[2] / 2), f = Math.hypot(...t), p = Math.min(d.x, d.z) * .03 + .12, m = [], h = l() * Math.PI * 2;
940
+ for (let e = 0; e < i; e++) {
941
+ let t = h + (e + (l() - .5) * .5) / i * Math.PI * 2, n = s === "boulder" ? (l() - .5) * 1.6 : (l() - .5) * .08, r = new _(Math.cos(t), n, Math.sin(t)).normalize(), a = Math.hypot(r.x * d.x, r.z * d.z);
942
+ m.push({
943
+ n: r,
944
+ d: a * (.86 + l() * .1)
945
+ });
946
+ }
947
+ let g = Array.from({ length: 2 + Math.floor(l() * 3) }, () => (l() * 1.5 - .75) * d.y).sort((e, t) => e - t), v = m.map(() => g.map(() => l() < .65 ? -(l() * .16) : l() * .06)), y = l() * Math.PI, b = new _(Math.cos(y), 0, Math.sin(y)), x = (l() - .5) * Math.min(d.x, d.z) * .6, S = m.map(() => -(l() * .12)), w = m.length;
948
+ m.push({
949
+ n: new _(l() - .5, 2.2, l() - .5).normalize(),
950
+ d: d.y * .92
951
+ }), m.push({
952
+ n: new _((l() - .5) * .3, -1, (l() - .5) * .3).normalize(),
953
+ d: d.y
954
+ });
955
+ let T = 1 + Math.floor(l() * 2);
956
+ for (let e = 0; e < T; e++) {
957
+ let e = l() * Math.PI * 2, t = new _(Math.cos(e) * .55, -.85, Math.sin(e) * .55).normalize();
958
+ m.push({
959
+ n: t,
960
+ d: Math.hypot(t.x * d.x, t.y * d.y, t.z * d.z) * .72
961
+ });
962
+ }
963
+ let D = 16 + Math.floor(l() * 8);
964
+ for (let e = 0; e < D; e++) {
965
+ let e = new _(l() * 2 - 1, l() * 2 - 1, l() * 2 - 1).normalize(), t = Math.abs(e.x) * d.x + Math.abs(e.y) * d.y + Math.abs(e.z) * d.z;
966
+ m.push({
967
+ n: e,
968
+ d: t * (.78 + l() * .12)
969
+ });
970
+ }
971
+ let O = [], k = a ?? Math.round(t[1] / 18 + l() * 3);
972
+ for (let e = 0; e < k; e++) {
973
+ let e = m[Math.floor(l() * i)], t = (l() * 1.6 - .8) * d.y, n = l() < .5 ? -1 : 1, r = new _(-e.n.z, 0, e.n.x).multiplyScalar(n * (.45 + l() * .4) * Math.min(d.x, d.z)), a = e.n.clone().setY(0).normalize().multiplyScalar(e.d).add(r).setY(t), o = Math.min(d.x, d.z) * (.12 + l() * .18);
974
+ O.push({
975
+ center: a,
976
+ half: new _(Math.min(d.x, d.z) * (.25 + l() * .45), d.y * (.04 + l() * .12), o),
977
+ yaw: Math.atan2(e.n.x, e.n.z) + (l() - .5) * .2
978
+ });
979
+ }
980
+ let A = new Float64Array(m.length * 4);
981
+ m.forEach((e, t) => A.set([
982
+ e.n.x,
983
+ e.n.y,
984
+ e.n.z,
985
+ e.d
986
+ ], t * 4));
987
+ let j = new Float64Array(w * g.length);
988
+ for (let e = 0; e < w; e++) for (let t = 0; t < g.length; t++) j[e * g.length + t] = v[e][t] * m[e].d;
989
+ let M = Float64Array.from(S, (e, t) => e * m[t].d), N = new Float64Array(O.length * 8);
990
+ O.forEach((e, t) => N.set([
991
+ e.center.x,
992
+ e.center.y,
993
+ e.center.z,
994
+ Math.cos(-e.yaw),
995
+ Math.sin(-e.yaw),
996
+ e.half.x,
997
+ e.half.y,
998
+ e.half.z
999
+ ], t * 8));
1000
+ let P = new Float64Array(g.length), F = b.x, I = b.z, L = (e, t, n) => {
1001
+ let r = He(-p * .4, p * .4, e * F + n * I - x);
1002
+ for (let e = 0; e < g.length; e++) P[e] = He(-p * .3, p * .3, t - g[e]);
1003
+ let i = -Infinity;
1004
+ for (let a = 0; a < m.length; a++) {
1005
+ let o = a * 4, s = 0;
1006
+ if (a < w) {
1007
+ for (let e = 0; e < g.length; e++) s += j[a * g.length + e] * P[e];
1008
+ s += M[a] * r;
1009
+ }
1010
+ i = Ue(i, e * A[o] + t * A[o + 1] + n * A[o + 2] - (A[o + 3] + s), p);
1011
+ }
1012
+ for (let r = 0; r < O.length; r++) {
1013
+ let a = r * 8, o = e - N[a], s = t - N[a + 1], c = n - N[a + 2], l = N[a + 3], u = N[a + 4], d = Math.abs(o * l + c * u) - N[a + 5], f = Math.abs(s) - N[a + 6], m = Math.abs(-o * u + c * l) - N[a + 7], h = d > 0 ? d : 0, g = f > 0 ? f : 0, _ = m > 0 ? m : 0, v = Math.min(Math.max(d, f, m), 0) + Math.sqrt(h * h + g * g + _ * _);
1014
+ i = Ue(i, -v, p * .6);
1015
+ }
1016
+ let a = e / f, s = t / f, c = n / f;
1017
+ return i -= Be(u, a * 2.2, s * 2.2, c * 2.2, 3, .5) * f * .007 * o, i -= Be(u, a * 9 + 7.1, s * 9 + 3.3, c * 9 - 2.2, 2, .5) * f * .004 * o, i;
1018
+ }, R = (e) => L(e.x, e.y, e.z), { positions: z, indices: B } = Ge(n), V = z.length / 3, H = new _(), U = new _(), W = d.length() * 1.5;
1019
+ for (let e = 0; e < V; e++) {
1020
+ H.fromArray(z, e * 3).multiply(d).normalize();
1021
+ let t = W, n = W;
1022
+ for (let e = 0; e < 200 && t > 0; e++) {
1023
+ let e = R(U.copy(H).multiplyScalar(t));
1024
+ if (e < 0) break;
1025
+ n = t, t -= Math.max(e * .8, .3);
1026
+ }
1027
+ let r = Math.max(t, 0), i = n;
1028
+ for (let e = 0; e < 9; e++) {
1029
+ let e = (r + i) / 2;
1030
+ R(U.copy(H).multiplyScalar(e)) < 0 ? r = e : i = e;
1031
+ }
1032
+ U.copy(H).multiplyScalar((r + i) / 2).toArray(z, e * 3);
1033
+ }
1034
+ We(z, B, R, 4);
1035
+ let G = new E();
1036
+ G.setAttribute("position", new C(z, 3)), G.setIndex(new C(B, 1)), G.computeVertexNormals(), G.setAttribute("aCavity", new C(Ke(G), 1)), G.computeBoundingBox(), G.computeBoundingSphere();
1037
+ let K = c === void 0 ? null : je(c), q = new r(G, K ?? void 0);
1038
+ return q.castShadow = !0, q.receiveShadow = !0, {
1039
+ mesh: q,
1040
+ dispose() {
1041
+ G.dispose(), K?.dispose();
1042
+ }
1043
+ };
1044
+ }
1045
+ function He(e, t, n) {
1046
+ let r = Math.min(1, Math.max(0, (n - e) / (t - e)));
1047
+ return r * r * (3 - 2 * r);
1048
+ }
1049
+ function Ue(e, t, n) {
1050
+ if (e === -Infinity) return t;
1051
+ let r = Math.min(1, Math.max(0, .5 - .5 * (t - e) / n));
1052
+ return t + (e - t) * r + n * r * (1 - r);
1053
+ }
1054
+ function We(e, t, n, r) {
1055
+ let i = e.length / 3, a = Array.from({ length: i }, () => []);
1056
+ for (let e = 0; e < t.length; e += 3) for (let n = 0; n < 3; n++) {
1057
+ let r = t[e + n], i = t[e + (n + 1) % 3];
1058
+ a[r].includes(i) || a[r].push(i), a[i].includes(r) || a[i].push(r);
1059
+ }
1060
+ let o = new _(), s = new _(), c = new _(), l = .05, u = new Float32Array(e.length);
1061
+ for (let t = 0; t < r; t++) {
1062
+ for (let t = 0; t < i; t++) {
1063
+ let r = 0, i = 0, d = 0;
1064
+ for (let n of a[t]) r += e[n * 3], i += e[n * 3 + 1], d += e[n * 3 + 2];
1065
+ let f = a[t].length;
1066
+ o.set(e[t * 3] * .4 + r / f * .6, e[t * 3 + 1] * .4 + i / f * .6, e[t * 3 + 2] * .4 + d / f * .6);
1067
+ for (let e = 0; e < 2; e++) {
1068
+ let e = n(o);
1069
+ s.set(n(c.set(o.x + l, o.y, o.z)) - e, n(c.set(o.x, o.y + l, o.z)) - e, n(c.set(o.x, o.y, o.z + l)) - e).divideScalar(l);
1070
+ let t = s.lengthSq();
1071
+ if (t < 1e-8) break;
1072
+ o.addScaledVector(s, -e / t);
1073
+ }
1074
+ o.toArray(u, t * 3);
1075
+ }
1076
+ e.set(u);
1077
+ }
1078
+ }
1079
+ function Ge(e) {
1080
+ let t = (1 + Math.sqrt(5)) / 2, n = [
1081
+ -1,
1082
+ t,
1083
+ 0,
1084
+ 1,
1085
+ t,
1086
+ 0,
1087
+ -1,
1088
+ -t,
1089
+ 0,
1090
+ 1,
1091
+ -t,
1092
+ 0,
1093
+ 0,
1094
+ -1,
1095
+ t,
1096
+ 0,
1097
+ 1,
1098
+ t,
1099
+ 0,
1100
+ -1,
1101
+ -t,
1102
+ 0,
1103
+ 1,
1104
+ -t,
1105
+ t,
1106
+ 0,
1107
+ -1,
1108
+ t,
1109
+ 0,
1110
+ 1,
1111
+ -t,
1112
+ 0,
1113
+ -1,
1114
+ -t,
1115
+ 0,
1116
+ 1
1117
+ ], r = [
1118
+ 0,
1119
+ 11,
1120
+ 5,
1121
+ 0,
1122
+ 5,
1123
+ 1,
1124
+ 0,
1125
+ 1,
1126
+ 7,
1127
+ 0,
1128
+ 7,
1129
+ 10,
1130
+ 0,
1131
+ 10,
1132
+ 11,
1133
+ 1,
1134
+ 5,
1135
+ 9,
1136
+ 5,
1137
+ 11,
1138
+ 4,
1139
+ 11,
1140
+ 10,
1141
+ 2,
1142
+ 10,
1143
+ 7,
1144
+ 6,
1145
+ 7,
1146
+ 1,
1147
+ 8,
1148
+ 3,
1149
+ 9,
1150
+ 4,
1151
+ 3,
1152
+ 4,
1153
+ 2,
1154
+ 3,
1155
+ 2,
1156
+ 6,
1157
+ 3,
1158
+ 6,
1159
+ 8,
1160
+ 3,
1161
+ 8,
1162
+ 9,
1163
+ 4,
1164
+ 9,
1165
+ 5,
1166
+ 2,
1167
+ 4,
1168
+ 11,
1169
+ 6,
1170
+ 2,
1171
+ 10,
1172
+ 8,
1173
+ 6,
1174
+ 7,
1175
+ 9,
1176
+ 8,
1177
+ 1
1178
+ ];
1179
+ for (let e = 0; e < n.length; e += 3) {
1180
+ let t = Math.hypot(n[e], n[e + 1], n[e + 2]);
1181
+ n[e] /= t, n[e + 1] /= t, n[e + 2] /= t;
1182
+ }
1183
+ for (let t = 0; t < e; t++) {
1184
+ let e = /* @__PURE__ */ new Map(), t = (t, r) => {
1185
+ let i = t < r ? t * 1e7 + r : r * 1e7 + t, a = e.get(i);
1186
+ if (a !== void 0) return a;
1187
+ let o = n[t * 3] + n[r * 3], s = n[t * 3 + 1] + n[r * 3 + 1], c = n[t * 3 + 2] + n[r * 3 + 2], l = Math.hypot(o, s, c);
1188
+ n.push(o / l, s / l, c / l);
1189
+ let u = n.length / 3 - 1;
1190
+ return e.set(i, u), u;
1191
+ }, i = [];
1192
+ for (let e = 0; e < r.length; e += 3) {
1193
+ let n = r[e], a = r[e + 1], o = r[e + 2], s = t(n, a), c = t(a, o), l = t(o, n);
1194
+ i.push(n, s, l, a, c, s, o, l, c, s, c, l);
1195
+ }
1196
+ r = i;
1197
+ }
1198
+ return {
1199
+ positions: new Float32Array(n),
1200
+ indices: new Uint32Array(r)
1201
+ };
1202
+ }
1203
+ function Ke(e) {
1204
+ let t = e.getAttribute("position"), n = e.getAttribute("normal"), r = e.getIndex(), i = t.count, a = Array.from({ length: i }, () => /* @__PURE__ */ new Set());
1205
+ for (let e = 0; e < r.count; e += 3) {
1206
+ let t = r.getX(e), n = r.getX(e + 1), i = r.getX(e + 2);
1207
+ a[t].add(n).add(i), a[n].add(t).add(i), a[i].add(t).add(n);
1208
+ }
1209
+ let o = new Float32Array(i);
1210
+ for (let e = 0; e < i; e++) {
1211
+ let r = 0, i = 0, s = 0, c = 0, l = t.getX(e), u = t.getY(e), d = t.getZ(e);
1212
+ for (let n of a[e]) r += t.getX(n), i += t.getY(n), s += t.getZ(n), c += Math.hypot(t.getX(n) - l, t.getY(n) - u, t.getZ(n) - d);
1213
+ let f = a[e].size || 1, p = ((r / f - l) * n.getX(e) + (i / f - u) * n.getY(e) + (s / f - d) * n.getZ(e)) / (c / f || 1);
1214
+ o[e] = p;
1215
+ }
1216
+ for (let e = 0; e < 2; e++) {
1217
+ let e = new Float32Array(i);
1218
+ for (let t = 0; t < i; t++) {
1219
+ let n = o[t];
1220
+ for (let e of a[t]) n += o[e];
1221
+ e[t] = n / (a[t].size + 1);
1222
+ }
1223
+ o = e;
1224
+ }
1225
+ for (let e = 0; e < i; e++) o[e] = Math.min(1, Math.max(0, .5 + o[e] * 4));
1226
+ return o;
1227
+ }
1228
+ // ../engine/src/set/crevice.ts
1229
+ function qe({ seed: e, color: t, subject: n }) {
1230
+ let r = Fe(e * 7919 + 13), i = new P();
1231
+ i.name = "set:crevice";
1232
+ let a = je(t), o = [], s = n.getCenter(new _()), l = n.getSize(new _()), u = l.x + Math.max(1.2, l.x * .18) * 2, d = Math.max(l.y * 4.2, u * 6.3), f = u * 3.1, p = Math.max(u * 3, l.z * 6), m = s.y - d * .3;
1233
+ for (let t of [-1, 1]) {
1234
+ let n = Ve({
1235
+ seed: e * 31 + (t < 0 ? 1 : 2),
1236
+ size: [
1237
+ f * (.9 + r() * .2),
1238
+ d * (.94 + r() * .08),
1239
+ p * (.9 + r() * .15)
1240
+ ]
1241
+ });
1242
+ n.mesh.material = a;
1243
+ let c = n.mesh;
1244
+ c.rotation.set((r() - .5) * .06, (r() - .5) * .5, -t * (.05 + r() * .04)), c.position.set(s.x + t * (u / 2 + f / 2), m + d / 2, s.z - p * .28), c.updateMatrixWorld(!0);
1245
+ let h = Je(c, t, s, l);
1246
+ h !== null && (c.position.x += s.x + u / 2 * t - h), i.add(c), o.push(n);
1247
+ }
1248
+ let h = u * .9;
1249
+ for (let [t, c] of [[-1, -.3], [1, .35]]) {
1250
+ let d = Ve({
1251
+ seed: e * 31 + (t < 0 ? 4 : 5),
1252
+ size: [
1253
+ u * 1.5,
1254
+ l.y * 1.3,
1255
+ h
1256
+ ],
1257
+ sides: 6,
1258
+ notches: 1,
1259
+ relief: 1.5,
1260
+ detail: 4
1261
+ });
1262
+ d.mesh.material = a, d.mesh.rotation.set((r() - .5) * .1, (r() - .5) * .5, -t * (.04 + r() * .06)), d.mesh.position.set(s.x + t * (l.x / 2 + u * .75 - .5), s.y + c * l.y, n.max.z + h * .5 + .8), d.mesh.updateMatrixWorld(!0);
1263
+ let f = Ye(d.mesh);
1264
+ f !== null && f < n.max.z + .4 && (d.mesh.position.z += n.max.z + .4 - f), i.add(d.mesh), o.push(d);
1265
+ }
1266
+ let g = Ve({
1267
+ seed: e * 31 + 3,
1268
+ size: [
1269
+ u * 2.2,
1270
+ l.y * .45,
1271
+ p * .55
1272
+ ],
1273
+ sides: 8,
1274
+ notches: 1,
1275
+ relief: 2,
1276
+ shape: "boulder",
1277
+ detail: 4
1278
+ });
1279
+ g.mesh.material = a, g.mesh.rotation.set(0, (r() - .5) * .6, (r() - .5) * .15), g.mesh.position.set(s.x, n.min.y, s.z - p * .08), g.mesh.updateMatrixWorld(!0);
1280
+ let v = Xe(g.mesh, s, l);
1281
+ v !== null && (g.mesh.position.y += n.min.y - .15 - v), i.add(g.mesh), o.push(g);
1282
+ let y = d, b = new c(15001584, 1, y * 4, .36, .95, 2);
1283
+ b.position.set(s.x - y * .7, s.y + y * 1.15, s.z + y * .4), b.target.position.copy(s), b.castShadow = !0, b.shadow.mapSize.set(2048, 2048), b.shadow.camera.near = y * .3, b.shadow.camera.far = y * 3, b.shadow.radius = 3, b.shadow.blurSamples = 12, b.shadow.bias = -2e-4, b.shadow.normalBias = .6;
1284
+ let x = new c(3364351, 1, y * 4, .45, .9, 2);
1285
+ x.position.set(s.x + y * .7, s.y + y * .35, s.z - y * .55), x.target.position.set(s.x - u, s.y, s.z);
1286
+ let S = new c(11122406, 1, y * 4, .9, 1, 2);
1287
+ S.position.set(s.x + y * .4, s.y - y * .1, s.z + y * 1.1), S.target.position.copy(s), i.add(b, b.target, x, x.target, S, S.target);
1288
+ let C = b.position.distanceTo(s), w = x.position.distanceTo(s), T = S.position.distanceTo(s);
1289
+ return {
1290
+ group: i,
1291
+ update(e, t) {
1292
+ a.color.set(e.color), b.intensity = 5 * C * C * t, x.intensity = .6 * w * w * t, S.intensity = .45 * T * T * t;
1293
+ },
1294
+ dispose() {
1295
+ for (let e of o) e.dispose();
1296
+ a.dispose(), b.shadow.map?.dispose(), b.dispose(), x.dispose(), S.dispose();
1297
+ }
1298
+ };
1299
+ }
1300
+ var Q = new _();
1301
+ function Je(e, t, n, r) {
1302
+ let i = e.geometry.getAttribute("position"), a = null;
1303
+ for (let o = 0; o < i.count; o++) Q.fromBufferAttribute(i, o).applyMatrix4(e.matrixWorld), !(Math.abs(Q.y - n.y) > r.y * .6 || Math.abs(Q.z - n.z) > Math.max(r.z * 2, 3)) && (a === null || (t < 0 ? Q.x > a : Q.x < a)) && (a = Q.x);
1304
+ return a;
1305
+ }
1306
+ function Ye(e) {
1307
+ let t = e.geometry.getAttribute("position"), n = null;
1308
+ for (let r = 0; r < t.count; r++) Q.fromBufferAttribute(t, r).applyMatrix4(e.matrixWorld), (n === null || Q.z < n) && (n = Q.z);
1309
+ return n;
1310
+ }
1311
+ function Xe(e, t, n) {
1312
+ let r = e.geometry.getAttribute("position"), i = null;
1313
+ for (let a = 0; a < r.count; a++) Q.fromBufferAttribute(r, a).applyMatrix4(e.matrixWorld), !(Math.abs(Q.x - t.x) > n.x * .5 || Math.abs(Q.z - t.z) > Math.max(n.z, 1)) && (i === null || Q.y > i) && (i = Q.y);
1314
+ return i;
1315
+ }
1316
+ // ../engine/src/set/index.ts
1317
+ var Ze = {
1318
+ crevice: qe,
1319
+ block: Pe
1320
+ };
1321
+ function Qe(e, t) {
1322
+ let n = Ze[e];
1323
+ return n ? n(t) : null;
1324
+ }
1325
+ // ../engine/src/engine.ts
1326
+ var $e = 2.35, et = Math.PI / 180, tt = {
1327
+ kind: "gradient",
1328
+ inner: "#f6f6f4",
1329
+ outer: "#d5d5d1",
1330
+ tone: "light"
1331
+ }, nt = {
1332
+ fisheye: 0,
1333
+ chromatic: 0,
1334
+ vignette: 0,
1335
+ bloom: 0,
1336
+ grain: 0,
1337
+ blur: 0,
1338
+ focus: 0,
1339
+ fade: 0
1340
+ };
1341
+ function rt(e) {
1342
+ return e.kind === "image" && e.image ? JSON.stringify(e.image) : null;
1343
+ }
1344
+ function it({ canvas: e, alpha: t = !0, quality: n = "preview" }) {
1345
+ let r = new O({
1346
+ canvas: e,
1347
+ antialias: !0,
1348
+ alpha: t
1349
+ }), o = typeof window < "u" ? window.devicePixelRatio : 1;
1350
+ r.setPixelRatio(n === "export" ? 1 : Math.min(o, 2)), r.setClearColor(0, 0), r.autoClear = !1, r.toneMapping = 7, r.shadowMap.enabled = !0, r.shadowMap.type = 3;
1351
+ let s = new I(), c = "studio", u = de(r, c);
1352
+ s.environment = u;
1353
+ let d = new l(28, 1, 5, 300);
1354
+ d.position.set(0, 1.5, 48);
1355
+ let f = he(s, -10.5), p = ie(), m = Ae(r, n === "export" ? 8 : 4), h = /* @__PURE__ */ new Map(), g = /* @__PURE__ */ new Map(), y = 0, b = tt, x = nt, S = null, C = null, w = 0, T = new v(), E = 0, D = null, k = "", j = new _(), M = new _(), N = ge(r), F = [], L = new _();
1356
+ function R(e) {
1357
+ let t = u;
1358
+ c = e, u = de(r, e), s.environment = u, t.dispose(), f.light.shadow.radius = le[e].shadow.radius;
1359
+ }
1360
+ async function B(e, t) {
1361
+ let n = rt(e);
1362
+ if (n === S) return null;
1363
+ let i = ++w, a = null;
1364
+ return e.image && n && t.resolveBackdrop && (a = await Promise.resolve(t.resolveBackdrop(e.image, { maxAnisotropy: r.capabilities.getMaxAnisotropy() })).catch(() => null)), () => {
1365
+ if (i !== w) return a?.dispose();
1366
+ C?.dispose(), C = a, S = n, p.setImage(a?.texture ?? null, a?.aspect);
1367
+ };
1368
+ }
1369
+ function V() {
1370
+ let e = Infinity;
1371
+ for (let { build: t, root: n } of h.values()) {
1372
+ let r = t.bounds.min.y * n.scale.y + n.position.y;
1373
+ e = Math.min(e, r - (t.restsOnFloor ? 0 : $e));
1374
+ }
1375
+ return Number.isFinite(e) ? e : null;
1376
+ }
1377
+ function H() {
1378
+ let e = V();
1379
+ e !== null && f.setY(e);
1380
+ let t = 0;
1381
+ for (let { build: e, root: n } of h.values()) {
1382
+ let r = new _();
1383
+ e.bounds.getSize(r), t = Math.max(t, Math.max(r.x, r.y, r.z) / 2 * n.scale.x + n.position.length());
1384
+ }
1385
+ t > 0 && f.fit(t);
1386
+ }
1387
+ function U() {
1388
+ te.forceLensPath || Oe(x) ? m.render(s, d, p, b, x, [f.ground], E) : (r.setRenderTarget(null), r.clear(), p.render(r, b), r.render(s, d));
1389
+ }
1390
+ function W(e, t = `device-${++y}`) {
1391
+ let n = new P(), r = new P();
1392
+ n.add(r), r.add(e.group);
1393
+ for (let t of e.screens) t.mesh.layers.enable(1);
1394
+ s.add(n);
1395
+ let i = {
1396
+ id: t,
1397
+ root: n,
1398
+ offset: r,
1399
+ build: e
1400
+ };
1401
+ return h.set(t, i), H(), i;
1402
+ }
1403
+ function G(e) {
1404
+ let t = h.get(e);
1405
+ t && (s.remove(t.root), t.build.dispose(), h.delete(e), H());
1406
+ }
1407
+ function K() {
1408
+ let e = new A();
1409
+ for (let { build: t, root: n } of h.values()) n.visible && e.union(t.bounds.clone().applyMatrix4(new i().compose(n.position, new a(), n.scale)));
1410
+ return e.isEmpty() ? null : e;
1411
+ }
1412
+ function q(e) {
1413
+ let t = e.set?.kind ?? "none", n = t === "none" ? null : K();
1414
+ if (t !== "none" && !n) return;
1415
+ let r = n ? n.getSize(M).toArray().map((e) => e.toFixed(1)).join(",") : "", i = `${t}:${e.set?.seed}:${r}`;
1416
+ i === k ? D && n && D.group.position.copy(n.getCenter(M)).sub(j) : (k = i, D && (s.remove(D.group), D.dispose()), D = n ? Qe(t, {
1417
+ seed: e.set.seed,
1418
+ color: e.set.color,
1419
+ subject: n
1420
+ }) : null, n && n.getCenter(j), D && s.add(D.group));
1421
+ }
1422
+ function ee(e, { skipCamera: t = !1 } = {}) {
1423
+ E = e.time;
1424
+ for (let [t, n] of h) {
1425
+ let r = e.devices[t];
1426
+ if (!r) n.root.visible = !1;
1427
+ else {
1428
+ n.root.visible = r.visible, n.root.position.set(r.position[0], r.position[1], r.position[2]), n.root.rotation.set(r.rotation[0] * et, r.rotation[1] * et, r.rotation[2] * et), n.root.scale.setScalar(r.scale);
1429
+ for (let [e, t] of Object.entries(r.params)) n.build.setParam(e, t);
1430
+ n.build.setGlare(r.glare, r.screenFinish);
1431
+ }
1432
+ }
1433
+ if (t || ce(d, e.camera), x = e.camera.lens, x.blur > 0 && !(x.focus > 0)) {
1434
+ let t = L.set(e.camera.target[0], e.camera.target[1], e.camera.target[2]).distanceTo(d.position);
1435
+ x = {
1436
+ ...x,
1437
+ focus: t
1438
+ };
1439
+ }
1440
+ b = e.backdrop;
1441
+ let n = ue(e.environment.preset);
1442
+ n !== c && R(n), s.environmentIntensity = e.environment.intensity, s.environmentRotation.y = e.environment.rotation * et;
1443
+ let r = Math.min(1, e.floor.shadow * le[c].shadow.opacity);
1444
+ f.setOpacity(r), f.setY(e.floor.y ?? V() ?? f.ground.position.y), q(e), f.setVisible(!D && r > 0), D?.update(e.set, e.environment.intensity), N.update(F, e.environment.glow ?? 0);
1445
+ }
1446
+ let te = {
1447
+ renderer: r,
1448
+ scene: s,
1449
+ camera: d,
1450
+ floor: f,
1451
+ devices: h,
1452
+ screenSources: g,
1453
+ maxAnisotropy: r.capabilities.getMaxAnisotropy(),
1454
+ forceLensPath: !1,
1455
+ addDevice: W,
1456
+ removeDevice: G,
1457
+ async loadScene(e, t) {
1458
+ let n = new Map(e.screens.map((e) => [e.id, e])), i = [];
1459
+ for (let a of e.devices) {
1460
+ let e = await t.buildDevice(a), o = [];
1461
+ for (let i = 0; i < e.screens.length; i++) {
1462
+ let s = e.screens[i], c = a.screens[i], l = c ? n.get(c) : void 0;
1463
+ if (!s || !l) continue;
1464
+ let u = await t.resolveScreen(l, a, {
1465
+ maxAnisotropy: r.capabilities.getMaxAnisotropy(),
1466
+ screenAspect: s.aspect
1467
+ });
1468
+ u && o.push({
1469
+ screenId: l.id,
1470
+ source: u,
1471
+ surface: s,
1472
+ fit: l.fit,
1473
+ pan: z(l.offset)
1474
+ });
1475
+ }
1476
+ i.push({
1477
+ deviceDoc: a,
1478
+ build: e,
1479
+ sources: o
1480
+ });
1481
+ }
1482
+ let a = await B(e.backdrop, t);
1483
+ for (let e of [...h.keys()]) G(e);
1484
+ for (let e of g.values()) e.dispose();
1485
+ g.clear(), F = [];
1486
+ for (let { deviceDoc: e, build: t, sources: n } of i) {
1487
+ W(t, e.id);
1488
+ for (let { screenId: e, source: t, surface: r, fit: i, pan: a } of n) g.set(e, t), r.setTexture(t.texture, t.aspect, i, a);
1489
+ for (let e of t.screens) F.push({
1490
+ surface: e,
1491
+ texture: n.find((t) => t.surface === e)?.source.texture ?? null
1492
+ });
1493
+ }
1494
+ a?.();
1495
+ },
1496
+ async loadBackdrop(e, t) {
1497
+ (await B(e, t))?.();
1498
+ },
1499
+ setSize(e, t) {
1500
+ r.setSize(e, t, !1), r.getDrawingBufferSize(T), m.setSize(T.x, T.y), d.aspect = e / t, d.updateProjectionMatrix();
1501
+ },
1502
+ applyState: ee,
1503
+ async prepareFrame(e) {
1504
+ let t = [];
1505
+ for (let [n, r] of g) {
1506
+ let i = e.screens[n];
1507
+ r.seek && i && t.push(r.seek(i.mediaTime));
1508
+ }
1509
+ await Promise.all(t);
1510
+ },
1511
+ render: U,
1512
+ renderFrame(e, t) {
1513
+ ee(e, t), U();
1514
+ },
1515
+ start(e) {
1516
+ let t = performance.now();
1517
+ r.setAnimationLoop((n) => {
1518
+ let r = Math.min((n - t) / 1e3, .05);
1519
+ t = n, e?.(n, r), U();
1520
+ });
1521
+ },
1522
+ stop() {
1523
+ r.setAnimationLoop(null);
1524
+ },
1525
+ renderToCanvas(e) {
1526
+ let t = r.getPixelRatio();
1527
+ r.setPixelRatio(t * e), r.getDrawingBufferSize(T), m.setSize(T.x, T.y), U();
1528
+ let n = document.createElement("canvas");
1529
+ return n.width = r.domElement.width, n.height = r.domElement.height, n.getContext("2d")?.drawImage(r.domElement, 0, 0), r.setPixelRatio(t), r.getDrawingBufferSize(T), m.setSize(T.x, T.y), U(), n;
1530
+ },
1531
+ dispose() {
1532
+ r.setAnimationLoop(null);
1533
+ for (let e of [...h.keys()]) G(e);
1534
+ for (let e of g.values()) e.dispose();
1535
+ g.clear(), C?.dispose(), D?.dispose(), N.dispose(), f.dispose(), p.dispose(), m.dispose(), u.dispose(), r.dispose();
1536
+ }
1537
+ };
1538
+ return te;
1539
+ }
1540
+ // ../engine/src/media/video.ts
1541
+ var at = .0625, ot = 16;
1542
+ function st(e) {
1543
+ return {
1544
+ start: e?.start,
1545
+ playbackRate: e?.playbackRate,
1546
+ loop: e?.loop
1547
+ };
1548
+ }
1549
+ function ct({ start: e = 0, playbackRate: t = 1, loop: n = !0 } = {}) {
1550
+ let r = Number.isFinite(t) && t > 0 ? Math.min(ot, Math.max(at, t)) : 1;
1551
+ return {
1552
+ delayMs: Number.isFinite(e) && e > 0 ? e * 1e3 : 0,
1553
+ rate: r,
1554
+ loop: n
1555
+ };
1556
+ }
1557
+ function lt(e, t = {}) {
1558
+ let { delayMs: n, rate: r, loop: i } = ct(t);
1559
+ e.loop = i, e.defaultPlaybackRate = r, e.playbackRate = r;
1560
+ let a, o, s = () => {
1561
+ a = void 0, e.play().catch(() => {
1562
+ typeof window < "u" && (o = () => void e.play().catch(() => void 0), window.addEventListener("pointerdown", o, { once: !0 }));
1563
+ });
1564
+ };
1565
+ return n > 0 ? (e.pause(), e.currentTime = 0, a = setTimeout(s, n)) : s(), () => {
1566
+ a !== void 0 && clearTimeout(a), o && typeof window < "u" && window.removeEventListener("pointerdown", o);
1567
+ };
1568
+ }
1569
+ // ../engine/src/media/file.ts
1570
+ function ut(e, t) {
1571
+ return e.colorSpace = p, e.anisotropy = t, e;
1572
+ }
1573
+ // ../engine/src/media/sample.ts
1574
+ function dt(e, t) {
1575
+ let n = e > 1, r = n ? 2048 : 1179, i = Math.round(r / e), a = document.createElement("canvas");
1576
+ a.width = r, a.height = i;
1577
+ let o = a.getContext("2d");
1578
+ o && (n ? ft : pt)(o, r, i);
1579
+ let s = ut(new M(a), t);
1580
+ return {
1581
+ texture: s,
1582
+ aspect: r / i,
1583
+ dispose: () => s.dispose()
1584
+ };
1585
+ }
1586
+ function ft(e, t, n) {
1587
+ let r = (e, t) => `${e} ${t}px ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif`;
1588
+ e.textBaseline = "middle";
1589
+ let i = e.createLinearGradient(0, 0, t, n);
1590
+ i.addColorStop(0, "#15171f"), i.addColorStop(1, "#0a0b0f"), e.fillStyle = i, e.fillRect(0, 0, t, n);
1591
+ let a = e.createRadialGradient(t * .8, n * .2, 0, t * .8, n * .2, t * .6);
1592
+ a.addColorStop(0, "rgba(124, 92, 255, 0.28)"), a.addColorStop(1, "rgba(124, 92, 255, 0)"), e.fillStyle = a, e.fillRect(0, 0, t, n);
1593
+ let o = Math.round(n * .035);
1594
+ e.fillStyle = "rgba(255,255,255,0.06)", e.fillRect(0, 0, t, o), e.fillStyle = "#f2f3f5", e.font = r(600, o * .5), e.fillText("Focus", o * .9, o / 2), e.fillStyle = "rgba(242,243,245,0.6)", e.font = r(500, o * .45), e.fillText("Tue 21 Oct 10:08", t - o * 7.2, o / 2);
1595
+ let s = Math.round(t * .17), c = Math.round(t * .018);
1596
+ e.fillStyle = "rgba(255,255,255,0.045)", e.fillRect(0, o, s, n - o), [
1597
+ "Overview",
1598
+ "Projects",
1599
+ "Timeline",
1600
+ "Exports",
1601
+ "Settings"
1602
+ ].forEach((t, n) => {
1603
+ let i = o + c * 1.6 + n * c * 2.2;
1604
+ n === 0 && (e.fillStyle = "rgba(124, 92, 255, 0.35)", e.beginPath(), e.roundRect(c * .6, i - c * .8, s - c * 1.2, c * 1.6, c * .4), e.fill()), e.fillStyle = n === 0 ? "#ffffff" : "rgba(242,243,245,0.6)", e.font = r(n === 0 ? 650 : 500, c * .78), e.fillText(t, c * 1.3, i);
1605
+ });
1606
+ let l = s + c * 1.5, u = t - l - c * 1.5;
1607
+ e.fillStyle = "rgba(242,243,245,0.55)", e.font = r(500, c * .8), e.fillText("Tuesday, 21 October", l, o + c * 1.6), e.fillStyle = "#f2f3f5", e.font = r(700, c * 1.7), e.fillText("Good morning", l, o + c * 3.2);
1608
+ let d = o + c * 4.6, f = Math.round((n - d - c * 1.5) * .52), p = e.createLinearGradient(l, d, l + u, d + f);
1609
+ p.addColorStop(0, "#6d5dfc"), p.addColorStop(.55, "#c14dd6"), p.addColorStop(1, "#ff8a5c"), e.fillStyle = p, e.beginPath(), e.roundRect(l, d, u, f, c * 1.1), e.fill(), e.fillStyle = "rgba(255,255,255,0.8)", e.font = r(600, c * .85), e.fillText("Focus time this week", l + c * 1.4, d + c * 1.8), e.fillStyle = "#fff", e.font = r(700, c * 3.2), e.fillText("26h 40m", l + c * 1.3, d + c * 4.2);
1610
+ let m = [
1611
+ .35,
1612
+ .55,
1613
+ .42,
1614
+ .7,
1615
+ .5,
1616
+ .92,
1617
+ .64,
1618
+ .58,
1619
+ .77,
1620
+ .48,
1621
+ .86,
1622
+ .6
1623
+ ], h = l + u * .46, g = u * .5 / m.length, _ = d + f - c * 1.2;
1624
+ m.forEach((t, n) => {
1625
+ let r = t * (f - c * 2.6);
1626
+ e.fillStyle = n === 5 ? "#fff" : "rgba(255,255,255,0.34)", e.beginPath(), e.roundRect(h + n * g + g * .22, _ - r, g * .56, r, c * .25), e.fill();
1627
+ });
1628
+ let v = d + f + c, y = n - v - c * 1.5, b = c, x = (u - b * 2) / 3;
1629
+ [
1630
+ [
1631
+ "Steps",
1632
+ "8,240",
1633
+ .82,
1634
+ "#3ddc97"
1635
+ ],
1636
+ [
1637
+ "Sleep",
1638
+ "7h 40m",
1639
+ .64,
1640
+ "#5ab0ff"
1641
+ ],
1642
+ [
1643
+ "Sessions",
1644
+ "14",
1645
+ .47,
1646
+ "#ffb23f"
1647
+ ]
1648
+ ].forEach(([t, n, i, a], o) => {
1649
+ let s = l + o * (x + b);
1650
+ e.fillStyle = "#171a22", e.beginPath(), e.roundRect(s, v, x, y, c * .9), e.fill(), e.fillStyle = "rgba(242,243,245,0.55)", e.font = r(600, c * .8), e.fillText(t, s + c, v + c * 1.4), e.fillStyle = "#f2f3f5", e.font = r(700, c * 1.6), e.fillText(n, s + c, v + c * 3.2);
1651
+ let u = s + x - c * 1.9, d = v + y / 2, f = Math.min(y * .28, c * 1.4);
1652
+ e.lineWidth = f * .32, e.lineCap = "round", e.strokeStyle = "rgba(255,255,255,0.1)", e.beginPath(), e.arc(u, d, f, 0, Math.PI * 2), e.stroke(), e.strokeStyle = a, e.beginPath(), e.arc(u, d, f, -Math.PI / 2, -Math.PI / 2 + Math.PI * 2 * i), e.stroke();
1653
+ });
1654
+ }
1655
+ function pt(e, t, n) {
1656
+ let r = (e, t) => `${e} ${t}px ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif`;
1657
+ e.textBaseline = "middle";
1658
+ let i = e.createLinearGradient(0, 0, 0, n);
1659
+ i.addColorStop(0, "#12141b"), i.addColorStop(1, "#07080b"), e.fillStyle = i, e.fillRect(0, 0, t, n);
1660
+ let a = e.createRadialGradient(t * .85, n * .12, 0, t * .85, n * .12, t);
1661
+ a.addColorStop(0, "rgba(124, 92, 255, 0.32)"), a.addColorStop(1, "rgba(124, 92, 255, 0)"), e.fillStyle = a, e.fillRect(0, 0, t, n), e.fillStyle = "#f2f3f5", e.font = r(600, 46), e.fillText("10:08", 108, 92);
1662
+ for (let n = 0; n < 4; n++) {
1663
+ let r = 12 + n * 8;
1664
+ e.fillRect(t - 84 - 250 + n * 22, 108 - r, 14, r);
1665
+ }
1666
+ e.strokeStyle = "rgba(242, 243, 245, 0.5)", e.lineWidth = 3, e.beginPath(), e.roundRect(t - 84 - 140, 76, 84, 34, 10), e.stroke(), e.beginPath(), e.roundRect(t - 84 - 134, 82, 60, 22, 5), e.fill(), e.fillRect(t - 84 - 52, 86, 5, 14), e.fillStyle = "rgba(242, 243, 245, 0.55)", e.font = r(500, 40), e.fillText("Tuesday, 21 October", 84, 262), e.fillStyle = "#f2f3f5", e.font = r(700, 92), e.fillText("Good morning", 84, 360);
1667
+ let o = t - 168, s = e.createLinearGradient(84, 450, 84 + o, 1090);
1668
+ s.addColorStop(0, "#6d5dfc"), s.addColorStop(.55, "#c14dd6"), s.addColorStop(1, "#ff8a5c"), e.fillStyle = s, e.beginPath(), e.roundRect(84, 450, o, 640, 64), e.fill(), e.fillStyle = "rgba(255, 255, 255, 0.8)", e.font = r(600, 40), e.fillText("Focus time today", 148, 550), e.fillStyle = "#fff", e.font = r(700, 140), e.fillText("4h 12m", 140, 675), e.fillStyle = "rgba(255, 255, 255, 0.8)", e.font = r(500, 38), e.fillText("+38 min vs. last week", 148, 770);
1669
+ let c = [
1670
+ .35,
1671
+ .55,
1672
+ .42,
1673
+ .7,
1674
+ .5,
1675
+ .92,
1676
+ .64
1677
+ ], l = (o - 128) / c.length;
1678
+ c.forEach((t, n) => {
1679
+ let r = t * 190;
1680
+ e.fillStyle = n === 5 ? "#fff" : "rgba(255, 255, 255, 0.34)", e.beginPath(), e.roundRect(148 + n * l + l * .2, 1026 - r, l * .6, r, 14), e.fill();
1681
+ });
1682
+ let u = (o - 40) / 2;
1683
+ [{
1684
+ label: "Steps",
1685
+ value: "8,240",
1686
+ progress: .82,
1687
+ color: "#3ddc97"
1688
+ }, {
1689
+ label: "Sleep",
1690
+ value: "7h 40m",
1691
+ progress: .64,
1692
+ color: "#5ab0ff"
1693
+ }].forEach((t, n) => {
1694
+ let i = 84 + n * (u + 40);
1695
+ e.fillStyle = "#171a22", e.beginPath(), e.roundRect(i, 1134, u, 300, 48), e.fill(), e.fillStyle = "rgba(242, 243, 245, 0.55)", e.font = r(600, 38), e.fillText(t.label, i + 48, 1216), e.fillStyle = "#f2f3f5", e.font = r(700, 70), e.fillText(t.value, i + 48, 1330);
1696
+ let a = i + u - 96, o = 1220;
1697
+ e.lineWidth = 16, e.lineCap = "round", e.strokeStyle = "rgba(255, 255, 255, 0.1)", e.beginPath(), e.arc(a, o, 42, 0, Math.PI * 2), e.stroke(), e.strokeStyle = t.color, e.beginPath(), e.arc(a, o, 42, -Math.PI / 2, -Math.PI / 2 + Math.PI * 2 * t.progress), e.stroke();
1698
+ });
1699
+ let d = 1530;
1700
+ e.fillStyle = "#f2f3f5", e.font = r(700, 50), e.fillText("Up next", 84, d), d += 64;
1701
+ for (let [t, n, i] of [
1702
+ [
1703
+ "Design review",
1704
+ "11:00 · Studio B",
1705
+ "#ffb23f"
1706
+ ],
1707
+ [
1708
+ "Team lunch",
1709
+ "13:30 · Rooftop",
1710
+ "#3ddc97"
1711
+ ],
1712
+ [
1713
+ "Ship v0.2",
1714
+ "17:00 · Release",
1715
+ "#ff5c7a"
1716
+ ]
1717
+ ]) e.fillStyle = i + "33", e.beginPath(), e.arc(124, d + 68, 40, 0, Math.PI * 2), e.fill(), e.fillStyle = i, e.beginPath(), e.arc(124, d + 68, 14, 0, Math.PI * 2), e.fill(), e.fillStyle = "#f2f3f5", e.font = r(600, 46), e.fillText(t, 196, d + 46), e.fillStyle = "rgba(242, 243, 245, 0.5)", e.font = r(500, 36), e.fillText(n, 196, d + 96), e.fillStyle = "rgba(255, 255, 255, 0.07)", e.fillRect(196, d + 140, o - 112, 2), d += 146;
1718
+ let f = n - 262;
1719
+ e.fillStyle = "rgba(28, 31, 40, 0.95)", e.beginPath(), e.roundRect(84, f, o, 150, 75), e.fill();
1720
+ for (let t = 0; t < 4; t++) {
1721
+ let n = 84 + o * ((t + .5) / 4);
1722
+ e.fillStyle = t === 0 ? "#f2f3f5" : "rgba(242, 243, 245, 0.32)", e.beginPath(), e.roundRect(n - 24, f + 51, 48, 48, 14), e.fill();
1723
+ }
1724
+ e.fillStyle = "rgba(255, 255, 255, 0.85)", e.beginPath(), e.roundRect(t / 2 - 140, n - 46, 280, 12, 6), e.fill();
1725
+ }
1726
+ // ../engine/src/interaction.ts
1727
+ function mt({ engine: e, element: t, getDoc: n, overrides: r, onTime: i }) {
1728
+ let a = 0, o = 0, s = 0, c = !1, l = 1, u = !1, d = 0, f = 0, p = B, m = B, h = null, g = null, _ = null, v = () => ({
1729
+ ...n().interaction,
1730
+ ...r,
1731
+ cursor: {
1732
+ ...n().interaction.cursor,
1733
+ ...r?.cursor
1734
+ }
1735
+ });
1736
+ function y(e) {
1737
+ return g && g.timeline === e.timeline || (g = {
1738
+ timeline: e.timeline,
1739
+ compiled: L(e.timeline)
1740
+ }), g.compiled;
1741
+ }
1742
+ function b(e, t, n) {
1743
+ if (n === "loop") return (e % t + t) % t;
1744
+ if (n === "pingpong") {
1745
+ let n = e % (t * 2);
1746
+ return n <= t ? n : t * 2 - n;
1747
+ }
1748
+ return Math.max(0, Math.min(t, e));
1749
+ }
1750
+ function x(e, t, n) {
1751
+ let r = t.timeline.duration;
1752
+ switch (n.trigger) {
1753
+ case "none": return 0;
1754
+ case "load":
1755
+ case "in-view":
1756
+ case "click": return c && (s += e * n.speed * l), n.loop === "none" && s >= r && (s = r, c = !1), b(Math.max(0, s - n.delay), r, n.loop);
1757
+ case "hover": return c && (s += e * n.speed * l, s >= r && (s = r, n.loop === "none" ? c = !1 : n.loop === "pingpong" ? l = -1 : s = 0), s <= 0 && (s = 0, l === -1 && (c = !1))), Math.max(0, Math.min(r, s));
1758
+ case "scroll": {
1759
+ let t = n.scroll?.smoothing ?? 6;
1760
+ return f += (d - f) * (1 - Math.exp(-e * t)), f * r;
1761
+ }
1762
+ case "cursor-move": return (m.x + 1) / 2 * r;
1763
+ }
1764
+ }
1765
+ function S() {
1766
+ let e = t.getBoundingClientRect(), n = window.innerHeight || 1, r = v(), i = r.scroll?.start === "top" ? n - e.height : n, a = i - (r.scroll?.end === "bottom" ? n - e.height : -e.height) || 1;
1767
+ d = Math.max(0, Math.min(1, (i - e.top) / a));
1768
+ }
1769
+ function C(t) {
1770
+ a = requestAnimationFrame(C);
1771
+ let s = Math.min((t - o) / 1e3, .05) || 0;
1772
+ o = t;
1773
+ let c = n(), l = v();
1774
+ m = V(m, p, s, l.cursor.smoothing), p = {
1775
+ ...p,
1776
+ speed: p.speed * Math.exp(-s * 6)
1777
+ };
1778
+ let u = x(s, c, l);
1779
+ i?.(u);
1780
+ let d = c.scene.devices.map((e) => e.id), f = [];
1781
+ c.interaction.idle.float > 0 && f.push(K(t / 1e3, c.interaction.idle.float, d));
1782
+ let h = R(c, u, [], y(c));
1783
+ f.push(q(m, l.cursor, t / 1e3, d, h.camera)), r?.cameraZoom && f.push(W(r.cameraZoom, h.camera)), e.renderFrame(R(c, u, f, y(c)));
1784
+ }
1785
+ let w = (e) => {
1786
+ let n = t.getBoundingClientRect(), r = (e.clientX - n.left) / n.width * 2 - 1, i = -((e.clientY - n.top) / n.height * 2 - 1), a = performance.now(), o = p.speed;
1787
+ if (h) {
1788
+ let e = Math.max(1, a - h.time) / 1e3;
1789
+ o = Math.min(1, Math.hypot(r - h.x, i - h.y) / e / 6);
1790
+ }
1791
+ h = {
1792
+ x: r,
1793
+ y: i,
1794
+ time: a
1795
+ }, p = {
1796
+ x: Math.max(-1, Math.min(1, r)),
1797
+ y: Math.max(-1, Math.min(1, i)),
1798
+ speed: o
1799
+ };
1800
+ }, T = () => {
1801
+ p = B, h = null, u = !1;
1802
+ let e = v();
1803
+ e.trigger === "hover" && (e.hover?.reverseOnLeave ?? !0 ? (l = -1, c = !0) : c = !1);
1804
+ }, E = () => {
1805
+ u = !0, v().trigger === "hover" && (l = 1, c = !0);
1806
+ }, D = () => {
1807
+ v().trigger === "click" && (!c || s >= n().timeline.duration ? (s >= n().timeline.duration && (s = 0), c = !0) : c = !1);
1808
+ }, O = () => S();
1809
+ return {
1810
+ start() {
1811
+ if (a) return;
1812
+ let e = v();
1813
+ t.addEventListener("pointermove", w), t.addEventListener("pointerleave", T), t.addEventListener("pointerenter", E), t.addEventListener("click", D), window.addEventListener("scroll", O, { passive: !0 }), window.addEventListener("resize", O), S(), s = 0, l = 1, c = e.trigger === "load", e.trigger === "in-view" && (_ = new IntersectionObserver((e) => {
1814
+ e.some((e) => e.isIntersecting) && (c = !0, _?.disconnect());
1815
+ }, { threshold: .5 }), _.observe(t)), o = performance.now(), a = requestAnimationFrame(C);
1816
+ },
1817
+ stop() {
1818
+ cancelAnimationFrame(a), a = 0, t.removeEventListener("pointermove", w), t.removeEventListener("pointerleave", T), t.removeEventListener("pointerenter", E), t.removeEventListener("click", D), window.removeEventListener("scroll", O), window.removeEventListener("resize", O), _?.disconnect(), _ = null;
1819
+ },
1820
+ restart() {
1821
+ s = 0, l = 1, c = v().trigger !== "none" && v().trigger !== "scroll" && v().trigger !== "cursor-move" && (v().trigger !== "hover" || u);
1822
+ },
1823
+ dispose() {
1824
+ this.stop();
1825
+ }
1826
+ };
1827
+ }
1828
+ // ../devices/src/registry.ts
1829
+ var ht = {
1830
+ phone: () => import("./device-phone-DxWL5LkW.js").then((e) => e.t).then((e) => e.phone),
1831
+ tablet: () => import("./device-tablet-B1JOR7Rf.js").then((e) => e.t).then((e) => e.tablet),
1832
+ laptop: () => import("./device-laptop-DlKLhrO9.js").then((e) => e.t).then((e) => e.laptop),
1833
+ monitor: () => import("./device-monitor-BkXp8a-n.js").then((e) => e.t).then((e) => e.monitor),
1834
+ watch: () => import("./device-watch-9Y7wuyPn.js").then((e) => e.t).then((e) => e.watch)
1835
+ }, gt = /* @__PURE__ */ new Map();
1836
+ function _t(e) {
1837
+ let t = gt.get(e);
1838
+ return t || (t = ht[e](), gt.set(e, t)), t;
1839
+ }
1840
+ function vt(e) {
1841
+ let t = e.split(".")[0];
1842
+ if (!(t in ht)) throw Error(`Unknown device spec '${e}'`);
1843
+ return t;
1844
+ }
1845
+ function yt(e, t, n) {
1846
+ if (typeof n != "string") return n;
1847
+ let r = e.finishes[n] ?? e.finishes[t.finishes[0] ?? ""];
1848
+ if (!r) throw Error(`Device '${t.id}' has no finishes`);
1849
+ return r;
1850
+ }
1851
+ async function bt(e, t, n = "high") {
1852
+ let r = await _t(vt(e)), i = r.specs[e];
1853
+ if (!i) throw Error(`Unknown device spec '${e}'`);
1854
+ return U(r.build(i, yt(r, i, t), n));
1855
+ }
1856
+ // src/media.ts
1857
+ function xt(e, t) {
1858
+ try {
1859
+ return new URL(e, t).href;
1860
+ } catch {
1861
+ return e;
1862
+ }
1863
+ }
1864
+ async function $(e, t) {
1865
+ let n = new Image();
1866
+ n.crossOrigin = "anonymous", n.src = e, await n.decode();
1867
+ let r = ut(new k(n), t);
1868
+ return r.needsUpdate = !0, {
1869
+ texture: r,
1870
+ aspect: n.naturalWidth / n.naturalHeight,
1871
+ dispose: () => r.dispose()
1872
+ };
1873
+ }
1874
+ async function St(e, t, n) {
1875
+ let r = document.createElement("video");
1876
+ r.crossOrigin = "anonymous", r.muted = !0, r.playsInline = !0, r.preload = "auto", r.src = e, await new Promise((t, n) => {
1877
+ r.addEventListener("loadedmetadata", () => t(), { once: !0 }), r.addEventListener("error", () => n(/* @__PURE__ */ Error(`Video failed: ${e}`)), { once: !0 });
1878
+ });
1879
+ let i = lt(r, st(n.video)), a = ut(new y(r), t);
1880
+ return {
1881
+ texture: a,
1882
+ aspect: r.videoWidth / r.videoHeight,
1883
+ duration: r.duration,
1884
+ dispose() {
1885
+ i(), r.pause(), r.removeAttribute("src"), r.load(), a.dispose();
1886
+ }
1887
+ };
1888
+ }
1889
+ function Ct(e, t, n) {
1890
+ return {
1891
+ buildDevice: (e) => bt(e.spec, e.finish, t),
1892
+ async resolveScreen(t, r, { maxAnisotropy: i, screenAspect: a }) {
1893
+ let o = t.media;
1894
+ if (n) return t.poster ? $(t.poster, i).catch(() => dt(a, i)) : o?.source === "url" && o.kind === "image" ? $(xt(o.url, e), i).catch(() => null) : dt(a, i);
1895
+ if (!o) return dt(a, i);
1896
+ if (o.source === "data") return $(o.dataUrl, i);
1897
+ if (o.source === "url") {
1898
+ let n = xt(o.url, e);
1899
+ return o.kind === "video" ? St(n, i, t) : $(n, i);
1900
+ }
1901
+ return dt(a, i);
1902
+ },
1903
+ async resolveBackdrop(t, { maxAnisotropy: r }) {
1904
+ return n || t.kind !== "image" || t.source === "idb" ? null : $(t.source === "data" ? t.dataUrl : xt(t.url, e), r);
1905
+ }
1906
+ };
1907
+ }
1908
+ // src/runtime.ts
1909
+ var wt = /* @__PURE__ */ e({ mount: () => Dt }), Tt = (e) => {
1910
+ let t = window;
1911
+ t.requestIdleCallback ? t.requestIdleCallback(e, { timeout: 2e3 }) : setTimeout(e, 300);
1912
+ };
1913
+ function Et(e, t) {
1914
+ let n = document.createElement("div"), r = e === "dark" ? "#f1f1f3" : "#17181b";
1915
+ return n.style.cssText = `position:absolute;inset:0;display:grid;place-items:center;background:${t && t !== "transparent" ? t : e === "dark" ? "#0d0e11" : "#f4f4f2"};transition:opacity .3s`, n.innerHTML = `<div style="width:28px;height:28px;border-radius:50%;border:2px solid ${r}33;border-top-color:${r};animation:om-spin .8s linear infinite"></div><style>@keyframes om-spin{to{transform:rotate(360deg)}}</style>`, n;
1916
+ }
1917
+ async function Dt(e, t, n) {
1918
+ let r = await fetch(n, { credentials: "omit" });
1919
+ if (!r.ok) throw Error(`Could not load ${n} (${r.status})`);
1920
+ let i = H(await r.json()), a = t.backgroundColor;
1921
+ a && (i.scene.backdrop = a === "transparent" ? {
1922
+ ...i.scene.backdrop,
1923
+ kind: "transparent"
1924
+ } : {
1925
+ ...i.scene.backdrop,
1926
+ kind: "solid",
1927
+ color: a
1928
+ });
1929
+ let o = document.createElement("div");
1930
+ o.style.cssText = "position:absolute;inset:0;";
1931
+ let s = document.createElement("canvas");
1932
+ s.style.cssText = "display:block;width:100%;height:100%;", s.setAttribute("aria-label", i.name), o.append(s), e.append(o);
1933
+ let c = t.loader ? Et(t.theme, a) : null;
1934
+ c && e.append(c);
1935
+ let l = it({
1936
+ canvas: s,
1937
+ quality: "embed"
1938
+ }), u = () => l.setSize(e.clientWidth || 1, e.clientHeight || 1), d = new ResizeObserver(u);
1939
+ d.observe(e);
1940
+ let f = t.progressive ? Ct(n, "low", !0) : Ct(n, "high", !1);
1941
+ await l.loadScene(i.scene, f), u();
1942
+ let p = mt({
1943
+ engine: l,
1944
+ element: e,
1945
+ getDoc: () => i,
1946
+ overrides: t.overrides
1947
+ });
1948
+ p.start(), c && (c.style.opacity = "0", setTimeout(() => c.remove(), 350));
1949
+ let m = !1;
1950
+ return t.progressive && Tt(() => {
1951
+ m || l.loadScene(i.scene, Ct(n, "high", !1));
1952
+ }), { dispose() {
1953
+ m = !0, d.disconnect(), p.dispose(), l.dispose(), o.remove(), c?.remove();
1954
+ } };
1955
+ }
1956
+ export { wt as t };