u-space 0.0.30 → 0.0.31
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/dist/getTransferables-C97JPUVf.cjs +1 -0
- package/dist/getTransferables-DrzSmiCR.js +43 -0
- package/dist/index.cjs +3 -3
- package/dist/index.js +1549 -1026
- package/dist/modelDecodeProtocol-D1Apm9iG.cjs +1 -0
- package/dist/modelDecodeProtocol-wDB7ksYw.js +56 -0
- package/dist/src/loaders/ModelDecodeWorkerClient.d.ts +31 -0
- package/dist/src/loaders/ModelLoaderManager.d.ts +15 -2
- package/dist/src/loaders/buildDecodedGltfModel.d.ts +4 -0
- package/dist/src/loaders/index.d.ts +1 -0
- package/dist/src/objects/Model.d.ts +1 -0
- package/dist/src/worker/decodeGltfModel.d.ts +10 -0
- package/dist/src/worker/getTransferables.d.ts +1 -0
- package/dist/src/worker/index.d.ts +1 -0
- package/dist/src/worker/installWorkerImageLoader.d.ts +3 -0
- package/dist/src/worker/model-decoder.d.ts +13 -0
- package/dist/src/worker/modelDecodeProtocol.d.ts +205 -0
- package/dist/src/worker/workerImageUtils.d.ts +8 -0
- package/dist/worker/index.cjs +1 -1
- package/dist/worker/index.js +8 -6
- package/dist/worker/model-decoder.cjs +1 -0
- package/dist/worker/model-decoder.js +339 -0
- package/dist/worker/runtime.cjs +1 -1
- package/dist/worker/runtime.js +202 -208
- package/dist/workerImageUtils-lmOMyTQN.cjs +1 -0
- package/dist/workerImageUtils-mQD3TQ1N.js +105 -0
- package/docs/api-viewer.md +45 -1
- package/docs/changelog.md +15 -0
- package/docs/examples-guide.md +9 -3
- package/docs/getting-started.md +1 -1
- package/docs/index.md +1 -1
- package/docs/mcp.md +5 -3
- package/docs/release.md +5 -3
- package/package.json +9 -1
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import { g as F } from "../getTransferables-DrzSmiCR.js";
|
|
2
|
+
import { c as M } from "../workerImageUtils-mQD3TQ1N.js";
|
|
3
|
+
import { M as O, v as S, U as L } from "../modelDecodeProtocol-wDB7ksYw.js";
|
|
4
|
+
const B = "u-space-model-loader-cache", U = "SBMG----", C = 1179937895, R = 1313821514, D = 5130562, E = new TextDecoder();
|
|
5
|
+
function g(e) {
|
|
6
|
+
throw new L(e);
|
|
7
|
+
}
|
|
8
|
+
async function k(e, t, s, o = e, i = !1) {
|
|
9
|
+
const n = e.startsWith("data:") || e.startsWith("blob:");
|
|
10
|
+
let l = !i;
|
|
11
|
+
if (i && !n)
|
|
12
|
+
try {
|
|
13
|
+
const f = new URL(e), c = new URL(o);
|
|
14
|
+
l = (f.protocol === "http:" || f.protocol === "https:") && f.origin === c.origin;
|
|
15
|
+
} catch {
|
|
16
|
+
l = !1;
|
|
17
|
+
}
|
|
18
|
+
const h = await fetch(e, n ? { signal: s } : {
|
|
19
|
+
signal: s,
|
|
20
|
+
headers: l ? t.headers : void 0,
|
|
21
|
+
credentials: l ? t.credentials : "omit"
|
|
22
|
+
});
|
|
23
|
+
if (!h.ok)
|
|
24
|
+
throw new Error(`Failed to load model resource ${e}: ${h.status} ${h.statusText}`);
|
|
25
|
+
return h;
|
|
26
|
+
}
|
|
27
|
+
async function T(e, t, s, o, i, n, l) {
|
|
28
|
+
const h = N(e, t), f = n ? await n.resolve(h, i) : { url: h, complete() {
|
|
29
|
+
} };
|
|
30
|
+
try {
|
|
31
|
+
const c = await k(f.url, o, i, s, !0), r = await l(c);
|
|
32
|
+
return f.complete(), r;
|
|
33
|
+
} catch (c) {
|
|
34
|
+
throw f.complete(c), c;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async function $(e, t, s) {
|
|
38
|
+
if (t.persistent !== !1 && typeof caches < "u") {
|
|
39
|
+
let o;
|
|
40
|
+
try {
|
|
41
|
+
o = await caches.open(B);
|
|
42
|
+
const n = await o.match(e);
|
|
43
|
+
if (n) return n.arrayBuffer();
|
|
44
|
+
} catch (n) {
|
|
45
|
+
if (s.aborted) throw n;
|
|
46
|
+
console.warn(`[ModelDecodeWorker] Failed to read Cache Storage for ${e}:`, n);
|
|
47
|
+
}
|
|
48
|
+
const i = await k(e, t, s);
|
|
49
|
+
if (o)
|
|
50
|
+
try {
|
|
51
|
+
await o.put(e, i.clone());
|
|
52
|
+
} catch (n) {
|
|
53
|
+
if (s.aborted) throw n;
|
|
54
|
+
console.warn(`[ModelDecodeWorker] Failed to write Cache Storage for ${e}:`, n);
|
|
55
|
+
}
|
|
56
|
+
return i.arrayBuffer();
|
|
57
|
+
}
|
|
58
|
+
return (await k(e, t, s)).arrayBuffer();
|
|
59
|
+
}
|
|
60
|
+
function V(e) {
|
|
61
|
+
if (e.byteLength < 8 || E.decode(new Uint8Array(e, 0, 8)) !== U) return e;
|
|
62
|
+
const s = new Uint8Array(e.byteLength - 8), o = new Uint8Array(e, 8);
|
|
63
|
+
for (let i = 0; i < o.length; i++) {
|
|
64
|
+
const n = o[i];
|
|
65
|
+
s[i] = n >> 4 & 15 | n << 4 & 240;
|
|
66
|
+
}
|
|
67
|
+
return s.buffer;
|
|
68
|
+
}
|
|
69
|
+
function G(e) {
|
|
70
|
+
const t = new DataView(e);
|
|
71
|
+
if (e.byteLength >= 12 && t.getUint32(0, !0) === C) {
|
|
72
|
+
const s = t.getUint32(8, !0);
|
|
73
|
+
if (s > e.byteLength)
|
|
74
|
+
throw new Error(`Invalid GLB length: expected ${s}, received ${e.byteLength}.`);
|
|
75
|
+
let o = 12, i;
|
|
76
|
+
const n = [];
|
|
77
|
+
for (; o + 8 <= s; ) {
|
|
78
|
+
const l = t.getUint32(o, !0), h = t.getUint32(o + 4, !0);
|
|
79
|
+
if (o += 8, o + l > s) throw new Error("Invalid GLB chunk length.");
|
|
80
|
+
const f = e.slice(o, o + l);
|
|
81
|
+
h === R ? i = JSON.parse(E.decode(f).replace(/\u0000+$/u, "")) : h === D && n.push(f), o += l;
|
|
82
|
+
}
|
|
83
|
+
if (!i) throw new Error("GLB does not contain a JSON chunk.");
|
|
84
|
+
return { document: i, binaryChunks: n };
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
document: JSON.parse(E.decode(e).replace(/^\uFEFF/u, "")),
|
|
88
|
+
binaryChunks: []
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function I(e) {
|
|
92
|
+
e.asset?.version?.startsWith("2") || g("Only glTF 2.x static models are supported by the decode worker."), (e.extensionsRequired?.length || e.extensionsUsed?.length) && g("glTF extensions are not supported by the decode worker."), e.animations?.length && g("Animated glTF models must use the regular loader."), e.skins?.length && g("Skinned glTF models must use the regular loader."), e.cameras?.length && g("glTF cameras must use the regular loader."), S(e);
|
|
93
|
+
for (const t of e.accessors ?? [])
|
|
94
|
+
t.sparse && g("Sparse glTF accessors must use the regular loader."), t.bufferView === void 0 && g("Accessors without a bufferView must use the regular loader."), ["SCALAR", "VEC2", "VEC3", "VEC4"].includes(t.type) || g(`Accessor type ${t.type} must use the regular loader.`), [5120, 5121, 5122, 5123, 5125, 5126].includes(t.componentType) || g(`Accessor component type ${t.componentType} must use the regular loader.`);
|
|
95
|
+
for (const t of e.bufferViews ?? [])
|
|
96
|
+
t.extensions && Object.keys(t.extensions).length > 0 && g("Compressed glTF buffer views must use the regular loader.");
|
|
97
|
+
for (const t of e.nodes ?? [])
|
|
98
|
+
(t.skin !== void 0 || t.weights?.length || t.camera !== void 0) && g("Skinned, morphed, or camera glTF nodes must use the regular loader."), t.extensions && Object.keys(t.extensions).length > 0 && g("Extended glTF nodes must use the regular loader.");
|
|
99
|
+
for (const t of e.meshes ?? [])
|
|
100
|
+
for (const s of t.primitives)
|
|
101
|
+
(s.mode ?? 4) !== 4 && g("Only triangle glTF primitives are supported."), s.targets?.length && g("Morph targets must use the regular loader."), s.extensions && Object.keys(s.extensions).length > 0 && g("Extended glTF primitives must use the regular loader.");
|
|
102
|
+
for (const t of e.materials ?? [])
|
|
103
|
+
t.extensions && Object.keys(t.extensions).length > 0 && g("Extended glTF materials must use the regular loader.");
|
|
104
|
+
for (const t of e.textures ?? [])
|
|
105
|
+
t.extensions && Object.keys(t.extensions).length > 0 && g("Extended glTF textures must use the regular loader.");
|
|
106
|
+
}
|
|
107
|
+
function N(e, t) {
|
|
108
|
+
return e.startsWith("data:") || e.startsWith("blob:") ? e : new URL(e, t).href;
|
|
109
|
+
}
|
|
110
|
+
async function _(e, t, s, o, i, n, l) {
|
|
111
|
+
const h = [...t], f = [];
|
|
112
|
+
for (const c of e.buffers ?? []) {
|
|
113
|
+
let r;
|
|
114
|
+
if (c.uri)
|
|
115
|
+
r = await T(
|
|
116
|
+
c.uri,
|
|
117
|
+
s,
|
|
118
|
+
o,
|
|
119
|
+
i,
|
|
120
|
+
n,
|
|
121
|
+
l,
|
|
122
|
+
(a) => a.arrayBuffer()
|
|
123
|
+
);
|
|
124
|
+
else {
|
|
125
|
+
const a = h.shift();
|
|
126
|
+
if (!a) throw new Error("glTF buffer is missing its GLB binary chunk.");
|
|
127
|
+
r = a;
|
|
128
|
+
}
|
|
129
|
+
if (r.byteLength < c.byteLength)
|
|
130
|
+
throw new Error(`glTF buffer is truncated: expected ${c.byteLength}, received ${r.byteLength}.`);
|
|
131
|
+
f.push(r), Reflect.deleteProperty(c, "uri");
|
|
132
|
+
}
|
|
133
|
+
return f;
|
|
134
|
+
}
|
|
135
|
+
function W(e, t, s, o) {
|
|
136
|
+
const i = e.bufferViews?.[s];
|
|
137
|
+
if (!i) throw new Error(`glTF image references missing bufferView ${s}.`);
|
|
138
|
+
const n = t[i.buffer];
|
|
139
|
+
if (!n) throw new Error(`glTF image references missing buffer ${i.buffer}.`);
|
|
140
|
+
const l = i.byteOffset ?? 0;
|
|
141
|
+
return new Blob([new Uint8Array(n, l, i.byteLength)], {
|
|
142
|
+
type: o ?? "application/octet-stream"
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
async function j(e, t, s, o, i, n, l) {
|
|
146
|
+
const h = [], f = [];
|
|
147
|
+
try {
|
|
148
|
+
for (const c of e.images ?? []) {
|
|
149
|
+
let r;
|
|
150
|
+
if (c.uri)
|
|
151
|
+
r = await T(
|
|
152
|
+
c.uri,
|
|
153
|
+
s,
|
|
154
|
+
o,
|
|
155
|
+
i,
|
|
156
|
+
n,
|
|
157
|
+
l,
|
|
158
|
+
(u) => u.blob()
|
|
159
|
+
);
|
|
160
|
+
else if (c.bufferView !== void 0)
|
|
161
|
+
r = W(e, t, c.bufferView, c.mimeType);
|
|
162
|
+
else
|
|
163
|
+
throw new Error("glTF image is missing both uri and bufferView.");
|
|
164
|
+
if (n.aborted) throw n.reason ?? new DOMException("Aborted", "AbortError");
|
|
165
|
+
const a = await globalThis.crypto.subtle.digest("SHA-256", await r.arrayBuffer());
|
|
166
|
+
if (n.aborted) throw n.reason ?? new DOMException("Aborted", "AbortError");
|
|
167
|
+
const d = Array.from(new Uint8Array(a), (u) => u.toString(16).padStart(2, "0")).join("");
|
|
168
|
+
f.push(`${r.type}:${r.size}:${d}`), h.push(await M(r, { imageOrientation: "flipY" })), Reflect.deleteProperty(c, "uri");
|
|
169
|
+
}
|
|
170
|
+
return { images: h, imageKeys: f };
|
|
171
|
+
} catch (c) {
|
|
172
|
+
throw h.forEach((r) => r.close()), c;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
async function P(e, t, s = {}, o = new AbortController().signal, i) {
|
|
176
|
+
const n = V(t), { document: l, binaryChunks: h } = G(n);
|
|
177
|
+
I(l);
|
|
178
|
+
const f = s.resourceBaseUrl ?? e, c = await _(
|
|
179
|
+
l,
|
|
180
|
+
h,
|
|
181
|
+
f,
|
|
182
|
+
e,
|
|
183
|
+
s,
|
|
184
|
+
o,
|
|
185
|
+
i
|
|
186
|
+
), { images: r, imageKeys: a } = await j(
|
|
187
|
+
l,
|
|
188
|
+
c,
|
|
189
|
+
f,
|
|
190
|
+
e,
|
|
191
|
+
s,
|
|
192
|
+
o,
|
|
193
|
+
i
|
|
194
|
+
);
|
|
195
|
+
return {
|
|
196
|
+
protocolVersion: O,
|
|
197
|
+
kind: "gltf-static",
|
|
198
|
+
url: e,
|
|
199
|
+
document: l,
|
|
200
|
+
buffers: c,
|
|
201
|
+
images: r,
|
|
202
|
+
imageKeys: a
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
async function q(e, t = {}, s = new AbortController().signal, o) {
|
|
206
|
+
const i = await $(e, t, s);
|
|
207
|
+
return P(e, i, t, s, o);
|
|
208
|
+
}
|
|
209
|
+
function A(e) {
|
|
210
|
+
return e instanceof Error ? { message: e.message, name: e.name, stack: e.stack } : { message: String(e) };
|
|
211
|
+
}
|
|
212
|
+
function z(e = globalThis) {
|
|
213
|
+
const t = [], s = /* @__PURE__ */ new Set();
|
|
214
|
+
let o = null, i = !1, n = !1;
|
|
215
|
+
const l = (r) => new Promise((a) => {
|
|
216
|
+
r.acknowledge = a;
|
|
217
|
+
}), h = (r, a) => {
|
|
218
|
+
for (const d of r.resources.values())
|
|
219
|
+
d.cleanup(), d.reject(a);
|
|
220
|
+
r.resources.clear();
|
|
221
|
+
}, f = (r) => ({
|
|
222
|
+
async resolve(a, d) {
|
|
223
|
+
if (d.aborted) throw d.reason ?? new DOMException("Aborted", "AbortError");
|
|
224
|
+
const u = r.nextResourceId++, m = await new Promise((p, b) => {
|
|
225
|
+
const x = () => {
|
|
226
|
+
r.resources.delete(u), b(d.reason ?? new DOMException("Aborted", "AbortError"));
|
|
227
|
+
}, y = () => d.removeEventListener("abort", x);
|
|
228
|
+
r.resources.set(u, {
|
|
229
|
+
resolve(w) {
|
|
230
|
+
y(), r.resources.delete(u), p(w);
|
|
231
|
+
},
|
|
232
|
+
reject(w) {
|
|
233
|
+
y(), r.resources.delete(u), b(w);
|
|
234
|
+
},
|
|
235
|
+
cleanup: y
|
|
236
|
+
}), d.addEventListener("abort", x, { once: !0 });
|
|
237
|
+
try {
|
|
238
|
+
e.postMessage({ type: "resolve-resource", id: r.id, resourceId: u, url: a });
|
|
239
|
+
} catch (w) {
|
|
240
|
+
y(), r.resources.delete(u), b(w instanceof Error ? w : new Error(String(w)));
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
let v = !1;
|
|
244
|
+
return {
|
|
245
|
+
url: m,
|
|
246
|
+
complete(p) {
|
|
247
|
+
v || (v = !0, e.postMessage({
|
|
248
|
+
type: "resource-complete",
|
|
249
|
+
id: r.id,
|
|
250
|
+
resourceId: u,
|
|
251
|
+
ok: p === void 0,
|
|
252
|
+
error: p === void 0 ? void 0 : A(p)
|
|
253
|
+
}));
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
}), c = async () => {
|
|
258
|
+
if (!(i || n)) {
|
|
259
|
+
i = !0;
|
|
260
|
+
try {
|
|
261
|
+
for (; !n && t.length > 0; ) {
|
|
262
|
+
const r = t.shift();
|
|
263
|
+
if (s.delete(r.id)) continue;
|
|
264
|
+
const a = {
|
|
265
|
+
id: r.id,
|
|
266
|
+
controller: new AbortController(),
|
|
267
|
+
nextResourceId: 1,
|
|
268
|
+
resources: /* @__PURE__ */ new Map()
|
|
269
|
+
};
|
|
270
|
+
o = a;
|
|
271
|
+
try {
|
|
272
|
+
const d = await q(
|
|
273
|
+
r.url,
|
|
274
|
+
r.options,
|
|
275
|
+
a.controller.signal,
|
|
276
|
+
f(a)
|
|
277
|
+
);
|
|
278
|
+
if (s.delete(r.id) || n) {
|
|
279
|
+
d.images.forEach((u) => u.close());
|
|
280
|
+
continue;
|
|
281
|
+
}
|
|
282
|
+
try {
|
|
283
|
+
e.postMessage(
|
|
284
|
+
{ type: "decoded", id: r.id, packet: d },
|
|
285
|
+
F(d)
|
|
286
|
+
);
|
|
287
|
+
} catch (u) {
|
|
288
|
+
throw d.images.forEach((m) => m.close()), u;
|
|
289
|
+
}
|
|
290
|
+
await l(a);
|
|
291
|
+
} catch (d) {
|
|
292
|
+
const u = s.delete(r.id);
|
|
293
|
+
if (a.controller.signal.aborted || u || n) continue;
|
|
294
|
+
d instanceof L ? e.postMessage({ type: "unsupported", id: r.id, reason: d.message }) : e.postMessage({ type: "error", id: r.id, error: A(d) });
|
|
295
|
+
} finally {
|
|
296
|
+
h(a, new DOMException("Model decode request ended.", "AbortError")), s.delete(r.id), o === a && (o = null);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
} finally {
|
|
300
|
+
i = !1, !n && t.length > 0 && c();
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
e.addEventListener("message", (r) => {
|
|
305
|
+
const a = r.data;
|
|
306
|
+
if (a.type === "decode") {
|
|
307
|
+
if (n) return;
|
|
308
|
+
t.push(a), c();
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
if (a.type === "cancel") {
|
|
312
|
+
s.add(a.id), o?.id === a.id && (o.controller.abort(), o.acknowledge?.());
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
if (a.type === "ack") {
|
|
316
|
+
o?.id === a.id && o.acknowledge?.();
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
if (a.type === "resource-resolved") {
|
|
320
|
+
if (o?.id !== a.id) return;
|
|
321
|
+
const d = o.resources.get(a.resourceId);
|
|
322
|
+
if (!d) return;
|
|
323
|
+
if (a.url !== void 0)
|
|
324
|
+
d.resolve(a.url);
|
|
325
|
+
else {
|
|
326
|
+
const u = new Error(a.error?.message ?? "Failed to resolve model resource URL.");
|
|
327
|
+
u.name = a.error?.name ?? "Error", u.stack = a.error?.stack, d.reject(u);
|
|
328
|
+
}
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
a.type === "dispose" && (n = !0, t.length = 0, o?.controller.abort(), o?.acknowledge?.(), e.postMessage({ type: "disposed" }), e.close());
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
export {
|
|
335
|
+
O as MODEL_DECODE_PROTOCOL_VERSION,
|
|
336
|
+
L as UnsupportedModelDecodeError,
|
|
337
|
+
z as installModelDecodeWorker,
|
|
338
|
+
S as validateDecodedGltfNodeGraph
|
|
339
|
+
};
|
package/dist/worker/runtime.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const E=require("../protocol-IUAzx0lk.cjs"),D=require("../Viewer-BKNV67Jj.cjs"),M=require("three/webgpu"),x=new WeakMap;class b{type;timeStamp=performance.now();target;currentTarget;cancelable=!0;bubbles=!0;defaultPrevented=!1;cancelBubble=!1;immediatePropagationStopped=!1;pointerId=0;pointerType="mouse";button=0;buttons=0;altKey=!1;ctrlKey=!1;metaKey=!1;shiftKey=!1;movementX=0;movementY=0;clientX=0;clientY=0;offsetX=0;offsetY=0;pageX=0;pageY=0;screenX=0;screenY=0;deltaX=0;deltaY=0;deltaZ=0;deltaMode=0;constructor(e,t){this.type=e.type,this.target=t,this.currentTarget=t;for(const[r,a]of Object.entries(e))r!=="type"&&a!==void 0&&Reflect.set(this,r,a)}preventDefault(){this.defaultPrevented=!0}stopPropagation(){this.cancelBubble=!0}stopImmediatePropagation(){this.cancelBubble=!0,this.immediatePropagationStopped=!0}composedPath(){return[this.target]}}class y{style={cssText:""};innerText="";textContent="";className="";parentElement=null;children=[];appendChild(e){return this.children.push(e),e instanceof y&&(e.parentElement=this),e}removeChild(e){const t=this.children.indexOf(e);return t>=0&&this.children.splice(t,1),e instanceof y&&(e.parentElement=null),e}remove(){this.parentElement?.removeChild(this)}setAttribute(){}addEventListener(){}removeEventListener(){}getContext(){return null}}function A(s){const e=t=>t.toLowerCase()==="canvas"?new OffscreenCanvas(1,1):new y;return{body:s,documentElement:s,pointerLockElement:null,visibilityState:"visible",createElement:e,createElementNS:(t,r)=>e(r),addEventListener:s.addEventListener.bind(s),removeEventListener:s.removeEventListener.bind(s),exitPointerLock(){}}}function c(s,e,t){Object.defineProperty(s,e,{configurable:!0,value:t})}function v(s,e,t){Object.defineProperty(s,e,{configurable:!0,get:t})}function O(s,e){const t={size:{...e},listeners:new Map,listenerWrappers:new WeakMap};x.set(s,t);const r=s,a={cssText:"",position:"relative",touchAction:"none",width:`${e.width}px`,height:`${e.height}px`},l=(i,p)=>{if(!p)return;let d;typeof p=="function"?d=p:(d=t.listenerWrappers.get(p)??(T=>p.handleEvent(T)),t.listenerWrappers.set(p,d));let h=t.listeners.get(i);h||(h=new Set,t.listeners.set(i,h)),h.add(d)},u=(i,p)=>{if(!p)return;const d=t.listeners.get(i);if(d)if(typeof p=="function")d.delete(p);else{const h=t.listenerWrappers.get(p);h&&d.delete(h)}};c(r,"style",a),c(r,"addEventListener",l),c(r,"removeEventListener",u),c(r,"appendChild",i=>i),c(r,"removeChild",i=>i),c(r,"setAttribute",()=>{}),c(r,"removeAttribute",()=>{}),c(r,"setPointerCapture",()=>{}),c(r,"releasePointerCapture",()=>{}),c(r,"hasPointerCapture",()=>!1),c(r,"requestPointerLock",()=>Promise.resolve()),c(r,"focus",()=>{}),c(r,"remove",()=>{}),v(r,"clientWidth",()=>t.size.width),v(r,"clientHeight",()=>t.size.height),v(r,"offsetWidth",()=>t.size.width),v(r,"offsetHeight",()=>t.size.height),v(r,"offsetTop",()=>t.size.top),v(r,"offsetLeft",()=>t.size.left),v(r,"clientTop",()=>t.size.top),v(r,"clientLeft",()=>t.size.left),v(r,"pageXOffset",()=>t.size.left),v(r,"pageYOffset",()=>t.size.top),v(r,"parentElement",()=>r),c(r,"getBoundingClientRect",()=>{const{width:i,height:p,top:d,left:h}=t.size;return{width:i,height:p,top:d,left:h,right:h+i,bottom:d+p,x:h,y:d,toJSON:()=>({width:i,height:p,top:d,left:h})}});const f=A(r);return c(r,"ownerDocument",f),c(r,"documentElement",r),c(r,"devicePixelRatio",e.pixelRatio),V(r,f),r}function F(s,e){const t=x.get(s);if(!t)throw new Error("The OffscreenCanvas has not been configured as a Worker DOM target.");t.size={...e},s.style.width=`${e.width}px`,s.style.height=`${e.height}px`,c(s,"devicePixelRatio",e.pixelRatio)}function I(s,e){const t=x.get(s);if(!t)throw new Error("The OffscreenCanvas has not been configured as a Worker DOM target.");const r=new b(e,s),a=[...t.listeners.get(e.type)??[]];for(const l of a)if(l(r),r.immediatePropagationStopped)break;return r}function V(s,e){const t=globalThis;t.window=s,t.document=e,t.getComputedStyle=()=>({position:"relative"}),t.PointerEvent=b,t.MouseEvent=b,t.WheelEvent=b,t.Image=y}const z=new Map;let P=!1;function $(){P||(P=!0,M.ImageLoader.prototype.load=function(e,t,r,a){let l=e;this.path!==void 0&&(l=this.path+l),l=this.manager.resolveURL(l);const u=M.Cache.get(`image:${l}`);if(this.manager.itemStart(l),u)return queueMicrotask(()=>{t?.(u),this.manager.itemEnd(l)}),u;let f=z.get(l);return f||(f=fetch(l).then(i=>{if(!i.ok)throw new Error(`Failed to load image ${l}: ${i.status} ${i.statusText}`);return i.blob()}).then(i=>createImageBitmap(i,{colorSpaceConversion:"none",premultiplyAlpha:"none"})).then(i=>(M.Cache.add(`image:${l}`,i),i)).finally(()=>z.delete(l)),z.set(l,f)),f.then(i=>{t?.(i),this.manager.itemEnd(l)}).catch(i=>{a?.(i),this.manager.itemError(l),this.manager.itemEnd(l)}),{}})}const B=1e3,j=100,_=25;class U{windowMs;idleResetMs;missedFrameThresholdMs;#e=[];#t=null;constructor(e={}){this.windowMs=e.windowMs??B,this.idleResetMs=e.idleResetMs??j,this.missedFrameThresholdMs=e.missedFrameThresholdMs??_}add(e,t=performance.now()){return!Number.isFinite(e)||e<=0||!Number.isFinite(t)?this.snapshot(t):(this.#t!==null&&t-this.#t>=this.idleResetMs&&(this.#e.length=0),this.#t=t,e<this.idleResetMs&&this.#e.push({at:t,duration:e}),this.snapshot(t))}snapshot(e=performance.now()){this.#r(e);const t=this.#e.map(({duration:f})=>f);if(t.length===0)return{samples:0,fps:0,average:0,p95:0,max:0,missedFramePercent:0};const r=[...t].sort((f,i)=>f-i),a=t.reduce((f,i)=>f+i,0)/t.length,l=Math.max(0,Math.ceil(r.length*.95)-1),u=t.filter(f=>f>this.missedFrameThresholdMs).length;return{samples:t.length,fps:1e3/a,average:a,p95:r[l],max:r[r.length-1],missedFramePercent:u/t.length*100}}reset(){this.#e.length=0,this.#t=null}#r(e){const t=e-this.windowMs;for(;this.#e.length>0&&this.#e[0].at<t;)this.#e.shift()}}function C(s,e){const{render:t}=s.renderer.info;return{drawCalls:t.drawCalls,frameCalls:t.frameCalls,triangles:t.triangles,points:t.points,lines:t.lines,frameTime:e.average,frameTiming:e}}function q(){const s=globalThis,e={viewer:null,canvas:null,domTarget:null,initialized:!1,disposed:!1,ready:!1,lastStatsAt:0},t=new Map,r=new Set,a=new WeakSet;let l=()=>{},u=()=>{};const f=new Promise((n,o)=>{l=n,u=o}),i=(n,o)=>{e.disposed&&n.type!=="disposed"||s.postMessage(n,o)},p=n=>{if(n&&typeof n=="object"){if(a.has(n))return;a.add(n)}i({type:"error",error:E.serializeError(n)})},d=(n,o)=>{if(t.has(n))throw new Error(`Worker viewer command already exists: ${n}`);return t.set(n,o),()=>{t.get(n)===o&&t.delete(n)}},h=async n=>{if(e.initialized||e.viewer)throw new Error("The Worker viewer has already initialized.");if(e.disposed)throw new Error("The Worker viewer has been disposed.");if(!s.navigator.gpu)throw new Error("WebGPU is not exposed in this Worker. Use a current Chromium browser or the main-thread Viewer.");$(),e.canvas=n.canvas,e.domTarget=O(n.canvas,n.size);const o=new D.Viewer({el:e.domTarget,pixelRatio:n.size.pixelRatio,rendererOptions:{canvas:n.canvas,forceWebGL:!1}});e.viewer=o;const m=new U;o.addEventListener("afterRender",({delta:w})=>{const g=performance.now(),R=m.add(w*1e3,g);g-e.lastStatsAt<250||(e.lastStatsAt=g,i({type:"stats",stats:C(o,R)}))}),d("getStats",()=>C(o,m.snapshot())),d("getViewpoint",()=>o.controls.getCameraViewpoint()),d("setViewpoint",async w=>{const g=w;return await o.controls.setCameraViewpoint(g.viewpoint,g.enableTransition??!0),o.controls.getCameraViewpoint()}),d("render",async()=>(await o.render(),C(o,m.snapshot())));const W={viewer:o,get canvas(){return n.canvas},status(w){i({type:"status",message:w})},emit(w,g){i({type:"event",eventType:w,detail:g})},registerCommand:d,onDispose(w){if(e.disposed)throw new Error("The Worker viewer has been disposed.");return r.add(w),()=>r.delete(w)},ready(w){if(e.disposed)throw new Error("The Worker viewer has been disposed.");if(e.ready)throw new Error("The Worker viewer is already ready.");i({type:"ready",detail:w}),e.ready=!0}};if(await o.init(),e.disposed)throw new Error("The Worker viewer was disposed during initialization.");e.initialized=!0,i({type:"initialized"}),l(W)},T=n=>{!e.viewer||!e.domTarget||(F(e.domTarget,n.size),e.viewer.renderer.setPixelRatio(n.size.pixelRatio),e.viewer.onWindowResize())},S=async n=>{try{if(!e.initialized)throw new Error("The Worker viewer has not initialized.");const o=t.get(n.command);if(!o)throw new Error(`Unknown Worker viewer command: ${n.command}`);const m=await o(n.payload),W=m instanceof ArrayBuffer?[m]:X(m);i({type:"response",id:n.id,result:m},W)}catch(o){i({type:"response",id:n.id,error:E.serializeError(o)})}},L=async()=>{if(e.disposed)return;e.disposed=!0;const n=[];for(const o of[...r].reverse())try{await o()}catch(m){n.push(m)}r.clear();try{e.viewer?.dispose()}catch(o){n.push(o)}e.viewer=null,e.canvas=null,e.domTarget=null,e.initialized||u(new Error("The Worker viewer was disposed before initialization."));for(const o of n)s.postMessage({type:"error",error:E.serializeError(o)});s.postMessage({type:"disposed"}),s.close()},k=n=>{p(n),e.ready||L()};return s.addEventListener("error",n=>{k(n.error??new Error(n.message)),n.preventDefault()}),s.addEventListener("unhandledrejection",n=>{k(n.reason),n.preventDefault()}),s.addEventListener("message",n=>{const o=n.data;o.type==="init"?h(o).catch(m=>{u(m),k(m)}):o.type==="resize"?T(o):o.type==="dom-event"?e.domTarget&&I(e.domTarget,o.event):o.type==="request"?S(o):o.type==="dispose"&&L()}),f}function X(s){const e=new Set,t=new WeakSet,r=a=>{if(!(!a||typeof a!="object")){if(a instanceof ArrayBuffer){e.add(a);return}if(ArrayBuffer.isView(a)){a.buffer instanceof ArrayBuffer&&e.add(a.buffer);return}if(!t.has(a)){if(t.add(a),a instanceof Map){a.forEach((l,u)=>{r(u),r(l)});return}if(a instanceof Set){a.forEach(r);return}Object.values(a).forEach(r)}}};return r(s),[...e]}exports.serializeError=E.serializeError;exports.createWorkerViewer=q;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const k=require("../protocol-IUAzx0lk.cjs"),F=require("../Viewer-BKNV67Jj.cjs"),E=require("three/webgpu"),S=require("../workerImageUtils-lmOMyTQN.cjs"),O=require("../getTransferables-C97JPUVf.cjs"),L=new WeakMap;class W{type;timeStamp=performance.now();target;currentTarget;cancelable=!0;bubbles=!0;defaultPrevented=!1;cancelBubble=!1;immediatePropagationStopped=!1;pointerId=0;pointerType="mouse";button=0;buttons=0;altKey=!1;ctrlKey=!1;metaKey=!1;shiftKey=!1;movementX=0;movementY=0;clientX=0;clientY=0;offsetX=0;offsetY=0;pageX=0;pageY=0;screenX=0;screenY=0;deltaX=0;deltaY=0;deltaZ=0;deltaMode=0;constructor(e,t){this.type=e.type,this.target=t,this.currentTarget=t;for(const[r,f]of Object.entries(e))r!=="type"&&f!==void 0&&Reflect.set(this,r,f)}preventDefault(){this.defaultPrevented=!0}stopPropagation(){this.cancelBubble=!0}stopImmediatePropagation(){this.cancelBubble=!0,this.immediatePropagationStopped=!0}composedPath(){return[this.target]}}class T{style={cssText:""};innerText="";textContent="";className="";parentElement=null;children=[];appendChild(e){return this.children.push(e),e instanceof T&&(e.parentElement=this),e}removeChild(e){const t=this.children.indexOf(e);return t>=0&&this.children.splice(t,1),e instanceof T&&(e.parentElement=null),e}remove(){this.parentElement?.removeChild(this)}setAttribute(){}addEventListener(){}removeEventListener(){}getContext(){return null}}function I(o){const e=t=>t.toLowerCase()==="canvas"?new OffscreenCanvas(1,1):new T;return{body:o,documentElement:o,pointerLockElement:null,visibilityState:"visible",createElement:e,createElementNS:(t,r)=>e(r),addEventListener:o.addEventListener.bind(o),removeEventListener:o.removeEventListener.bind(o),exitPointerLock(){}}}function p(o,e,t){Object.defineProperty(o,e,{configurable:!0,value:t})}function v(o,e,t){Object.defineProperty(o,e,{configurable:!0,get:t})}function A(o,e){const t={size:{...e},listeners:new Map,listenerWrappers:new WeakMap};L.set(o,t);const r=o,f={cssText:"",position:"relative",touchAction:"none",width:`${e.width}px`,height:`${e.height}px`},n=(a,d)=>{if(!d)return;let l;typeof d=="function"?l=d:(l=t.listenerWrappers.get(d)??(b=>d.handleEvent(b)),t.listenerWrappers.set(d,l));let u=t.listeners.get(a);u||(u=new Set,t.listeners.set(a,u)),u.add(l)},m=(a,d)=>{if(!d)return;const l=t.listeners.get(a);if(l)if(typeof d=="function")l.delete(d);else{const u=t.listenerWrappers.get(d);u&&l.delete(u)}};p(r,"style",f),p(r,"addEventListener",n),p(r,"removeEventListener",m),p(r,"appendChild",a=>a),p(r,"removeChild",a=>a),p(r,"setAttribute",()=>{}),p(r,"removeAttribute",()=>{}),p(r,"setPointerCapture",()=>{}),p(r,"releasePointerCapture",()=>{}),p(r,"hasPointerCapture",()=>!1),p(r,"requestPointerLock",()=>Promise.resolve()),p(r,"focus",()=>{}),p(r,"remove",()=>{}),v(r,"clientWidth",()=>t.size.width),v(r,"clientHeight",()=>t.size.height),v(r,"offsetWidth",()=>t.size.width),v(r,"offsetHeight",()=>t.size.height),v(r,"offsetTop",()=>t.size.top),v(r,"offsetLeft",()=>t.size.left),v(r,"clientTop",()=>t.size.top),v(r,"clientLeft",()=>t.size.left),v(r,"pageXOffset",()=>t.size.left),v(r,"pageYOffset",()=>t.size.top),v(r,"parentElement",()=>r),p(r,"getBoundingClientRect",()=>{const{width:a,height:d,top:l,left:u}=t.size;return{width:a,height:d,top:l,left:u,right:u+a,bottom:l+d,x:u,y:l,toJSON:()=>({width:a,height:d,top:l,left:u})}});const c=I(r);return p(r,"ownerDocument",c),p(r,"documentElement",r),p(r,"devicePixelRatio",e.pixelRatio),_(r,c),r}function $(o,e){const t=L.get(o);if(!t)throw new Error("The OffscreenCanvas has not been configured as a Worker DOM target.");t.size={...e},o.style.width=`${e.width}px`,o.style.height=`${e.height}px`,p(o,"devicePixelRatio",e.pixelRatio)}function V(o,e){const t=L.get(o);if(!t)throw new Error("The OffscreenCanvas has not been configured as a Worker DOM target.");const r=new W(e,o),f=[...t.listeners.get(e.type)??[]];for(const n of f)if(n(r),r.immediatePropagationStopped)break;return r}function _(o,e){const t=globalThis;t.window=o,t.document=e,t.getComputedStyle=()=>({position:"relative"}),t.PointerEvent=W,t.MouseEvent=W,t.WheelEvent=W,t.Image=T}const z=new Map;let R=!1;function q(){R||(R=!0,E.ImageLoader.prototype.load=function(e,t,r,f){let n=e;this.path!==void 0&&(n=this.path+n),n=this.manager.resolveURL(n);const m=E.Cache.get(`image:${n}`);if(this.manager.itemStart(n),m)return queueMicrotask(()=>{t?.(m),this.manager.itemEnd(n)}),m;let c=z.get(n);return c||(c=fetch(n).then(a=>{if(!a.ok)throw new Error(`Failed to load image ${n}: ${a.status} ${a.statusText}`);return a.blob()}).then(S.createWorkerImageBitmap).then(a=>(E.Cache.add(`image:${n}`,a),a)).finally(()=>z.delete(n)),z.set(n,c)),c.then(a=>{t?.(a),this.manager.itemEnd(n)}).catch(a=>{f?.(a),this.manager.itemError(n),this.manager.itemEnd(n)}),{}},E.ImageBitmapLoader.prototype.load=function(e,t,r,f){let n=e??"";this.path!==void 0&&(n=this.path+n),n=this.manager.resolveURL(n);const m=`image-bitmap:${n}`,c=E.Cache.get(m);if(this.manager.itemStart(n),c){Promise.resolve(c).then(h=>{t?.(h),this.manager.itemEnd(n)}).catch(h=>{f?.(h),this.manager.itemError(n),this.manager.itemEnd(n)});return}const d=this._abortController?.signal,l=this.manager.abortController.signal,u=d&&typeof AbortSignal.any=="function"?AbortSignal.any([d,l]):d??l,b=fetch(n,{credentials:this.crossOrigin==="anonymous"?"same-origin":"include",headers:this.requestHeader,signal:u}).then(h=>{if(!h.ok)throw new Error(`Failed to load image ${n}: ${h.status} ${h.statusText}`);return h.blob()}).then(h=>S.createWorkerImageBitmap(h,this.options)).then(h=>(E.Cache.add(m,h),h));E.Cache.add(m,b),b.then(h=>{t?.(h),this.manager.itemEnd(n)}).catch(h=>{E.Cache.remove(m),f?.(h),this.manager.itemError(n),this.manager.itemEnd(n)})})}const B=1e3,U=100,j=25;class X{windowMs;idleResetMs;missedFrameThresholdMs;#e=[];#t=null;constructor(e={}){this.windowMs=e.windowMs??B,this.idleResetMs=e.idleResetMs??U,this.missedFrameThresholdMs=e.missedFrameThresholdMs??j}add(e,t=performance.now()){return!Number.isFinite(e)||e<=0||!Number.isFinite(t)?this.snapshot(t):(this.#t!==null&&t-this.#t>=this.idleResetMs&&(this.#e.length=0),this.#t=t,e<this.idleResetMs&&this.#e.push({at:t,duration:e}),this.snapshot(t))}snapshot(e=performance.now()){this.#r(e);const t=this.#e.map(({duration:c})=>c);if(t.length===0)return{samples:0,fps:0,average:0,p95:0,max:0,missedFramePercent:0};const r=[...t].sort((c,a)=>c-a),f=t.reduce((c,a)=>c+a,0)/t.length,n=Math.max(0,Math.ceil(r.length*.95)-1),m=t.filter(c=>c>this.missedFrameThresholdMs).length;return{samples:t.length,fps:1e3/f,average:f,p95:r[n],max:r[r.length-1],missedFramePercent:m/t.length*100}}reset(){this.#e.length=0,this.#t=null}#r(e){const t=e-this.windowMs;for(;this.#e.length>0&&this.#e[0].at<t;)this.#e.shift()}}function x(o,e){const{render:t}=o.renderer.info;return{drawCalls:t.drawCalls,frameCalls:t.frameCalls,triangles:t.triangles,points:t.points,lines:t.lines,frameTime:e.average,frameTiming:e}}function Y(){const o=globalThis,e={viewer:null,canvas:null,domTarget:null,initialized:!1,disposed:!1,ready:!1,lastStatsAt:0},t=new Map,r=new Set,f=new WeakSet;let n=()=>{},m=()=>{};const c=new Promise((i,s)=>{n=i,m=s}),a=(i,s)=>{e.disposed&&i.type!=="disposed"||o.postMessage(i,s)},d=i=>{if(i&&typeof i=="object"){if(f.has(i))return;f.add(i)}a({type:"error",error:k.serializeError(i)})},l=(i,s)=>{if(t.has(i))throw new Error(`Worker viewer command already exists: ${i}`);return t.set(i,s),()=>{t.get(i)===s&&t.delete(i)}},u=async i=>{if(e.initialized||e.viewer)throw new Error("The Worker viewer has already initialized.");if(e.disposed)throw new Error("The Worker viewer has been disposed.");if(!o.navigator.gpu)throw new Error("WebGPU is not exposed in this Worker. Use a current Chromium browser or the main-thread Viewer.");q(),e.canvas=i.canvas,e.domTarget=A(i.canvas,i.size);const s=new F.Viewer({el:e.domTarget,pixelRatio:i.size.pixelRatio,rendererOptions:{canvas:i.canvas,forceWebGL:!1}});e.viewer=s;const g=new X;s.addEventListener("afterRender",({delta:w})=>{const y=performance.now(),D=g.add(w*1e3,y);y-e.lastStatsAt<250||(e.lastStatsAt=y,a({type:"stats",stats:x(s,D)}))}),l("getStats",()=>x(s,g.snapshot())),l("getViewpoint",()=>s.controls.getCameraViewpoint()),l("setViewpoint",async w=>{const y=w;return await s.controls.setCameraViewpoint(y.viewpoint,y.enableTransition??!0),s.controls.getCameraViewpoint()}),l("render",async()=>(await s.render(),x(s,g.snapshot())));const M={viewer:s,get canvas(){return i.canvas},status(w){a({type:"status",message:w})},emit(w,y){a({type:"event",eventType:w,detail:y})},registerCommand:l,onDispose(w){if(e.disposed)throw new Error("The Worker viewer has been disposed.");return r.add(w),()=>r.delete(w)},ready(w){if(e.disposed)throw new Error("The Worker viewer has been disposed.");if(e.ready)throw new Error("The Worker viewer is already ready.");a({type:"ready",detail:w}),e.ready=!0}};if(await s.init(),e.disposed)throw new Error("The Worker viewer was disposed during initialization.");e.initialized=!0,a({type:"initialized"}),n(M)},b=i=>{!e.viewer||!e.domTarget||($(e.domTarget,i.size),e.viewer.renderer.setPixelRatio(i.size.pixelRatio),e.viewer.onWindowResize())},h=async i=>{try{if(!e.initialized)throw new Error("The Worker viewer has not initialized.");const s=t.get(i.command);if(!s)throw new Error(`Unknown Worker viewer command: ${i.command}`);const g=await s(i.payload),M=g instanceof ArrayBuffer?[g]:O.getTransferables(g);a({type:"response",id:i.id,result:g},M)}catch(s){a({type:"response",id:i.id,error:k.serializeError(s)})}},P=async()=>{if(e.disposed)return;e.disposed=!0;const i=[];for(const s of[...r].reverse())try{await s()}catch(g){i.push(g)}r.clear();try{e.viewer?.dispose()}catch(s){i.push(s)}e.viewer=null,e.canvas=null,e.domTarget=null,e.initialized||m(new Error("The Worker viewer was disposed before initialization."));for(const s of i)o.postMessage({type:"error",error:k.serializeError(s)});o.postMessage({type:"disposed"}),o.close()},C=i=>{d(i),e.ready||P()};return o.addEventListener("error",i=>{C(i.error??new Error(i.message)),i.preventDefault()}),o.addEventListener("unhandledrejection",i=>{C(i.reason),i.preventDefault()}),o.addEventListener("message",i=>{const s=i.data;s.type==="init"?u(s).catch(g=>{m(g),C(g)}):s.type==="resize"?b(s):s.type==="dom-event"?e.domTarget&&V(e.domTarget,s.event):s.type==="request"?h(s):s.type==="dispose"&&P()}),c}exports.serializeError=k.serializeError;exports.createWorkerViewer=Y;
|