@needle-tools/gltf-progressive 3.6.0-alpha.3 → 3.6.0-canary.027a4c9

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,69 +1,98 @@
1
- import { BufferGeometry as j, Mesh as K, Box3 as ue, Vector3 as P, Sphere as Ce, CompressedTexture as ze, Texture as q, Matrix3 as Ee, InterleavedBuffer as Ne, InterleavedBufferAttribute as Ve, BufferAttribute as Xe, TextureLoader as je, Color as ke, Matrix4 as Pe, Clock as Ke } from "three";
2
- import { GLTFLoader as Le } from "three/examples/jsm/loaders/GLTFLoader.js";
3
- import { MeshoptDecoder as Ye } from "three/examples/jsm/libs/meshopt_decoder.module.js";
4
- import { DRACOLoader as He } from "three/examples/jsm/loaders/DRACOLoader.js";
5
- import { KTX2Loader as Qe } from "three/examples/jsm/loaders/KTX2Loader.js";
6
- const Je = "";
7
- globalThis.GLTF_PROGRESSIVE_VERSION = Je;
1
+ import * as Xe from "three";
2
+ import { RedFormat as je, RedIntegerFormat as Ke, RGFormat as Ye, RGIntegerFormat as He, RGBFormat as Qe, RGBAFormat as Je, RGBAIntegerFormat as Ze, BufferGeometry as j, Mesh as K, Box3 as ue, Vector3 as P, Sphere as Ae, CompressedTexture as et, Texture as q, Matrix3 as tt, InterleavedBuffer as st, InterleavedBufferAttribute as rt, BufferAttribute as nt, TextureLoader as it, Color as Ie, Matrix4 as $e } from "three";
3
+ import { GLTFLoader as De } from "three/examples/jsm/loaders/GLTFLoader.js";
4
+ import { MeshoptDecoder as ot } from "three/examples/jsm/libs/meshopt_decoder.module.js";
5
+ import { DRACOLoader as at } from "three/examples/jsm/loaders/DRACOLoader.js";
6
+ import { KTX2Loader as lt } from "three/examples/jsm/loaders/KTX2Loader.js";
7
+ const ut = "";
8
+ globalThis.GLTF_PROGRESSIVE_VERSION = ut;
8
9
  console.debug("[gltf-progressive] version -");
9
10
  let $ = "https://www.gstatic.com/draco/versioned/decoders/1.5.7/", Y = "https://cdn.needle.tools/static/three/0.179.1/basis2/";
