@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.
- package/LICENSE +21 -0
- package/README.md +47 -2
- package/dist/device-laptop-DlKLhrO9.js +900 -0
- package/dist/device-monitor-BkXp8a-n.js +366 -0
- package/dist/device-phone-DxWL5LkW.js +3227 -0
- package/dist/device-tablet-B1JOR7Rf.js +255 -0
- package/dist/device-watch-9Y7wuyPn.js +274 -0
- package/dist/embed.iife.js +4759 -0
- package/dist/embed.js +106 -0
- package/dist/rolldown-runtime-CGnMp29N.js +10 -0
- package/dist/runtime-RiyRiexX.js +1956 -0
- package/dist/three-o_76Nw0r.js +13763 -0
- package/package.json +70 -3
|
@@ -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 };
|