@vctrl/hooks 0.18.0 → 0.23.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 (49) hide show
  1. package/CHANGELOG.md +85 -0
  2. package/README.md +9 -9
  3. package/chunk-CMqjfN_6.cjs +1 -0
  4. package/index.cjs.js +1 -1
  5. package/index.es.js +3 -3
  6. package/package.json +73 -67
  7. package/use-export-model-8JbUalyf.cjs +1 -0
  8. package/{use-export-model-DzVKdqnY.js → use-export-model-BXg6L_W5.js} +5 -5
  9. package/use-export-model.cjs.js +1 -1
  10. package/use-export-model.es.js +1 -1
  11. package/use-load-model/error-helpers.d.ts +5 -0
  12. package/use-load-model/file-loaders.d.ts +12 -0
  13. package/use-load-model/index.d.ts +2 -1
  14. package/use-load-model/optimizer-integration.d.ts +16 -0
  15. package/use-load-model/scene-data-builder.d.ts +3 -0
  16. package/use-load-model/types.d.ts +17 -4
  17. package/use-load-model/use-load-model.d.ts +5 -16
  18. package/use-load-model/utils/fetch-manifest-assets.d.ts +10 -0
  19. package/use-load-model/utils/index.d.ts +1 -0
  20. package/use-load-model-B8oqou4I.cjs +1 -0
  21. package/use-load-model-C88r8-HE.js +585 -0
  22. package/use-load-model.cjs.js +1 -1
  23. package/use-load-model.es.js +11 -11
  24. package/use-optimize-model/use-optimize-model.d.ts +14 -12
  25. package/use-optimize-model/utils/browser-texture-encoder.d.ts +41 -0
  26. package/use-optimize-model/utils/index.d.ts +2 -2
  27. package/use-optimize-model/utils/texture-optimization.d.ts +3 -13
  28. package/use-optimize-model-CweunXiv.js +296 -0
  29. package/use-optimize-model-Jie2FUHc.cjs +1 -0
  30. package/use-optimize-model.cjs.js +1 -1
  31. package/use-optimize-model.es.js +1 -1
  32. package/GLTFLoader-CygFefRr.cjs +0 -1
  33. package/GLTFLoader-NiJ7qzh1.js +0 -1381
  34. package/__vite-browser-external-Bn_csQuM.js +0 -7
  35. package/__vite-browser-external-CVmj8TrW.cjs +0 -1
  36. package/chunk-foFoljWS.js +0 -23
  37. package/chunk-gGpyby2o.cjs +0 -1
  38. package/lib-DKn2MJ9X.js +0 -4111
  39. package/lib-DZ-MihdJ.cjs +0 -2
  40. package/model-exporter-SMSAY90N.cjs +0 -1
  41. package/model-exporter-cvguDGnn.js +0 -6512
  42. package/server-communication-Bj6ZxFw2.js +0 -4659
  43. package/server-communication-yXZR8eso.cjs +0 -18
  44. package/use-export-model-CaijtW1c.cjs +0 -1
  45. package/use-load-model-B6UXiFWh.js +0 -517
  46. package/use-load-model-CH-WPQ_s.cjs +0 -1
  47. package/use-optimize-model/utils/validation.d.ts +0 -8
  48. package/use-optimize-model-C-fzzKh6.cjs +0 -1
  49. package/use-optimize-model-Cb3WMvDZ.js +0 -299
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Creates a sharp-constructor-compatible browser encoder.
3
+ *
4
+ * The returned function matches the sharp API surface that gltf-transform uses:
5
+ * `encoder(buffer)` → instance with `.resize()`, `.webp/jpeg/png()`,
6
+ * `.toBuffer()`, and `.metadata()`.
7
+ *
8
+ * Pass the result directly to `TextureCompressOptions.encoder`:
9
+ * ```ts
10
+ * await optimizer.compressTextures({
11
+ * encoder: createBrowserTextureEncoder(),
12
+ * targetFormat: 'webp',
13
+ * quality: 80,
14
+ * })
15
+ * ```
16
+ */
17
+ export declare function createBrowserTextureEncoder(): (inputBuffer: Uint8Array | ArrayBuffer) => {
18
+ resize(w?: number, h?: number, _opts?: unknown): /*elided*/ any;
19
+ webp(opts?: {
20
+ quality?: number;
21
+ }): /*elided*/ any;
22
+ jpeg(opts?: {
23
+ quality?: number;
24
+ }): /*elided*/ any;
25
+ png(_opts?: unknown): /*elided*/ any;
26
+ /**
27
+ * sharp-compatible `.toFormat(format, opts)` — gltf-transform calls this
28
+ * instead of `.webp()` / `.jpeg()` / `.png()` directly.
29
+ */
30
+ toFormat(format: string, opts?: {
31
+ quality?: number;
32
+ lossless?: boolean;
33
+ nearLossless?: boolean;
34
+ }): /*elided*/ any;
35
+ toBuffer(): Promise<Uint8Array>;
36
+ metadata(): Promise<{
37
+ width: number;
38
+ height: number;
39
+ format: string;
40
+ }>;
41
+ };
@@ -1,2 +1,2 @@
1
- export { optimizeTextures, performClientSideTextureOptimization, performServerSideTextureOptimization, shouldUseServerOptimization } from './texture-optimization';
2
- export { validateResponseContentType, validateServerResponse } from './validation';
1
+ export { optimizeTextures } from './texture-optimization';
2
+ export { createBrowserTextureEncoder } from './browser-texture-encoder';
@@ -1,17 +1,7 @@
1
1
  import { ModelOptimizer, TextureCompressOptions } from '../../../../core/src/model-optimizer/index.ts';
2
2
  /**
3
- * Performs server-side texture optimization.
4
- */
5
- export declare const performServerSideTextureOptimization: (optimizer: ModelOptimizer, options: TextureCompressOptions) => Promise<void>;
6
- /**
7
- * Handles client-side texture optimization (throws error as not supported in browser).
8
- */
9
- export declare const performClientSideTextureOptimization: () => never;
10
- /**
11
- * Determines if server-side optimization should be used.
12
- */
13
- export declare const shouldUseServerOptimization: (options?: TextureCompressOptions) => boolean;
14
- /**
15
- * Main texture optimization function that orchestrates the process.
3
+ * Performs client-side texture compression using the browser-native encoder.
4
+ * Delegates directly to optimizer.compressTextures() with the OffscreenCanvas
5
+ * encoder injected — no network round-trip required.
16
6
  */
17
7
  export declare const optimizeTextures: (optimizer: ModelOptimizer, options?: TextureCompressOptions) => Promise<void>;