10
- const Ze = $, et = Y, Re = new URL($ + "draco_decoder.js");
11
- Re.searchParams.append("range", "true");
12
- fetch(Re, {
11
+ const ct = $, ft = Y, Be = new URL($ + "draco_decoder.js");
12
+ Be.searchParams.append("range", "true");
13
+ fetch(Be, {
13
14
  method: "GET",
14
15
  headers: {
15
16
  Range: "bytes=0-1"
16
17
  }
17
18
  }).catch((i) => {
18
- console.debug(`Failed to fetch remote Draco decoder from ${$} (offline: ${typeof navigator < "u" ? navigator.onLine : "unknown"})`), $ === Ze && st("./include/draco/"), Y === et && rt("./include/ktx2/");
19
+ console.debug(`Failed to fetch remote Draco decoder from ${$} (offline: ${typeof navigator < "u" ? navigator.onLine : "unknown"})`), $ === ct && ht("./include/draco/"), Y === ft && gt("./include/ktx2/");
19
20
  }).finally(() => {
20
- Ie();
21
+ qe();
21
22
  });
22
- const tt = () => ({
23
+ const dt = () => ({
23
24
  dracoDecoderPath: $,
24
25
  ktx2TranscoderPath: Y
25
26
  });
26
- function st(i) {
27
- $ = i, k && k[ye] != $ ? (console.debug("Updating Draco decoder path to " + i), k[ye] = $, k.setDecoderPath($), k.preload()) : console.debug("Setting Draco decoder path to " + i);
27
+ function ht(i) {
28
+ $ = i, C && C[ye] != $ ? (console.debug("Updating Draco decoder path to " + i), C[ye] = $, C.setDecoderPath($), C.preload()) : console.debug("Setting Draco decoder path to " + i);
28
29
  }
29
- function rt(i) {
30
+ function gt(i) {
30
31
  Y = i, B && B.transcoderPath != Y ? (console.debug("Updating KTX2 transcoder path to " + i), B.setTranscoderPath(Y), B.init()) : console.debug("Setting KTX2 transcoder path to " + i);
31
32
  }
32
- function ve(i) {
33
- return Ie(), i ? B.detectSupport(i) : i !== null && console.warn("No renderer provided to detect ktx2 support - loading KTX2 textures might fail"), { dracoLoader: k, ktx2Loader: B, meshoptDecoder: le };
33
+ function _e(i) {
34
+ return qe(), i ? B.detectSupport(i) : i !== null && console.warn("No renderer provided to detect ktx2 support - loading KTX2 textures might fail"), { dracoLoader: C, ktx2Loader: B, meshoptDecoder: le };
34
35
  }
35
- function Ae(i) {
36
- i.dracoLoader || i.setDRACOLoader(k), i.ktx2Loader || i.setKTX2Loader(B), i.meshoptDecoder || i.setMeshoptDecoder(le);
36
+ function Ge(i) {
37
+ i.dracoLoader || i.setDRACOLoader(C), i.ktx2Loader || i.setKTX2Loader(B), i.meshoptDecoder || i.setMeshoptDecoder(le);
37
38
  }
38
39
  const ye = /* @__PURE__ */ Symbol("dracoDecoderPath");
39
- let k, le, B;
40
- function Ie() {
41
- k || (k = new He(), k[ye] = $, k.setDecoderPath($), k.setDecoderConfig({ type: "js" }), k.preload()), B || (B = new Qe(), B.setTranscoderPath(Y), B.init()), le || (le = Ye);
40
+ let C, le, B;
41
+ function qe() {
42
+ C || (C = new at(), C[ye] = $, C.setDecoderPath($), C.setDecoderConfig({ type: "js" }), C.preload()), B || (B = new lt(), B.setTranscoderPath(Y), B.init()), le || (le = ot);
42
43
  }
43
44
  const xe = /* @__PURE__ */ new WeakMap();
44
- function $e(i, t) {
45
+ function We(i, t) {
45
46
  let e = xe.get(i);
46
47
  e ? e = Object.assign(e, t) : e = t, xe.set(i, e);
47
48
  }
48
- const nt = Le.prototype.load;
49
- function it(...i) {
49
+ const pt = De.prototype.load;
50
+ function mt(...i) {
50
51
  const t = xe.get(this);
51
52
  let e = i[0];
52
- const s = new URL(e, window.location.href);
53
- if (s.hostname.endsWith("needle.tools")) {
53
+ const s = yt(e);
54
+ if (s?.hostname.endsWith("needle.tools")) {
54
55
  const n = t?.progressive !== void 0 ? t.progressive : !0, o = t?.usecase ? t.usecase : "default";
55
56
  n ? this.requestHeader.Accept = `*/*;progressive=allowed;usecase=${o}` : this.requestHeader.Accept = `*/*;usecase=${o}`, e = s.toString();
56
57
  }
57
- return i[0] = e, nt?.call(this, ...i);
58
+ return i[0] = e, pt?.call(this, ...i);
59
+ }
60
+ De.prototype.load = mt;
61
+ function yt(i) {
62
+ try {
63
+ if (i instanceof URL)
64
+ return i;
65
+ const t = globalThis.location?.href;
66
+ return t ? new URL(i, t) : new URL(i);
67
+ } catch {
68
+ return null;
69
+ }
70
+ }
71
+ function Oe(i) {
72
+ return i != null && i.data != null;
73
+ }
74
+ function we(i) {
75
+ const t = i.source?.data;
76
+ return t != null && typeof t == "object" ? t : null;
77
+ }
78
+ function xt(i) {
79
+ const t = i.image;
80
+ return t != null && typeof t == "object" ? t : null;
81
+ }
82
+ function Le(i) {
83
+ const t = xt(i), e = we(i);
84
+ return {
85
+ width: t?.width || e?.width || 0,
86
+ height: t?.height || e?.height || 0
87
+ };
58
88
  }
59
- Le.prototype.load = it;
60
89
  N("debugprogressive");
61
90
  function N(i) {
62
91
  if (typeof window > "u") return !1;
63
92
  const e = new URL(window.location.href).searchParams.get(i);
64
93
  return e == null || e === "0" || e === "false" ? !1 : e === "" ? !0 : e;
65
94
  }
66
- function ot(i, t) {
95
+ function wt(i, t) {
67
96
  if (t === void 0 || i === void 0 || t.startsWith("./") || t.startsWith("http") || t.startsWith("data:") || t.startsWith("blob:"))
68
97
  return t;
69
98
  const e = i.lastIndexOf("/");
@@ -74,16 +103,18 @@ function ot(i, t) {
74
103
  }
75
104
  return t;
76
105
  }
77
- function _e() {
78
- return Z !== void 0 || (Z = /iPhone|iPad|iPod|Android|IEMobile/i.test(navigator.userAgent), N("debugprogressive") && console.log("[glTF Progressive]: isMobileDevice", Z)), Z;
106
+ function Me() {
107
+ if (Z !== void 0) return Z;
108
+ const i = globalThis.navigator?.userAgent || "";
109
+ return Z = /iPhone|iPad|iPod|Android|IEMobile/i.test(i), N("debugprogressive") && console.log("[glTF Progressive]: isMobileDevice", Z), Z;
79
110
  }
80
111
  let Z;
81
- function Be() {
112
+ function Fe() {
82
113
  if (typeof window > "u") return !1;
83
114
  const i = new URL(window.location.href), t = i.hostname === "localhost" || /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(i.hostname);
84
115
  return i.hostname === "127.0.0.1" || t;
85
116
  }
86
- class at {
117
+ class Lt {
87
118
  constructor(t, e = {}) {
88
119
  this.maxConcurrent = t, this.debug = e.debug ?? !1, typeof window < "u" && window.requestAnimationFrame(this.tick);
89
120
  }
@@ -117,29 +148,29 @@ class at {
117
148
  }
118
149
  }
119
150
  }
120
- function lt(i) {
121
- const t = i.image?.width ?? 0, e = i.image?.height ?? 0, s = i.image?.depth ?? 1, r = Math.floor(Math.log2(Math.max(t, e, s))) + 1, n = ut(i);
122
- return t * e * s * n * (1 - Math.pow(0.25, r)) / (1 - 0.25);
151
+ function vt(i) {
152
+ const t = i.image, e = t?.width ?? 0, s = t?.height ?? 0, r = t?.depth ?? 1, n = Math.floor(Math.log2(Math.max(e, s, r))) + 1, o = Dt(i);
153
+ return e * s * r * o * (1 - Math.pow(0.25, n)) / (1 - 0.25);
123
154
  }
124
- function ut(i) {
155
+ function Dt(i) {
125
156
  let t = 4;
126
157
  const e = i.format;
127
- e === 1024 || e === 1025 ? t = 1 : e === 1026 || e === 1027 ? t = 2 : e === 1022 || e === 1029 ? t = 3 : (e === 1023 || e === 1033) && (t = 4);
158
+ e === je || e === Ke ? t = 1 : e === Ye || e === He ? t = 2 : e === Qe || e === 1029 ? t = 3 : (e === Je || e === Ze) && (t = 4);
128
159
  let s = 1;
129
160
  const r = i.type;
130
161
  return r === 1009 || r === 1010 ? s = 1 : r === 1011 || r === 1012 ? s = 2 : r === 1013 || r === 1014 || r === 1015 ? s = 4 : r === 1016 && (s = 2), t * s;
131
162
  }
132
- const ct = typeof window > "u" && typeof document > "u", we = /* @__PURE__ */ Symbol("needle:raycast-mesh");
163
+ const _t = typeof window > "u" && typeof document > "u", ve = /* @__PURE__ */ Symbol("needle:raycast-mesh");
133
164
  function ne(i) {
134
- return i?.[we] instanceof j ? i[we] : null;
165
+ return i?.[ve] instanceof j ? i[ve] : null;
135
166
  }
136
- function dt(i, t) {
167
+ function Mt(i, t) {
137
168
  if ((i.type === "Mesh" || i.type === "SkinnedMesh") && !ne(i)) {
138
- const s = ht(t);
139
- s.userData = { isRaycastMesh: !0 }, i[we] = s;
169
+ const s = Ot(t);
170
+ s.userData = { isRaycastMesh: !0 }, i[ve] = s;
140
171
  }
141
172
  }
142
- function ft(i = !0) {
173
+ function bt(i = !0) {
143
174
  if (i) {
144
175
  if (ee) return;
145
176
  const t = ee = K.prototype.raycast;
@@ -154,7 +185,7 @@ function ft(i = !0) {
154
185
  }
155
186
  }
156
187
  let ee = null;
157
- function ht(i) {
188
+ function Ot(i) {
158
189
  const t = new j();
159
190
  for (const e in i.attributes)
160
191
  t.setAttribute(e, i.getAttribute(e));
@@ -173,27 +204,27 @@ if (h) {
173
204
  !isNaN(s) && s >= 0 && (X = s, console.log(`Set LOD level to [${X}]`));
174
205
  });
175
206
  }
176
- function Ge(i) {
207
+ function Ue(i) {
177
208
  if (h && re !== void 0)
178
209
  if (Array.isArray(i))
179
210
  for (const t of i)
180
- Ge(t);
211
+ Ue(t);
181
212
  else i && "wireframe" in i && (i.wireframe = re === !0);
182
213
  }
183
214
  const te = new Array();
184
- let gt = 0;
185
- const pt = _e() ? 2 : 10;
186
- function mt(i) {
187
- if (te.length < pt) {
215
+ let Tt = 0;
216
+ const St = Me() ? 2 : 10;
217
+ function Rt(i) {
218
+ if (te.length < St) {
188
219
  const s = te.length;
189
220
  h && console.warn(`[Worker] Creating new worker #${s}`);
190
- const r = De.createWorker(i || {});
221
+ const r = be.createWorker(i || {});
191
222
  return te.push(r), r;
192
223
  }
193
- const t = gt++ % te.length;
224
+ const t = Tt++ % te.length;
194
225
  return te[t];
195
226
  }
196
- class De {
227
+ class be {
197
228
  constructor(t, e) {
198
229
  this.worker = t, this._debug = e.debug ?? !1, t.onmessage = (s) => {
199
230
  const r = s.data;
@@ -201,7 +232,7 @@ class De {
201
232
  case "loaded-gltf":
202
233
  for (const n of this._running)
203
234
  if (n.url === r.result.url) {
204
- yt(r.result), n.resolve(r.result);
235
+ Ct(r.result), n.resolve(r.result);
205
236
  const o = n.url;
206
237
  o.startsWith("blob:") && URL.revokeObjectURL(o);
207
238
  }
@@ -220,19 +251,26 @@ class De {
220
251
  ), {
221
252
  type: "module"
222
253
  });
223
- return new De(e, t);
254
+ return new be(e, t);
224
255
  }
225
256
  _running = [];
226
257
  _webglRenderer = null;
227
258
  async load(t, e) {
228
- const s = tt();
259
+ const s = dt();
229
260
  let r = e?.renderer;
230
261
  r || (this._webglRenderer ??= (async () => {
231
262
  const { WebGLRenderer: u } = await import("three");
232
263
  return new u();
233
264
  })(), r = await this._webglRenderer);
234
- const a = ve(r).ktx2Loader.workerConfig;
235
- t instanceof URL ? t = t.toString() : t.startsWith("file:") ? t = URL.createObjectURL(new Blob([t])) : !t.startsWith("blob:") && !t.startsWith("http:") && !t.startsWith("https:") && (t = new URL(t, window.location.href).toString());
265
+ const a = _e(r).ktx2Loader.workerConfig;
266
+ if (t instanceof URL)
267
+ t = t.toString();
268
+ else if (t.startsWith("file:"))
269
+ t = URL.createObjectURL(new Blob([t]));
270
+ else if (!t.startsWith("blob:") && !t.startsWith("http:") && !t.startsWith("https:")) {
271
+ const u = globalThis.location?.href;
272
+ u && (t = new URL(t, u).toString());
273
+ }
236
274
  const l = {
237
275
  type: "load",
238
276
  url: t,
@@ -249,20 +287,20 @@ class De {
249
287
  }
250
288
  _debug = !1;
251
289
  }
252
- function yt(i) {
290
+ function Ct(i) {
253
291
  for (const t of i.geometries) {
254
292
  const e = t.geometry, s = new j();
255
293
  if (s.name = e.name || "", e.index) {
256
294
  const r = e.index;
257
- s.setIndex(de(r));
295
+ s.setIndex(fe(r));
258
296
  }
259
297
  for (const r in e.attributes) {
260
- const n = e.attributes[r], o = de(n);
298
+ const n = e.attributes[r], o = fe(n);
261
299
  s.setAttribute(r, o);
262
300
  }
263
301
  if (e.morphAttributes)
264
302
  for (const r in e.morphAttributes) {
265
- const o = e.morphAttributes[r].map((a) => de(a));
303
+ const o = e.morphAttributes[r].map((a) => fe(a));
266
304
  s.morphAttributes[r] = o;
267
305
  }
268
306
  if (s.morphTargetsRelative = e.morphTargetsRelative ?? !1, s.boundingBox = new ue(), s.boundingBox.min = new P(
@@ -273,7 +311,7 @@ function yt(i) {
273
311
  e.boundingBox?.max.x,
274
312
  e.boundingBox?.max.y,
275
313
  e.boundingBox?.max.z
276
- ), s.boundingSphere = new Ce(
314
+ ), s.boundingSphere = new Ae(
277
315
  new P(
278
316
  e.boundingSphere?.center.x,
279
317
  e.boundingSphere?.center.y,
@@ -289,8 +327,8 @@ function yt(i) {
289
327
  const e = t.texture;
290
328
  let s = null;
291
329
  if (e.isCompressedTexture) {
292
- const r = e.mipmaps, n = e.image?.width || e.source?.data?.width || -1, o = e.image?.height || e.source?.data?.height || -1;
293
- s = new ze(
330
+ const r = e.mipmaps, { width: n, height: o } = Le(e);
331
+ s = new et(
294
332
  r,
295
333
  n,
296
334
  o,
@@ -316,7 +354,7 @@ function yt(i) {
316
354
  e.type,
317
355
  e.anisotropy,
318
356
  e.colorSpace
319
- ), s.mipmaps = e.mipmaps, s.channel = e.channel, s.source.data = e.source.data, s.flipY = e.flipY, s.premultiplyAlpha = e.premultiplyAlpha, s.unpackAlignment = e.unpackAlignment, s.matrix = new Ee(...e.matrix.elements);
357
+ ), s.mipmaps = e.mipmaps, s.channel = e.channel, s.source.data = e.source.data, s.flipY = e.flipY, s.premultiplyAlpha = e.premultiplyAlpha, s.unpackAlignment = e.unpackAlignment, s.matrix = new tt(...e.matrix.elements);
320
358
  if (!s) {
321
359
  console.error("[Worker] Failed to create new texture from received data. Texture is not a CompressedTexture or Texture.");
322
360
  continue;
@@ -325,21 +363,21 @@ function yt(i) {
325
363
  }
326
364
  return i;
327
365
  }
328
- function de(i) {
366
+ function fe(i) {
329
367
  let t = i;
330
368
  if ("isInterleavedBufferAttribute" in i && i.isInterleavedBufferAttribute) {
331
- const e = i.data, s = e.array, r = new Ne(s, e.stride);
332
- t = new Ve(r, i.itemSize, s.byteOffset, i.normalized), t.offset = i.offset;
333
- } else "isBufferAttribute" in i && i.isBufferAttribute && (t = new Xe(i.array, i.itemSize, i.normalized), t.usage = i.usage, t.gpuType = i.gpuType, t.updateRanges = i.updateRanges);
369
+ const e = i.data, s = e.array, r = new st(s, e.stride);
370
+ t = new rt(r, i.itemSize, s.byteOffset, i.normalized), t.offset = i.offset;
371
+ } else "isBufferAttribute" in i && i.isBufferAttribute && (t = new nt(i.array, i.itemSize, i.normalized), t.usage = i.usage, t.gpuType = i.gpuType, t.updateRanges = i.updateRanges);
334
372
  return t;
335
373
  }
336
- const xt = N("gltf-progressive-worker");
374
+ const Pt = N("gltf-progressive-worker");
337
375
  N("gltf-progressive-reduce-mipmaps");
338
- const se = N("gltf-progressive-gc"), fe = /* @__PURE__ */ Symbol("needle-progressive-texture"), U = "NEEDLE_progressive";
376
+ const se = N("gltf-progressive-gc"), de = /* @__PURE__ */ Symbol("needle-progressive-texture"), F = "NEEDLE_progressive";
339
377
  class p {
340
378
  /** The name of the extension */
341
379
  get name() {
342
- return U;
380
+ return F;
343
381
  }
344
382
  // #region PUBLIC API
345
383
  /**
@@ -402,12 +440,12 @@ class p {
402
440
  function o(a, l) {
403
441
  const u = s.getAssignedLODInformation(a);
404
442
  if (u) {
405
- const d = s.lodInfos.get(u.key);
406
- if (d && d.lods) {
407
- l.min_count = Math.min(l.min_count, d.lods.length), l.max_count = Math.max(l.max_count, d.lods.length);
408
- for (let c = 0; c < d.lods.length; c++) {
409
- const f = d.lods[c];
410
- f.width && (l.lods[c] = l.lods[c] || { min_height: 1 / 0, max_height: 0 }, l.lods[c].min_height = Math.min(l.lods[c].min_height, f.height), l.lods[c].max_height = Math.max(l.lods[c].max_height, f.height));
443
+ const f = s.lodInfos.get(u.key);
444
+ if (f && f.lods) {
445
+ l.min_count = Math.min(l.min_count, f.lods.length), l.max_count = Math.max(l.max_count, f.lods.length);
446
+ for (let c = 0; c < f.lods.length; c++) {
447
+ const d = f.lods[c];
448
+ d.width && (l.lods[c] = l.lods[c] || { min_height: 1 / 0, max_height: 0 }, l.lods[c].min_height = Math.min(l.lods[c].min_height, d.height), l.lods[c].max_height = Math.max(l.lods[c].max_height, d.height));
411
449
  }
412
450
  }
413
451
  }
@@ -507,9 +545,9 @@ class p {
507
545
  if (this.trackCurrentMaterialTextureSlots(n), n.uniforms && (n.isRawShaderMaterial || n.isShaderMaterial === !0)) {
508
546
  const l = n;
509
547
  for (const u of Object.keys(l.uniforms)) {
510
- const d = l.uniforms[u].value;
511
- if (d?.isTexture === !0) {
512
- const c = this.assignTextureLODForSlot(d, e, n, u, r).then((f) => (f && l.uniforms[u].value != f && (l.uniforms[u].value = f, l.uniformsNeedUpdate = !0), f));
548
+ const f = l.uniforms[u].value;
549
+ if (f?.isTexture === !0) {
550
+ const c = this.assignTextureLODForSlot(f, e, n, u, r).then((d) => (d && l.uniforms[u].value != d && (l.uniforms[u].value = d, l.uniformsNeedUpdate = !0), d));
513
551
  o.push(c), a.push(u);
514
552
  }
515
553
  }
@@ -517,15 +555,15 @@ class p {
517
555
  for (const l of Object.keys(n)) {
518
556
  const u = n[l];
519
557
  if (u?.isTexture === !0) {
520
- const d = this.assignTextureLODForSlot(u, e, n, l, r);
521
- o.push(d), a.push(l);
558
+ const f = this.assignTextureLODForSlot(u, e, n, l, r);
559
+ o.push(f), a.push(l);
522
560
  }
523
561
  }
524
562
  return Promise.all(o).then((l) => {
525
563
  const u = new Array();
526
- for (let d = 0; d < l.length; d++) {
527
- const c = l[d], f = a[d];
528
- c && c.isTexture === !0 ? u.push({ material: n, slot: f, texture: c, level: e }) : u.push({ material: n, slot: f, texture: null, level: e });
564
+ for (let f = 0; f < l.length; f++) {
565
+ const c = l[f], d = a[f];
566
+ c && c.isTexture === !0 ? u.push({ material: n, slot: d, texture: c, level: e }) : u.push({ material: n, slot: d, texture: null, level: e });
529
567
  }
530
568
  return u;
531
569
  });
@@ -560,7 +598,7 @@ class p {
560
598
  if (c && c.level === e && c.force === n)
561
599
  return c.promise;
562
600
  }
563
- const a = s && r ? this.nextTextureSlotRequestId(s, r, e, n) : 0, l = () => !s || !r || this.getLatestTextureSlotRequest(s, r)?.id === a, u = () => l() || this.shouldApplyStaleTextureSlotLOD(s, r, e, n), d = p.getOrLoadLOD(t, e, {
601
+ const a = s && r ? this.nextTextureSlotRequestId(s, r, e, n) : 0, l = () => !s || !r || this.getLatestTextureSlotRequest(s, r)?.id === a, u = () => l() || this.shouldApplyStaleTextureSlotLOD(s, r, e, n), f = p.getOrLoadLOD(t, e, {
564
602
  isCurrent: u
565
603
  }).then((c) => {
566
604
  if (!l() && !this.shouldApplyStaleTextureSlotLOD(s, r, e, n)) return null;
@@ -568,11 +606,11 @@ class p {
568
606
  return console.warn("Progressive: Got an array of textures for a texture slot, this should not happen..."), null;
569
607
  if (c?.isTexture === !0) {
570
608
  if (c != t && s && r) {
571
- const f = this.getMaterialTextureSlot(s, r) ?? t;
572
- if (f && !n) {
573
- const g = this.getAssignedLODInformation(f);
609
+ const d = this.getMaterialTextureSlot(s, r) ?? t;
610
+ if (d && !n) {
611
+ const g = this.getAssignedLODInformation(d);
574
612
  if (g && g?.level < e)
575
- return h === "verbose" && console.warn("Assigned texture level is already higher: ", g.level, e, s, f, c), null;
613
+ return h === "verbose" && console.warn("Assigned texture level is already higher: ", g.level, e, s, d, c), null;
576
614
  }
577
615
  this.assignTrackedTextureSlot(s, r, c);
578
616
  }
@@ -580,7 +618,7 @@ class p {
580
618
  } else h == "verbose" && console.warn("No LOD found for", t, e);
581
619
  return null;
582
620
  }).catch((c) => (console.error("Error loading LOD", t, c), null));
583
- return s && r && this.setPendingTextureSlotRequest(s, r, e, n, a, d), d;
621
+ return s && r && this.setPendingTextureSlotRequest(s, r, e, n, a, f), f;
584
622
  }
585
623
  // Track material slots, not just texture objects. A shared fallback texture can be
586
624
  // referenced by many slots and should only be disposed after every slot moved away.
@@ -677,7 +715,7 @@ class p {
677
715
  _isLoadingMesh;
678
716
  loadMesh = (t) => {
679
717
  if (this._isLoadingMesh) return null;
680
- const e = this.parser.json.meshes[t]?.extensions?.[U];
718
+ const e = this.parser.json.meshes[t]?.extensions?.[F];
681
719
  return e ? (this._isLoadingMesh = !0, this.parser.getDependency("mesh", t).then((s) => (this._isLoadingMesh = !1, s && p.registerMesh(this.url, e.guid, s, e.lods?.length, 0, e), s))) : null;
682
720
  };
683
721
  // private _isLoadingTexture;
@@ -697,7 +735,7 @@ class p {
697
735
  afterRoot(t) {
698
736
  return h && console.log("AFTER", this.url, t), this.parser.json.textures?.forEach((e, s) => {
699
737
  if (e?.extensions) {
700
- const r = e?.extensions[U];
738
+ const r = e?.extensions[F];
701
739
  if (r) {
702
740
  if (!r.lods) {
703
741
  h && console.warn("Texture has no LODs", r);
@@ -713,7 +751,7 @@ class p {
713
751
  }
714
752
  }), this.parser.json.meshes?.forEach((e, s) => {
715
753
  if (e?.extensions) {
716
- const r = e?.extensions[U];
754
+ const r = e?.extensions[F];
717
755
  if (r && r.lods) {
718
756
  for (const n of this.parser.associations.keys())
719
757
  if (n.isMesh) {
@@ -741,10 +779,10 @@ class p {
741
779
  return;
742
780
  }
743
781
  if (h) {
744
- const a = e.image?.width || e.source?.data?.width || 0, l = e.image?.height || e.source?.data?.height || 0;
782
+ const { width: a, height: l } = Le(e);
745
783
  console.log(`> gltf-progressive: register texture[${r}] "${e.name || e.uuid}", Current: ${a}x${l}, Max: ${n.lods[0]?.width}x${n.lods[0]?.height}, uuid: ${e.uuid}`, n, e);
746
784
  }
747
- e.source && (e.source[fe] = n);
785
+ e.source && (e.source[de] = n);
748
786
  const o = n.guid;
749
787
  p.assignLODInformation(t, e, o, s, r), p.lodInfos.set(o, n), p.lowresCache.set(o, new WeakRef(e));
750
788
  };
@@ -769,9 +807,9 @@ class p {
769
807
  }
770
808
  a.userData || (a.userData = {}), h && console.log("> Progressive: register mesh " + s.name, { index: n, uuid: s.uuid }, o, s), p.assignLODInformation(t, a, e, r, n), p.lodInfos.set(e, o);
771
809
  let u = p.lowresCache.get(e)?.deref();
772
- u ? u.push(s.geometry) : u = [s.geometry], p.lowresCache.set(e, new WeakRef(u)), r > 0 && !ne(s) && dt(s, a);
773
- for (const d of E)
774
- d.onRegisteredNewMesh?.(s, o);
810
+ u ? u.push(s.geometry) : u = [s.geometry], p.lowresCache.set(e, new WeakRef(u)), r > 0 && !ne(s) && Mt(s, a);
811
+ for (const f of E)
812
+ f.onRegisteredNewMesh?.(s, o);
775
813
  };
776
814
  /**
777
815
  * Dispose cached resources to free memory.
@@ -869,9 +907,10 @@ ${t}`), e instanceof WeakRef && (e.deref() || (p.cache.delete(t), (h || se) && c
869
907
  return this.textureRefCounts.delete(e), (h || se) && n("[gltf-progressive] Memory: Dispose texture", r), t.dispose(), !0;
870
908
  return this.textureRefCounts.set(e, r), h === "verbose" && n("[gltf-progressive] Memory: Untrack texture", r), !1;
871
909
  function n(o, a) {
872
- const l = t.image?.width || t.source?.data?.width || 0, u = t.image?.height || t.source?.data?.height || 0, d = l && u ? `${l}x${u}` : "N/A";
910
+ let { width: l, height: u } = Le(t);
911
+ const f = l && u ? `${l}x${u}` : "N/A";
873
912
  let c = "N/A";
874
- l && u && (c = `~${(lt(t) / (1024 * 1024)).toFixed(2)} MB`), console.log(`${o} — ${t.name} ${d} (${c}), refCount: ${s} → ${a}
913
+ l && u && (c = `~${(vt(t) / (1024 * 1024)).toFixed(2)} MB`), console.log(`${o} — ${t.name} ${f} (${c}), refCount: ${s} → ${a}
875
914
  ${e}`);
876
915
  }
877
916
  }
@@ -885,19 +924,19 @@ ${e}`);
885
924
  let a;
886
925
  if (t.isTexture === !0) {
887
926
  const u = t;
888
- u.source && u.source[fe] && (a = u.source[fe]);
927
+ u.source && u.source[de] && (a = u.source[de]);
889
928
  }
890
929
  if (a || (a = p.lodInfos.get(o)), !a)
891
930
  h && console.warn(`Can not load LOD ${e}: no LOD info found for "${o}" ${t.name}`, t.type, p.lodInfos);
892
931
  else {
893
932
  if (e > 0) {
894
933
  let c = !1;
895
- const f = Array.isArray(a.lods);
896
- if (f && e >= a.lods.length ? c = !0 : f || (c = !0), c) {
934
+ const d = Array.isArray(a.lods);
935
+ if (d && e >= a.lods.length ? c = !0 : d || (c = !0), c) {
897
936
  const g = this.lowresCache.get(o);
898
937
  if (g) {
899
- const O = g.deref();
900
- if (O) return O;
938
+ const b = g.deref();
939
+ if (b) return b;
901
940
  this.lowresCache.delete(o), h && console.log(`[gltf-progressive] Lowres cache entry was GC'd: ${o}`);
902
941
  }
903
942
  return null;
@@ -906,99 +945,99 @@ ${e}`);
906
945
  const u = Array.isArray(a.lods) ? a.lods[e]?.path : a.lods;
907
946
  if (!u)
908
947
  return h && !a["missing:uri"] && (a["missing:uri"] = !0, console.warn("Missing uri for progressive asset for LOD " + e, a)), null;
909
- const d = ot(n.url, u);
910
- if (d.endsWith(".glb") || d.endsWith(".gltf")) {
948
+ const f = wt(n.url, u);
949
+ if (f.endsWith(".glb") || f.endsWith(".gltf")) {
911
950
  if (!a.guid)
912
951
  return console.warn("missing pointer for glb/gltf texture", a), null;
913
- const c = d + "_" + a.guid, f = await this.tryResolveLODCacheEntry(this.cache.get(c), c, d, t, e, r);
914
- if (f.found) return f.value;
952
+ const c = f + "_" + a.guid, d = await this.tryResolveLODCacheEntry(this.cache.get(c), c, f, t, e, r);
953
+ if (d.found) return d.value;
915
954
  if (s?.isCurrent?.() === !1)
916
- return r && console.log(`Skipping stale LOD ${e} request before queue: ${d}`), null;
917
- const g = await this.queue.slot(d);
955
+ return r && console.log(`Skipping stale LOD ${e} request before queue: ${f}`), null;
956
+ const g = await this.queue.slot(f);
918
957
  if (s?.isCurrent?.() === !1)
919
- return r && console.log(`Skipping stale LOD ${e} request after queue: ${d}`), null;
920
- const O = await this.tryResolveLODCacheEntry(this.cache.get(c), c, d, t, e, r);
921
- if (O.found) return O.value;
958
+ return r && console.log(`Skipping stale LOD ${e} request after queue: ${f}`), null;
959
+ const b = await this.tryResolveLODCacheEntry(this.cache.get(c), c, f, t, e, r);
960
+ if (b.found) return b.value;
922
961
  if (!g.use)
923
- return h && console.log(`LOD ${e} was aborted: ${d}`), null;
962
+ return h && console.log(`LOD ${e} was aborted: ${f}`), null;
924
963
  const y = a, x = new Promise(async (L, V) => {
925
- if (xt) {
926
- const m = await (await mt({})).load(d);
964
+ if (Pt) {
965
+ const m = await (await Rt({})).load(f);
927
966
  if (m.textures.length > 0)
928
- for (const D of m.textures) {
929
- let M = D.texture;
967
+ for (const _ of m.textures) {
968
+ let M = _.texture;
930
969
  return p.assignLODInformation(n.url, M, o, e, void 0), t instanceof q && (M = this.copySettings(t, M)), M && (M.guid = y.guid), L(M);
931
970
  }
932
971
  if (m.geometries.length > 0) {
933
- const D = new Array();
972
+ const _ = new Array();
934
973
  for (const M of m.geometries) {
935
974
  const G = M.geometry;
936
- p.assignLODInformation(n.url, G, o, e, M.primitiveIndex), D.push(G);
975
+ p.assignLODInformation(n.url, G, o, e, M.primitiveIndex), _.push(G);
937
976
  }
938
- return L(D);
977
+ return L(_);
939
978
  }
940
979
  return L(null);
941
980
  }
942
- const w = new Le();
943
- Ae(w), h && (await new Promise((b) => setTimeout(b, 1e3)), r && console.warn("Start loading (delayed) " + d, y.guid));
944
- let S = d;
981
+ const w = new De();
982
+ Ge(w), h && (await new Promise((T) => setTimeout(T, 1e3)), r && console.warn("Start loading (delayed) " + f, y.guid));
983
+ let O = f;
945
984
  if (y && Array.isArray(y.lods)) {
946
- const b = y.lods[e];
947
- b.hash && (S += "?v=" + b.hash);
985
+ const T = y.lods[e];
986
+ T.hash && (O += "?v=" + T.hash);
948
987
  }
949
- const _ = await w.loadAsync(S).catch((b) => (console.error(`Error loading LOD ${e} from ${d}
950
- `, b), L(null)));
951
- if (!_)
988
+ const D = await w.loadAsync(O).catch((T) => (console.error(`Error loading LOD ${e} from ${f}
989
+ `, T), L(null)));
990
+ if (!D)
952
991
  return L(null);
953
- const R = _.parser;
954
- r && console.log("Loading finished " + d, y.guid);
955
- let C = 0;
956
- if (_.parser.json.textures) {
957
- let b = !1;
958
- for (const m of _.parser.json.textures) {
992
+ const k = D.parser;
993
+ r && console.log("Loading finished " + f, y.guid);
994
+ let R = 0;
995
+ if (D.parser.json.textures) {
996
+ let T = !1;
997
+ for (const m of D.parser.json.textures) {
959
998
  if (m?.extensions) {
960
- const D = m?.extensions[U];
961
- if (D?.guid && D.guid === y.guid) {
962
- b = !0;
999
+ const _ = m?.extensions[F];
1000
+ if (_?.guid && _.guid === y.guid) {
1001
+ T = !0;
963
1002
  break;
964
1003
  }
965
1004
  }
966
- C++;
1005
+ R++;
967
1006
  }
968
- if (b) {
969
- let m = await R.getDependency("texture", C);
970
- return m && p.assignLODInformation(n.url, m, o, e, void 0), r && console.log('change "' + t.name + '" → "' + m.name + '"', d, C, m, c), t instanceof q && (m = this.copySettings(t, m)), m && (m.guid = y.guid), L(m);
971
- } else h && console.warn("Could not find texture with guid", y.guid, _.parser.json);
1007
+ if (T) {
1008
+ let m = await k.getDependency("texture", R);
1009
+ return m && p.assignLODInformation(n.url, m, o, e, void 0), r && console.log('change "' + t.name + '" → "' + m.name + '"', f, R, m, c), t instanceof q && (m = this.copySettings(t, m)), m && (m.guid = y.guid), L(m);
1010
+ } else h && console.warn("Could not find texture with guid", y.guid, D.parser.json);
972
1011
  }
973
- if (C = 0, _.parser.json.meshes) {
974
- let b = !1;
975
- for (const m of _.parser.json.meshes) {
1012
+ if (R = 0, D.parser.json.meshes) {
1013
+ let T = !1;
1014
+ for (const m of D.parser.json.meshes) {
976
1015
  if (m?.extensions) {
977
- const D = m?.extensions[U];
978
- if (D?.guid && D.guid === y.guid) {
979
- b = !0;
1016
+ const _ = m?.extensions[F];
1017
+ if (_?.guid && _.guid === y.guid) {
1018
+ T = !0;
980
1019
  break;
981
1020
  }
982
1021
  }
983
- C++;
1022
+ R++;
984
1023
  }
985
- if (b) {
986
- const m = await R.getDependency("mesh", C);
987
- if (r && console.log(`Loaded Mesh "${m.name}"`, d, C, m, c), m.isMesh === !0) {
988
- const D = m.geometry;
989
- return p.assignLODInformation(n.url, D, o, e, 0), L(D);
1024
+ if (T) {
1025
+ const m = await k.getDependency("mesh", R);
1026
+ if (r && console.log(`Loaded Mesh "${m.name}"`, f, R, m, c), m.isMesh === !0) {
1027
+ const _ = m.geometry;
1028
+ return p.assignLODInformation(n.url, _, o, e, 0), L(_);
990
1029
  } else {
991
- const D = new Array();
1030
+ const _ = new Array();
992
1031
  for (let M = 0; M < m.children.length; M++) {
993
1032
  const G = m.children[M];
994
1033
  if (G.isMesh === !0) {
995
1034
  const ie = G.geometry;
996
- p.assignLODInformation(n.url, ie, o, e, M), D.push(ie);
1035
+ p.assignLODInformation(n.url, ie, o, e, M), _.push(ie);
997
1036
  }
998
1037
  }
999
- return L(D);
1038
+ return L(_);
1000
1039
  }
1001
- } else h && console.warn("Could not find mesh with guid", y.guid, _.parser.json);
1040
+ } else h && console.warn("Could not find mesh with guid", y.guid, D.parser.json);
1002
1041
  }
1003
1042
  return L(null);
1004
1043
  });
@@ -1007,10 +1046,10 @@ ${e}`);
1007
1046
  return v != null ? v instanceof q ? (this.cache.set(c, new WeakRef(v)), p._resourceRegistry.register(v, c)) : Array.isArray(v) ? this.cache.set(c, Promise.resolve(v)) : this.cache.set(c, Promise.resolve(v)) : this.cache.set(c, Promise.resolve(null)), v;
1008
1047
  } else if (t instanceof q) {
1009
1048
  if (s?.isCurrent?.() === !1)
1010
- return r && console.log(`Skipping stale texture LOD ${e} request: ${d}`), null;
1011
- r && console.log("Load texture from uri: " + d);
1012
- const f = await new je().loadAsync(d);
1013
- return s?.isCurrent?.() === !1 ? (f?.dispose(), null) : (f ? (f.guid = a.guid, f.flipY = !1, f.needsUpdate = !0, f.colorSpace = t.colorSpace, r && console.log(a, f)) : h && console.warn("failed loading", d), f);
1049
+ return r && console.log(`Skipping stale texture LOD ${e} request: ${f}`), null;
1050
+ r && console.log("Load texture from uri: " + f);
1051
+ const d = await new it().loadAsync(f);
1052
+ return s?.isCurrent?.() === !1 ? (d?.dispose(), null) : (d ? (d.guid = a.guid, d.flipY = !1, d.needsUpdate = !0, d.colorSpace = t.colorSpace, r && console.log(a, d)) : h && console.warn("failed loading", f), d);
1014
1053
  }
1015
1054
  }
1016
1055
  return null;
@@ -1021,24 +1060,24 @@ ${e}`);
1021
1060
  if (o && console.log(`LOD ${n} was already loading/loaded: ${e}`), t instanceof WeakRef) {
1022
1061
  const u = t.deref();
1023
1062
  if (u) {
1024
- let d = u, c = !1;
1025
- if (d instanceof q && r instanceof q ? d.image?.data || d.source?.data ? d = this.copySettings(r, d) : c = !0 : d instanceof j && r instanceof j && (d.attributes.position?.array || (c = !0)), !c)
1026
- return { found: !0, value: d };
1063
+ let f = u, c = !1;
1064
+ if (f instanceof q && r instanceof q ? Oe(f.image) || we(f) ? f = this.copySettings(r, f) : c = !0 : f instanceof j && r instanceof j && (f.attributes.position?.array || (c = !0)), !c)
1065
+ return { found: !0, value: f };
1027
1066
  }
1028
1067
  return this.cache.delete(e), h && console.log(`[gltf-progressive] Re-loading GC'd/disposed resource: ${e}`), { found: !1 };
1029
1068
  }
1030
1069
  let a = await t.catch((u) => (console.error(`Error loading LOD ${n} from ${s}
1031
1070
  `, u), null)), l = !1;
1032
- return a == null || (a instanceof q && r instanceof q ? a.image?.data || a.source?.data ? a = this.copySettings(r, a) : (l = !0, this.cache.delete(e)) : a instanceof j && r instanceof j && (a.attributes.position?.array || (l = !0, this.cache.delete(e)))), l ? { found: !1 } : { found: !0, value: a };
1071
+ return a == null || (a instanceof q && r instanceof q ? Oe(a.image) || we(a) ? a = this.copySettings(r, a) : (l = !0, this.cache.delete(e)) : a instanceof j && r instanceof j && (a.attributes.position?.array || (l = !0, this.cache.delete(e)))), l ? { found: !1 } : { found: !0, value: a };
1033
1072
  }
1034
1073
  static _queue;
1035
1074
  static get queue() {
1036
- return this._queue ??= new at(_e() ? 20 : 50, { debug: h != !1 });
1075
+ return this._queue ??= new Lt(Me() ? 20 : 50, { debug: h != !1 });
1037
1076
  }
1038
1077
  static assignLODInformation(t, e, s, r, n) {
1039
1078
  if (!e) return;
1040
1079
  e.userData || (e.userData = {});
1041
- const o = new wt(t, s, r, n);
1080
+ const o = new kt(t, s, r, n);
1042
1081
  e.userData.LODS = o, "source" in e && typeof e.source == "object" && (e.source.LODS = o);
1043
1082
  }
1044
1083
  static getAssignedLODInformation(t) {
@@ -1051,7 +1090,7 @@ ${e}`);
1051
1090
  `, e.uuid), e = e.clone(), e.offset = t.offset, e.repeat = t.repeat, e.colorSpace = t.colorSpace, e.magFilter = t.magFilter, e.minFilter = t.minFilter, e.wrapS = t.wrapS, e.wrapT = t.wrapT, e.flipY = t.flipY, e.anisotropy = t.anisotropy, e.mipmaps || (e.generateMipmaps = t.generateMipmaps), e) : t;
1052
1091
  }
1053
1092
  }
1054
- class wt {
1093
+ class kt {
1055
1094
  url;
1056
1095
  /** the key to lookup the LOD information */
1057
1096
  key;
@@ -1138,7 +1177,7 @@ class oe {
1138
1177
  });
1139
1178
  }
1140
1179
  }
1141
- const A = N("debugprogressive"), Lt = A === "colors", vt = N("noprogressive"), he = /* @__PURE__ */ Symbol("Needle:LODSManager"), ge = /* @__PURE__ */ Symbol("Needle:LODState"), F = /* @__PURE__ */ Symbol("Needle:CurrentLOD"), T = { mesh_lod: -1, texture_lod: -1 }, _t = new ke(), Me = [
1180
+ const A = N("debugprogressive"), At = A === "colors", It = N("noprogressive"), he = /* @__PURE__ */ Symbol("Needle:LODSManager"), ge = /* @__PURE__ */ Symbol("Needle:LODState"), U = /* @__PURE__ */ Symbol("Needle:CurrentLOD"), Te = Xe, S = { mesh_lod: -1, texture_lod: -1 }, $t = new Ie(), Se = [
1142
1181
  3526751,
1143
1182
  11065402,
1144
1183
  15978811,
@@ -1171,12 +1210,17 @@ const A = N("debugprogressive"), Lt = A === "colors", vt = N("noprogressive"), h
1171
1210
  15817653,
1172
1211
  5083278,
1173
1212
  5592405
1174
- ], pe = new ue(), z = new ue(), Oe = new ue(), Dt = new P(), Mt = new P(), Ot = new Pe(), W = new P(), H = new P(), Q = new P(), J = new P();
1175
- function St(i, t) {
1213
+ ];
1214
+ function Bt() {
1215
+ const i = Te.Timer || Te.Clock;
1216
+ return new i();
1217
+ }
1218
+ const pe = new ue(), z = new ue(), Re = new ue(), Gt = new P(), qt = new P(), Wt = new $e(), W = new P(), H = new P(), Q = new P(), J = new P();
1219
+ function Ft(i, t) {
1176
1220
  const e = i.min, s = i.max, r = (e.x + s.x) * 0.5, n = (e.y + s.y) * 0.5;
1177
1221
  return W.set(r, n, e.z).applyMatrix4(t).z < 0;
1178
1222
  }
1179
- function bt(i) {
1223
+ function Ut(i) {
1180
1224
  const {
1181
1225
  geometry: t,
1182
1226
  matrixWorld: e,
@@ -1187,42 +1231,42 @@ function bt(i) {
1187
1231
  currentLevel: a = -1,
1188
1232
  xrEnabled: l = !1,
1189
1233
  debugDrawLine: u,
1190
- warnMissingPrimitiveDensities: d = !1
1191
- } = i, c = p.getMeshLODExtension(t)?.lods, f = p.getPrimitiveIndex(t), g = i.target ?? {
1234
+ warnMissingPrimitiveDensities: f = !1
1235
+ } = i, c = p.getMeshLODExtension(t)?.lods, d = p.getPrimitiveIndex(t), g = i.target ?? {
1192
1236
  level: a,
1193
- primitiveIndex: f,
1237
+ primitiveIndex: d,
1194
1238
  screenCoverage: 0,
1195
1239
  screenspaceVolume: new P(),
1196
1240
  centrality: 1
1197
1241
  };
1198
- if (g.level = a, g.primitiveIndex = f, g.screenCoverage = 0, g.screenspaceVolume.set(0, 0, 0), g.centrality = 1, !c?.length) return g;
1199
- let O = i.boundingBox ?? t.boundingBox;
1200
- if (O || (t.computeBoundingBox(), O = t.boundingBox), !O) return g;
1201
- if (pe.copy(O).applyMatrix4(e), s.isPerspectiveCamera && St(pe, r))
1242
+ if (g.level = a, g.primitiveIndex = d, g.screenCoverage = 0, g.screenspaceVolume.set(0, 0, 0), g.centrality = 1, !c?.length) return g;
1243
+ let b = i.boundingBox ?? t.boundingBox;
1244
+ if (b || (t.computeBoundingBox(), b = t.boundingBox), !b) return g;
1245
+ if (pe.copy(b).applyMatrix4(e), s.isPerspectiveCamera && Ft(pe, r))
1202
1246
  return g.level = 0, g.screenCoverage = 1 / 0, g.screenspaceVolume.set(1 / 0, 1 / 0, 1 / 0), g;
1203
1247
  if (z.copy(pe).applyMatrix4(r), l && s.isPerspectiveCamera && s.fov > 70) {
1204
- const w = z.min, S = z.max;
1205
- let _ = w.x, R = w.y, C = S.x, b = S.y;
1206
- const m = 2, D = 1.5, M = (w.x + S.x) * 0.5, G = (w.y + S.y) * 0.5;
1207
- _ = (_ - M) * m + M, R = (R - G) * m + G, C = (C - M) * m + M, b = (b - G) * m + G;
1208
- const ie = _ < 0 && C > 0 ? 0 : Math.min(Math.abs(w.x), Math.abs(S.x)), Fe = R < 0 && b > 0 ? 0 : Math.min(Math.abs(w.y), Math.abs(S.y)), ce = Math.max(ie, Fe);
1209
- g.centrality = (D - ce) * (D - ce) * (D - ce);
1210
- }
1211
- const y = z.getSize(Dt);
1212
- y.multiplyScalar(0.5), globalThis.screen?.availHeight > 0 && o > 0 && y.multiplyScalar(o / globalThis.screen.availHeight), s.isPerspectiveCamera && (y.x *= s.aspect), Oe.copy(O).applyMatrix4(e).applyMatrix4(s.matrixWorldInverse);
1213
- const x = Oe.getSize(Mt), v = Math.max(y.x, y.y), L = Math.max(x.x, x.y);
1248
+ const w = z.min, O = z.max;
1249
+ let D = w.x, k = w.y, R = O.x, T = O.y;
1250
+ const m = 2, _ = 1.5, M = (w.x + O.x) * 0.5, G = (w.y + O.y) * 0.5;
1251
+ D = (D - M) * m + M, k = (k - G) * m + G, R = (R - M) * m + M, T = (T - G) * m + G;
1252
+ const ie = D < 0 && R > 0 ? 0 : Math.min(Math.abs(w.x), Math.abs(O.x)), Ve = k < 0 && T > 0 ? 0 : Math.min(Math.abs(w.y), Math.abs(O.y)), ce = Math.max(ie, Ve);
1253
+ g.centrality = (_ - ce) * (_ - ce) * (_ - ce);
1254
+ }
1255
+ const y = z.getSize(Gt);
1256
+ y.multiplyScalar(0.5), globalThis.screen?.availHeight > 0 && o > 0 && y.multiplyScalar(o / globalThis.screen.availHeight), s.isPerspectiveCamera && (y.x *= s.aspect), Re.copy(b).applyMatrix4(e).applyMatrix4(s.matrixWorldInverse);
1257
+ const x = Re.getSize(qt), v = Math.max(y.x, y.y), L = Math.max(x.x, x.y);
1214
1258
  v !== 0 && L !== 0 && (y.z = x.z / L * v);
1215
1259
  const V = Math.max(y.x, y.y, y.z) * g.centrality;
1216
1260
  if (g.screenCoverage = V, g.screenspaceVolume.copy(y), V <= 0) return g;
1217
1261
  if (u) {
1218
- const w = Ot.copy(r);
1262
+ const w = Wt.copy(r);
1219
1263
  w.invert(), W.copy(z.min), H.copy(z.max), H.x = W.x, Q.copy(z.max), Q.y = W.y, J.copy(z.max);
1220
- const S = (W.z + J.z) * 0.5;
1221
- W.z = H.z = Q.z = J.z = S, W.applyMatrix4(w), H.applyMatrix4(w), Q.applyMatrix4(w), J.applyMatrix4(w), u(W, H, 255), u(W, Q, 255), u(H, J, 255), u(Q, J, 255);
1264
+ const O = (W.z + J.z) * 0.5;
1265
+ W.z = H.z = Q.z = J.z = O, W.applyMatrix4(w), H.applyMatrix4(w), Q.applyMatrix4(w), J.applyMatrix4(w), u(W, H, 255), u(W, Q, 255), u(H, J, 255), u(Q, J, 255);
1222
1266
  }
1223
1267
  for (let w = 0; w < c.length; w++) {
1224
- const S = c[w], _ = S.densities?.[f] || S.density || 1e-5;
1225
- if (f > 0 && d && Be() && !S.densities && !globalThis["NEEDLE:MISSING_LOD_PRIMITIVE_DENSITIES"] && (globalThis["NEEDLE:MISSING_LOD_PRIMITIVE_DENSITIES"] = !0, console.warn("[Needle Progressive] Detected usage of mesh without primitive densities. This might cause incorrect LOD level selection: Consider re-optimizing your model by updating your Needle Integration, Needle glTF Pipeline or running optimization again on Needle Cloud.")), _ / V < n) {
1268
+ const O = c[w], D = O.densities?.[d] || O.density || 1e-5;
1269
+ if (d > 0 && f && Fe() && !O.densities && !globalThis["NEEDLE:MISSING_LOD_PRIMITIVE_DENSITIES"] && (globalThis["NEEDLE:MISSING_LOD_PRIMITIVE_DENSITIES"] = !0, console.warn("[Needle Progressive] Detected usage of mesh without primitive densities. This might cause incorrect LOD level selection: Consider re-optimizing your model by updating your Needle Integration, Needle glTF Pipeline or running optimization again on Needle Cloud.")), D / V < n) {
1226
1270
  g.level = w;
1227
1271
  break;
1228
1272
  }
@@ -1261,7 +1305,7 @@ class I {
1261
1305
  }
1262
1306
  renderer;
1263
1307
  context;
1264
- projectionScreenMatrix = new Pe();
1308
+ projectionScreenMatrix = new $e();
1265
1309
  /** @deprecated use static `LODsManager.addPlugin()` method. This getter will be removed in later versions */
1266
1310
  get plugins() {
1267
1311
  return E;
@@ -1334,7 +1378,7 @@ class I {
1334
1378
  const r = performance.now();
1335
1379
  return s.ready.finally(() => {
1336
1380
  const n = this._newPromiseGroups.indexOf(s);
1337
- n >= 0 && (this._newPromiseGroups.splice(n, 1), Be() && performance.measure("LODsManager:awaitLoading", {
1381
+ n >= 0 && (this._newPromiseGroups.splice(n, 1), Fe() && performance.measure("LODsManager:awaitLoading", {
1338
1382
  start: r,
1339
1383
  detail: { id: e, name: t?.name, awaited: s.awaitedCount, resolved: s.resolvedCount }
1340
1384
  }));
@@ -1390,11 +1434,11 @@ class I {
1390
1434
  this.renderer = t, this.context = { ...e };
1391
1435
  }
1392
1436
  #t;
1393
- #i = new Ke();
1394
1437
  #r = 0;
1395
1438
  #n = 0;
1396
1439
  #o = 0;
1397
1440
  #s = 0;
1441
+ #i = Bt();
1398
1442
  _fpsBuffer = [60, 60, 60, 60, 60];
1399
1443
  /**
1400
1444
  * Enable the LODsManager. This will replace the render method of the renderer with a method that updates the LODs.
@@ -1405,9 +1449,9 @@ class I {
1405
1449
  let t = 0;
1406
1450
  this.#t = this.renderer.render;
1407
1451
  const e = this;
1408
- ve(this.renderer), this.renderer.render = function(s, r) {
1452
+ _e(this.renderer), this.renderer.render = function(s, r) {
1409
1453
  const n = e.renderer.getRenderTarget();
1410
- (n == null || "isXRRenderTarget" in n && n.isXRRenderTarget) && (t = 0, e.#r += 1, e.#n = e.#i.getDelta(), e.#o += e.#n, e._fpsBuffer.shift(), e._fpsBuffer.push(1 / e.#n), e.#s = e._fpsBuffer.reduce((a, l) => a + l) / e._fpsBuffer.length, A && e.#r % 200 === 0 && console.log("FPS", Math.round(e.#s), "Interval:", e.#e));
1454
+ (n == null || "isXRRenderTarget" in n && n.isXRRenderTarget) && (t = 0, e.#r += 1, e.#i.update?.(), e.#n = Math.max(e.#i.getDelta(), 1 / 1e3), e.#o += e.#n, e._fpsBuffer.shift(), e._fpsBuffer.push(1 / e.#n), e.#s = e._fpsBuffer.reduce((a, l) => a + l) / e._fpsBuffer.length, A && e.#r % 200 === 0 && console.log("FPS", Math.round(e.#s), "Interval:", e.#e));
1411
1455
  const o = t++;
1412
1456
  e.#t.call(this, s, r), e.onAfterRender(s, r, o);
1413
1457
  };
@@ -1435,14 +1479,16 @@ class I {
1435
1479
  }
1436
1480
  onAfterRender(t, e, s) {
1437
1481
  if (this.pause) return;
1438
- const n = this.renderer.renderLists.get(t, 0).opaque;
1482
+ const r = this.getRenderList(t, e, s);
1483
+ if (!r) return;
1484
+ const n = r.opaque;
1439
1485
  let o = !0;
1440
1486
  if (n.length === 1) {
1441
1487
  const a = n[0].material;
1442
1488
  (a.name === "EffectMaterial" || a.name === "CopyShader") && (o = !1);
1443
1489
  }
1444
1490
  if ((e.parent && e.parent.type === "CubeCamera" || s >= 1 && e.type === "OrthographicCamera") && (o = !1), o) {
1445
- if (vt || (this.updateInterval === "auto" ? this.#s < 40 && this.#e < 10 ? (this.#e += 1, A && console.warn("↓ Reducing LOD updates", this.#e, this.#s.toFixed(0))) : this.#s >= 60 && this.#e > 1 && (this.#e -= 1, A && console.warn("↑ Increasing LOD updates", this.#e, this.#s.toFixed(0))) : this.#e = this.updateInterval, this.#e > 0 && this.#r % this.#e != 0))
1491
+ if (It || (this.updateInterval === "auto" ? this.#s < 40 && this.#e < 10 ? (this.#e += 1, A && console.warn("↓ Reducing LOD updates", this.#e, this.#s.toFixed(0))) : this.#s >= 60 && this.#e > 1 && (this.#e -= 1, A && console.warn("↑ Increasing LOD updates", this.#e, this.#s.toFixed(0))) : this.#e = this.updateInterval, this.#e > 0 && this.#r % this.#e != 0))
1446
1492
  return;
1447
1493
  this.internalUpdate(t, e), this._postprocessPromiseGroups();
1448
1494
  }
@@ -1451,7 +1497,9 @@ class I {
1451
1497
  * Update LODs in a scene
1452
1498
  */
1453
1499
  internalUpdate(t, e) {
1454
- const s = this.renderer.renderLists.get(t, 0), r = s.opaque;
1500
+ const s = this.getRenderList(t, e, 0);
1501
+ if (!s) return;
1502
+ const r = s.opaque;
1455
1503
  this.projectionScreenMatrix.multiplyMatrices(e.projectionMatrix, e.matrixWorldInverse);
1456
1504
  const n = this.targetTriangleDensity;
1457
1505
  for (const l of r) {
@@ -1482,19 +1530,38 @@ class I {
1482
1530
  (u instanceof K || u.isMesh) && this.updateLODs(t, e, u, n);
1483
1531
  }
1484
1532
  }
1533
+ getRenderList(t, e, s) {
1534
+ const r = this.renderer;
1535
+ let n = null;
1536
+ if (r.isWebGPURenderer === !0) {
1537
+ const o = r._renderLists;
1538
+ if (!o) return null;
1539
+ n = o.get(t, e);
1540
+ } else if (r.isWebGLRenderer === !0) {
1541
+ const o = r.renderLists;
1542
+ if (!o) return null;
1543
+ n = o.get(t, s);
1544
+ }
1545
+ return n ? {
1546
+ opaque: n.opaque || [],
1547
+ transparent: n.transparent || [],
1548
+ transmissive: n.transmissive || n.transparentDoublePass || [],
1549
+ transparentDoublePass: n.transparentDoublePass || []
1550
+ } : null;
1551
+ }
1485
1552
  /** Update the LOD levels for the renderer. */
1486
1553
  updateLODs(t, e, s, r) {
1487
1554
  s.userData || (s.userData = {});
1488
1555
  let n = s[ge];
1489
- if (n || (n = new Tt(), s[ge] = n), n.frames++ < 2)
1556
+ if (n || (n = new zt(), s[ge] = n), n.frames++ < 2)
1490
1557
  return;
1491
1558
  for (const a of E)
1492
1559
  a.onBeforeUpdateLOD?.(this.renderer, t, e, s);
1493
1560
  const o = this.overrideLodLevel !== void 0 ? this.overrideLodLevel : X;
1494
- o >= 0 ? (T.mesh_lod = o, T.texture_lod = o) : (this.calculateLodLevel(e, s, n, r, T), T.mesh_lod = Math.round(T.mesh_lod), T.texture_lod = Math.round(T.texture_lod)), T.mesh_lod >= 0 && this.loadProgressiveMeshes(s, T.mesh_lod), s.material && T.texture_lod >= 0 && this.loadProgressiveTextures(s.material, T.texture_lod, o), h && s.material && !s.isGizmo && Ge(s.material), Lt && s.material && !s.isGizmo && !s.isBatchedMesh && qe(s.material, T.mesh_lod);
1561
+ o >= 0 ? (S.mesh_lod = o, S.texture_lod = o) : (this.calculateLodLevel(e, s, n, r, S), S.mesh_lod = Math.round(S.mesh_lod), S.texture_lod = Math.round(S.texture_lod)), S.mesh_lod >= 0 && this.loadProgressiveMeshes(s, S.mesh_lod), s.material && S.texture_lod >= 0 && this.loadProgressiveTextures(s.material, S.texture_lod, o), h && s.material && !s.isGizmo && Ue(s.material), At && s.material && !s.isGizmo && !s.isBatchedMesh && ze(s.material, S.mesh_lod);
1495
1562
  for (const a of E)
1496
- a.onAfterUpdatedLOD?.(this.renderer, t, e, s, T);
1497
- n.lastLodLevel_Mesh = T.mesh_lod, n.lastLodLevel_Texture = T.texture_lod;
1563
+ a.onAfterUpdatedLOD?.(this.renderer, t, e, s, S);
1564
+ n.lastLodLevel_Mesh = S.mesh_lod, n.lastLodLevel_Texture = S.texture_lod;
1498
1565
  }
1499
1566
  /** Load progressive textures for the given material
1500
1567
  * @param material the material to load the textures for
@@ -1509,10 +1576,10 @@ class I {
1509
1576
  return;
1510
1577
  }
1511
1578
  let r = !1;
1512
- (t[F] === void 0 || e < t[F]) && (r = !0);
1579
+ (t[U] === void 0 || e < t[U]) && (r = !0);
1513
1580
  const n = s !== void 0 && s >= 0;
1514
- if (n && (r = t[F] != s, e = s), r) {
1515
- t[F] = e;
1581
+ if (n && (r = t[U] != s, e = s), r) {
1582
+ t[U] = e;
1516
1583
  const o = n ? { force: !0 } : void 0, a = p.assignTextureLOD(t, e, o).then((l) => {
1517
1584
  this._lodchangedlisteners.forEach((u) => u({ type: "texture", level: e, object: t }));
1518
1585
  });
@@ -1527,17 +1594,17 @@ class I {
1527
1594
  */
1528
1595
  loadProgressiveMeshes(t, e) {
1529
1596
  if (!t) return Promise.resolve(null);
1530
- let s = t[F] !== e;
1597
+ let s = t[U] !== e;
1531
1598
  const r = t["DEBUG:LOD"];
1532
- if (r != null && (s = t[F] != r, e = r), s) {
1533
- t[F] = e;
1534
- const n = t.geometry, o = p.assignMeshLOD(t, e).then((a) => (a && t[F] == e && n != t.geometry && this._lodchangedlisteners.forEach((l) => l({ type: "mesh", level: e, object: t })), a));
1599
+ if (r != null && (s = t[U] != r, e = r), s) {
1600
+ t[U] = e;
1601
+ const n = t.geometry, o = p.assignMeshLOD(t, e).then((a) => (a && t[U] == e && n != t.geometry && this._lodchangedlisteners.forEach((l) => l({ type: "mesh", level: e, object: t })), a));
1535
1602
  return oe.addPromise("mesh", t, o, this._newPromiseGroups), o;
1536
1603
  }
1537
1604
  return Promise.resolve(null);
1538
1605
  }
1539
1606
  // private testIfLODLevelsAreAvailable() {
1540
- _sphere = new Ce();
1607
+ _sphere = new Ae();
1541
1608
  _tempWorldPosition = new P();
1542
1609
  static skinnedMeshBoundsFrameOffsetCounter = 0;
1543
1610
  static $skinnedMeshBoundsOffset = /* @__PURE__ */ Symbol("gltf-progressive-skinnedMeshBoundsOffset");
@@ -1554,13 +1621,13 @@ class I {
1554
1621
  let a = 10 + 1, l = !1;
1555
1622
  if (A && e["DEBUG:LOD"] != null)
1556
1623
  return e["DEBUG:LOD"];
1557
- const u = p.getMeshLODExtension(e.geometry)?.lods, d = p.getPrimitiveIndex(e.geometry), c = u && u.length > 0, f = p.getMaterialMinMaxLODsCount(e.material), g = f.min_count !== 1 / 0 && f.min_count >= 0 && f.max_count >= 0;
1624
+ const u = p.getMeshLODExtension(e.geometry)?.lods, f = p.getPrimitiveIndex(e.geometry), c = u && u.length > 0, d = p.getMaterialMinMaxLODsCount(e.material), g = d.min_count !== 1 / 0 && d.min_count >= 0 && d.max_count >= 0;
1558
1625
  if (!c && !g) {
1559
1626
  n.mesh_lod = 0, n.texture_lod = 0;
1560
1627
  return;
1561
1628
  }
1562
1629
  c || (l = !0, a = 0);
1563
- const O = this.renderer.domElement.clientHeight || this.renderer.domElement.height;
1630
+ const b = this.renderer.domElement.clientHeight || this.renderer.domElement.height;
1564
1631
  let y = e.geometry.boundingBox;
1565
1632
  if (e.type === "SkinnedMesh") {
1566
1633
  const x = e;
@@ -1588,13 +1655,13 @@ class I {
1588
1655
  return;
1589
1656
  }
1590
1657
  }
1591
- const x = bt({
1658
+ const x = Ut({
1592
1659
  geometry: e.geometry,
1593
1660
  matrixWorld: e.matrixWorld,
1594
1661
  camera: t,
1595
1662
  projectionScreenMatrix: this.projectionScreenMatrix,
1596
1663
  desiredDensity: r,
1597
- canvasHeight: O,
1664
+ canvasHeight: b,
1598
1665
  currentLevel: s.lastLodLevel_Mesh,
1599
1666
  boundingBox: y,
1600
1667
  xrEnabled: this.renderer.xr.enabled,
@@ -1609,27 +1676,27 @@ class I {
1609
1676
  }
1610
1677
  if (l ? n.mesh_lod = a : n.mesh_lod = s.lastLodLevel_Mesh, A && n.mesh_lod != s.lastLodLevel_Mesh) {
1611
1678
  const v = u?.[n.mesh_lod];
1612
- v && console.log(`Mesh LOD changed: ${s.lastLodLevel_Mesh} → ${n.mesh_lod} (density: ${v.densities?.[d].toFixed(0)}) | ${e.name}`);
1679
+ v && console.log(`Mesh LOD changed: ${s.lastLodLevel_Mesh} → ${n.mesh_lod} (density: ${v.densities?.[f].toFixed(0)}) | ${e.name}`);
1613
1680
  }
1614
1681
  if (g) {
1615
1682
  const x = "saveData" in globalThis.navigator && globalThis.navigator.saveData === !0;
1616
1683
  if (s.lastLodLevel_Texture < 0) {
1617
- if (n.texture_lod = f.max_count - 1, A) {
1618
- const v = f.lods[f.max_count - 1];
1684
+ if (n.texture_lod = d.max_count - 1, A) {
1685
+ const v = d.lods[d.max_count - 1];
1619
1686
  A && console.log(`First Texture LOD ${n.texture_lod} (${v.max_height}px) - ${e.name}`);
1620
1687
  }
1621
1688
  } else {
1622
1689
  const v = s.lastScreenspaceVolume.x + s.lastScreenspaceVolume.y + s.lastScreenspaceVolume.z;
1623
1690
  let L = s.lastScreenCoverage * 4;
1624
1691
  this.context?.engine === "model-viewer" && (L *= 1.5);
1625
- const w = O / window.devicePixelRatio * L;
1626
- let S = !1;
1627
- for (let _ = f.lods.length - 1; _ >= 0; _--) {
1628
- const R = f.lods[_];
1629
- if (!(x && R.max_height >= 2048) && !(_e() && R.max_height > 4096) && (R.max_height > w || !S && _ === 0)) {
1630
- if (S = !0, n.texture_lod = _, A && n.texture_lod < s.lastLodLevel_Texture) {
1631
- const C = R.max_height;
1632
- console.log(`Texture LOD changed: ${s.lastLodLevel_Texture} → ${n.texture_lod} = ${C}px
1692
+ const w = b / window.devicePixelRatio * L;
1693
+ let O = !1;
1694
+ for (let D = d.lods.length - 1; D >= 0; D--) {
1695
+ const k = d.lods[D];
1696
+ if (!(x && k.max_height >= 2048) && !(Me() && k.max_height > 4096) && (k.max_height > w || !O && D === 0)) {
1697
+ if (O = !0, n.texture_lod = D, A && n.texture_lod < s.lastLodLevel_Texture) {
1698
+ const R = k.max_height;
1699
+ console.log(`Texture LOD changed: ${s.lastLodLevel_Texture} → ${n.texture_lod} = ${R}px
1633
1700
  Screensize: ${w.toFixed(0)}px, Coverage: ${(100 * s.lastScreenCoverage).toFixed(2)}%, Volume ${v.toFixed(1)}
1634
1701
  ${e.name}`);
1635
1702
  }
@@ -1641,7 +1708,7 @@ ${e.name}`);
1641
1708
  n.texture_lod = 0;
1642
1709
  }
1643
1710
  }
1644
- class Tt {
1711
+ class zt {
1645
1712
  frames = 0;
1646
1713
  lastLodLevel_Mesh = -1;
1647
1714
  lastLodLevel_Texture = -1;
@@ -1649,53 +1716,53 @@ class Tt {
1649
1716
  lastScreenspaceVolume = new P();
1650
1717
  lastCentrality = 0;
1651
1718
  }
1652
- function qe(i, t) {
1719
+ function ze(i, t) {
1653
1720
  if (!(t < 0)) {
1654
1721
  if (Array.isArray(i)) {
1655
1722
  for (const e of i)
1656
- qe(e, t);
1723
+ ze(e, t);
1657
1724
  return;
1658
1725
  }
1659
- "color" in i && i.color instanceof ke && (i.color.copy(Ct(t, _t)), i.needsUpdate = !0);
1726
+ "color" in i && i.color instanceof Ie && (i.color.copy(Et(t, $t)), i.needsUpdate = !0);
1660
1727
  }
1661
1728
  }
1662
- function Ct(i, t) {
1663
- const e = Math.max(0, Math.min(Me.length - 1, Math.floor(i)));
1664
- return t.setHex(Me[e]);
1729
+ function Et(i, t) {
1730
+ const e = Math.max(0, Math.min(Se.length - 1, Math.floor(i)));
1731
+ return t.setHex(Se[e]);
1665
1732
  }
1666
- const Se = /* @__PURE__ */ Symbol("NEEDLE_mesh_lod"), ae = /* @__PURE__ */ Symbol("NEEDLE_texture_lod");
1733
+ const Ce = /* @__PURE__ */ Symbol("NEEDLE_mesh_lod"), ae = /* @__PURE__ */ Symbol("NEEDLE_texture_lod");
1667
1734
  let me = null;
1668
- function We() {
1669
- const i = kt();
1735
+ function Ee() {
1736
+ const i = Nt();
1670
1737
  i && (i.mapURLs(function(t) {
1671
- return be(), t;
1672
- }), be(), me?.disconnect(), me = new MutationObserver((t) => {
1738
+ return Pe(), t;
1739
+ }), Pe(), me?.disconnect(), me = new MutationObserver((t) => {
1673
1740
  t.forEach((e) => {
1674
1741
  e.addedNodes.forEach((s) => {
1675
- s instanceof HTMLElement && s.tagName.toLowerCase() === "model-viewer" && Ue(s);
1742
+ s instanceof HTMLElement && s.tagName.toLowerCase() === "model-viewer" && Ne(s);
1676
1743
  });
1677
1744
  });
1678
1745
  }), me.observe(document, { childList: !0, subtree: !0 }));
1679
1746
  }
1680
- function kt() {
1747
+ function Nt() {
1681
1748
  if (typeof customElements > "u") return null;
1682
1749
  const i = customElements.get("model-viewer");
1683
1750
  return i || (customElements.whenDefined("model-viewer").then(() => {
1684
- console.debug("[gltf-progressive] model-viewer defined"), We();
1751
+ console.debug("[gltf-progressive] model-viewer defined"), Ee();
1685
1752
  }), null);
1686
1753
  }
1687
- function be() {
1754
+ function Pe() {
1688
1755
  if (typeof document > "u") return;
1689
1756
  document.querySelectorAll("model-viewer").forEach((t) => {
1690
- Ue(t);
1757
+ Ne(t);
1691
1758
  });
1692
1759
  }
1693
- const Te = /* @__PURE__ */ new WeakSet();
1694
- let Pt = 0;
1695
- function Ue(i) {
1696
- if (!i || Te.has(i))
1760
+ const ke = /* @__PURE__ */ new WeakSet();
1761
+ let Vt = 0;
1762
+ function Ne(i) {
1763
+ if (!i || ke.has(i))
1697
1764
  return null;
1698
- Te.add(i), console.debug("[gltf-progressive] found new model-viewer..." + ++Pt + `
1765
+ ke.add(i), console.debug("[gltf-progressive] found new model-viewer..." + ++Vt + `
1699
1766
  `, i.getAttribute("src"));
1700
1767
  let t = null, e = null, s = null;
1701
1768
  for (let r = i; r != null; r = Object.getPrototypeOf(r)) {
@@ -1717,7 +1784,7 @@ function Ue(i) {
1717
1784
  };
1718
1785
  console.debug("[gltf-progressive] setup model-viewer");
1719
1786
  const n = I.get(t, { engine: "model-viewer" });
1720
- return I.addPlugin(new Rt()), n.enable(), n.addEventListener("changed", () => {
1787
+ return I.addPlugin(new Xt()), n.enable(), n.addEventListener("changed", () => {
1721
1788
  s?.call(i);
1722
1789
  }), i.addEventListener("model-visibility", (o) => {
1723
1790
  o.detail.visible && s?.call(i);
@@ -1729,7 +1796,7 @@ function Ue(i) {
1729
1796
  }
1730
1797
  return null;
1731
1798
  }
1732
- class Rt {
1799
+ class Xt {
1733
1800
  _didWarnAboutMissingUrl = !1;
1734
1801
  onBeforeUpdateLOD(t, e, s, r) {
1735
1802
  this.tryParseMeshLOD(e, r), this.tryParseTextureLOD(e, r);
@@ -1755,19 +1822,19 @@ class Rt {
1755
1822
  if (l[ae] == !0) return;
1756
1823
  l[ae] = !0, l.userData && (l.userData.LOD = -1);
1757
1824
  const u = Object.keys(l);
1758
- for (let d = 0; d < u.length; d++) {
1759
- const c = u[d], f = l[c];
1760
- if (f?.isTexture === !0) {
1761
- const g = f.userData?.associations?.textures;
1825
+ for (let f = 0; f < u.length; f++) {
1826
+ const c = u[f], d = l[c];
1827
+ if (d?.isTexture === !0) {
1828
+ const g = d.userData?.associations?.textures;
1762
1829
  if (g == null) continue;
1763
- const O = s.parser.json.textures[g];
1764
- if (!O) {
1830
+ const b = s.parser.json.textures[g];
1831
+ if (!b) {
1765
1832
  console.warn("Texture data not found for texture index " + g);
1766
1833
  continue;
1767
1834
  }
1768
- if (O?.extensions?.[U]) {
1769
- const y = O.extensions[U];
1770
- y && n && p.registerTexture(n, f, y.lods.length, g, y);
1835
+ if (b?.extensions?.[F]) {
1836
+ const y = b.extensions[F];
1837
+ y && n && p.registerTexture(n, d, y.lods.length, g, y);
1771
1838
  }
1772
1839
  }
1773
1840
  }
@@ -1778,19 +1845,19 @@ class Rt {
1778
1845
  }
1779
1846
  }
1780
1847
  tryParseMeshLOD(t, e) {
1781
- if (e[Se] == !0) return;
1782
- e[Se] = !0;
1848
+ if (e[Ce] == !0) return;
1849
+ e[Ce] = !0;
1783
1850
  const s = this.tryGetCurrentModelViewer(t), r = this.getUrl(s);
1784
1851
  if (!r)
1785
1852
  return;
1786
- const n = e.userData?.gltfExtensions?.[U];
1853
+ const n = e.userData?.gltfExtensions?.[F];
1787
1854
  if (n && r) {
1788
1855
  const o = e.uuid;
1789
1856
  p.registerMesh(r, o, e, 0, n.lods.length, n);
1790
1857
  }
1791
1858
  }
1792
1859
  }
1793
- function At(...i) {
1860
+ function jt(...i) {
1794
1861
  let t, e, s, r;
1795
1862
  switch (i.length) {
1796
1863
  case 2:
@@ -1805,22 +1872,22 @@ function At(...i) {
1805
1872
  default:
1806
1873
  throw new Error("Invalid arguments");
1807
1874
  }
1808
- ve(e), Ae(s), $e(s, {
1875
+ _e(e), Ge(s), We(s, {
1809
1876
  progressive: !0,
1810
1877
  ...r?.hints
1811
1878
  }), s.register((o) => new p(o));
1812
1879
  const n = I.get(e);
1813
1880
  return r?.enableLODsManager !== !1 && n.enable(), n;
1814
1881
  }
1815
- We();
1816
- if (!ct) {
1882
+ Ee();
1883
+ if (!_t) {
1817
1884
  const i = {
1818
1885
  gltfProgressive: {
1819
- useNeedleProgressive: At,
1886
+ useNeedleProgressive: jt,
1820
1887
  LODsManager: I,
1821
- configureLoader: $e,
1888
+ configureLoader: We,
1822
1889
  getRaycastMesh: ne,
1823
- useRaycastMeshes: ft
1890
+ useRaycastMeshes: bt
1824
1891
  }
1825
1892
  };
1826
1893
  if (!globalThis.Needle)
@@ -1830,21 +1897,21 @@ if (!ct) {
1830
1897
  globalThis.Needle[t] = i[t];
1831
1898
  }
1832
1899
  export {
1833
- U as EXTENSION_NAME,
1900
+ F as EXTENSION_NAME,
1834
1901
  I as LODsManager,
1835
1902
  p as NEEDLE_progressive,
1836
- Je as VERSION,
1837
- Ae as addDracoAndKTX2Loaders,
1838
- bt as calculateMeshLODLevel,
1839
- $e as configureLoader,
1840
- ve as createLoaders,
1841
- Ct as getLODColor,
1903
+ ut as VERSION,
1904
+ Ge as addDracoAndKTX2Loaders,
1905
+ Ut as calculateMeshLODLevel,
1906
+ We as configureLoader,
1907
+ _e as createLoaders,
1908
+ Et as getLODColor,
1842
1909
  ne as getRaycastMesh,
1843
- Me as lodDebugColors,
1844
- We as patchModelViewer,
1845
- dt as registerRaycastMesh,
1846
- st as setDracoDecoderLocation,
1847
- rt as setKTX2TranscoderLocation,
1848
- At as useNeedleProgressive,
1849
- ft as useRaycastMeshes
1910
+ Se as lodDebugColors,
1911
+ Ee as patchModelViewer,
1912
+ Mt as registerRaycastMesh,
1913
+ ht as setDracoDecoderLocation,
1914
+ gt as setKTX2TranscoderLocation,
1915
+ jt as useNeedleProgressive,
1916
+ bt as useRaycastMeshes
1850
1917
  };