@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.
- package/gltf-progressive.js +362 -295
- package/gltf-progressive.min.js +8 -8
- package/gltf-progressive.umd.cjs +9 -9
- package/lib/extension.js +5 -7
- package/lib/loaders.d.ts +1 -8
- package/lib/loaders.js +15 -2
- package/lib/lods.manager.d.ts +1 -0
- package/lib/lods.manager.js +40 -5
- package/lib/utils.d.ts +1 -1
- package/lib/utils.internal.d.ts +27 -0
- package/lib/utils.internal.js +50 -19
- package/lib/worker/loader.mainthread.js +6 -4
- package/package.json +9 -4
package/gltf-progressive.js
CHANGED
|
@@ -1,69 +1,98 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
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
|
|
11
|
-
|
|
12
|
-
fetch(
|
|
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"})`), $ ===
|
|
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
|
-
|
|
21
|
+
qe();
|
|
21
22
|
});
|
|
22
|
-
const
|
|
23
|
+
const dt = () => ({
|
|
23
24
|
dracoDecoderPath: $,
|
|
24
25
|
ktx2TranscoderPath: Y
|
|
25
26
|
});
|
|
26
|
-
function
|
|
27
|
-
$ = 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
|
|
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
|
|
33
|
-
return
|
|
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
|
|
36
|
-
i.dracoLoader || i.setDRACOLoader(
|
|
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
|
|
40
|
-
function
|
|
41
|
-
|
|
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
|
|
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
|
|
49
|
-
function
|
|
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 =
|
|
53
|
-
if (s
|
|
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,
|
|
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
|
|
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
|
|
78
|
-
|
|
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
|
|
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
|
|
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
|
|
121
|
-
const t = i.image?.width ?? 0,
|
|
122
|
-
return
|
|
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
|
|
155
|
+
function Dt(i) {
|
|
125
156
|
let t = 4;
|
|
126
157
|
const e = i.format;
|
|
127
|
-
e ===
|
|
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
|
|
163
|
+
const _t = typeof window > "u" && typeof document > "u", ve = /* @__PURE__ */ Symbol("needle:raycast-mesh");
|
|
133
164
|
function ne(i) {
|
|
134
|
-
return i?.[
|
|
165
|
+
return i?.[ve] instanceof j ? i[ve] : null;
|
|
135
166
|
}
|
|
136
|
-
function
|
|
167
|
+
function Mt(i, t) {
|
|
137
168
|
if ((i.type === "Mesh" || i.type === "SkinnedMesh") && !ne(i)) {
|
|
138
|
-
const s =
|
|
139
|
-
s.userData = { isRaycastMesh: !0 }, i[
|
|
169
|
+
const s = Ot(t);
|
|
170
|
+
s.userData = { isRaycastMesh: !0 }, i[ve] = s;
|
|
140
171
|
}
|
|
141
172
|
}
|
|
142
|
-
function
|
|
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
|
|
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
|
|
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
|
-
|
|
211
|
+
Ue(t);
|
|
181
212
|
else i && "wireframe" in i && (i.wireframe = re === !0);
|
|
182
213
|
}
|
|
183
214
|
const te = new Array();
|
|
184
|
-
let
|
|
185
|
-
const
|
|
186
|
-
function
|
|
187
|
-
if (te.length <
|
|
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 =
|
|
221
|
+
const r = be.createWorker(i || {});
|
|
191
222
|
return te.push(r), r;
|
|
192
223
|
}
|
|
193
|
-
const t =
|
|
224
|
+
const t = Tt++ % te.length;
|
|
194
225
|
return te[t];
|
|
195
226
|
}
|
|
196
|
-
class
|
|
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
|
-
|
|
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
|
|
254
|
+
return new be(e, t);
|
|
224
255
|
}
|
|
225
256
|
_running = [];
|
|
226
257
|
_webglRenderer = null;
|
|
227
258
|
async load(t, e) {
|
|
228
|
-
const s =
|
|
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 =
|
|
235
|
-
|
|
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
|
|
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(
|
|
295
|
+
s.setIndex(fe(r));
|
|
258
296
|
}
|
|
259
297
|
for (const r in e.attributes) {
|
|
260
|
-
const n = e.attributes[r], o =
|
|
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) =>
|
|
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
|
|
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,
|
|
293
|
-
s = new
|
|
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
|
|
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
|
|
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
|
|
332
|
-
t = new
|
|
333
|
-
} else "isBufferAttribute" in i && i.isBufferAttribute && (t = new
|
|
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
|
|
374
|
+
const Pt = N("gltf-progressive-worker");
|
|
337
375
|
N("gltf-progressive-reduce-mipmaps");
|
|
338
|
-
const se = N("gltf-progressive-gc"),
|
|
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
|
|
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
|
|
406
|
-
if (
|
|
407
|
-
l.min_count = Math.min(l.min_count,
|
|
408
|
-
for (let c = 0; c <
|
|
409
|
-
const
|
|
410
|
-
|
|
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
|
|
511
|
-
if (
|
|
512
|
-
const c = this.assignTextureLODForSlot(
|
|
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
|
|
521
|
-
o.push(
|
|
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
|
|
527
|
-
const c = l[
|
|
528
|
-
c && c.isTexture === !0 ? u.push({ material: n, slot:
|
|
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),
|
|
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
|
|
572
|
-
if (
|
|
573
|
-
const g = this.getAssignedLODInformation(
|
|
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,
|
|
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,
|
|
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?.[
|
|
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[
|
|
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[
|
|
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
|
|
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[
|
|
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) &&
|
|
773
|
-
for (const
|
|
774
|
-
|
|
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
|
-
|
|
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 = `~${(
|
|
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[
|
|
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
|
|
896
|
-
if (
|
|
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
|
|
900
|
-
if (
|
|
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
|
|
910
|
-
if (
|
|
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 =
|
|
914
|
-
if (
|
|
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: ${
|
|
917
|
-
const g = await this.queue.slot(
|
|
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: ${
|
|
920
|
-
const
|
|
921
|
-
if (
|
|
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: ${
|
|
962
|
+
return h && console.log(`LOD ${e} was aborted: ${f}`), null;
|
|
924
963
|
const y = a, x = new Promise(async (L, V) => {
|
|
925
|
-
if (
|
|
926
|
-
const m = await (await
|
|
964
|
+
if (Pt) {
|
|
965
|
+
const m = await (await Rt({})).load(f);
|
|
927
966
|
if (m.textures.length > 0)
|
|
928
|
-
for (const
|
|
929
|
-
let M =
|
|
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
|
|
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),
|
|
975
|
+
p.assignLODInformation(n.url, G, o, e, M.primitiveIndex), _.push(G);
|
|
937
976
|
}
|
|
938
|
-
return L(
|
|
977
|
+
return L(_);
|
|
939
978
|
}
|
|
940
979
|
return L(null);
|
|
941
980
|
}
|
|
942
|
-
const w = new
|
|
943
|
-
|
|
944
|
-
let
|
|
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
|
|
947
|
-
|
|
985
|
+
const T = y.lods[e];
|
|
986
|
+
T.hash && (O += "?v=" + T.hash);
|
|
948
987
|
}
|
|
949
|
-
const
|
|
950
|
-
`,
|
|
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
|
|
954
|
-
r && console.log("Loading finished " +
|
|
955
|
-
let
|
|
956
|
-
if (
|
|
957
|
-
let
|
|
958
|
-
for (const m of
|
|
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
|
|
961
|
-
if (
|
|
962
|
-
|
|
999
|
+
const _ = m?.extensions[F];
|
|
1000
|
+
if (_?.guid && _.guid === y.guid) {
|
|
1001
|
+
T = !0;
|
|
963
1002
|
break;
|
|
964
1003
|
}
|
|
965
1004
|
}
|
|
966
|
-
|
|
1005
|
+
R++;
|
|
967
1006
|
}
|
|
968
|
-
if (
|
|
969
|
-
let m = await
|
|
970
|
-
return m && p.assignLODInformation(n.url, m, o, e, void 0), r && console.log('change "' + t.name + '" → "' + m.name + '"',
|
|
971
|
-
} else h && console.warn("Could not find texture with guid", y.guid,
|
|
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 (
|
|
974
|
-
let
|
|
975
|
-
for (const m of
|
|
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
|
|
978
|
-
if (
|
|
979
|
-
|
|
1016
|
+
const _ = m?.extensions[F];
|
|
1017
|
+
if (_?.guid && _.guid === y.guid) {
|
|
1018
|
+
T = !0;
|
|
980
1019
|
break;
|
|
981
1020
|
}
|
|
982
1021
|
}
|
|
983
|
-
|
|
1022
|
+
R++;
|
|
984
1023
|
}
|
|
985
|
-
if (
|
|
986
|
-
const m = await
|
|
987
|
-
if (r && console.log(`Loaded Mesh "${m.name}"`,
|
|
988
|
-
const
|
|
989
|
-
return p.assignLODInformation(n.url,
|
|
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
|
|
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),
|
|
1035
|
+
p.assignLODInformation(n.url, ie, o, e, M), _.push(ie);
|
|
997
1036
|
}
|
|
998
1037
|
}
|
|
999
|
-
return L(
|
|
1038
|
+
return L(_);
|
|
1000
1039
|
}
|
|
1001
|
-
} else h && console.warn("Could not find mesh with guid", y.guid,
|
|
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: ${
|
|
1011
|
-
r && console.log("Load texture from uri: " +
|
|
1012
|
-
const
|
|
1013
|
-
return s?.isCurrent?.() === !1 ? (
|
|
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
|
|
1025
|
-
if (
|
|
1026
|
-
return { found: !0, value:
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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"),
|
|
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
|
-
]
|
|
1175
|
-
function
|
|
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
|
|
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:
|
|
1191
|
-
} = i, c = p.getMeshLODExtension(t)?.lods,
|
|
1234
|
+
warnMissingPrimitiveDensities: f = !1
|
|
1235
|
+
} = i, c = p.getMeshLODExtension(t)?.lods, d = p.getPrimitiveIndex(t), g = i.target ?? {
|
|
1192
1236
|
level: a,
|
|
1193
|
-
primitiveIndex:
|
|
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 =
|
|
1199
|
-
let
|
|
1200
|
-
if (
|
|
1201
|
-
if (pe.copy(
|
|
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,
|
|
1205
|
-
let
|
|
1206
|
-
const m = 2,
|
|
1207
|
-
|
|
1208
|
-
const ie =
|
|
1209
|
-
g.centrality = (
|
|
1210
|
-
}
|
|
1211
|
-
const y = z.getSize(
|
|
1212
|
-
y.multiplyScalar(0.5), globalThis.screen?.availHeight > 0 && o > 0 && y.multiplyScalar(o / globalThis.screen.availHeight), s.isPerspectiveCamera && (y.x *= s.aspect),
|
|
1213
|
-
const x =
|
|
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 =
|
|
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
|
|
1221
|
-
W.z = H.z = Q.z = J.z =
|
|
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
|
|
1225
|
-
if (
|
|
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
|
|
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),
|
|
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
|
-
|
|
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
|
|
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 (
|
|
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.
|
|
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
|
|
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 ? (
|
|
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,
|
|
1497
|
-
n.lastLodLevel_Mesh =
|
|
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[
|
|
1579
|
+
(t[U] === void 0 || e < t[U]) && (r = !0);
|
|
1513
1580
|
const n = s !== void 0 && s >= 0;
|
|
1514
|
-
if (n && (r = t[
|
|
1515
|
-
t[
|
|
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[
|
|
1597
|
+
let s = t[U] !== e;
|
|
1531
1598
|
const r = t["DEBUG:LOD"];
|
|
1532
|
-
if (r != null && (s = t[
|
|
1533
|
-
t[
|
|
1534
|
-
const n = t.geometry, o = p.assignMeshLOD(t, e).then((a) => (a && t[
|
|
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
|
|
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,
|
|
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
|
|
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 =
|
|
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:
|
|
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?.[
|
|
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 =
|
|
1618
|
-
const v =
|
|
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 =
|
|
1626
|
-
let
|
|
1627
|
-
for (let
|
|
1628
|
-
const
|
|
1629
|
-
if (!(x &&
|
|
1630
|
-
if (
|
|
1631
|
-
const
|
|
1632
|
-
console.log(`Texture LOD changed: ${s.lastLodLevel_Texture} → ${n.texture_lod} = ${
|
|
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
|
|
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
|
|
1719
|
+
function ze(i, t) {
|
|
1653
1720
|
if (!(t < 0)) {
|
|
1654
1721
|
if (Array.isArray(i)) {
|
|
1655
1722
|
for (const e of i)
|
|
1656
|
-
|
|
1723
|
+
ze(e, t);
|
|
1657
1724
|
return;
|
|
1658
1725
|
}
|
|
1659
|
-
"color" in i && i.color instanceof
|
|
1726
|
+
"color" in i && i.color instanceof Ie && (i.color.copy(Et(t, $t)), i.needsUpdate = !0);
|
|
1660
1727
|
}
|
|
1661
1728
|
}
|
|
1662
|
-
function
|
|
1663
|
-
const e = Math.max(0, Math.min(
|
|
1664
|
-
return t.setHex(
|
|
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
|
|
1733
|
+
const Ce = /* @__PURE__ */ Symbol("NEEDLE_mesh_lod"), ae = /* @__PURE__ */ Symbol("NEEDLE_texture_lod");
|
|
1667
1734
|
let me = null;
|
|
1668
|
-
function
|
|
1669
|
-
const i =
|
|
1735
|
+
function Ee() {
|
|
1736
|
+
const i = Nt();
|
|
1670
1737
|
i && (i.mapURLs(function(t) {
|
|
1671
|
-
return
|
|
1672
|
-
}),
|
|
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" &&
|
|
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
|
|
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"),
|
|
1751
|
+
console.debug("[gltf-progressive] model-viewer defined"), Ee();
|
|
1685
1752
|
}), null);
|
|
1686
1753
|
}
|
|
1687
|
-
function
|
|
1754
|
+
function Pe() {
|
|
1688
1755
|
if (typeof document > "u") return;
|
|
1689
1756
|
document.querySelectorAll("model-viewer").forEach((t) => {
|
|
1690
|
-
|
|
1757
|
+
Ne(t);
|
|
1691
1758
|
});
|
|
1692
1759
|
}
|
|
1693
|
-
const
|
|
1694
|
-
let
|
|
1695
|
-
function
|
|
1696
|
-
if (!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
|
-
|
|
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
|
|
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
|
|
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
|
|
1759
|
-
const c = u[
|
|
1760
|
-
if (
|
|
1761
|
-
const g =
|
|
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
|
|
1764
|
-
if (!
|
|
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 (
|
|
1769
|
-
const y =
|
|
1770
|
-
y && n && p.registerTexture(n,
|
|
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[
|
|
1782
|
-
e[
|
|
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?.[
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
1816
|
-
if (!
|
|
1882
|
+
Ee();
|
|
1883
|
+
if (!_t) {
|
|
1817
1884
|
const i = {
|
|
1818
1885
|
gltfProgressive: {
|
|
1819
|
-
useNeedleProgressive:
|
|
1886
|
+
useNeedleProgressive: jt,
|
|
1820
1887
|
LODsManager: I,
|
|
1821
|
-
configureLoader:
|
|
1888
|
+
configureLoader: We,
|
|
1822
1889
|
getRaycastMesh: ne,
|
|
1823
|
-
useRaycastMeshes:
|
|
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
|
-
|
|
1900
|
+
F as EXTENSION_NAME,
|
|
1834
1901
|
I as LODsManager,
|
|
1835
1902
|
p as NEEDLE_progressive,
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
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
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
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
|
};
|