@vctrl/hooks 0.25.0 → 1.0.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.
Files changed (46) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/README.md +110 -67
  3. package/index.cjs +1 -0
  4. package/index.d.ts +2 -1
  5. package/index.es.js +4 -4
  6. package/package.json +18 -10
  7. package/{chunk-CMqjfN_6.cjs → rolldown-runtime-BocRIvOZ.cjs} +1 -1
  8. package/use-export-model/use-export-model.d.ts +1 -1
  9. package/use-export-model-CORoAKbf.cjs +1 -0
  10. package/{use-export-model-efFsSWe-.js → use-export-model-DXesLypI.js} +1 -1
  11. package/use-export-model.cjs +1 -0
  12. package/use-export-model.es.js +1 -1
  13. package/use-load-model/error-helpers.d.ts +5 -0
  14. package/use-load-model/file-loaders.d.ts +11 -12
  15. package/use-load-model/index.d.ts +1 -1
  16. package/use-load-model/load-context.d.ts +17 -0
  17. package/use-load-model/optimizer-ingest.d.ts +8 -0
  18. package/use-load-model/optimizer-integration.d.ts +3 -4
  19. package/use-load-model/scene-loaders.d.ts +15 -0
  20. package/use-load-model/state.d.ts +14 -14
  21. package/use-load-model/types.d.ts +154 -131
  22. package/use-load-model/use-load-model.d.ts +12 -8
  23. package/use-load-model/utils/index.d.ts +1 -1
  24. package/use-load-model/utils/reconstruct-files.d.ts +27 -5
  25. package/use-load-model/utils/resolve-scene-payload.d.ts +9 -0
  26. package/use-load-model-CRDVzrPC.js +635 -0
  27. package/use-load-model-CZCi6bPM.cjs +1 -0
  28. package/use-load-model.cjs +1 -0
  29. package/use-load-model.es.js +1 -1
  30. package/use-optimize-model/index.d.ts +1 -0
  31. package/use-optimize-model/types.d.ts +3 -1
  32. package/use-optimize-model/use-optimize-model.d.ts +11 -6
  33. package/use-optimize-model-Fwew6qD8.cjs +1 -0
  34. package/{use-optimize-model-D16-4Zwm.js → use-optimize-model-sNXkORNg.js} +94 -76
  35. package/use-optimize-model.cjs +1 -0
  36. package/use-optimize-model.es.js +2 -2
  37. package/utils/server-communication.d.ts +0 -5
  38. package/index.cjs.js +0 -1
  39. package/use-export-model-yQWV3O3H.cjs +0 -1
  40. package/use-export-model.cjs.js +0 -1
  41. package/use-load-model/event-system.d.ts +0 -7
  42. package/use-load-model-B8oqou4I.cjs +0 -1
  43. package/use-load-model-C88r8-HE.js +0 -585
  44. package/use-load-model.cjs.js +0 -1
  45. package/use-optimize-model-CD5zqTLK.cjs +0 -1
  46. package/use-optimize-model.cjs.js +0 -1