@@ -0,0 +1,296 @@
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
+ import { ModelOptimizer as l } from "@vctrl/core/model-optimizer";
4
+ //#region packages/hooks/src/use-optimize-model/state.ts
5
+ var u = {
6
+ info: null,
7
+ error: null,
8
+ loading: !1,
9
+ report: null
10
+ }, d = (e, t) => {
11
+ switch (t.type) {
12
+ case "LOAD_START": return {
13
+ ...e,
14
+ loading: !0,
15
+ error: null
16
+ };
17
+ case "LOAD_SUCCESS": return {
18
+ ...e,
19
+ loading: !1,
20
+ report: t.payload.report
21
+ };
22
+ case "LOAD_ERROR": return {
23
+ ...e,
24
+ loading: !1,
25
+ error: t.payload
26
+ };
27
+ case "RESET": return { ...u };
28
+ default: return e;
29
+ }
30
+ };
31
+ //#endregion
32
+ //#region packages/hooks/src/use-optimize-model/use-calc-optimization-info.ts
33
+ function f(e) {
34
+ return e ? {
35
+ verticesCount: e.stats.vertices.after ?? 0,
36
+ primitivesCount: e.stats.triangles.after ?? 0,
37
+ meshesCount: e.stats.meshes.after ?? 0,
38
+ textureAssetCount: e.stats.texturesCount.after ?? 0,
39
+ materialsCount: e.stats.materials.after ?? 0,
40
+ sceneBytes: e.optimizedSize ?? 0
41
+ } : {
42
+ verticesCount: 0,
43
+ primitivesCount: 0,
44
+ meshesCount: 0,
45
+ textureAssetCount: 0,
46
+ materialsCount: 0,
47
+ sceneBytes: 0
48
+ };
49
+ }
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
+ return {
58
+ initial: {
59
+ verticesCount: e.verticesCount,
60
+ primitivesCount: e.primitivesCount,
61
+ meshesCount: e.meshesCount,
62
+ texturesCount: e.textureAssetCount,
63
+ sceneBytes: e.sceneBytes
64
+ },
65
+ optimized: {
66
+ verticesCount: n.verticesCount,
67
+ primitivesCount: n.primitivesCount,
68
+ meshesCount: n.meshesCount,
69
+ texturesCount: n.textureAssetCount,
70
+ sceneBytes: n.sceneBytes
71
+ },
72
+ improvement: {
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
+ }
79
+ };
80
+ }, [o, t]),
81
+ reset: r(() => {
82
+ n(null);
83
+ }, [])
84
+ };
85
+ };
86
+ //#endregion
87
+ //#region packages/hooks/src/use-optimize-model/utils/browser-texture-encoder.ts
88
+ async function m(e, t) {
89
+ let n = new Blob([e]), r = await createImageBitmap(n), { width: i, height: a } = r;
90
+ if (t.maxWidth || t.maxHeight) {
91
+ let e = t.maxWidth ? t.maxWidth / i : Infinity, n = t.maxHeight ? t.maxHeight / a : Infinity, r = Math.min(e, n, 1);
92
+ r < 1 && (i = Math.round(i * r), a = Math.round(a * r));
93
+ }
94
+ let o = new OffscreenCanvas(i, a), s = o.getContext("2d");
95
+ if (!s) throw r.close(), Error("OffscreenCanvas 2D context unavailable");
96
+ s.drawImage(r, 0, 0, i, a), r.close();
97
+ let c = t.format === "webp" ? "image/webp" : t.format === "jpeg" ? "image/jpeg" : "image/png", l = await o.convertToBlob({
98
+ type: c,
99
+ quality: t.quality / 100
100
+ });
101
+ return new Uint8Array(await l.arrayBuffer());
102
+ }
103
+ function h() {
104
+ return function(e) {
105
+ let t = e instanceof Uint8Array ? e : new Uint8Array(e), n = "webp", r = 80, i, a, o = {
106
+ resize(e, t, n) {
107
+ return i = e, a = t, o;
108
+ },
109
+ webp(e) {
110
+ return n = "webp", typeof e?.quality == "number" && (r = e.quality), o;
111
+ },
112
+ jpeg(e) {
113
+ return n = "jpeg", typeof e?.quality == "number" && (r = e.quality), o;
114
+ },
115
+ png(e) {
116
+ return n = "png", o;
117
+ },
118
+ toFormat(e, t) {
119
+ return (e === "webp" || e === "jpeg" || e === "png") && (n = e), typeof t?.quality == "number" && (r = t.quality), o;
120
+ },
121
+ async toBuffer() {
122
+ return m(t, {
123
+ format: n,
124
+ quality: r,
125
+ maxWidth: i,
126
+ maxHeight: a
127
+ });
128
+ },
129
+ async metadata() {
130
+ let e = new Blob([t]), n = await createImageBitmap(e), r = {
131
+ width: n.width,
132
+ height: n.height,
133
+ format: "unknown"
134
+ };
135
+ return n.close(), r;
136
+ }
137
+ };
138
+ return o;
139
+ };
140
+ }
141
+ //#endregion
142
+ //#region packages/hooks/src/use-optimize-model/utils/texture-optimization.ts
143
+ var g = async (e, t) => {
144
+ e.hasModel() && await e.compressTextures({
145
+ ...t,
146
+ encoder: h()
147
+ });
148
+ }, _ = () => {
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
+ let e = y.current;
152
+ return () => {
153
+ e.reset();
154
+ };
155
+ }, []);
156
+ let b = r(async (e) => {
157
+ c({ type: "LOAD_START" });
158
+ try {
159
+ let t = y.current;
160
+ await t.loadFromThreeJS(e), c({
161
+ type: "LOAD_SUCCESS",
162
+ payload: { report: await t.getReport() }
163
+ });
164
+ } catch (e) {
165
+ c({
166
+ type: "LOAD_ERROR",
167
+ payload: e
168
+ }), console.error("Error loading model:", e);
169
+ }
170
+ }, []), x = r(async (r) => {
171
+ c({ type: "LOAD_START" });
172
+ try {
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
+ for (let e of l) {
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
+ }
180
+ let u = {
181
+ json: r.gltfJson,
182
+ resources: o
183
+ };
184
+ await i.loadFromJSON(u), c({
185
+ type: "LOAD_SUCCESS",
186
+ payload: { report: await i.getReport() }
187
+ });
188
+ } catch (e) {
189
+ throw c({
190
+ type: "LOAD_ERROR",
191
+ payload: e
192
+ }), console.error("Error loading server scene into optimizer:", e), e;
193
+ }
194
+ }, []), S = r(async (e) => {
195
+ c({ type: "LOAD_START" });
196
+ try {
197
+ await y.current.loadFromBuffer(e), c({
198
+ type: "LOAD_SUCCESS",
199
+ payload: { report: await y.current.getReport() }
200
+ });
201
+ } catch (e) {
202
+ throw c({
203
+ type: "LOAD_ERROR",
204
+ payload: e
205
+ }), console.error("Error loading GLB buffer into optimizer:", e), e;
206
+ }
207
+ }, []), C = r(async (e, t) => {
208
+ c({ type: "LOAD_START" });
209
+ try {
210
+ await y.current.loadFromGLTFWithAssets(e, t), c({
211
+ type: "LOAD_SUCCESS",
212
+ payload: { report: await y.current.getReport() }
213
+ });
214
+ } catch (e) {
215
+ throw c({
216
+ type: "LOAD_ERROR",
217
+ payload: e
218
+ }), console.error("Error loading GLTF with assets into optimizer:", e), e;
219
+ }
220
+ }, []), w = r(async (e) => {
221
+ if (y.current.hasModel()) try {
222
+ await y.current.simplify(e), c({
223
+ type: "LOAD_SUCCESS",
224
+ payload: { report: await y.current.getReport() }
225
+ });
226
+ } catch (e) {
227
+ console.error("Simplification failed:", e);
228
+ }
229
+ }, []), T = r(async (e) => {
230
+ if (y.current.hasModel()) try {
231
+ await y.current.deduplicate(e), c({
232
+ type: "LOAD_SUCCESS",
233
+ payload: { report: await y.current.getReport() }
234
+ });
235
+ } catch (e) {
236
+ console.error("Deduplication failed:", e);
237
+ }
238
+ }, []), E = r(async (e) => {
239
+ if (y.current.hasModel()) try {
240
+ await y.current.quantize(e), c({
241
+ type: "LOAD_SUCCESS",
242
+ payload: { report: await y.current.getReport() }
243
+ });
244
+ } catch (e) {
245
+ console.error("Quantization failed:", e);
246
+ }
247
+ }, []), D = r(async (e) => {
248
+ if (y.current.hasModel()) try {
249
+ await y.current.optimizeNormals(e), c({
250
+ type: "LOAD_SUCCESS",
251
+ payload: { report: await y.current.getReport() }
252
+ });
253
+ } catch (e) {
254
+ console.error("Normals optimization failed:", e);
255
+ }
256
+ }, []), O = r(async (e) => {
257
+ try {
258
+ await g(y.current, e), c({
259
+ type: "LOAD_SUCCESS",
260
+ payload: { report: await y.current.getReport() }
261
+ });
262
+ } catch (e) {
263
+ throw console.error("Texture optimization failed:", e), e;
264
+ }
265
+ }, []), k = r(async () => {
266
+ if (!y.current.hasModel()) return null;
267
+ try {
268
+ return await y.current.export();
269
+ } catch (e) {
270
+ return console.error("Error getting model binary:", e), null;
271
+ }
272
+ }, []), A = r(() => y.current.hasModel() ? y.current.document : null, []);
273
+ return {
274
+ load: b,
275
+ loadFromServerSceneData: x,
276
+ loadFromGlbBuffer: S,
277
+ loadFromGLTFWithAssets: C,
278
+ getModel: k,
279
+ isReady: !!A() && !h,
280
+ _getDocument: A,
281
+ reset: r(() => {
282
+ y.current.reset(), c({ type: "RESET" }), v();
283
+ }, [v]),
284
+ error: m,
285
+ loading: h,
286
+ report: f,
287
+ info: _,
288
+ simplifyOptimization: w,
289
+ dedupOptimization: T,
290
+ quantizeOptimization: E,
291
+ normalsOptimization: D,
292
+ texturesOptimization: O
293
+ };
294
+ };
295
+ //#endregion
296
+ export { _ as t };
@@ -0,0 +1 @@
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=>{s({type:`LOAD_START`});try{await m.current.loadFromBuffer(e),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 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./chunk-gGpyby2o.cjs`);const e=require(`./use-optimize-model-C-fzzKh6.cjs`);exports.useOptimizeModel=e.t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./use-optimize-model-Jie2FUHc.cjs");exports.useOptimizeModel=e.t;
@@ -1,2 +1,2 @@
1
- import { t as e } from "./use-optimize-model-Cb3WMvDZ.js";
1
+ import { t as e } from "./use-optimize-model-CweunXiv.js";
2
2
  export { e as useOptimizeModel };
@@ -1 +0,0 @@
1
- require(`./chunk-gGpyby2o.cjs`);let e=require(`three`);function t(t,n){if(n===e.TrianglesDrawMode)return console.warn(`THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.`),t;if(n===e.TriangleFanDrawMode||n===e.TriangleStripDrawMode){let r=t.getIndex();if(r===null){let e=[],n=t.getAttribute(`position`);if(n!==void 0){for(let t=0;t<n.count;t++)e.push(t);t.setIndex(e),r=t.getIndex()}else return console.error(`THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.`),t}let i=r.count-2,a=[];if(n===e.TriangleFanDrawMode)for(let e=1;e<=i;e++)a.push(r.getX(0)),a.push(r.getX(e)),a.push(r.getX(e+1));else for(let e=0;e<i;e++)e%2==0?(a.push(r.getX(e)),a.push(r.getX(e+1)),a.push(r.getX(e+2))):(a.push(r.getX(e+2)),a.push(r.getX(e+1)),a.push(r.getX(e)));a.length/3!==i&&console.error(`THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.`);let o=t.clone();return o.setIndex(a),o.clearGroups(),o}else return console.error(`THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:`,n),t}function n(e){let t=new Map,n=new Map,i=e.clone();return r(e,i,function(e,r){t.set(r,e),n.set(e,r)}),i.traverse(function(e){if(!e.isSkinnedMesh)return;let r=e,i=t.get(e),a=i.skeleton.bones;r.skeleton=i.skeleton.clone(),r.bindMatrix.copy(i.bindMatrix),r.skeleton.bones=a.map(function(e){return n.get(e)}),r.bind(r.skeleton,r.bindMatrix)}),i}function r(e,t,n){n(e,t);for(let i=0;i<e.children.length;i++)r(e.children[i],t.children[i],n)}var i=class extends e.Loader{constructor(e){super(e),this.dracoLoader=null,this.ktx2Loader=null,this.meshoptDecoder=null,this.pluginCallbacks=[],this.register(function(e){return new d(e)}),this.register(function(e){return new f(e)}),this.register(function(e){return new x(e)}),this.register(function(e){return new S(e)}),this.register(function(e){return new C(e)}),this.register(function(e){return new m(e)}),this.register(function(e){return new h(e)}),this.register(function(e){return new g(e)}),this.register(function(e){return new _(e)}),this.register(function(e){return new u(e)}),this.register(function(e){return new v(e)}),this.register(function(e){return new p(e)}),this.register(function(e){return new b(e)}),this.register(function(e){return new y(e)}),this.register(function(e){return new c(e)}),this.register(function(e){return new w(e,s.EXT_MESHOPT_COMPRESSION)}),this.register(function(e){return new w(e,s.KHR_MESHOPT_COMPRESSION)}),this.register(function(e){return new T(e)})}load(t,n,r,i){let a=this,o;if(this.resourcePath!==``)o=this.resourcePath;else if(this.path!==``){let n=e.LoaderUtils.extractUrlBase(t);o=e.LoaderUtils.resolveURL(n,this.path)}else o=e.LoaderUtils.extractUrlBase(t);this.manager.itemStart(t);let s=function(e){i?i(e):console.error(e),a.manager.itemError(t),a.manager.itemEnd(t)},c=new e.FileLoader(this.manager);c.setPath(this.path),c.setResponseType(`arraybuffer`),c.setRequestHeader(this.requestHeader),c.setWithCredentials(this.withCredentials),c.load(t,function(e){try{a.parse(e,o,function(e){n(e),a.manager.itemEnd(t)},s)}catch(e){s(e)}},r,s)}setDRACOLoader(e){return this.dracoLoader=e,this}setKTX2Loader(e){return this.ktx2Loader=e,this}setMeshoptDecoder(e){return this.meshoptDecoder=e,this}register(e){return this.pluginCallbacks.indexOf(e)===-1&&this.pluginCallbacks.push(e),this}unregister(e){return this.pluginCallbacks.indexOf(e)!==-1&&this.pluginCallbacks.splice(this.pluginCallbacks.indexOf(e),1),this}parse(e,t,n,r){let i,a={},o={},c=new TextDecoder;if(typeof e==`string`)i=JSON.parse(e);else if(e instanceof ArrayBuffer)if(c.decode(new Uint8Array(e,0,4))===E){try{a[s.KHR_BINARY_GLTF]=new k(e)}catch(e){r&&r(e);return}i=JSON.parse(a[s.KHR_BINARY_GLTF].content)}else i=JSON.parse(c.decode(e));else i=e;if(i.asset===void 0||i.asset.version[0]<2){r&&r(Error(`THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.`));return}let u=new ne(i,{path:t||this.resourcePath||``,crossOrigin:this.crossOrigin,requestHeader:this.requestHeader,manager:this.manager,ktx2Loader:this.ktx2Loader,meshoptDecoder:this.meshoptDecoder});u.fileLoader.setRequestHeader(this.requestHeader);for(let e=0;e<this.pluginCallbacks.length;e++){let t=this.pluginCallbacks[e](u);t.name||console.error(`THREE.GLTFLoader: Invalid plugin found: missing name`),o[t.name]=t,a[t.name]=!0}if(i.extensionsUsed)for(let e=0;e<i.extensionsUsed.length;++e){let t=i.extensionsUsed[e],n=i.extensionsRequired||[];switch(t){case s.KHR_MATERIALS_UNLIT:a[t]=new l;break;case s.KHR_DRACO_MESH_COMPRESSION:a[t]=new A(i,this.dracoLoader);break;case s.KHR_TEXTURE_TRANSFORM:a[t]=new j;break;case s.KHR_MESH_QUANTIZATION:a[t]=new M;break;default:n.indexOf(t)>=0&&o[t]===void 0&&console.warn(`THREE.GLTFLoader: Unknown extension "`+t+`".`)}}u.setExtensions(a),u.setPlugins(o),u.parse(n,r)}parseAsync(e,t){let n=this;return new Promise(function(r,i){n.parse(e,t,r,i)})}};function a(){let e={};return{get:function(t){return e[t]},add:function(t,n){e[t]=n},remove:function(t){delete e[t]},removeAll:function(){e={}}}}function o(e,t,n){let r=e.json.materials[t];return r.extensions&&r.extensions[n]?r.extensions[n]:null}var s={KHR_BINARY_GLTF:`KHR_binary_glTF`,KHR_DRACO_MESH_COMPRESSION:`KHR_draco_mesh_compression`,KHR_LIGHTS_PUNCTUAL:`KHR_lights_punctual`,KHR_MATERIALS_CLEARCOAT:`KHR_materials_clearcoat`,KHR_MATERIALS_DISPERSION:`KHR_materials_dispersion`,KHR_MATERIALS_IOR:`KHR_materials_ior`,KHR_MATERIALS_SHEEN:`KHR_materials_sheen`,KHR_MATERIALS_SPECULAR:`KHR_materials_specular`,KHR_MATERIALS_TRANSMISSION:`KHR_materials_transmission`,KHR_MATERIALS_IRIDESCENCE:`KHR_materials_iridescence`,KHR_MATERIALS_ANISOTROPY:`KHR_materials_anisotropy`,KHR_MATERIALS_UNLIT:`KHR_materials_unlit`,KHR_MATERIALS_VOLUME:`KHR_materials_volume`,KHR_TEXTURE_BASISU:`KHR_texture_basisu`,KHR_TEXTURE_TRANSFORM:`KHR_texture_transform`,KHR_MESH_QUANTIZATION:`KHR_mesh_quantization`,KHR_MATERIALS_EMISSIVE_STRENGTH:`KHR_materials_emissive_strength`,EXT_MATERIALS_BUMP:`EXT_materials_bump`,EXT_TEXTURE_WEBP:`EXT_texture_webp`,EXT_TEXTURE_AVIF:`EXT_texture_avif`,EXT_MESHOPT_COMPRESSION:`EXT_meshopt_compression`,KHR_MESHOPT_COMPRESSION:`KHR_meshopt_compression`,EXT_MESH_GPU_INSTANCING:`EXT_mesh_gpu_instancing`},c=class{constructor(e){this.parser=e,this.name=s.KHR_LIGHTS_PUNCTUAL,this.cache={refs:{},uses:{}}}_markDefs(){let e=this.parser,t=this.parser.json.nodes||[];for(let n=0,r=t.length;n<r;n++){let r=t[n];r.extensions&&r.extensions[this.name]&&r.extensions[this.name].light!==void 0&&e._addNodeRef(this.cache,r.extensions[this.name].light)}}_loadLight(t){let n=this.parser,r=`light:`+t,i=n.cache.get(r);if(i)return i;let a=n.json,o=((a.extensions&&a.extensions[this.name]||{}).lights||[])[t],s,c=new e.Color(16777215);o.color!==void 0&&c.setRGB(o.color[0],o.color[1],o.color[2],e.LinearSRGBColorSpace);let l=o.range===void 0?0:o.range;switch(o.type){case`directional`:s=new e.DirectionalLight(c),s.target.position.set(0,0,-1),s.add(s.target);break;case`point`:s=new e.PointLight(c),s.distance=l;break;case`spot`:s=new e.SpotLight(c),s.distance=l,o.spot=o.spot||{},o.spot.innerConeAngle=o.spot.innerConeAngle===void 0?0:o.spot.innerConeAngle,o.spot.outerConeAngle=o.spot.outerConeAngle===void 0?Math.PI/4:o.spot.outerConeAngle,s.angle=o.spot.outerConeAngle,s.penumbra=1-o.spot.innerConeAngle/o.spot.outerConeAngle,s.target.position.set(0,0,-1),s.add(s.target);break;default:throw Error(`THREE.GLTFLoader: Unexpected light type: `+o.type)}return s.position.set(0,0,0),q(s,o),o.intensity!==void 0&&(s.intensity=o.intensity),s.name=n.createUniqueName(o.name||`light_`+t),i=Promise.resolve(s),n.cache.add(r,i),i}getDependency(e,t){if(e===`light`)return this._loadLight(t)}createNodeAttachment(e){let t=this,n=this.parser,r=n.json.nodes[e],i=(r.extensions&&r.extensions[this.name]||{}).light;return i===void 0?null:this._loadLight(i).then(function(e){return n._getNodeRef(t.cache,i,e)})}},l=class{constructor(){this.name=s.KHR_MATERIALS_UNLIT}getMaterialType(){return e.MeshBasicMaterial}extendParams(t,n,r){let i=[];t.color=new e.Color(1,1,1),t.opacity=1;let a=n.pbrMetallicRoughness;if(a){if(Array.isArray(a.baseColorFactor)){let n=a.baseColorFactor;t.color.setRGB(n[0],n[1],n[2],e.LinearSRGBColorSpace),t.opacity=n[3]}a.baseColorTexture!==void 0&&i.push(r.assignTexture(t,`map`,a.baseColorTexture,e.SRGBColorSpace))}return Promise.all(i)}},u=class{constructor(e){this.parser=e,this.name=s.KHR_MATERIALS_EMISSIVE_STRENGTH}extendMaterialParams(e,t){let n=o(this.parser,e,this.name);return n===null||n.emissiveStrength!==void 0&&(t.emissiveIntensity=n.emissiveStrength),Promise.resolve()}},d=class{constructor(e){this.parser=e,this.name=s.KHR_MATERIALS_CLEARCOAT}getMaterialType(t){return o(this.parser,t,this.name)===null?null:e.MeshPhysicalMaterial}extendMaterialParams(t,n){let r=o(this.parser,t,this.name);if(r===null)return Promise.resolve();let i=[];if(r.clearcoatFactor!==void 0&&(n.clearcoat=r.clearcoatFactor),r.clearcoatTexture!==void 0&&i.push(this.parser.assignTexture(n,`clearcoatMap`,r.clearcoatTexture)),r.clearcoatRoughnessFactor!==void 0&&(n.clearcoatRoughness=r.clearcoatRoughnessFactor),r.clearcoatRoughnessTexture!==void 0&&i.push(this.parser.assignTexture(n,`clearcoatRoughnessMap`,r.clearcoatRoughnessTexture)),r.clearcoatNormalTexture!==void 0&&(i.push(this.parser.assignTexture(n,`clearcoatNormalMap`,r.clearcoatNormalTexture)),r.clearcoatNormalTexture.scale!==void 0)){let t=r.clearcoatNormalTexture.scale;n.clearcoatNormalScale=new e.Vector2(t,t)}return Promise.all(i)}},f=class{constructor(e){this.parser=e,this.name=s.KHR_MATERIALS_DISPERSION}getMaterialType(t){return o(this.parser,t,this.name)===null?null:e.MeshPhysicalMaterial}extendMaterialParams(e,t){let n=o(this.parser,e,this.name);return n===null||(t.dispersion=n.dispersion===void 0?0:n.dispersion),Promise.resolve()}},p=class{constructor(e){this.parser=e,this.name=s.KHR_MATERIALS_IRIDESCENCE}getMaterialType(t){return o(this.parser,t,this.name)===null?null:e.MeshPhysicalMaterial}extendMaterialParams(e,t){let n=o(this.parser,e,this.name);if(n===null)return Promise.resolve();let r=[];return n.iridescenceFactor!==void 0&&(t.iridescence=n.iridescenceFactor),n.iridescenceTexture!==void 0&&r.push(this.parser.assignTexture(t,`iridescenceMap`,n.iridescenceTexture)),n.iridescenceIor!==void 0&&(t.iridescenceIOR=n.iridescenceIor),t.iridescenceThicknessRange===void 0&&(t.iridescenceThicknessRange=[100,400]),n.iridescenceThicknessMinimum!==void 0&&(t.iridescenceThicknessRange[0]=n.iridescenceThicknessMinimum),n.iridescenceThicknessMaximum!==void 0&&(t.iridescenceThicknessRange[1]=n.iridescenceThicknessMaximum),n.iridescenceThicknessTexture!==void 0&&r.push(this.parser.assignTexture(t,`iridescenceThicknessMap`,n.iridescenceThicknessTexture)),Promise.all(r)}},m=class{constructor(e){this.parser=e,this.name=s.KHR_MATERIALS_SHEEN}getMaterialType(t){return o(this.parser,t,this.name)===null?null:e.MeshPhysicalMaterial}extendMaterialParams(t,n){let r=o(this.parser,t,this.name);if(r===null)return Promise.resolve();let i=[];if(n.sheenColor=new e.Color(0,0,0),n.sheenRoughness=0,n.sheen=1,r.sheenColorFactor!==void 0){let t=r.sheenColorFactor;n.sheenColor.setRGB(t[0],t[1],t[2],e.LinearSRGBColorSpace)}return r.sheenRoughnessFactor!==void 0&&(n.sheenRoughness=r.sheenRoughnessFactor),r.sheenColorTexture!==void 0&&i.push(this.parser.assignTexture(n,`sheenColorMap`,r.sheenColorTexture,e.SRGBColorSpace)),r.sheenRoughnessTexture!==void 0&&i.push(this.parser.assignTexture(n,`sheenRoughnessMap`,r.sheenRoughnessTexture)),Promise.all(i)}},h=class{constructor(e){this.parser=e,this.name=s.KHR_MATERIALS_TRANSMISSION}getMaterialType(t){return o(this.parser,t,this.name)===null?null:e.MeshPhysicalMaterial}extendMaterialParams(e,t){let n=o(this.parser,e,this.name);if(n===null)return Promise.resolve();let r=[];return n.transmissionFactor!==void 0&&(t.transmission=n.transmissionFactor),n.transmissionTexture!==void 0&&r.push(this.parser.assignTexture(t,`transmissionMap`,n.transmissionTexture)),Promise.all(r)}},g=class{constructor(e){this.parser=e,this.name=s.KHR_MATERIALS_VOLUME}getMaterialType(t){return o(this.parser,t,this.name)===null?null:e.MeshPhysicalMaterial}extendMaterialParams(t,n){let r=o(this.parser,t,this.name);if(r===null)return Promise.resolve();let i=[];n.thickness=r.thicknessFactor===void 0?0:r.thicknessFactor,r.thicknessTexture!==void 0&&i.push(this.parser.assignTexture(n,`thicknessMap`,r.thicknessTexture)),n.attenuationDistance=r.attenuationDistance||1/0;let a=r.attenuationColor||[1,1,1];return n.attenuationColor=new e.Color().setRGB(a[0],a[1],a[2],e.LinearSRGBColorSpace),Promise.all(i)}},_=class{constructor(e){this.parser=e,this.name=s.KHR_MATERIALS_IOR}getMaterialType(t){return o(this.parser,t,this.name)===null?null:e.MeshPhysicalMaterial}extendMaterialParams(e,t){let n=o(this.parser,e,this.name);return n===null?Promise.resolve():(t.ior=n.ior===void 0?1.5:n.ior,t.ior===0&&(t.ior=1e3),Promise.resolve())}},v=class{constructor(e){this.parser=e,this.name=s.KHR_MATERIALS_SPECULAR}getMaterialType(t){return o(this.parser,t,this.name)===null?null:e.MeshPhysicalMaterial}extendMaterialParams(t,n){let r=o(this.parser,t,this.name);if(r===null)return Promise.resolve();let i=[];n.specularIntensity=r.specularFactor===void 0?1:r.specularFactor,r.specularTexture!==void 0&&i.push(this.parser.assignTexture(n,`specularIntensityMap`,r.specularTexture));let a=r.specularColorFactor||[1,1,1];return n.specularColor=new e.Color().setRGB(a[0],a[1],a[2],e.LinearSRGBColorSpace),r.specularColorTexture!==void 0&&i.push(this.parser.assignTexture(n,`specularColorMap`,r.specularColorTexture,e.SRGBColorSpace)),Promise.all(i)}},y=class{constructor(e){this.parser=e,this.name=s.EXT_MATERIALS_BUMP}getMaterialType(t){return o(this.parser,t,this.name)===null?null:e.MeshPhysicalMaterial}extendMaterialParams(e,t){let n=o(this.parser,e,this.name);if(n===null)return Promise.resolve();let r=[];return t.bumpScale=n.bumpFactor===void 0?1:n.bumpFactor,n.bumpTexture!==void 0&&r.push(this.parser.assignTexture(t,`bumpMap`,n.bumpTexture)),Promise.all(r)}},b=class{constructor(e){this.parser=e,this.name=s.KHR_MATERIALS_ANISOTROPY}getMaterialType(t){return o(this.parser,t,this.name)===null?null:e.MeshPhysicalMaterial}extendMaterialParams(e,t){let n=o(this.parser,e,this.name);if(n===null)return Promise.resolve();let r=[];return n.anisotropyStrength!==void 0&&(t.anisotropy=n.anisotropyStrength),n.anisotropyRotation!==void 0&&(t.anisotropyRotation=n.anisotropyRotation),n.anisotropyTexture!==void 0&&r.push(this.parser.assignTexture(t,`anisotropyMap`,n.anisotropyTexture)),Promise.all(r)}},x=class{constructor(e){this.parser=e,this.name=s.KHR_TEXTURE_BASISU}loadTexture(e){let t=this.parser,n=t.json,r=n.textures[e];if(!r.extensions||!r.extensions[this.name])return null;let i=r.extensions[this.name],a=t.options.ktx2Loader;if(!a){if(n.extensionsRequired&&n.extensionsRequired.indexOf(this.name)>=0)throw Error(`THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures`);return null}return t.loadTextureImage(e,i.source,a)}},S=class{constructor(e){this.parser=e,this.name=s.EXT_TEXTURE_WEBP}loadTexture(e){let t=this.name,n=this.parser,r=n.json,i=r.textures[e];if(!i.extensions||!i.extensions[t])return null;let a=i.extensions[t],o=r.images[a.source],s=n.textureLoader;if(o.uri){let e=n.options.manager.getHandler(o.uri);e!==null&&(s=e)}return n.loadTextureImage(e,a.source,s)}},C=class{constructor(e){this.parser=e,this.name=s.EXT_TEXTURE_AVIF}loadTexture(e){let t=this.name,n=this.parser,r=n.json,i=r.textures[e];if(!i.extensions||!i.extensions[t])return null;let a=i.extensions[t],o=r.images[a.source],s=n.textureLoader;if(o.uri){let e=n.options.manager.getHandler(o.uri);e!==null&&(s=e)}return n.loadTextureImage(e,a.source,s)}},w=class{constructor(e,t){this.name=t,this.parser=e}loadBufferView(e){let t=this.parser.json,n=t.bufferViews[e];if(n.extensions&&n.extensions[this.name]){let e=n.extensions[this.name],r=this.parser.getDependency(`buffer`,e.buffer),i=this.parser.options.meshoptDecoder;if(!i||!i.supported){if(t.extensionsRequired&&t.extensionsRequired.indexOf(this.name)>=0)throw Error(`THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files`);return null}return r.then(function(t){let n=e.byteOffset||0,r=e.byteLength||0,a=e.count,o=e.byteStride,s=new Uint8Array(t,n,r);return i.decodeGltfBufferAsync?i.decodeGltfBufferAsync(a,o,s,e.mode,e.filter).then(function(e){return e.buffer}):i.ready.then(function(){let t=new ArrayBuffer(a*o);return i.decodeGltfBuffer(new Uint8Array(t),a,o,s,e.mode,e.filter),t})})}else return null}},T=class{constructor(e){this.name=s.EXT_MESH_GPU_INSTANCING,this.parser=e}createNodeMesh(t){let n=this.parser.json,r=n.nodes[t];if(!r.extensions||!r.extensions[this.name]||r.mesh===void 0)return null;let i=n.meshes[r.mesh];for(let e of i.primitives)if(e.mode!==I.TRIANGLES&&e.mode!==I.TRIANGLE_STRIP&&e.mode!==I.TRIANGLE_FAN&&e.mode!==void 0)return null;let a=r.extensions[this.name].attributes,o=[],s={};for(let e in a)o.push(this.parser.getDependency(`accessor`,a[e]).then(t=>(s[e]=t,s[e])));return o.length<1?null:(o.push(this.parser.createNodeMesh(t)),Promise.all(o).then(t=>{let n=t.pop(),r=n.isGroup?n.children:[n],i=t[0].count,a=[];for(let t of r){let n=new e.Matrix4,r=new e.Vector3,o=new e.Quaternion,c=new e.Vector3(1,1,1),l=new e.InstancedMesh(t.geometry,t.material,i);for(let e=0;e<i;e++)s.TRANSLATION&&r.fromBufferAttribute(s.TRANSLATION,e),s.ROTATION&&o.fromBufferAttribute(s.ROTATION,e),s.SCALE&&c.fromBufferAttribute(s.SCALE,e),l.setMatrixAt(e,n.compose(r,o,c));for(let n in s)if(n===`_COLOR_0`){let t=s[n];l.instanceColor=new e.InstancedBufferAttribute(t.array,t.itemSize,t.normalized)}else n!==`TRANSLATION`&&n!==`ROTATION`&&n!==`SCALE`&&t.geometry.setAttribute(n,s[n]);e.Object3D.prototype.copy.call(l,t),this.parser.assignFinalMaterial(l),a.push(l)}return n.isGroup?(n.clear(),n.add(...a),n):a[0]}))}},E=`glTF`,D=12,O={JSON:1313821514,BIN:5130562},k=class{constructor(e){this.name=s.KHR_BINARY_GLTF,this.content=null,this.body=null;let t=new DataView(e,0,D),n=new TextDecoder;if(this.header={magic:n.decode(new Uint8Array(e.slice(0,4))),version:t.getUint32(4,!0),length:t.getUint32(8,!0)},this.header.magic!==E)throw Error(`THREE.GLTFLoader: Unsupported glTF-Binary header.`);if(this.header.version<2)throw Error(`THREE.GLTFLoader: Legacy binary file detected.`);let r=this.header.length-D,i=new DataView(e,D),a=0;for(;a<r;){let t=i.getUint32(a,!0);a+=4;let r=i.getUint32(a,!0);if(a+=4,r===O.JSON){let r=new Uint8Array(e,D+a,t);this.content=n.decode(r)}else if(r===O.BIN){let n=D+a;this.body=e.slice(n,n+t)}a+=t}if(this.content===null)throw Error(`THREE.GLTFLoader: JSON content not found.`)}},A=class{constructor(e,t){if(!t)throw Error(`THREE.GLTFLoader: No DRACOLoader instance provided.`);this.name=s.KHR_DRACO_MESH_COMPRESSION,this.json=e,this.dracoLoader=t,this.dracoLoader.preload()}decodePrimitive(t,n){let r=this.json,i=this.dracoLoader,a=t.extensions[this.name].bufferView,o=t.extensions[this.name].attributes,s={},c={},l={};for(let e in o){let t=V[e]||e.toLowerCase();s[t]=o[e]}for(let e in t.attributes){let n=V[e]||e.toLowerCase();if(o[e]!==void 0){let i=r.accessors[t.attributes[e]];l[n]=L[i.componentType].name,c[n]=i.normalized===!0}}return n.getDependency(`bufferView`,a).then(function(t){return new Promise(function(n,r){i.decodeDracoFile(t,function(e){for(let t in e.attributes){let n=e.attributes[t],r=c[t];r!==void 0&&(n.normalized=r)}n(e)},s,l,e.LinearSRGBColorSpace,r)})})}},j=class{constructor(){this.name=s.KHR_TEXTURE_TRANSFORM}extendTexture(e,t){return(t.texCoord===void 0||t.texCoord===e.channel)&&t.offset===void 0&&t.rotation===void 0&&t.scale===void 0?e:(e=e.clone(),t.texCoord!==void 0&&(e.channel=t.texCoord),t.offset!==void 0&&e.offset.fromArray(t.offset),t.rotation!==void 0&&(e.rotation=t.rotation),t.scale!==void 0&&e.repeat.fromArray(t.scale),e.needsUpdate=!0,e)}},M=class{constructor(){this.name=s.KHR_MESH_QUANTIZATION}},N=class extends e.Interpolant{constructor(e,t,n,r){super(e,t,n,r)}copySampleValue_(e){let t=this.resultBuffer,n=this.sampleValues,r=this.valueSize,i=e*r*3+r;for(let e=0;e!==r;e++)t[e]=n[i+e];return t}interpolate_(e,t,n,r){let i=this.resultBuffer,a=this.sampleValues,o=this.valueSize,s=o*2,c=o*3,l=r-t,u=(n-t)/l,d=u*u,f=d*u,p=e*c,m=p-c,h=-2*f+3*d,g=f-d,_=1-h,v=g-d+u;for(let e=0;e!==o;e++){let t=a[m+e+o],n=a[m+e+s]*l,r=a[p+e+o],c=a[p+e]*l;i[e]=_*t+v*n+h*r+g*c}return i}},P=new e.Quaternion,F=class extends N{interpolate_(e,t,n,r){let i=super.interpolate_(e,t,n,r);return P.fromArray(i).normalize().toArray(i),i}},I={FLOAT:5126,FLOAT_MAT3:35675,FLOAT_MAT4:35676,FLOAT_VEC2:35664,FLOAT_VEC3:35665,FLOAT_VEC4:35666,LINEAR:9729,REPEAT:10497,SAMPLER_2D:35678,POINTS:0,LINES:1,LINE_LOOP:2,LINE_STRIP:3,TRIANGLES:4,TRIANGLE_STRIP:5,TRIANGLE_FAN:6,UNSIGNED_BYTE:5121,UNSIGNED_SHORT:5123},L={5120:Int8Array,5121:Uint8Array,5122:Int16Array,5123:Uint16Array,5125:Uint32Array,5126:Float32Array},R={9728:e.NearestFilter,9729:e.LinearFilter,9984:e.NearestMipmapNearestFilter,9985:e.LinearMipmapNearestFilter,9986:e.NearestMipmapLinearFilter,9987:e.LinearMipmapLinearFilter},z={33071:e.ClampToEdgeWrapping,33648:e.MirroredRepeatWrapping,10497:e.RepeatWrapping},B={SCALAR:1,VEC2:2,VEC3:3,VEC4:4,MAT2:4,MAT3:9,MAT4:16},V={POSITION:`position`,NORMAL:`normal`,TANGENT:`tangent`,TEXCOORD_0:`uv`,TEXCOORD_1:`uv1`,TEXCOORD_2:`uv2`,TEXCOORD_3:`uv3`,COLOR_0:`color`,WEIGHTS_0:`skinWeight`,JOINTS_0:`skinIndex`},H={scale:`scale`,translation:`position`,rotation:`quaternion`,weights:`morphTargetInfluences`},U={CUBICSPLINE:void 0,LINEAR:e.InterpolateLinear,STEP:e.InterpolateDiscrete},W={OPAQUE:`OPAQUE`,MASK:`MASK`,BLEND:`BLEND`};function G(t){return t.DefaultMaterial===void 0&&(t.DefaultMaterial=new e.MeshStandardMaterial({color:16777215,emissive:0,metalness:1,roughness:1,transparent:!1,depthTest:!0,side:e.FrontSide})),t.DefaultMaterial}function K(e,t,n){for(let r in n.extensions)e[r]===void 0&&(t.userData.gltfExtensions=t.userData.gltfExtensions||{},t.userData.gltfExtensions[r]=n.extensions[r])}function q(e,t){t.extras!==void 0&&(typeof t.extras==`object`?Object.assign(e.userData,t.extras):console.warn(`THREE.GLTFLoader: Ignoring primitive type .extras, `+t.extras))}function J(e,t,n){let r=!1,i=!1,a=!1;for(let e=0,n=t.length;e<n;e++){let n=t[e];if(n.POSITION!==void 0&&(r=!0),n.NORMAL!==void 0&&(i=!0),n.COLOR_0!==void 0&&(a=!0),r&&i&&a)break}if(!r&&!i&&!a)return Promise.resolve(e);let o=[],s=[],c=[];for(let l=0,u=t.length;l<u;l++){let u=t[l];if(r){let t=u.POSITION===void 0?e.attributes.position:n.getDependency(`accessor`,u.POSITION);o.push(t)}if(i){let t=u.NORMAL===void 0?e.attributes.normal:n.getDependency(`accessor`,u.NORMAL);s.push(t)}if(a){let t=u.COLOR_0===void 0?e.attributes.color:n.getDependency(`accessor`,u.COLOR_0);c.push(t)}}return Promise.all([Promise.all(o),Promise.all(s),Promise.all(c)]).then(function(t){let n=t[0],o=t[1],s=t[2];return r&&(e.morphAttributes.position=n),i&&(e.morphAttributes.normal=o),a&&(e.morphAttributes.color=s),e.morphTargetsRelative=!0,e})}function Y(e,t){if(e.updateMorphTargets(),t.weights!==void 0)for(let n=0,r=t.weights.length;n<r;n++)e.morphTargetInfluences[n]=t.weights[n];if(t.extras&&Array.isArray(t.extras.targetNames)){let n=t.extras.targetNames;if(e.morphTargetInfluences.length===n.length){e.morphTargetDictionary={};for(let t=0,r=n.length;t<r;t++)e.morphTargetDictionary[n[t]]=t}else console.warn(`THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.`)}}function X(e){let t,n=e.extensions&&e.extensions[s.KHR_DRACO_MESH_COMPRESSION];if(t=n?`draco:`+n.bufferView+`:`+n.indices+`:`+Z(n.attributes):e.indices+`:`+Z(e.attributes)+`:`+e.mode,e.targets!==void 0)for(let n=0,r=e.targets.length;n<r;n++)t+=`:`+Z(e.targets[n]);return t}function Z(e){let t=``,n=Object.keys(e).sort();for(let r=0,i=n.length;r<i;r++)t+=n[r]+`:`+e[n[r]]+`;`;return t}function Q(e){switch(e){case Int8Array:return 1/127;case Uint8Array:return 1/255;case Int16Array:return 1/32767;case Uint16Array:return 1/65535;default:throw Error(`THREE.GLTFLoader: Unsupported normalized accessor component type.`)}}function ee(e){return e.search(/\.jpe?g($|\?)/i)>0||e.search(/^data\:image\/jpeg/)===0?`image/jpeg`:e.search(/\.webp($|\?)/i)>0||e.search(/^data\:image\/webp/)===0?`image/webp`:e.search(/\.ktx2($|\?)/i)>0||e.search(/^data\:image\/ktx2/)===0?`image/ktx2`:`image/png`}var te=new e.Matrix4,ne=class{constructor(t={},n={}){this.json=t,this.extensions={},this.plugins={},this.options=n,this.cache=new a,this.associations=new Map,this.primitiveCache={},this.nodeCache={},this.meshCache={refs:{},uses:{}},this.cameraCache={refs:{},uses:{}},this.lightCache={refs:{},uses:{}},this.sourceCache={},this.textureCache={},this.nodeNamesUsed={};let r=!1,i=-1,o=!1,s=-1;if(typeof navigator<`u`&&navigator.userAgent!==void 0){let e=navigator.userAgent;r=/^((?!chrome|android).)*safari/i.test(e)===!0;let t=e.match(/Version\/(\d+)/);i=r&&t?parseInt(t[1],10):-1,o=e.indexOf(`Firefox`)>-1,s=o?e.match(/Firefox\/([0-9]+)\./)[1]:-1}typeof createImageBitmap>`u`||r&&i<17||o&&s<98?this.textureLoader=new e.TextureLoader(this.options.manager):this.textureLoader=new e.ImageBitmapLoader(this.options.manager),this.textureLoader.setCrossOrigin(this.options.crossOrigin),this.textureLoader.setRequestHeader(this.options.requestHeader),this.fileLoader=new e.FileLoader(this.options.manager),this.fileLoader.setResponseType(`arraybuffer`),this.options.crossOrigin===`use-credentials`&&this.fileLoader.setWithCredentials(!0)}setExtensions(e){this.extensions=e}setPlugins(e){this.plugins=e}parse(e,t){let n=this,r=this.json,i=this.extensions;this.cache.removeAll(),this.nodeCache={},this._invokeAll(function(e){return e._markDefs&&e._markDefs()}),Promise.all(this._invokeAll(function(e){return e.beforeRoot&&e.beforeRoot()})).then(function(){return Promise.all([n.getDependencies(`scene`),n.getDependencies(`animation`),n.getDependencies(`camera`)])}).then(function(t){let a={scene:t[0][r.scene||0],scenes:t[0],animations:t[1],cameras:t[2],asset:r.asset,parser:n,userData:{}};return K(i,a,r),q(a,r),Promise.all(n._invokeAll(function(e){return e.afterRoot&&e.afterRoot(a)})).then(function(){for(let e of a.scenes)e.updateMatrixWorld();e(a)})}).catch(t)}_markDefs(){let e=this.json.nodes||[],t=this.json.skins||[],n=this.json.meshes||[];for(let n=0,r=t.length;n<r;n++){let r=t[n].joints;for(let t=0,n=r.length;t<n;t++)e[r[t]].isBone=!0}for(let t=0,r=e.length;t<r;t++){let r=e[t];r.mesh!==void 0&&(this._addNodeRef(this.meshCache,r.mesh),r.skin!==void 0&&(n[r.mesh].isSkinnedMesh=!0)),r.camera!==void 0&&this._addNodeRef(this.cameraCache,r.camera)}}_addNodeRef(e,t){t!==void 0&&(e.refs[t]===void 0&&(e.refs[t]=e.uses[t]=0),e.refs[t]++)}_getNodeRef(e,t,n){if(e.refs[t]<=1)return n;let r=n.clone(),i=(e,t)=>{let n=this.associations.get(e);n!=null&&this.associations.set(t,n);for(let[n,r]of e.children.entries())i(r,t.children[n])};return i(n,r),r.name+=`_instance_`+ e.uses[t]++,r}_invokeOne(e){let t=Object.values(this.plugins);t.push(this);for(let n=0;n<t.length;n++){let r=e(t[n]);if(r)return r}return null}_invokeAll(e){let t=Object.values(this.plugins);t.unshift(this);let n=[];for(let r=0;r<t.length;r++){let i=e(t[r]);i&&n.push(i)}return n}getDependency(e,t){let n=e+`:`+t,r=this.cache.get(n);if(!r){switch(e){case`scene`:r=this.loadScene(t);break;case`node`:r=this._invokeOne(function(e){return e.loadNode&&e.loadNode(t)});break;case`mesh`:r=this._invokeOne(function(e){return e.loadMesh&&e.loadMesh(t)});break;case`accessor`:r=this.loadAccessor(t);break;case`bufferView`:r=this._invokeOne(function(e){return e.loadBufferView&&e.loadBufferView(t)});break;case`buffer`:r=this.loadBuffer(t);break;case`material`:r=this._invokeOne(function(e){return e.loadMaterial&&e.loadMaterial(t)});break;case`texture`:r=this._invokeOne(function(e){return e.loadTexture&&e.loadTexture(t)});break;case`skin`:r=this.loadSkin(t);break;case`animation`:r=this._invokeOne(function(e){return e.loadAnimation&&e.loadAnimation(t)});break;case`camera`:r=this.loadCamera(t);break;default:if(r=this._invokeOne(function(n){return n!=this&&n.getDependency&&n.getDependency(e,t)}),!r)throw Error(`Unknown type: `+e);break}this.cache.add(n,r)}return r}getDependencies(e){let t=this.cache.get(e);if(!t){let n=this,r=this.json[e+(e===`mesh`?`es`:`s`)]||[];t=Promise.all(r.map(function(t,r){return n.getDependency(e,r)})),this.cache.add(e,t)}return t}loadBuffer(t){let n=this.json.buffers[t],r=this.fileLoader;if(n.type&&n.type!==`arraybuffer`)throw Error(`THREE.GLTFLoader: `+n.type+` buffer type is not supported.`);if(n.uri===void 0&&t===0)return Promise.resolve(this.extensions[s.KHR_BINARY_GLTF].body);let i=this.options;return new Promise(function(t,a){r.load(e.LoaderUtils.resolveURL(n.uri,i.path),t,void 0,function(){a(Error(`THREE.GLTFLoader: Failed to load buffer "`+n.uri+`".`))})})}loadBufferView(e){let t=this.json.bufferViews[e];return this.getDependency(`buffer`,t.buffer).then(function(e){let n=t.byteLength||0,r=t.byteOffset||0;return e.slice(r,r+n)})}loadAccessor(t){let n=this,r=this.json,i=this.json.accessors[t];if(i.bufferView===void 0&&i.sparse===void 0){let t=B[i.type],n=L[i.componentType],r=i.normalized===!0,a=new n(i.count*t);return Promise.resolve(new e.BufferAttribute(a,t,r))}let a=[];return i.bufferView===void 0?a.push(null):a.push(this.getDependency(`bufferView`,i.bufferView)),i.sparse!==void 0&&(a.push(this.getDependency(`bufferView`,i.sparse.indices.bufferView)),a.push(this.getDependency(`bufferView`,i.sparse.values.bufferView))),Promise.all(a).then(function(t){let a=t[0],o=B[i.type],s=L[i.componentType],c=s.BYTES_PER_ELEMENT,l=c*o,u=i.byteOffset||0,d=i.bufferView===void 0?void 0:r.bufferViews[i.bufferView].byteStride,f=i.normalized===!0,p,m;if(d&&d!==l){let t=Math.floor(u/d),r=`InterleavedBuffer:`+i.bufferView+`:`+i.componentType+`:`+t+`:`+i.count,l=n.cache.get(r);l||(p=new s(a,t*d,i.count*d/c),l=new e.InterleavedBuffer(p,d/c),n.cache.add(r,l)),m=new e.InterleavedBufferAttribute(l,o,u%d/c,f)}else p=a===null?new s(i.count*o):new s(a,u,i.count*o),m=new e.BufferAttribute(p,o,f);if(i.sparse!==void 0){let n=B.SCALAR,r=L[i.sparse.indices.componentType],c=i.sparse.indices.byteOffset||0,l=i.sparse.values.byteOffset||0,u=new r(t[1],c,i.sparse.count*n),d=new s(t[2],l,i.sparse.count*o);a!==null&&(m=new e.BufferAttribute(m.array.slice(),m.itemSize,m.normalized)),m.normalized=!1;for(let e=0,t=u.length;e<t;e++){let t=u[e];if(m.setX(t,d[e*o]),o>=2&&m.setY(t,d[e*o+1]),o>=3&&m.setZ(t,d[e*o+2]),o>=4&&m.setW(t,d[e*o+3]),o>=5)throw Error(`THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.`)}m.normalized=f}return m})}loadTexture(e){let t=this.json,n=this.options,r=t.textures[e].source,i=t.images[r],a=this.textureLoader;if(i.uri){let e=n.manager.getHandler(i.uri);e!==null&&(a=e)}return this.loadTextureImage(e,r,a)}loadTextureImage(t,n,r){let i=this,a=this.json,o=a.textures[t],s=a.images[n],c=(s.uri||s.bufferView)+`:`+o.sampler;if(this.textureCache[c])return this.textureCache[c];let l=this.loadImageSource(n,r).then(function(n){n.flipY=!1,n.name=o.name||s.name||``,n.name===``&&typeof s.uri==`string`&&s.uri.startsWith(`data:image/`)===!1&&(n.name=s.uri);let r=(a.samplers||{})[o.sampler]||{};return n.magFilter=R[r.magFilter]||e.LinearFilter,n.minFilter=R[r.minFilter]||e.LinearMipmapLinearFilter,n.wrapS=z[r.wrapS]||e.RepeatWrapping,n.wrapT=z[r.wrapT]||e.RepeatWrapping,n.generateMipmaps=!n.isCompressedTexture&&n.minFilter!==e.NearestFilter&&n.minFilter!==e.LinearFilter,i.associations.set(n,{textures:t}),n}).catch(function(){return null});return this.textureCache[c]=l,l}loadImageSource(t,n){let r=this,i=this.json,a=this.options;if(this.sourceCache[t]!==void 0)return this.sourceCache[t].then(e=>e.clone());let o=i.images[t],s=self.URL||self.webkitURL,c=o.uri||``,l=!1;if(o.bufferView!==void 0)c=r.getDependency(`bufferView`,o.bufferView).then(function(e){l=!0;let t=new Blob([e],{type:o.mimeType});return c=s.createObjectURL(t),c});else if(o.uri===void 0)throw Error(`THREE.GLTFLoader: Image `+t+` is missing URI and bufferView`);let u=Promise.resolve(c).then(function(t){return new Promise(function(r,i){let o=r;n.isImageBitmapLoader===!0&&(o=function(t){let n=new e.Texture(t);n.needsUpdate=!0,r(n)}),n.load(e.LoaderUtils.resolveURL(t,a.path),o,void 0,i)})}).then(function(e){return l===!0&&s.revokeObjectURL(c),q(e,o),e.userData.mimeType=o.mimeType||ee(o.uri),e}).catch(function(e){throw console.error(`THREE.GLTFLoader: Couldn't load texture`,c),e});return this.sourceCache[t]=u,u}assignTexture(e,t,n,r){let i=this;return this.getDependency(`texture`,n.index).then(function(a){if(!a)return null;if(n.texCoord!==void 0&&n.texCoord>0&&(a=a.clone(),a.channel=n.texCoord),i.extensions[s.KHR_TEXTURE_TRANSFORM]){let e=n.extensions===void 0?void 0:n.extensions[s.KHR_TEXTURE_TRANSFORM];if(e){let t=i.associations.get(a);a=i.extensions[s.KHR_TEXTURE_TRANSFORM].extendTexture(a,e),i.associations.set(a,t)}}return r!==void 0&&(a.colorSpace=r),e[t]=a,a})}assignFinalMaterial(t){let n=t.geometry,r=t.material,i=n.attributes.tangent===void 0,a=n.attributes.color!==void 0,o=n.attributes.normal===void 0;if(t.isPoints){let t=`PointsMaterial:`+r.uuid,n=this.cache.get(t);n||(n=new e.PointsMaterial,e.Material.prototype.copy.call(n,r),n.color.copy(r.color),n.map=r.map,n.sizeAttenuation=!1,this.cache.add(t,n)),r=n}else if(t.isLine){let t=`LineBasicMaterial:`+r.uuid,n=this.cache.get(t);n||(n=new e.LineBasicMaterial,e.Material.prototype.copy.call(n,r),n.color.copy(r.color),n.map=r.map,this.cache.add(t,n)),r=n}if(i||a||o){let e=`ClonedMaterial:`+r.uuid+`:`;i&&(e+=`derivative-tangents:`),a&&(e+=`vertex-colors:`),o&&(e+=`flat-shading:`);let t=this.cache.get(e);t||(t=r.clone(),a&&(t.vertexColors=!0),o&&(t.flatShading=!0),i&&(t.normalScale&&(t.normalScale.y*=-1),t.clearcoatNormalScale&&(t.clearcoatNormalScale.y*=-1)),this.cache.add(e,t),this.associations.set(t,this.associations.get(r))),r=t}t.material=r}getMaterialType(){return e.MeshStandardMaterial}loadMaterial(t){let n=this,r=this.json,i=this.extensions,a=r.materials[t],o,c={},l=a.extensions||{},u=[];if(l[s.KHR_MATERIALS_UNLIT]){let e=i[s.KHR_MATERIALS_UNLIT];o=e.getMaterialType(),u.push(e.extendParams(c,a,n))}else{let r=a.pbrMetallicRoughness||{};if(c.color=new e.Color(1,1,1),c.opacity=1,Array.isArray(r.baseColorFactor)){let t=r.baseColorFactor;c.color.setRGB(t[0],t[1],t[2],e.LinearSRGBColorSpace),c.opacity=t[3]}r.baseColorTexture!==void 0&&u.push(n.assignTexture(c,`map`,r.baseColorTexture,e.SRGBColorSpace)),c.metalness=r.metallicFactor===void 0?1:r.metallicFactor,c.roughness=r.roughnessFactor===void 0?1:r.roughnessFactor,r.metallicRoughnessTexture!==void 0&&(u.push(n.assignTexture(c,`metalnessMap`,r.metallicRoughnessTexture)),u.push(n.assignTexture(c,`roughnessMap`,r.metallicRoughnessTexture))),o=this._invokeOne(function(e){return e.getMaterialType&&e.getMaterialType(t)}),u.push(Promise.all(this._invokeAll(function(e){return e.extendMaterialParams&&e.extendMaterialParams(t,c)})))}a.doubleSided===!0&&(c.side=e.DoubleSide);let d=a.alphaMode||W.OPAQUE;if(d===W.BLEND?(c.transparent=!0,c.depthWrite=!1):(c.transparent=!1,d===W.MASK&&(c.alphaTest=a.alphaCutoff===void 0?.5:a.alphaCutoff)),a.normalTexture!==void 0&&o!==e.MeshBasicMaterial&&(u.push(n.assignTexture(c,`normalMap`,a.normalTexture)),c.normalScale=new e.Vector2(1,1),a.normalTexture.scale!==void 0)){let e=a.normalTexture.scale;c.normalScale.set(e,e)}if(a.occlusionTexture!==void 0&&o!==e.MeshBasicMaterial&&(u.push(n.assignTexture(c,`aoMap`,a.occlusionTexture)),a.occlusionTexture.strength!==void 0&&(c.aoMapIntensity=a.occlusionTexture.strength)),a.emissiveFactor!==void 0&&o!==e.MeshBasicMaterial){let t=a.emissiveFactor;c.emissive=new e.Color().setRGB(t[0],t[1],t[2],e.LinearSRGBColorSpace)}return a.emissiveTexture!==void 0&&o!==e.MeshBasicMaterial&&u.push(n.assignTexture(c,`emissiveMap`,a.emissiveTexture,e.SRGBColorSpace)),Promise.all(u).then(function(){let e=new o(c);return a.name&&(e.name=a.name),q(e,a),n.associations.set(e,{materials:t}),a.extensions&&K(i,e,a),e})}createUniqueName(t){let n=e.PropertyBinding.sanitizeNodeName(t||``);return n in this.nodeNamesUsed?n+`_`+ ++this.nodeNamesUsed[n]:(this.nodeNamesUsed[n]=0,n)}loadGeometries(t){let n=this,r=this.extensions,i=this.primitiveCache;function a(e){return r[s.KHR_DRACO_MESH_COMPRESSION].decodePrimitive(e,n).then(function(t){return $(t,e,n)})}let o=[];for(let r=0,c=t.length;r<c;r++){let c=t[r],l=X(c),u=i[l];if(u)o.push(u.promise);else{let t;t=c.extensions&&c.extensions[s.KHR_DRACO_MESH_COMPRESSION]?a(c):$(new e.BufferGeometry,c,n),i[l]={primitive:c,promise:t},o.push(t)}}return Promise.all(o)}loadMesh(n){let r=this,i=this.json,a=this.extensions,o=i.meshes[n],s=o.primitives,c=[];for(let e=0,t=s.length;e<t;e++){let t=s[e].material===void 0?G(this.cache):this.getDependency(`material`,s[e].material);c.push(t)}return c.push(r.loadGeometries(s)),Promise.all(c).then(function(i){let c=i.slice(0,i.length-1),l=i[i.length-1],u=[];for(let i=0,d=l.length;i<d;i++){let d=l[i],f=s[i],p,m=c[i];if(f.mode===I.TRIANGLES||f.mode===I.TRIANGLE_STRIP||f.mode===I.TRIANGLE_FAN||f.mode===void 0)p=o.isSkinnedMesh===!0?new e.SkinnedMesh(d,m):new e.Mesh(d,m),p.isSkinnedMesh===!0&&p.normalizeSkinWeights(),f.mode===I.TRIANGLE_STRIP?p.geometry=t(p.geometry,e.TriangleStripDrawMode):f.mode===I.TRIANGLE_FAN&&(p.geometry=t(p.geometry,e.TriangleFanDrawMode));else if(f.mode===I.LINES)p=new e.LineSegments(d,m);else if(f.mode===I.LINE_STRIP)p=new e.Line(d,m);else if(f.mode===I.LINE_LOOP)p=new e.LineLoop(d,m);else if(f.mode===I.POINTS)p=new e.Points(d,m);else throw Error(`THREE.GLTFLoader: Primitive mode unsupported: `+f.mode);Object.keys(p.geometry.morphAttributes).length>0&&Y(p,o),p.name=r.createUniqueName(o.name||`mesh_`+n),q(p,o),f.extensions&&K(a,p,f),r.assignFinalMaterial(p),u.push(p)}for(let e=0,t=u.length;e<t;e++)r.associations.set(u[e],{meshes:n,primitives:e});if(u.length===1)return o.extensions&&K(a,u[0],o),u[0];let d=new e.Group;o.extensions&&K(a,d,o),r.associations.set(d,{meshes:n});for(let e=0,t=u.length;e<t;e++)d.add(u[e]);return d})}loadCamera(t){let n,r=this.json.cameras[t],i=r[r.type];if(!i){console.warn(`THREE.GLTFLoader: Missing camera parameters.`);return}return r.type===`perspective`?n=new e.PerspectiveCamera(e.MathUtils.radToDeg(i.yfov),i.aspectRatio||1,i.znear||1,i.zfar||2e6):r.type===`orthographic`&&(n=new e.OrthographicCamera(-i.xmag,i.xmag,i.ymag,-i.ymag,i.znear,i.zfar)),r.name&&(n.name=this.createUniqueName(r.name)),q(n,r),Promise.resolve(n)}loadSkin(t){let n=this.json.skins[t],r=[];for(let e=0,t=n.joints.length;e<t;e++)r.push(this._loadNodeShallow(n.joints[e]));return n.inverseBindMatrices===void 0?r.push(null):r.push(this.getDependency(`accessor`,n.inverseBindMatrices)),Promise.all(r).then(function(t){let r=t.pop(),i=t,a=[],o=[];for(let t=0,s=i.length;t<s;t++){let s=i[t];if(s){a.push(s);let n=new e.Matrix4;r!==null&&n.fromArray(r.array,t*16),o.push(n)}else console.warn(`THREE.GLTFLoader: Joint "%s" could not be found.`,n.joints[t])}return new e.Skeleton(a,o)})}loadAnimation(t){let n=this.json,r=this,i=n.animations[t],a=i.name?i.name:`animation_`+t,o=[],s=[],c=[],l=[],u=[];for(let e=0,t=i.channels.length;e<t;e++){let t=i.channels[e],n=i.samplers[t.sampler],r=t.target,a=r.node,d=i.parameters===void 0?n.input:i.parameters[n.input],f=i.parameters===void 0?n.output:i.parameters[n.output];r.node!==void 0&&(o.push(this.getDependency(`node`,a)),s.push(this.getDependency(`accessor`,d)),c.push(this.getDependency(`accessor`,f)),l.push(n),u.push(r))}return Promise.all([Promise.all(o),Promise.all(s),Promise.all(c),Promise.all(l),Promise.all(u)]).then(function(t){let n=t[0],o=t[1],s=t[2],c=t[3],l=t[4],u=[];for(let e=0,t=n.length;e<t;e++){let t=n[e],i=o[e],a=s[e],d=c[e],f=l[e];if(t===void 0)continue;t.updateMatrix&&t.updateMatrix();let p=r._createAnimationTracks(t,i,a,d,f);if(p)for(let e=0;e<p.length;e++)u.push(p[e])}let d=new e.AnimationClip(a,void 0,u);return q(d,i),d})}createNodeMesh(e){let t=this.json,n=this,r=t.nodes[e];return r.mesh===void 0?null:n.getDependency(`mesh`,r.mesh).then(function(e){let t=n._getNodeRef(n.meshCache,r.mesh,e);return r.weights!==void 0&&t.traverse(function(e){if(e.isMesh)for(let t=0,n=r.weights.length;t<n;t++)e.morphTargetInfluences[t]=r.weights[t]}),t})}loadNode(t){let n=this.json,r=this,i=n.nodes[t],a=r._loadNodeShallow(t),o=[],s=i.children||[];for(let e=0,t=s.length;e<t;e++)o.push(r.getDependency(`node`,s[e]));let c=i.skin===void 0?Promise.resolve(null):r.getDependency(`skin`,i.skin);return Promise.all([a,Promise.all(o),c]).then(function(t){let n=t[0],r=t[1],i=t[2];i!==null&&n.traverse(function(e){e.isSkinnedMesh&&e.bind(i,te)});for(let e=0,t=r.length;e<t;e++)n.add(r[e]);if(n.userData.pivot!==void 0&&r.length>0){let t=n.userData.pivot,i=r[0];n.pivot=new e.Vector3().fromArray(t),n.position.x-=t[0],n.position.y-=t[1],n.position.z-=t[2],i.position.set(0,0,0),delete n.userData.pivot}return n})}_loadNodeShallow(t){let n=this.json,r=this.extensions,i=this;if(this.nodeCache[t]!==void 0)return this.nodeCache[t];let a=n.nodes[t],o=a.name?i.createUniqueName(a.name):``,s=[],c=i._invokeOne(function(e){return e.createNodeMesh&&e.createNodeMesh(t)});return c&&s.push(c),a.camera!==void 0&&s.push(i.getDependency(`camera`,a.camera).then(function(e){return i._getNodeRef(i.cameraCache,a.camera,e)})),i._invokeAll(function(e){return e.createNodeAttachment&&e.createNodeAttachment(t)}).forEach(function(e){s.push(e)}),this.nodeCache[t]=Promise.all(s).then(function(n){let s;if(s=a.isBone===!0?new e.Bone:n.length>1?new e.Group:n.length===1?n[0]:new e.Object3D,s!==n[0])for(let e=0,t=n.length;e<t;e++)s.add(n[e]);if(a.name&&(s.userData.name=a.name,s.name=o),q(s,a),a.extensions&&K(r,s,a),a.matrix!==void 0){let t=new e.Matrix4;t.fromArray(a.matrix),s.applyMatrix4(t)}else a.translation!==void 0&&s.position.fromArray(a.translation),a.rotation!==void 0&&s.quaternion.fromArray(a.rotation),a.scale!==void 0&&s.scale.fromArray(a.scale);if(!i.associations.has(s))i.associations.set(s,{});else if(a.mesh!==void 0&&i.meshCache.refs[a.mesh]>1){let e=i.associations.get(s);i.associations.set(s,{...e})}return i.associations.get(s).nodes=t,s}),this.nodeCache[t]}loadScene(t){let r=this.extensions,i=this.json.scenes[t],a=this,o=new e.Group;i.name&&(o.name=a.createUniqueName(i.name)),q(o,i),i.extensions&&K(r,o,i);let s=i.nodes||[],c=[];for(let e=0,t=s.length;e<t;e++)c.push(a.getDependency(`node`,s[e]));return Promise.all(c).then(function(t){for(let e=0,r=t.length;e<r;e++){let r=t[e];r.parent===null?o.add(r):o.add(n(r))}return a.associations=(t=>{let n=new Map;for(let[t,r]of a.associations)(t instanceof e.Material||t instanceof e.Texture)&&n.set(t,r);return t.traverse(e=>{let t=a.associations.get(e);t!=null&&n.set(e,t)}),n})(o),o})}_createAnimationTracks(t,n,r,i,a){let o=[],s=t.name?t.name:t.uuid,c=[];function l(e){e.morphTargetInfluences&&c.push(e.name?e.name:e.uuid)}H[a.path]===H.weights?(l(t),t.isGroup&&t.children.forEach(l)):c.push(s);let u;switch(H[a.path]){case H.weights:u=e.NumberKeyframeTrack;break;case H.rotation:u=e.QuaternionKeyframeTrack;break;case H.translation:case H.scale:u=e.VectorKeyframeTrack;break;default:switch(r.itemSize){case 1:u=e.NumberKeyframeTrack;break;default:u=e.VectorKeyframeTrack;break}break}let d=i.interpolation===void 0?e.InterpolateLinear:U[i.interpolation],f=this._getArrayFromAccessor(r);for(let e=0,t=c.length;e<t;e++){let t=new u(c[e]+`.`+H[a.path],n.array,f,d);i.interpolation===`CUBICSPLINE`&&this._createCubicSplineTrackInterpolant(t),o.push(t)}return o}_getArrayFromAccessor(e){let t=e.array;if(e.normalized){let e=Q(t.constructor),n=new Float32Array(t.length);for(let r=0,i=t.length;r<i;r++)n[r]=t[r]*e;t=n}return t}_createCubicSplineTrackInterpolant(t){t.createInterpolant=function(t){return new(this instanceof e.QuaternionKeyframeTrack?F:N)(this.times,this.values,this.getValueSize()/3,t)},t.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline=!0}};function re(t,n,r){let i=n.attributes,a=new e.Box3;if(i.POSITION!==void 0){let t=r.json.accessors[i.POSITION],n=t.min,o=t.max;if(n!==void 0&&o!==void 0){if(a.set(new e.Vector3(n[0],n[1],n[2]),new e.Vector3(o[0],o[1],o[2])),t.normalized){let e=Q(L[t.componentType]);a.min.multiplyScalar(e),a.max.multiplyScalar(e)}}else{console.warn(`THREE.GLTFLoader: Missing min/max properties for accessor POSITION.`);return}}else return;let o=n.targets;if(o!==void 0){let t=new e.Vector3,n=new e.Vector3;for(let e=0,i=o.length;e<i;e++){let i=o[e];if(i.POSITION!==void 0){let e=r.json.accessors[i.POSITION],a=e.min,o=e.max;if(a!==void 0&&o!==void 0){if(n.setX(Math.max(Math.abs(a[0]),Math.abs(o[0]))),n.setY(Math.max(Math.abs(a[1]),Math.abs(o[1]))),n.setZ(Math.max(Math.abs(a[2]),Math.abs(o[2]))),e.normalized){let t=Q(L[e.componentType]);n.multiplyScalar(t)}t.max(n)}else console.warn(`THREE.GLTFLoader: Missing min/max properties for accessor POSITION.`)}}a.expandByVector(t)}t.boundingBox=a;let s=new e.Sphere;a.getCenter(s.center),s.radius=a.min.distanceTo(a.max)/2,t.boundingSphere=s}function $(t,n,r){let i=n.attributes,a=[];function o(e,n){return r.getDependency(`accessor`,e).then(function(e){t.setAttribute(n,e)})}for(let e in i){let n=V[e]||e.toLowerCase();n in t.attributes||a.push(o(i[e],n))}if(n.indices!==void 0&&!t.index){let e=r.getDependency(`accessor`,n.indices).then(function(e){t.setIndex(e)});a.push(e)}return e.ColorManagement.workingColorSpace!==e.LinearSRGBColorSpace&&`COLOR_0`in i&&console.warn(`THREE.GLTFLoader: Converting vertex colors from "srgb-linear" to "${e.ColorManagement.workingColorSpace}" not supported.`),q(t,n),re(t,n,r),Promise.all(a).then(function(){return n.targets===void 0?t:J(t,n.targets,r)})}exports.GLTFLoader=i;