@vctrl/hooks 0.22.0 → 0.24.1
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/CHANGELOG.md +59 -0
- package/README.md +6 -6
- package/index.cjs.js +1 -1
- package/index.es.js +3 -3
- package/package.json +4 -4
- package/use-export-model/use-export-model.d.ts +2 -0
- package/use-export-model-efFsSWe-.js +70 -0
- package/use-export-model-yQWV3O3H.cjs +1 -0
- package/use-export-model.cjs.js +1 -1
- package/use-export-model.es.js +1 -1
- package/use-load-model/index.d.ts +1 -0
- package/use-load-model/types.d.ts +4 -0
- package/use-load-model/utils/fetch-manifest-assets.d.ts +10 -0
- package/use-load-model/utils/index.d.ts +1 -0
- package/use-load-model-B8oqou4I.cjs +1 -0
- package/use-load-model-C88r8-HE.js +585 -0
- package/use-load-model.cjs.js +1 -1
- package/use-load-model.es.js +11 -11
- package/use-optimize-model/use-optimize-model.d.ts +7 -2
- package/use-optimize-model-CD5zqTLK.cjs +1 -0
- package/{use-optimize-model-KAGxtv_k.js → use-optimize-model-D16-4Zwm.js} +62 -62
- package/use-optimize-model.cjs.js +1 -1
- package/use-optimize-model.es.js +1 -1
- package/use-export-model-8JbUalyf.cjs +0 -1
- package/use-export-model-BXg6L_W5.js +0 -49
- package/use-load-model-B9M4cF4B.cjs +0 -1
- package/use-load-model-BDCy9n2U.js +0 -504
- package/use-optimize-model-CPGezwrM.cjs +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { buildAssetLookupKeys as e, normalizeAssetUri as t, toSerializedAssetBytes as n } from "@vctrl/core";
|
|
2
|
+
import { useCallback as r, useEffect as i, useMemo as a, useReducer as o, useRef as s, useState as c } from "react";
|
|
3
3
|
import { ModelOptimizer as l } from "@vctrl/core/model-optimizer";
|
|
4
4
|
//#region packages/hooks/src/use-optimize-model/state.ts
|
|
5
5
|
var u = {
|
|
@@ -47,13 +47,13 @@ function f(e) {
|
|
|
47
47
|
sceneBytes: 0
|
|
48
48
|
};
|
|
49
49
|
}
|
|
50
|
-
var p = (
|
|
51
|
-
let [
|
|
52
|
-
return
|
|
53
|
-
!
|
|
54
|
-
}, [
|
|
55
|
-
info:
|
|
56
|
-
let e = f(
|
|
50
|
+
var p = (e) => {
|
|
51
|
+
let [t, n] = c(null), o = e.report;
|
|
52
|
+
return i(() => {
|
|
53
|
+
!t && o && n(o);
|
|
54
|
+
}, [t, o]), {
|
|
55
|
+
info: a(() => {
|
|
56
|
+
let e = f(t), n = f(o);
|
|
57
57
|
return {
|
|
58
58
|
initial: {
|
|
59
59
|
verticesCount: e.verticesCount,
|
|
@@ -63,23 +63,23 @@ var p = (r) => {
|
|
|
63
63
|
sceneBytes: e.sceneBytes
|
|
64
64
|
},
|
|
65
65
|
optimized: {
|
|
66
|
-
verticesCount:
|
|
67
|
-
primitivesCount:
|
|
68
|
-
meshesCount:
|
|
69
|
-
texturesCount:
|
|
70
|
-
sceneBytes:
|
|
66
|
+
verticesCount: n.verticesCount,
|
|
67
|
+
primitivesCount: n.primitivesCount,
|
|
68
|
+
meshesCount: n.meshesCount,
|
|
69
|
+
texturesCount: n.textureAssetCount,
|
|
70
|
+
sceneBytes: n.sceneBytes
|
|
71
71
|
},
|
|
72
72
|
improvement: {
|
|
73
|
-
verticesCount: e.verticesCount -
|
|
74
|
-
primitivesCount: e.primitivesCount -
|
|
75
|
-
meshesCount: e.meshesCount -
|
|
76
|
-
texturesCount: e.textureAssetCount -
|
|
77
|
-
sceneBytes: e.sceneBytes -
|
|
73
|
+
verticesCount: e.verticesCount - n.verticesCount,
|
|
74
|
+
primitivesCount: e.primitivesCount - n.primitivesCount,
|
|
75
|
+
meshesCount: e.meshesCount - n.meshesCount,
|
|
76
|
+
texturesCount: e.textureAssetCount - n.textureAssetCount,
|
|
77
|
+
sceneBytes: e.sceneBytes - n.sceneBytes
|
|
78
78
|
}
|
|
79
79
|
};
|
|
80
|
-
}, [
|
|
81
|
-
reset:
|
|
82
|
-
|
|
80
|
+
}, [o, t]),
|
|
81
|
+
reset: r(() => {
|
|
82
|
+
n(null);
|
|
83
83
|
}, [])
|
|
84
84
|
};
|
|
85
85
|
};
|
|
@@ -146,130 +146,130 @@ var g = async (e, t) => {
|
|
|
146
146
|
encoder: h()
|
|
147
147
|
});
|
|
148
148
|
}, _ = () => {
|
|
149
|
-
let [
|
|
150
|
-
|
|
149
|
+
let [a, c] = o(d, u), { report: f, error: m, loading: h } = a, { info: _, reset: v } = p(a), y = s(new l());
|
|
150
|
+
i(() => {
|
|
151
151
|
let e = y.current;
|
|
152
152
|
return () => {
|
|
153
153
|
e.reset();
|
|
154
154
|
};
|
|
155
155
|
}, []);
|
|
156
|
-
let b =
|
|
157
|
-
|
|
156
|
+
let b = r(async (e) => {
|
|
157
|
+
c({ type: "LOAD_START" });
|
|
158
158
|
try {
|
|
159
159
|
let t = y.current;
|
|
160
|
-
await t.loadFromThreeJS(e),
|
|
160
|
+
await t.loadFromThreeJS(e), c({
|
|
161
161
|
type: "LOAD_SUCCESS",
|
|
162
162
|
payload: { report: await t.getReport() }
|
|
163
163
|
});
|
|
164
164
|
} catch (e) {
|
|
165
|
-
|
|
165
|
+
c({
|
|
166
166
|
type: "LOAD_ERROR",
|
|
167
167
|
payload: e
|
|
168
168
|
}), console.error("Error loading model:", e);
|
|
169
169
|
}
|
|
170
|
-
}, []), x =
|
|
171
|
-
|
|
170
|
+
}, []), x = r(async (r) => {
|
|
171
|
+
c({ type: "LOAD_START" });
|
|
172
172
|
try {
|
|
173
|
-
let
|
|
174
|
-
for (let t of Object.values(
|
|
175
|
-
let
|
|
173
|
+
let i = y.current, a = /* @__PURE__ */ new Map();
|
|
174
|
+
for (let t of Object.values(r.assetData ?? {})) for (let n of e(t.fileName)) a.set(n, t);
|
|
175
|
+
let o = {}, s = r.gltfJson, l = [...(s.images ?? []).map((e) => e.uri).filter((e) => !!e && !e.startsWith("data:")), ...(s.buffers ?? []).map((e) => e.uri).filter((e) => !!e && !e.startsWith("data:"))];
|
|
176
176
|
for (let e of l) {
|
|
177
|
-
let
|
|
178
|
-
|
|
177
|
+
let r = t(e), i = r.split("/").pop() || r, s = a.get(e) ?? a.get(r) ?? a.get(i);
|
|
178
|
+
s && (o[e] = n(s));
|
|
179
179
|
}
|
|
180
180
|
let u = {
|
|
181
|
-
json:
|
|
182
|
-
resources:
|
|
181
|
+
json: r.gltfJson,
|
|
182
|
+
resources: o
|
|
183
183
|
};
|
|
184
|
-
await
|
|
184
|
+
await i.loadFromJSON(u), c({
|
|
185
185
|
type: "LOAD_SUCCESS",
|
|
186
|
-
payload: { report: await
|
|
186
|
+
payload: { report: await i.getReport() }
|
|
187
187
|
});
|
|
188
188
|
} catch (e) {
|
|
189
|
-
throw
|
|
189
|
+
throw c({
|
|
190
190
|
type: "LOAD_ERROR",
|
|
191
191
|
payload: e
|
|
192
192
|
}), console.error("Error loading server scene into optimizer:", e), e;
|
|
193
193
|
}
|
|
194
|
-
}, []), S =
|
|
195
|
-
|
|
194
|
+
}, []), S = r(async (e, t) => {
|
|
195
|
+
c({ type: "LOAD_START" });
|
|
196
196
|
try {
|
|
197
|
-
await y.current.loadFromBuffer(e),
|
|
197
|
+
await y.current.loadFromBuffer(e), y.current.setAppliedOptimizations(t?.appliedOptimizations ?? []), y.current.setDracoReport(t?.dracoReport ?? null), c({
|
|
198
198
|
type: "LOAD_SUCCESS",
|
|
199
199
|
payload: { report: await y.current.getReport() }
|
|
200
200
|
});
|
|
201
201
|
} catch (e) {
|
|
202
|
-
throw
|
|
202
|
+
throw c({
|
|
203
203
|
type: "LOAD_ERROR",
|
|
204
204
|
payload: e
|
|
205
205
|
}), console.error("Error loading GLB buffer into optimizer:", e), e;
|
|
206
206
|
}
|
|
207
|
-
}, []), C =
|
|
208
|
-
|
|
207
|
+
}, []), C = r(async (e, t) => {
|
|
208
|
+
c({ type: "LOAD_START" });
|
|
209
209
|
try {
|
|
210
|
-
await y.current.loadFromGLTFWithAssets(e, t),
|
|
210
|
+
await y.current.loadFromGLTFWithAssets(e, t), c({
|
|
211
211
|
type: "LOAD_SUCCESS",
|
|
212
212
|
payload: { report: await y.current.getReport() }
|
|
213
213
|
});
|
|
214
214
|
} catch (e) {
|
|
215
|
-
throw
|
|
215
|
+
throw c({
|
|
216
216
|
type: "LOAD_ERROR",
|
|
217
217
|
payload: e
|
|
218
218
|
}), console.error("Error loading GLTF with assets into optimizer:", e), e;
|
|
219
219
|
}
|
|
220
|
-
}, []), w =
|
|
220
|
+
}, []), w = r(async (e) => {
|
|
221
221
|
if (y.current.hasModel()) try {
|
|
222
|
-
await y.current.simplify(e),
|
|
222
|
+
await y.current.simplify(e), c({
|
|
223
223
|
type: "LOAD_SUCCESS",
|
|
224
224
|
payload: { report: await y.current.getReport() }
|
|
225
225
|
});
|
|
226
226
|
} catch (e) {
|
|
227
227
|
console.error("Simplification failed:", e);
|
|
228
228
|
}
|
|
229
|
-
}, []), T =
|
|
229
|
+
}, []), T = r(async (e) => {
|
|
230
230
|
if (y.current.hasModel()) try {
|
|
231
|
-
await y.current.deduplicate(e),
|
|
231
|
+
await y.current.deduplicate(e), c({
|
|
232
232
|
type: "LOAD_SUCCESS",
|
|
233
233
|
payload: { report: await y.current.getReport() }
|
|
234
234
|
});
|
|
235
235
|
} catch (e) {
|
|
236
236
|
console.error("Deduplication failed:", e);
|
|
237
237
|
}
|
|
238
|
-
}, []), E =
|
|
238
|
+
}, []), E = r(async (e) => {
|
|
239
239
|
if (y.current.hasModel()) try {
|
|
240
|
-
await y.current.quantize(e),
|
|
240
|
+
await y.current.quantize(e), c({
|
|
241
241
|
type: "LOAD_SUCCESS",
|
|
242
242
|
payload: { report: await y.current.getReport() }
|
|
243
243
|
});
|
|
244
244
|
} catch (e) {
|
|
245
245
|
console.error("Quantization failed:", e);
|
|
246
246
|
}
|
|
247
|
-
}, []), D =
|
|
247
|
+
}, []), D = r(async (e) => {
|
|
248
248
|
if (y.current.hasModel()) try {
|
|
249
|
-
await y.current.optimizeNormals(e),
|
|
249
|
+
await y.current.optimizeNormals(e), c({
|
|
250
250
|
type: "LOAD_SUCCESS",
|
|
251
251
|
payload: { report: await y.current.getReport() }
|
|
252
252
|
});
|
|
253
253
|
} catch (e) {
|
|
254
254
|
console.error("Normals optimization failed:", e);
|
|
255
255
|
}
|
|
256
|
-
}, []), O =
|
|
256
|
+
}, []), O = r(async (e) => {
|
|
257
257
|
try {
|
|
258
|
-
await g(y.current, e),
|
|
258
|
+
await g(y.current, e), c({
|
|
259
259
|
type: "LOAD_SUCCESS",
|
|
260
260
|
payload: { report: await y.current.getReport() }
|
|
261
261
|
});
|
|
262
262
|
} catch (e) {
|
|
263
263
|
throw console.error("Texture optimization failed:", e), e;
|
|
264
264
|
}
|
|
265
|
-
}, []), k =
|
|
265
|
+
}, []), k = r(async () => {
|
|
266
266
|
if (!y.current.hasModel()) return null;
|
|
267
267
|
try {
|
|
268
268
|
return await y.current.export();
|
|
269
269
|
} catch (e) {
|
|
270
270
|
return console.error("Error getting model binary:", e), null;
|
|
271
271
|
}
|
|
272
|
-
}, []), A =
|
|
272
|
+
}, []), A = r(() => y.current.hasModel() ? y.current.document : null, []);
|
|
273
273
|
return {
|
|
274
274
|
load: b,
|
|
275
275
|
loadFromServerSceneData: x,
|
|
@@ -278,8 +278,8 @@ var g = async (e, t) => {
|
|
|
278
278
|
getModel: k,
|
|
279
279
|
isReady: !!A() && !h,
|
|
280
280
|
_getDocument: A,
|
|
281
|
-
reset:
|
|
282
|
-
y.current.reset(),
|
|
281
|
+
reset: r(() => {
|
|
282
|
+
y.current.reset(), c({ type: "RESET" }), v();
|
|
283
283
|
}, [v]),
|
|
284
284
|
error: m,
|
|
285
285
|
loading: h,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./use-optimize-model-
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./use-optimize-model-CD5zqTLK.cjs");exports.useOptimizeModel=e.t;
|
package/use-optimize-model.es.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as e } from "./use-optimize-model-
|
|
1
|
+
import { t as e } from "./use-optimize-model-D16-4Zwm.js";
|
|
2
2
|
export { e as useOptimizeModel };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const e=require("./chunk-CMqjfN_6.cjs");let t=require("react"),n=require("@vctrl/core/model-exporter"),r=require("file-saver");r=e.t(r,1);var i=(e,i)=>{let a=(0,t.useRef)(new n.ModelExporter);return{handleThreeGltfExport:(0,t.useCallback)(async(t,n)=>{let o=t?.model;if(!o){console.error(`Scene not initialized`);return}try{let i=a.current,s=t.name.replace(/\.[^/.]+$/,``);if(n){let e=await i.exportThreeJSGLB(o,{});if(!(e.data instanceof Uint8Array))throw Error(`Expected GLB export to return Uint8Array`);r.default.saveAs(new Blob([new Uint8Array(e.data)]),`${s}.glb`)}else{let e=await i.exportThreeJSGLTF(o),t=await i.createZIPArchive(e,s);r.default.saveAs(new Blob([new Uint8Array(t)]),`${s}.zip`)}e&&e()}catch(e){console.error(`Export failed:`,e),i&&i(e)}},[e,i]),handleDocumentGltfExport:(0,t.useCallback)(async function(t,n,o=!1,s=!0){try{let i=a.current,c=n?.name.replace(/\.[^/.]+$/,``)||`model`;if(o){let e=await i.exportDocumentGLB(t);r.default.saveAs(new Blob([new Uint8Array(e.data)]),`${c}.glb`)}else{let e=await i.exportDocumentGLTF(t);if(!s)return e;let n=await i.createZIPArchive(e,c);r.default.saveAs(new Blob([new Uint8Array(n)]),`${c}.zip`)}e&&e()}catch(e){console.error(`Export failed:`,e),i&&i(e)}},[i,e])}};Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return i}});
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { useCallback as e, useRef as t } from "react";
|
|
2
|
-
import { ModelExporter as n } from "@vctrl/core/model-exporter";
|
|
3
|
-
import r from "file-saver";
|
|
4
|
-
//#region packages/hooks/src/use-export-model/use-export-model.ts
|
|
5
|
-
var i = (i, a) => {
|
|
6
|
-
let o = t(new n());
|
|
7
|
-
return {
|
|
8
|
-
handleThreeGltfExport: e(async (e, t) => {
|
|
9
|
-
let n = e?.model;
|
|
10
|
-
if (!n) {
|
|
11
|
-
console.error("Scene not initialized");
|
|
12
|
-
return;
|
|
13
|
-
}
|
|
14
|
-
try {
|
|
15
|
-
let a = o.current, s = e.name.replace(/\.[^/.]+$/, "");
|
|
16
|
-
if (t) {
|
|
17
|
-
let e = await a.exportThreeJSGLB(n, {});
|
|
18
|
-
if (!(e.data instanceof Uint8Array)) throw Error("Expected GLB export to return Uint8Array");
|
|
19
|
-
r.saveAs(new Blob([new Uint8Array(e.data)]), `${s}.glb`);
|
|
20
|
-
} else {
|
|
21
|
-
let e = await a.exportThreeJSGLTF(n), t = await a.createZIPArchive(e, s);
|
|
22
|
-
r.saveAs(new Blob([new Uint8Array(t)]), `${s}.zip`);
|
|
23
|
-
}
|
|
24
|
-
i && i();
|
|
25
|
-
} catch (e) {
|
|
26
|
-
console.error("Export failed:", e), a && a(e);
|
|
27
|
-
}
|
|
28
|
-
}, [i, a]),
|
|
29
|
-
handleDocumentGltfExport: e(async function(e, t, n = !1, s = !0) {
|
|
30
|
-
try {
|
|
31
|
-
let a = o.current, c = t?.name.replace(/\.[^/.]+$/, "") || "model";
|
|
32
|
-
if (n) {
|
|
33
|
-
let t = await a.exportDocumentGLB(e);
|
|
34
|
-
r.saveAs(new Blob([new Uint8Array(t.data)]), `${c}.glb`);
|
|
35
|
-
} else {
|
|
36
|
-
let t = await a.exportDocumentGLTF(e);
|
|
37
|
-
if (!s) return t;
|
|
38
|
-
let n = await a.createZIPArchive(t, c);
|
|
39
|
-
r.saveAs(new Blob([new Uint8Array(n)]), `${c}.zip`);
|
|
40
|
-
}
|
|
41
|
-
i && i();
|
|
42
|
-
} catch (e) {
|
|
43
|
-
console.error("Export failed:", e), a && a(e);
|
|
44
|
-
}
|
|
45
|
-
}, [a, i])
|
|
46
|
-
};
|
|
47
|
-
};
|
|
48
|
-
//#endregion
|
|
49
|
-
export { i as t };
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
let e=require("@vctrl/core/model-loader"),t=require("react"),n=require("@vctrl/core");var r=({code:e,message:t,recoverable:n,source:r,cause:i,context:a})=>({code:e,message:t,recoverable:n,source:r,cause:i,context:a}),i=e=>e instanceof Error&&e.message?e.message:typeof e==`string`&&e.trim().length>0?e:`Unknown error`,a=(e,t,n)=>{let a=i(e);return r({code:a.includes(`missing required referenced assets`)?`missing_assets`:t,message:a,recoverable:!0,source:`local-upload`,cause:e,context:n})},o=(e,t)=>{let n=i(e),a=`server_load_failed`;return n.includes(`Server responded with 404`)?a=`not_found`:(n.includes(`Server responded with 402`)||n.includes(`Server responded with 403`))&&(a=`quota_exceeded`),r({code:a,message:n,recoverable:a!==`not_found`,source:`server-load`,cause:e,context:{sceneId:t}})},s={},c={emit(e,t){let n=s[e];console.debug(`Event emitted: ${e}`,t),n&&n.forEach(e=>e(t))},on(e,t){s[e]||(s[e]=[]),s[e].push(t)},off(e,t){let n=s[e];n&&(s[e]=n.filter(e=>e!==t))}},l=e=>{try{return(0,n.normalizeAssetUri)(e)}catch{return e}},u=e=>{let t=new Set,n=e,r=Array.isArray(n.images)?n.images:[];for(let e of r)typeof e.uri==`string`&&!e.uri.startsWith(`data:`)&&t.add(e.uri);let i=Array.isArray(n.buffers)?n.buffers:[];for(let e of i)typeof e.uri==`string`&&!e.uri.startsWith(`data:`)&&t.add(e.uri);return t},d=async(e,t)=>{let r=JSON.parse(await e.text()),i=u(r),a={},o=new Map,s=new Map,c=new Set,d=async e=>{let t=s.get(e);if(t)return t;let n=new Uint8Array(await e.arrayBuffer());return s.set(e,n),n};for(let e of t){for(let t of(0,n.buildAssetLookupKeys)(e.name))o.set(t,e);if(e.webkitRelativePath)for(let t of(0,n.buildAssetLookupKeys)(e.webkitRelativePath))o.set(t,e)}let f=[];for(let e of i){let t=l(e),n=t.split(`/`).pop()||t,r=o.get(e)||o.get(t)||o.get(n);if(!r){f.push(e);continue}c.add(r);let i=await d(r);a[t]={data:Array.from(i),fileName:t,mimeType:r.type||`application/octet-stream`}}if(f.length>0)throw Error(`Scene payload is missing required referenced assets: ${f.slice(0,5).join(`, `)}`);for(let[e,n]of t.entries()){if(c.has(n))continue;let t=l(n.name),r=t.split(`/`).pop()||t,i=await d(n);a[`extra-${e}-${r}`]={data:Array.from(i),fileName:r,mimeType:n.type||`application/octet-stream`}}return{gltfJson:r,assetData:a}},f=async(t,n,r,i,o)=>{try{let a={model:(await r.loadToThreeJS(t)).scene,type:n,name:t.name};if(o({type:`set-file`,payload:a}),o({type:`set-file-loading`,payload:!1}),i&&n!==e.ModelFileTypes.usdz){let e=new Uint8Array(await t.arrayBuffer());await i.loadFromGlbBuffer(e)}return a}catch(e){return console.error(`Error loading binary model:`,e),o({type:`set-file-loading`,payload:!1}),c.emit(`load-error`,a(e,`binary_load_failed`,{fileName:t.name,fileType:n,fileSize:t.size})),null}},p=async(t,n,r,i,o,s)=>{try{let{sourcePackageBytes:a,textureBytes:c}=await s(t,n),l=await r.loadGLTFWithAssetsToThreeJS(t,n),u={model:l.scene,type:e.ModelFileTypes.gltf,name:t.name,sourcePackageBytes:a,sourceTextureBytes:c};if(o({type:`set-file`,payload:u}),o({type:`set-file-loading`,payload:!1}),i)try{let e=await d(t,n);await i.loadFromServerSceneData(e)}catch(e){console.warn(`Failed to initialize optimizer from source GLTF payload; trying direct asset load.`,e);try{if(`loadFromGLTFWithAssets`in i){let e=new Uint8Array(await t.arrayBuffer()),r=new Map;for(let e of n){let t=new Uint8Array(await e.arrayBuffer());r.set(e.name,t),e.webkitRelativePath&&r.set(e.webkitRelativePath,t)}await i.loadFromGLTFWithAssets(e,r)}else throw Error(`loadFromGLTFWithAssets not available`)}catch(e){console.warn(`Direct asset load also failed; falling back to Three.js scene import. Texture names may be generic.`,e),await i.load(l.scene)}}return u}catch(e){return console.error(`Error loading GLTF model:`,e),console.error(`GLTF file:`,t.name),console.error(`Asset files:`,n.map(e=>e.name)),o({type:`set-file-loading`,payload:!1}),c.emit(`load-error`,a(e,`gltf_load_failed`,{fileName:t.name,fileSize:t.size,assetCount:n.length})),null}};function m(n,r,i,a){let o=(0,t.useCallback)(async(t,o)=>{if(!n){console.warn(`Optimizer is not available`);return}try{t&&await t(o);let s=await n.getModel();if(!s){console.warn(`No optimized model available after optimization`);return}let c=s instanceof Uint8Array?s.slice():new Uint8Array(s).slice(),l=new File([c],i?.name||`optimized_model.glb`,{type:`model/gltf-binary`});r({type:`set-file`,payload:{model:(await a.loadToThreeJS(l)).scene,type:e.ModelFileTypes.glb,name:l.name}})}catch(e){console.error(`Optimization failed:`,e)}},[n,a,i,r]);if(!n)return null;let s=n.isReady,c=!!i?.model&&!s;return{...n,isReady:s,isPreparing:c,applyOptimization:o,reset:n?.reset,error:n?.error,loading:n?.loading}}var h={file:null,isFileLoading:!1,progress:0,supportedFileTypes:[e.ModelFileTypes.gltf,e.ModelFileTypes.glb,e.ModelFileTypes.usdz]};function g(e,t){switch(t.type){case`set-file`:return{...e,file:t.payload};case`set-file-loading`:return{...e,isFileLoading:t.payload};case`set-progress`:return{...e,progress:t.payload};case`reset-state`:return{...h};default:return e}}async function _(e){let t=[];async function*n(e){let t=e;for await(let[,e]of t)e.kind===`file`?yield await e.getFile():e.kind===`directory`&&(yield*n(e))}for await(let r of n(e))t.push(r);return t}function v(e){let t=[];if(e.assetData&&typeof e.assetData==`object`)for(let[,r]of Object.entries(e.assetData)){let{fileName:e,mimeType:i}=r;if(e===n.PERSISTED_BAKE_FILENAME)continue;let a=(0,n.toSerializedAssetBytes)(r),o=new Uint8Array(a.byteLength);o.set(a);let s=new Blob([o],{type:i}),c=new File([s],e,{type:i});t.push(c)}let r=JSON.stringify(e.gltfJson),i=new Blob([r],{type:`model/gltf+json`}),a=e.meta?.name,o=a?`${a}.gltf`:`scene.gltf`;return[new File([i],o,{type:`model/gltf+json`}),...t]}var y=(e,t)=>{let r=(0,n.normalizeAssetUri)(e),i=r.split(`/`).pop()||r;for(let e of t){let t=(0,n.buildAssetLookupKeys)(e.fileName);if(t.has(r)||t.has(i))return e.size}return 0},b=e=>{let t=new Set,n=new Set,r=e,i=Array.isArray(r.images)?r.images:[];for(let e of i)typeof e.uri==`string`&&!e.uri.startsWith(`data:`)&&n.add(e.uri);let a=Array.isArray(r.buffers)?r.buffers:[];for(let e of a)typeof e.uri==`string`&&!e.uri.startsWith(`data:`)&&t.add(e.uri);return{bufferUris:t,imageUris:n}};async function x(e,t){let n=await e.text(),r;try{r=JSON.parse(n)}catch{return{sourcePackageBytes:e.size,textureBytes:0}}let i=t.map(e=>({fileName:e.name,size:e.size})),{bufferUris:a,imageUris:o}=b(r),s=Array.from(a).reduce((e,t)=>e+y(t,i),0),c=Array.from(o).reduce((e,t)=>e+y(t,i),0);return{sourcePackageBytes:e.size+s+c,textureBytes:c}}function S(e){let t=e.gltfJson,r=Object.values(e.assetData||{}).map(e=>({fileName:e.fileName,size:(0,n.getSerializedAssetByteSize)(e.data)})),i=new TextEncoder().encode(JSON.stringify(t)).byteLength,{bufferUris:a,imageUris:o}=b(t),s=Array.from(a).reduce((e,t)=>e+y(t,r),0),c=Array.from(o).reduce((e,t)=>e+y(t,r),0);return{sourcePackageBytes:i+s+c,textureBytes:c}}function C(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function w(e){let t=C(e.settings)?e.settings:{},r=(0,n.normalizeCameraSettings)(e.camera??t.camera);return{...t,bounds:e.bounds??t.bounds,camera:r,interactions:(0,n.normalizeSceneInteractions)(t.interactions,{camera:r}),controls:e.controls??t.controls,environment:e.environment??t.environment,shadows:e.shadows??t.shadows}}function T(e){let t=new Set,n=e,r=Array.isArray(n.images)?n.images:[];for(let e of r)typeof e.uri==`string`&&!e.uri.startsWith(`data:`)&&t.add(e.uri);let i=Array.isArray(n.buffers)?n.buffers:[];for(let e of i)typeof e.uri==`string`&&!e.uri.startsWith(`data:`)&&t.add(e.uri);return t}function E(e){for(let[t,r]of Object.entries(e)){if(!r||typeof r!=`object`)throw Error(`Scene payload contains invalid asset entry for ${t}`);if(typeof r.fileName!=`string`||r.fileName.trim().length===0)throw Error(`Scene payload asset ${t} is missing a valid fileName`);if(typeof r.mimeType!=`string`||r.mimeType.trim().length===0)throw Error(`Scene payload asset ${t} is missing a valid mimeType`);if(typeof r.data==`string`&&r.encoding===`base64`&&!(0,n.isValidBase64)(r.data))throw Error(`Scene payload asset ${r.fileName} has invalid base64 data`)}}function D(e,t){let r=T(e);if(r.size===0)return;let i=new Set;for(let e of Object.values(t))for(let t of(0,n.buildAssetLookupKeys)(e.fileName))i.add(t);let a=[];for(let e of r){let t=(0,n.normalizeAssetUri)(e),r=t.split(`/`).pop()||t;!i.has(e)&&!i.has(t)&&!i.has(r)&&a.push(e)}if(a.length>0)throw Error(`Scene payload is missing required referenced assets: ${a.slice(0,5).join(`, `)}`)}function O(e){if(!C(e.gltfJson))throw Error(`Scene payload is missing a valid glTF document`);let t=e.assetData??{};return E(t),D(e.gltfJson,t),{meta:e.meta,gltfJson:e.gltfJson,assetData:t,...w(e)}}function k(n){let r=(0,t.useRef)(!1),i=(0,t.useRef)(null),[a,s]=(0,t.useReducer)(g,h),l=(0,t.useMemo)(()=>{let t=new e.ModelLoader;return t.onProgress(e=>{s({type:`set-progress`,payload:e.progress}),e.progress!==100&&c.emit(`load-progress`,e.progress)}),t},[]),u=(0,t.useCallback)(e=>{s({type:`set-progress`,payload:e}),c.emit(`load-progress`,e)},[]),d=(0,t.useCallback)(()=>{s({type:`reset-state`}),c.emit(`load-reset`)},[]),y=(0,t.useCallback)((e,t)=>e.find(e=>e.name.endsWith(`.`+t)),[]),b=(0,t.useCallback)(async t=>{if(t.length===0)return;let a=y(t,e.ModelFileTypes.gltf),o=y(t,e.ModelFileTypes.glb),u=y(t,e.ModelFileTypes.usdz),d=[a,o,u].filter(Boolean);if(d.length>1){c.emit(`multiple-models`,d);return}let m=t.filter(e=>e!==a&&e!==o&&e!==u),h=()=>{r.current=!0,i.current&&(c.emit(`load-complete`,i.current),r.current=!1)};if(a){let e=await p(a,m,l,n,s,x);e&&(i.current=e),h()}else if(o){let t=await f(o,e.ModelFileTypes.glb,l,n,s);t&&(i.current=t),h()}else if(u){let t=await f(u,e.ModelFileTypes.usdz,l,n,s);t&&(i.current=t),h()}else c.emit(`not-loaded-files`,t),s({type:`set-file-loading`,payload:!1})},[y,l,n]),C=(0,t.useCallback)(async e=>{let t=[];c.emit(`load-start`),s({type:`reset-state`}),s({type:`set-file-loading`,payload:!0}),u(0),r.current=!1;for(let n of e)if(n instanceof File)t.push(n);else if(`kind`in n&&n.kind===`directory`){let e=await _(n);t.push(...e)}await b(t)},[b,u]),w=(0,t.useCallback)(async t=>{let{sceneData:r,sceneId:a}=t;u(40);let o=v(r),{sourcePackageBytes:c,textureBytes:d}=S(r);u(60);let f=o[0],p=o.slice(1),m={model:(await l.loadGLTFWithAssetsToThreeJS(f,p)).scene,type:e.ModelFileTypes.gltf,name:f.name,sourcePackageBytes:c,sourceTextureBytes:d};return s({type:`set-file`,payload:m}),s({type:`set-file-loading`,payload:!1}),i.current=m,n&&await n.loadFromServerSceneData(r),u(100),{file:m,sceneId:a,...r}},[l,n,u]),T=(0,t.useCallback)(async e=>{let{sceneId:t,serverOptions:n}=e;try{c.emit(`server-load-start`,t),s({type:`reset-state`}),s({type:`set-file-loading`,payload:!0}),u(0);let e=new FormData;e.append(`action`,`get-scene-settings`),e.append(`sceneId`,t);let r=n?.endpoint??`/api/scenes/${t}`,i=n?.apiKey?{Authorization:`Bearer ${n.apiKey}`,...n.headers}:{...n?.headers},a=await fetch(r,{method:`POST`,headers:i,body:e});if(!a.ok)throw Error(`Server responded with ${a.status} ${a.statusText}`);let o=await a.json(),l=await w({sceneId:t,sceneData:O(o.data??o)});return c.emit(`server-load-complete`,l),l}catch(e){console.error(`Server scene loading failed:`,e),s({type:`set-file-loading`,payload:!1});let n=o(e,t);throw c.emit(`server-load-error`,n),n}},[w,u]),E=m(n,s,a.file,l);return{...a,on:c.on,off:c.off,load:C,loadFromData:w,loadFromServer:T,reset:d,optimizer:E}}Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return k}});
|