@@ -1,585 +0,0 @@
1
- import { PERSISTED_BAKE_FILENAME as e, buildAssetLookupKeys as t, getSerializedAssetByteSize as n, isValidBase64 as r, normalizeAssetUri as i, normalizeCameraSettings as a, normalizeSceneInteractions as o, toSerializedAssetBytes as s } from "@vctrl/core";
2
- import { ModelFileTypes as c, ModelLoader as l } from "@vctrl/core/model-loader";
3
- import { useCallback as u, useMemo as d, useReducer as f, useRef as p } from "react";
4
- //#region packages/hooks/src/use-load-model/error-helpers.ts
5
- var m = ({ code: e, message: t, recoverable: n, source: r, cause: i, context: a }) => ({
6
- code: e,
7
- message: t,
8
- recoverable: n,
9
- source: r,
10
- cause: i,
11
- context: a
12
- }), h = (e) => e instanceof Error && e.message ? e.message : typeof e == "string" && e.trim().length > 0 ? e : "Unknown error", g = (e, t, n) => {
13
- let r = h(e);
14
- return m({
15
- code: r.includes("missing required referenced assets") ? "missing_assets" : t,
16
- message: r,
17
- recoverable: !0,
18
- source: "local-upload",
19
- cause: e,
20
- context: n
21
- });
22
- }, _ = (e, t) => {
23
- let n = h(e), r = "server_load_failed";
24
- return n.includes("Server responded with 404") ? r = "not_found" : (n.includes("Server responded with 402") || n.includes("Server responded with 403")) && (r = "quota_exceeded"), m({
25
- code: r,
26
- message: n,
27
- recoverable: r !== "not_found",
28
- source: "server-load",
29
- cause: e,
30
- context: { sceneId: t }
31
- });
32
- }, v = {}, y = {
33
- emit(e, t) {
34
- let n = v[e];
35
- console.debug(`Event emitted: ${e}`, t), n && n.forEach((e) => e(t));
36
- },
37
- on(e, t) {
38
- v[e] || (v[e] = []), v[e].push(t);
39
- },
40
- off(e, t) {
41
- let n = v[e];
42
- n && (v[e] = n.filter((e) => e !== t));
43
- }
44
- }, b = (e) => {
45
- try {
46
- return i(e);
47
- } catch {
48
- return e;
49
- }
50
- }, x = (e) => {
51
- let t = /* @__PURE__ */ new Set(), n = e, r = Array.isArray(n.images) ? n.images : [];
52
- for (let e of r) typeof e.uri == "string" && !e.uri.startsWith("data:") && t.add(e.uri);
53
- let i = Array.isArray(n.buffers) ? n.buffers : [];
54
- for (let e of i) typeof e.uri == "string" && !e.uri.startsWith("data:") && t.add(e.uri);
55
- return t;
56
- }, S = async (e, n) => {
57
- let r = JSON.parse(await e.text()), i = x(r), a = {}, o = /* @__PURE__ */ new Map(), s = /* @__PURE__ */ new Map(), c = /* @__PURE__ */ new Set(), l = async (e) => {
58
- let t = s.get(e);
59
- if (t) return t;
60
- let n = new Uint8Array(await e.arrayBuffer());
61
- return s.set(e, n), n;
62
- };
63
- for (let e of n) {
64
- for (let n of t(e.name)) o.set(n, e);
65
- if (e.webkitRelativePath) for (let n of t(e.webkitRelativePath)) o.set(n, e);
66
- }
67
- let u = [];
68
- for (let e of i) {
69
- let t = b(e), n = t.split("/").pop() || t, r = o.get(e) || o.get(t) || o.get(n);
70
- if (!r) {
71
- u.push(e);
72
- continue;
73
- }
74
- c.add(r);
75
- let i = await l(r);
76
- a[t] = {
77
- data: Array.from(i),
78
- fileName: t,
79
- mimeType: r.type || "application/octet-stream"
80
- };
81
- }
82
- if (u.length > 0) throw Error(`Scene payload is missing required referenced assets: ${u.slice(0, 5).join(", ")}`);
83
- for (let [e, t] of n.entries()) {
84
- if (c.has(t)) continue;
85
- let n = b(t.name), r = n.split("/").pop() || n, i = await l(t);
86
- a[`extra-${e}-${r}`] = {
87
- data: Array.from(i),
88
- fileName: r,
89
- mimeType: t.type || "application/octet-stream"
90
- };
91
- }
92
- return {
93
- gltfJson: r,
94
- assetData: a
95
- };
96
- }, C = async (e, t, n, r, i) => {
97
- try {
98
- let a = {
99
- model: (await n.loadToThreeJS(e)).scene,
100
- type: t,
101
- name: e.name
102
- };
103
- if (i({
104
- type: "set-file",
105
- payload: a
106
- }), i({
107
- type: "set-file-loading",
108
- payload: !1
109
- }), r && t !== c.usdz) {
110
- let t = new Uint8Array(await e.arrayBuffer());
111
- await r.loadFromGlbBuffer(t);
112
- }
113
- return a;
114
- } catch (n) {
115
- return console.error("Error loading binary model:", n), i({
116
- type: "set-file-loading",
117
- payload: !1
118
- }), y.emit("load-error", g(n, "binary_load_failed", {
119
- fileName: e.name,
120
- fileType: t,
121
- fileSize: e.size
122
- })), null;
123
- }
124
- }, w = async (e, t, n, r, i, a) => {
125
- try {
126
- let { sourcePackageBytes: o, textureBytes: s } = await a(e, t), l = await n.loadGLTFWithAssetsToThreeJS(e, t), u = {
127
- model: l.scene,
128
- type: c.gltf,
129
- name: e.name,
130
- sourcePackageBytes: o,
131
- sourceTextureBytes: s
132
- };
133
- if (i({
134
- type: "set-file",
135
- payload: u
136
- }), i({
137
- type: "set-file-loading",
138
- payload: !1
139
- }), r) try {
140
- let n = await S(e, t);
141
- await r.loadFromServerSceneData(n);
142
- } catch (n) {
143
- console.warn("Failed to initialize optimizer from source GLTF payload; trying direct asset load.", n);
144
- try {
145
- if ("loadFromGLTFWithAssets" in r) {
146
- let n = new Uint8Array(await e.arrayBuffer()), i = /* @__PURE__ */ new Map();
147
- for (let e of t) {
148
- let t = new Uint8Array(await e.arrayBuffer());
149
- i.set(e.name, t), e.webkitRelativePath && i.set(e.webkitRelativePath, t);
150
- }
151
- await r.loadFromGLTFWithAssets(n, i);
152
- } else throw Error("loadFromGLTFWithAssets not available");
153
- } catch (e) {
154
- console.warn("Direct asset load also failed; falling back to Three.js scene import. Texture names may be generic.", e), await r.load(l.scene);
155
- }
156
- }
157
- return u;
158
- } catch (n) {
159
- return console.error("Error loading GLTF model:", n), console.error("GLTF file:", e.name), console.error("Asset files:", t.map((e) => e.name)), i({
160
- type: "set-file-loading",
161
- payload: !1
162
- }), y.emit("load-error", g(n, "gltf_load_failed", {
163
- fileName: e.name,
164
- fileSize: e.size,
165
- assetCount: t.length
166
- })), null;
167
- }
168
- };
169
- //#endregion
170
- //#region packages/hooks/src/use-load-model/optimizer-integration.ts
171
- function T(e, t, n, r) {
172
- let i = u(async (i, a) => {
173
- if (!e) {
174
- console.warn("Optimizer is not available");
175
- return;
176
- }
177
- try {
178
- i && await i(a);
179
- let o = await e.getModel();
180
- if (!o) {
181
- console.warn("No optimized model available after optimization");
182
- return;
183
- }
184
- let s = o instanceof Uint8Array ? o.slice() : new Uint8Array(o).slice(), l = new File([s], n?.name || "optimized_model.glb", { type: "model/gltf-binary" });
185
- t({
186
- type: "set-file",
187
- payload: {
188
- model: (await r.loadToThreeJS(l)).scene,
189
- type: c.glb,
190
- name: l.name
191
- }
192
- });
193
- } catch (e) {
194
- console.error("Optimization failed:", e);
195
- }
196
- }, [
197
- e,
198
- r,
199
- n,
200
- t
201
- ]);
202
- if (!e) return null;
203
- let a = e.isReady, o = !!n?.model && !a;
204
- return {
205
- ...e,
206
- isReady: a,
207
- isPreparing: o,
208
- applyOptimization: i,
209
- reset: e?.reset,
210
- error: e?.error,
211
- loading: e?.loading
212
- };
213
- }
214
- //#endregion
215
- //#region packages/hooks/src/use-load-model/state.ts
216
- var E = {
217
- file: null,
218
- isFileLoading: !1,
219
- progress: 0,
220
- supportedFileTypes: [
221
- c.gltf,
222
- c.glb,
223
- c.usdz
224
- ]
225
- };
226
- function D(e, t) {
227
- switch (t.type) {
228
- case "set-file": return {
229
- ...e,
230
- file: t.payload
231
- };
232
- case "set-file-loading": return {
233
- ...e,
234
- isFileLoading: t.payload
235
- };
236
- case "set-progress": return {
237
- ...e,
238
- progress: t.payload
239
- };
240
- case "reset-state": return { ...E };
241
- default: return e;
242
- }
243
- }
244
- //#endregion
245
- //#region packages/hooks/src/use-load-model/utils/read-directory.ts
246
- async function O(e) {
247
- let t = [];
248
- async function* n(e) {
249
- let t = e;
250
- for await (let [, e] of t) e.kind === "file" ? yield await e.getFile() : e.kind === "directory" && (yield* n(e));
251
- }
252
- for await (let r of n(e)) t.push(r);
253
- return t;
254
- }
255
- //#endregion
256
- //#region packages/hooks/src/use-load-model/utils/reconstruct-files.ts
257
- function k(t) {
258
- let n = [];
259
- if (t.assetData && typeof t.assetData == "object") for (let [, r] of Object.entries(t.assetData)) {
260
- let { fileName: t, mimeType: i } = r;
261
- if (t === e) continue;
262
- let a = s(r), o = new Uint8Array(a.byteLength);
263
- o.set(a);
264
- let c = new Blob([o], { type: i }), l = new File([c], t, { type: i });
265
- n.push(l);
266
- }
267
- let r = JSON.stringify(t.gltfJson), i = new Blob([r], { type: "model/gltf+json" }), a = t.meta?.name, o = a ? `${a}.gltf` : "scene.gltf";
268
- return [new File([i], o, { type: "model/gltf+json" }), ...n];
269
- }
270
- //#endregion
271
- //#region packages/hooks/src/use-load-model/utils/calculate-referenced-bytes.ts
272
- var A = (e, n) => {
273
- let r = i(e), a = r.split("/").pop() || r;
274
- for (let e of n) {
275
- let n = t(e.fileName);
276
- if (n.has(r) || n.has(a)) return e.size;
277
- }
278
- return 0;
279
- }, j = (e) => {
280
- let t = /* @__PURE__ */ new Set(), n = /* @__PURE__ */ new Set(), r = e, i = Array.isArray(r.images) ? r.images : [];
281
- for (let e of i) typeof e.uri == "string" && !e.uri.startsWith("data:") && n.add(e.uri);
282
- let a = Array.isArray(r.buffers) ? r.buffers : [];
283
- for (let e of a) typeof e.uri == "string" && !e.uri.startsWith("data:") && t.add(e.uri);
284
- return {
285
- bufferUris: t,
286
- imageUris: n
287
- };
288
- };
289
- async function M(e, t) {
290
- let n = await e.text(), r;
291
- try {
292
- r = JSON.parse(n);
293
- } catch {
294
- return {
295
- sourcePackageBytes: e.size,
296
- textureBytes: 0
297
- };
298
- }
299
- let i = t.map((e) => ({
300
- fileName: e.name,
301
- size: e.size
302
- })), { bufferUris: a, imageUris: o } = j(r), s = Array.from(a).reduce((e, t) => e + A(t, i), 0), c = Array.from(o).reduce((e, t) => e + A(t, i), 0);
303
- return {
304
- sourcePackageBytes: e.size + s + c,
305
- textureBytes: c
306
- };
307
- }
308
- function N(e) {
309
- let t = e.gltfJson, r = Object.values(e.assetData || {}).map((e) => ({
310
- fileName: e.fileName,
311
- size: n(e.data)
312
- })), i = new TextEncoder().encode(JSON.stringify(t)).byteLength, { bufferUris: a, imageUris: o } = j(t), s = Array.from(a).reduce((e, t) => e + A(t, r), 0), c = Array.from(o).reduce((e, t) => e + A(t, r), 0);
313
- return {
314
- sourcePackageBytes: i + s + c,
315
- textureBytes: c
316
- };
317
- }
318
- //#endregion
319
- //#region packages/hooks/src/use-load-model/utils/resolve-scene-payload.ts
320
- function P(e) {
321
- return typeof e == "object" && !!e && !Array.isArray(e);
322
- }
323
- function F(e) {
324
- let t = P(e.settings) ? e.settings : {}, n = a(e.camera ?? t.camera);
325
- return {
326
- ...t,
327
- bounds: e.bounds ?? t.bounds,
328
- camera: n,
329
- interactions: o(t.interactions, { camera: n }),
330
- controls: e.controls ?? t.controls,
331
- environment: e.environment ?? t.environment,
332
- shadows: e.shadows ?? t.shadows
333
- };
334
- }
335
- function I(e) {
336
- let t = /* @__PURE__ */ new Set(), n = e, r = Array.isArray(n.images) ? n.images : [];
337
- for (let e of r) typeof e.uri == "string" && !e.uri.startsWith("data:") && t.add(e.uri);
338
- let i = Array.isArray(n.buffers) ? n.buffers : [];
339
- for (let e of i) typeof e.uri == "string" && !e.uri.startsWith("data:") && t.add(e.uri);
340
- return t;
341
- }
342
- function L(e) {
343
- for (let [t, n] of Object.entries(e)) {
344
- if (!n || typeof n != "object") throw Error(`Scene payload contains invalid asset entry for ${t}`);
345
- if (typeof n.fileName != "string" || n.fileName.trim().length === 0) throw Error(`Scene payload asset ${t} is missing a valid fileName`);
346
- if (typeof n.mimeType != "string" || n.mimeType.trim().length === 0) throw Error(`Scene payload asset ${t} is missing a valid mimeType`);
347
- if (typeof n.data == "string" && n.encoding === "base64" && !r(n.data)) throw Error(`Scene payload asset ${n.fileName} has invalid base64 data`);
348
- }
349
- }
350
- function R(e, n) {
351
- let r = I(e);
352
- if (r.size === 0) return;
353
- let a = /* @__PURE__ */ new Set();
354
- for (let e of Object.values(n)) for (let n of t(e.fileName)) a.add(n);
355
- let o = [];
356
- for (let e of r) {
357
- let t = i(e), n = t.split("/").pop() || t;
358
- !a.has(e) && !a.has(t) && !a.has(n) && o.push(e);
359
- }
360
- if (o.length > 0) throw Error(`Scene payload is missing required referenced assets: ${o.slice(0, 5).join(", ")}`);
361
- }
362
- function z(e) {
363
- if (!P(e.gltfJson)) throw Error("Scene payload is missing a valid glTF document");
364
- let t = e.assetData ?? {};
365
- return L(t), R(e.gltfJson, t), {
366
- meta: e.meta,
367
- gltfJson: e.gltfJson,
368
- assetData: t,
369
- ...F(e)
370
- };
371
- }
372
- //#endregion
373
- //#region packages/hooks/src/use-load-model/utils/fetch-manifest-assets.ts
374
- async function B(e, t = {}) {
375
- let n = Object.entries(e);
376
- if (n.length === 0) return t.onProgress?.(1), {};
377
- let r = n.every(([, e]) => e.byteSize != null), i = r ? n.reduce((e, [, t]) => e + (t.byteSize ?? 0), 0) : 0, a = 0, o = 0, s = {}, c = new AbortController();
378
- return await Promise.all(n.map(async ([e, l]) => {
379
- try {
380
- let u = await fetch(l.url, {
381
- headers: t.headers,
382
- credentials: "same-origin",
383
- signal: c.signal
384
- });
385
- if (!u.ok) throw c.abort(), Error(`Failed to fetch scene asset ${l.fileName}: ${u.status}`);
386
- s[e] = {
387
- data: new Uint8Array(await u.arrayBuffer()),
388
- fileName: l.fileName,
389
- mimeType: l.mimeType
390
- }, o += 1, a += l.byteSize ?? 0, t.onProgress?.(r && i > 0 ? a / i : o / n.length);
391
- } catch (e) {
392
- throw c.abort(), e;
393
- }
394
- })), s;
395
- }
396
- //#endregion
397
- //#region packages/hooks/src/use-load-model/use-load-model.ts
398
- async function V(e, t) {
399
- try {
400
- let n = await fetch(e, {
401
- method: "GET",
402
- headers: {
403
- Accept: "application/json",
404
- ...t
405
- }
406
- });
407
- if (!n.ok) return null;
408
- let r = await n.json(), i = r.data ?? r;
409
- return !i || typeof i != "object" || !i.gltfJson || !i.assetRefs && !i.assetData ? null : i;
410
- } catch {
411
- return null;
412
- }
413
- }
414
- async function H(e, t, n) {
415
- let r = new FormData();
416
- r.append("action", "get-scene-settings"), r.append("sceneId", n);
417
- let i = await fetch(e, {
418
- method: "POST",
419
- headers: t,
420
- body: r
421
- });
422
- if (!i.ok) throw Error(`Server responded with ${i.status} ${i.statusText}`);
423
- let a = await i.json();
424
- return a.data ?? a;
425
- }
426
- function U(t) {
427
- let n = p(!1), r = p(null), [i, a] = f(D, E), o = d(() => {
428
- let e = new l();
429
- return e.onProgress((e) => {
430
- a({
431
- type: "set-progress",
432
- payload: e.progress
433
- }), e.progress !== 100 && y.emit("load-progress", e.progress);
434
- }), e;
435
- }, []), m = u((e) => {
436
- a({
437
- type: "set-progress",
438
- payload: e
439
- }), y.emit("load-progress", e);
440
- }, []), h = u(() => {
441
- a({ type: "reset-state" }), y.emit("load-reset");
442
- }, []), g = u((e, t) => e.find((e) => e.name.endsWith("." + t)), []), v = u(async (e) => {
443
- if (e.length === 0) return;
444
- let i = g(e, c.gltf), s = g(e, c.glb), l = g(e, c.usdz), u = [
445
- i,
446
- s,
447
- l
448
- ].filter(Boolean);
449
- if (u.length > 1) {
450
- y.emit("multiple-models", u);
451
- return;
452
- }
453
- let d = e.filter((e) => e !== i && e !== s && e !== l), f = () => {
454
- n.current = !0, r.current && (y.emit("load-complete", r.current), n.current = !1);
455
- };
456
- if (i) {
457
- let e = await w(i, d, o, t, a, M);
458
- e && (r.current = e), f();
459
- } else if (s) {
460
- let e = await C(s, c.glb, o, t, a);
461
- e && (r.current = e), f();
462
- } else if (l) {
463
- let e = await C(l, c.usdz, o, t, a);
464
- e && (r.current = e), f();
465
- } else y.emit("not-loaded-files", e), a({
466
- type: "set-file-loading",
467
- payload: !1
468
- });
469
- }, [
470
- g,
471
- o,
472
- t
473
- ]), b = u(async (e) => {
474
- let t = [];
475
- y.emit("load-start"), a({ type: "reset-state" }), a({
476
- type: "set-file-loading",
477
- payload: !0
478
- }), m(0), n.current = !1;
479
- for (let n of e) if (n instanceof File) t.push(n);
480
- else if ("kind" in n && n.kind === "directory") {
481
- let e = await O(n);
482
- t.push(...e);
483
- }
484
- await v(t);
485
- }, [v, m]), x = u(async (n) => {
486
- let { sceneData: i, sceneId: l } = n;
487
- if (m(40), n.parseMode === "direct" && i.gltfJson) {
488
- let t = /* @__PURE__ */ new Map();
489
- for (let n of Object.values(i.assetData ?? {})) n.fileName !== e && t.set(n.fileName, s(n));
490
- let { sourcePackageBytes: n, textureBytes: u } = N(i);
491
- m(60);
492
- let d = {
493
- model: (await o.parseGLTFJsonToThreeJS(i.gltfJson, t)).scene,
494
- type: c.gltf,
495
- name: i.meta?.name || "scene",
496
- sourcePackageBytes: n,
497
- sourceTextureBytes: u
498
- };
499
- return a({
500
- type: "set-file",
501
- payload: d
502
- }), a({
503
- type: "set-file-loading",
504
- payload: !1
505
- }), r.current = d, m(100), {
506
- file: d,
507
- sceneId: l,
508
- ...i
509
- };
510
- }
511
- let u = k(i), { sourcePackageBytes: d, textureBytes: f } = N(i);
512
- m(60);
513
- let p = u[0], h = u.slice(1), g = {
514
- model: (await o.loadGLTFWithAssetsToThreeJS(p, h)).scene,
515
- type: c.gltf,
516
- name: p.name,
517
- sourcePackageBytes: d,
518
- sourceTextureBytes: f
519
- };
520
- return a({
521
- type: "set-file",
522
- payload: g
523
- }), a({
524
- type: "set-file-loading",
525
- payload: !1
526
- }), r.current = g, t && await t.loadFromServerSceneData(i), m(100), {
527
- file: g,
528
- sceneId: l,
529
- ...i
530
- };
531
- }, [
532
- o,
533
- t,
534
- m
535
- ]), S = u(async (e) => {
536
- let { sceneId: t, serverOptions: n, parseMode: r } = e;
537
- try {
538
- y.emit("server-load-start", t), a({ type: "reset-state" }), a({
539
- type: "set-file-loading",
540
- payload: !0
541
- }), m(0);
542
- let e = n?.endpoint ?? `/api/scenes/${t}`, i = n?.apiKey ? {
543
- Authorization: `Bearer ${n.apiKey}`,
544
- ...n.headers
545
- } : { ...n?.headers }, o = await V(e, i);
546
- if (o?.assetRefs && !o.assetData) {
547
- m(10);
548
- let e = await B(o.assetRefs, {
549
- headers: i,
550
- onProgress: (e) => m(10 + Math.round(e * 30))
551
- });
552
- o = {
553
- ...o,
554
- assetData: e
555
- };
556
- }
557
- o ||= await H(e, i, t);
558
- let s = await x({
559
- sceneId: t,
560
- sceneData: z(o),
561
- parseMode: r
562
- });
563
- return y.emit("server-load-complete", s), s;
564
- } catch (e) {
565
- console.error("Server scene loading failed:", e), a({
566
- type: "set-file-loading",
567
- payload: !1
568
- });
569
- let n = _(e, t);
570
- throw y.emit("server-load-error", n), n;
571
- }
572
- }, [x, m]), A = T(t, a, i.file, o);
573
- return {
574
- ...i,
575
- on: y.on,
576
- off: y.off,
577
- load: b,
578
- loadFromData: x,
579
- loadFromServer: S,
580
- reset: h,
581
- optimizer: A
582
- };
583
- }
584
- //#endregion
585
- export { B as n, k as r, U as t };
@@ -1 +0,0 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./chunk-CMqjfN_6.cjs"),t=require("./use-load-model-B8oqou4I.cjs");let n=require("react");n=e.t(n,1);let r=require("react/jsx-runtime");var i=(0,n.createContext)(void 0),a=(0,n.createContext)(void 0),o=({children:e,optimizer:n})=>{let o=t.t(n);return n?(0,r.jsx)(i.Provider,{value:o,children:e}):(0,r.jsx)(a.Provider,{value:o,children:e})};function s(e){let t=(0,n.useContext)(i),r=(0,n.useContext)(a),o=t??r;if(!o)throw Error(`useModelContext must be used within a ModelProvider`);return o}exports.ModelProvider=o,exports.fetchManifestAssetData=t.n,exports.reconstructGltfFiles=t.r,exports.useLoadModel=t.t,exports.useModelContext=s;
@@ -1 +0,0 @@
1
- let e=require("@vctrl/core"),t=require("react"),n=require("@vctrl/core/model-optimizer");var r={info:null,error:null,loading:!1,report:null},i=(e,t)=>{switch(t.type){case`LOAD_START`:return{...e,loading:!0,error:null};case`LOAD_SUCCESS`:return{...e,loading:!1,report:t.payload.report};case`LOAD_ERROR`:return{...e,loading:!1,error:t.payload};case`RESET`:return{...r};default:return e}};function a(e){return e?{verticesCount:e.stats.vertices.after??0,primitivesCount:e.stats.triangles.after??0,meshesCount:e.stats.meshes.after??0,textureAssetCount:e.stats.texturesCount.after??0,materialsCount:e.stats.materials.after??0,sceneBytes:e.optimizedSize??0}:{verticesCount:0,primitivesCount:0,meshesCount:0,textureAssetCount:0,materialsCount:0,sceneBytes:0}}var o=e=>{let[n,r]=(0,t.useState)(null),i=e.report;return(0,t.useEffect)(()=>{!n&&i&&r(i)},[n,i]),{info:(0,t.useMemo)(()=>{let e=a(n),t=a(i);return{initial:{verticesCount:e.verticesCount,primitivesCount:e.primitivesCount,meshesCount:e.meshesCount,texturesCount:e.textureAssetCount,sceneBytes:e.sceneBytes},optimized:{verticesCount:t.verticesCount,primitivesCount:t.primitivesCount,meshesCount:t.meshesCount,texturesCount:t.textureAssetCount,sceneBytes:t.sceneBytes},improvement:{verticesCount:e.verticesCount-t.verticesCount,primitivesCount:e.primitivesCount-t.primitivesCount,meshesCount:e.meshesCount-t.meshesCount,texturesCount:e.textureAssetCount-t.textureAssetCount,sceneBytes:e.sceneBytes-t.sceneBytes}}},[i,n]),reset:(0,t.useCallback)(()=>{r(null)},[])}};async function s(e,t){let n=new Blob([e]),r=await createImageBitmap(n),{width:i,height:a}=r;if(t.maxWidth||t.maxHeight){let e=t.maxWidth?t.maxWidth/i:1/0,n=t.maxHeight?t.maxHeight/a:1/0,r=Math.min(e,n,1);r<1&&(i=Math.round(i*r),a=Math.round(a*r))}let o=new OffscreenCanvas(i,a),s=o.getContext(`2d`);if(!s)throw r.close(),Error(`OffscreenCanvas 2D context unavailable`);s.drawImage(r,0,0,i,a),r.close();let c=t.format===`webp`?`image/webp`:t.format===`jpeg`?`image/jpeg`:`image/png`,l=await o.convertToBlob({type:c,quality:t.quality/100});return new Uint8Array(await l.arrayBuffer())}function c(){return function(e){let t=e instanceof Uint8Array?e:new Uint8Array(e),n=`webp`,r=80,i,a,o={resize(e,t,n){return i=e,a=t,o},webp(e){return n=`webp`,typeof e?.quality==`number`&&(r=e.quality),o},jpeg(e){return n=`jpeg`,typeof e?.quality==`number`&&(r=e.quality),o},png(e){return n=`png`,o},toFormat(e,t){return(e===`webp`||e===`jpeg`||e===`png`)&&(n=e),typeof t?.quality==`number`&&(r=t.quality),o},async toBuffer(){return s(t,{format:n,quality:r,maxWidth:i,maxHeight:a})},async metadata(){let e=new Blob([t]),n=await createImageBitmap(e),r={width:n.width,height:n.height,format:`unknown`};return n.close(),r}};return o}}var l=async(e,t)=>{e.hasModel()&&await e.compressTextures({...t,encoder:c()})},u=()=>{let[a,s]=(0,t.useReducer)(i,r),{report:c,error:u,loading:d}=a,{info:f,reset:p}=o(a),m=(0,t.useRef)(new n.ModelOptimizer);(0,t.useEffect)(()=>{let e=m.current;return()=>{e.reset()}},[]);let h=(0,t.useCallback)(async e=>{s({type:`LOAD_START`});try{let t=m.current;await t.loadFromThreeJS(e),s({type:`LOAD_SUCCESS`,payload:{report:await t.getReport()}})}catch(e){s({type:`LOAD_ERROR`,payload:e}),console.error(`Error loading model:`,e)}},[]),g=(0,t.useCallback)(async t=>{s({type:`LOAD_START`});try{let n=m.current,r=new Map;for(let n of Object.values(t.assetData??{}))for(let t of(0,e.buildAssetLookupKeys)(n.fileName))r.set(t,n);let i={},a=t.gltfJson,o=[...(a.images??[]).map(e=>e.uri).filter(e=>!!e&&!e.startsWith(`data:`)),...(a.buffers??[]).map(e=>e.uri).filter(e=>!!e&&!e.startsWith(`data:`))];for(let t of o){let n=(0,e.normalizeAssetUri)(t),a=n.split(`/`).pop()||n,o=r.get(t)??r.get(n)??r.get(a);o&&(i[t]=(0,e.toSerializedAssetBytes)(o))}let c={json:t.gltfJson,resources:i};await n.loadFromJSON(c),s({type:`LOAD_SUCCESS`,payload:{report:await n.getReport()}})}catch(e){throw s({type:`LOAD_ERROR`,payload:e}),console.error(`Error loading server scene into optimizer:`,e),e}},[]),_=(0,t.useCallback)(async(e,t)=>{s({type:`LOAD_START`});try{await m.current.loadFromBuffer(e),m.current.setAppliedOptimizations(t?.appliedOptimizations??[]),m.current.setDracoReport(t?.dracoReport??null),s({type:`LOAD_SUCCESS`,payload:{report:await m.current.getReport()}})}catch(e){throw s({type:`LOAD_ERROR`,payload:e}),console.error(`Error loading GLB buffer into optimizer:`,e),e}},[]),v=(0,t.useCallback)(async(e,t)=>{s({type:`LOAD_START`});try{await m.current.loadFromGLTFWithAssets(e,t),s({type:`LOAD_SUCCESS`,payload:{report:await m.current.getReport()}})}catch(e){throw s({type:`LOAD_ERROR`,payload:e}),console.error(`Error loading GLTF with assets into optimizer:`,e),e}},[]),y=(0,t.useCallback)(async e=>{if(m.current.hasModel())try{await m.current.simplify(e),s({type:`LOAD_SUCCESS`,payload:{report:await m.current.getReport()}})}catch(e){console.error(`Simplification failed:`,e)}},[]),b=(0,t.useCallback)(async e=>{if(m.current.hasModel())try{await m.current.deduplicate(e),s({type:`LOAD_SUCCESS`,payload:{report:await m.current.getReport()}})}catch(e){console.error(`Deduplication failed:`,e)}},[]),x=(0,t.useCallback)(async e=>{if(m.current.hasModel())try{await m.current.quantize(e),s({type:`LOAD_SUCCESS`,payload:{report:await m.current.getReport()}})}catch(e){console.error(`Quantization failed:`,e)}},[]),S=(0,t.useCallback)(async e=>{if(m.current.hasModel())try{await m.current.optimizeNormals(e),s({type:`LOAD_SUCCESS`,payload:{report:await m.current.getReport()}})}catch(e){console.error(`Normals optimization failed:`,e)}},[]),C=(0,t.useCallback)(async e=>{try{await l(m.current,e),s({type:`LOAD_SUCCESS`,payload:{report:await m.current.getReport()}})}catch(e){throw console.error(`Texture optimization failed:`,e),e}},[]),w=(0,t.useCallback)(async()=>{if(!m.current.hasModel())return null;try{return await m.current.export()}catch(e){return console.error(`Error getting model binary:`,e),null}},[]),T=(0,t.useCallback)(()=>m.current.hasModel()?m.current.document:null,[]);return{load:h,loadFromServerSceneData:g,loadFromGlbBuffer:_,loadFromGLTFWithAssets:v,getModel:w,isReady:!!T()&&!d,_getDocument:T,reset:(0,t.useCallback)(()=>{m.current.reset(),s({type:`RESET`}),p()},[p]),error:u,loading:d,report:c,info:f,simplifyOptimization:y,dedupOptimization:b,quantizeOptimization:x,normalsOptimization:S,texturesOptimization:C}};Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return u}});
@@ -1 +0,0 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./use-optimize-model-CD5zqTLK.cjs");exports.useOptimizeModel=e.t;