@vctrl/hooks 0.22.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.
@@ -1,5 +1,5 @@
1
- import { useCallback as e, useEffect as t, useMemo as n, useReducer as r, useRef as i, useState as a } from "react";
2
- import { buildAssetLookupKeys as o, normalizeAssetUri as s, toSerializedAssetBytes as c } from "@vctrl/core";
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 = (r) => {
51
- let [i, o] = a(null), s = r.report;
52
- return t(() => {
53
- !i && s && o(s);
54
- }, [i, s]), {
55
- info: n(() => {
56
- let e = f(i), t = f(s);
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: t.verticesCount,
67
- primitivesCount: t.primitivesCount,
68
- meshesCount: t.meshesCount,
69
- texturesCount: t.textureAssetCount,
70
- sceneBytes: t.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 - t.verticesCount,
74
- primitivesCount: e.primitivesCount - t.primitivesCount,
75
- meshesCount: e.meshesCount - t.meshesCount,
76
- texturesCount: e.textureAssetCount - t.textureAssetCount,
77
- sceneBytes: e.sceneBytes - t.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
- }, [s, i]),
81
- reset: e(() => {
82
- o(null);
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 [n, a] = r(d, u), { report: f, error: m, loading: h } = n, { info: _, reset: v } = p(n), y = i(new l());
150
- t(() => {
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 = e(async (e) => {
157
- a({ type: "LOAD_START" });
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), a({
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
- a({
165
+ c({
166
166
  type: "LOAD_ERROR",
167
167
  payload: e
168
168
  }), console.error("Error loading model:", e);
169
169
  }
170
- }, []), x = e(async (e) => {
171
- a({ type: "LOAD_START" });
170
+ }, []), x = r(async (r) => {
171
+ c({ type: "LOAD_START" });
172
172
  try {
173
- let t = y.current, n = /* @__PURE__ */ new Map();
174
- for (let t of Object.values(e.assetData ?? {})) for (let e of o(t.fileName)) n.set(e, t);
175
- let r = {}, i = e.gltfJson, l = [...(i.images ?? []).map((e) => e.uri).filter((e) => !!e && !e.startsWith("data:")), ...(i.buffers ?? []).map((e) => e.uri).filter((e) => !!e && !e.startsWith("data:"))];
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 t = s(e), i = t.split("/").pop() || t, a = n.get(e) ?? n.get(t) ?? n.get(i);
178
- a && (r[e] = c(a));
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: e.gltfJson,
182
- resources: r
181
+ json: r.gltfJson,
182
+ resources: o
183
183
  };
184
- await t.loadFromJSON(u), a({
184
+ await i.loadFromJSON(u), c({
185
185
  type: "LOAD_SUCCESS",
186
- payload: { report: await t.getReport() }
186
+ payload: { report: await i.getReport() }
187
187
  });
188
188
  } catch (e) {
189
- throw a({
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 = e(async (e) => {
195
- a({ type: "LOAD_START" });
194
+ }, []), S = r(async (e) => {
195
+ c({ type: "LOAD_START" });
196
196
  try {
197
- await y.current.loadFromBuffer(e), a({
197
+ await y.current.loadFromBuffer(e), c({
198
198
  type: "LOAD_SUCCESS",
199
199
  payload: { report: await y.current.getReport() }
200
200
  });
201
201
  } catch (e) {
202
- throw a({
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 = e(async (e, t) => {
208
- a({ type: "LOAD_START" });
207
+ }, []), C = r(async (e, t) => {
208
+ c({ type: "LOAD_START" });
209
209
  try {
210
- await y.current.loadFromGLTFWithAssets(e, t), a({
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 a({
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 = e(async (e) => {
220
+ }, []), w = r(async (e) => {
221
221
  if (y.current.hasModel()) try {
222
- await y.current.simplify(e), a({
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 = e(async (e) => {
229
+ }, []), T = r(async (e) => {
230
230
  if (y.current.hasModel()) try {
231
- await y.current.deduplicate(e), a({
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 = e(async (e) => {
238
+ }, []), E = r(async (e) => {
239
239
  if (y.current.hasModel()) try {
240
- await y.current.quantize(e), a({
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 = e(async (e) => {
247
+ }, []), D = r(async (e) => {
248
248
  if (y.current.hasModel()) try {
249
- await y.current.optimizeNormals(e), a({
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 = e(async (e) => {
256
+ }, []), O = r(async (e) => {
257
257
  try {
258
- await g(y.current, e), a({
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 = e(async () => {
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 = e(() => y.current.hasModel() ? y.current.document : null, []);
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: e(() => {
282
- y.current.reset(), a({ type: "RESET" }), v();
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
- let e=require("react"),t=require("@vctrl/core"),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=t=>{let[n,r]=(0,e.useState)(null),i=t.report;return(0,e.useEffect)(()=>{!n&&i&&r(i)},[n,i]),{info:(0,e.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,e.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,e.useReducer)(i,r),{report:c,error:u,loading:d}=a,{info:f,reset:p}=o(a),m=(0,e.useRef)(new n.ModelOptimizer);(0,e.useEffect)(()=>{let e=m.current;return()=>{e.reset()}},[]);let h=(0,e.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,e.useCallback)(async e=>{s({type:`LOAD_START`});try{let n=m.current,r=new Map;for(let n of Object.values(e.assetData??{}))for(let e of(0,t.buildAssetLookupKeys)(n.fileName))r.set(e,n);let i={},a=e.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 e of o){let n=(0,t.normalizeAssetUri)(e),a=n.split(`/`).pop()||n,o=r.get(e)??r.get(n)??r.get(a);o&&(i[e]=(0,t.toSerializedAssetBytes)(o))}let c={json:e.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,e.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,e.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,e.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,e.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,e.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,e.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,e.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,e.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,e.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,e.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
+ 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`});const e=require("./use-optimize-model-CPGezwrM.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-KAGxtv_k.js";
1
+ import { t as e } from "./use-optimize-model-CweunXiv.js";
2
2
  export { e as useOptimizeModel };
@@ -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}});