@needle-tools/gltf-progressive 3.0.0 → 3.1.0-next.f550970
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -1
- package/gltf-progressive.js +776 -605
- package/gltf-progressive.min.js +7 -7
- package/gltf-progressive.umd.cjs +7 -7
- package/lib/extension.d.ts +1 -0
- package/lib/extension.js +65 -27
- package/lib/index.d.ts +2 -2
- package/lib/index.js +2 -2
- package/lib/{lods_manager.d.ts → lods.manager.d.ts} +17 -3
- package/lib/{lods_manager.js → lods.manager.js} +64 -20
- package/lib/lods.promise.d.ts +61 -0
- package/lib/lods.promise.js +101 -0
- package/lib/plugins/modelviewer.js +1 -1
- package/lib/utils.internal.d.ts +21 -0
- package/lib/utils.internal.js +57 -0
- package/lib/version.js +1 -1
- package/package.json +1 -1
package/gltf-progressive.js
CHANGED
|
@@ -1,179 +1,219 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
if (!t.has(
|
|
1
|
+
var He = Object.defineProperty;
|
|
2
|
+
var Qe = (o, t, e) => t in o ? He(o, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : o[t] = e;
|
|
3
|
+
var u = (o, t, e) => (Qe(o, typeof t != "symbol" ? t + "" : t, e), e), Ee = (o, t, e) => {
|
|
4
|
+
if (!t.has(o))
|
|
5
5
|
throw TypeError("Cannot " + e);
|
|
6
6
|
};
|
|
7
|
-
var
|
|
8
|
-
if (t.has(
|
|
7
|
+
var L = (o, t, e) => (Ee(o, t, "read from private field"), e ? e.call(o) : t.get(o)), H = (o, t, e) => {
|
|
8
|
+
if (t.has(o))
|
|
9
9
|
throw TypeError("Cannot add the same private member more than once");
|
|
10
|
-
t instanceof WeakSet ? t.add(
|
|
11
|
-
}, V = (
|
|
12
|
-
import { BufferGeometry as
|
|
13
|
-
import { GLTFLoader as
|
|
14
|
-
import { MeshoptDecoder as
|
|
15
|
-
import { DRACOLoader as
|
|
16
|
-
import { KTX2Loader as
|
|
17
|
-
const
|
|
18
|
-
globalThis.GLTF_PROGRESSIVE_VERSION =
|
|
10
|
+
t instanceof WeakSet ? t.add(o) : t.set(o, e);
|
|
11
|
+
}, V = (o, t, e, s) => (Ee(o, t, "write to private field"), s ? s.call(o, e) : t.set(o, e), e);
|
|
12
|
+
import { BufferGeometry as Le, Mesh as se, Texture as oe, TextureLoader as je, Matrix4 as Ie, Clock as Je, MeshStandardMaterial as Ze, Sphere as et, Box3 as $e, Vector3 as W } from "three";
|
|
13
|
+
import { GLTFLoader as Ce } from "three/examples/jsm/loaders/GLTFLoader.js";
|
|
14
|
+
import { MeshoptDecoder as tt } from "three/examples/jsm/libs/meshopt_decoder.module.js";
|
|
15
|
+
import { DRACOLoader as st } from "three/examples/jsm/loaders/DRACOLoader.js";
|
|
16
|
+
import { KTX2Loader as rt } from "three/examples/jsm/loaders/KTX2Loader.js";
|
|
17
|
+
const it = "";
|
|
18
|
+
globalThis.GLTF_PROGRESSIVE_VERSION = it;
|
|
19
19
|
console.debug("[gltf-progressive] version -");
|
|
20
|
-
let
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
fetch(
|
|
20
|
+
let q = "https://www.gstatic.com/draco/versioned/decoders/1.5.7/", re = "https://www.gstatic.com/basis-universal/versioned/2021-04-15-ba1c3e4/";
|
|
21
|
+
const nt = q, ot = re, Fe = new URL(q + "draco_decoder.js");
|
|
22
|
+
Fe.searchParams.append("range", "true");
|
|
23
|
+
fetch(Fe, {
|
|
24
24
|
method: "GET",
|
|
25
25
|
headers: {
|
|
26
26
|
Range: "bytes=0-1"
|
|
27
27
|
}
|
|
28
|
-
}).catch((
|
|
29
|
-
console.debug(`Failed to fetch remote Draco decoder from ${
|
|
28
|
+
}).catch((o) => {
|
|
29
|
+
console.debug(`Failed to fetch remote Draco decoder from ${q} (offline: ${typeof navigator < "u" ? navigator.onLine : "unknown"})`), q === nt && at("./include/draco/"), re === ot && lt("./include/ktx2/");
|
|
30
30
|
}).finally(() => {
|
|
31
|
-
|
|
31
|
+
Ne();
|
|
32
32
|
});
|
|
33
|
-
function
|
|
34
|
-
|
|
33
|
+
function at(o) {
|
|
34
|
+
q = o, k && k[Pe] != q ? (console.debug("Updating Draco decoder path to " + o), k[Pe] = q, k.setDecoderPath(q), k.preload()) : console.debug("Setting Draco decoder path to " + o);
|
|
35
35
|
}
|
|
36
|
-
function
|
|
37
|
-
re =
|
|
36
|
+
function lt(o) {
|
|
37
|
+
re = o, N && N.transcoderPath != re ? (console.debug("Updating KTX2 transcoder path to " + o), N.setTranscoderPath(re), N.init()) : console.debug("Setting KTX2 transcoder path to " + o);
|
|
38
38
|
}
|
|
39
|
-
const
|
|
40
|
-
let
|
|
41
|
-
function
|
|
42
|
-
|
|
39
|
+
const Pe = Symbol("dracoDecoderPath");
|
|
40
|
+
let k, xe, N;
|
|
41
|
+
function Ne() {
|
|
42
|
+
k || (k = new st(), k[Pe] = q, k.setDecoderPath(q), k.setDecoderConfig({ type: "js" }), k.preload()), N || (N = new rt(), N.setTranscoderPath(re), N.init()), xe || (xe = tt);
|
|
43
43
|
}
|
|
44
|
-
function Ue(
|
|
45
|
-
return
|
|
44
|
+
function Ue(o) {
|
|
45
|
+
return Ne(), o ? N.detectSupport(o) : o !== null && console.warn("No renderer provided to detect ktx2 support - loading KTX2 textures might fail"), { dracoLoader: k, ktx2Loader: N, meshoptDecoder: xe };
|
|
46
46
|
}
|
|
47
|
-
function
|
|
48
|
-
|
|
47
|
+
function ze(o) {
|
|
48
|
+
o.dracoLoader || o.setDRACOLoader(k), o.ktx2Loader || o.setKTX2Loader(N), o.meshoptDecoder || o.setMeshoptDecoder(xe);
|
|
49
49
|
}
|
|
50
50
|
const Te = /* @__PURE__ */ new WeakMap();
|
|
51
|
-
function
|
|
52
|
-
let e = Te.get(
|
|
53
|
-
e ? e = Object.assign(e, t) : e = t, Te.set(
|
|
51
|
+
function Ve(o, t) {
|
|
52
|
+
let e = Te.get(o);
|
|
53
|
+
e ? e = Object.assign(e, t) : e = t, Te.set(o, e);
|
|
54
54
|
}
|
|
55
|
-
const
|
|
56
|
-
function
|
|
55
|
+
const Me = Ce.prototype.load;
|
|
56
|
+
function ut(...o) {
|
|
57
57
|
const t = Te.get(this);
|
|
58
|
-
let e =
|
|
59
|
-
const
|
|
60
|
-
if (
|
|
61
|
-
const
|
|
62
|
-
|
|
58
|
+
let e = o[0];
|
|
59
|
+
const s = new URL(e, window.location.href);
|
|
60
|
+
if (s.hostname.endsWith("needle.tools")) {
|
|
61
|
+
const r = (t == null ? void 0 : t.progressive) !== void 0 ? t.progressive : !0, i = t != null && t.usecase ? t.usecase : "default";
|
|
62
|
+
r ? this.requestHeader.Accept = `*/*;progressive=allowed;usecase=${i}` : this.requestHeader.Accept = `*/*;usecase=${i}`, e = s.toString();
|
|
63
63
|
}
|
|
64
|
-
return
|
|
64
|
+
return o[0] = e, Me == null ? void 0 : Me.call(this, ...o);
|
|
65
65
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
function
|
|
66
|
+
Ce.prototype.load = ut;
|
|
67
|
+
de("debugprogressive");
|
|
68
|
+
function de(o) {
|
|
69
69
|
if (typeof window > "u")
|
|
70
70
|
return !1;
|
|
71
|
-
const e = new URL(window.location.href).searchParams.get(
|
|
71
|
+
const e = new URL(window.location.href).searchParams.get(o);
|
|
72
72
|
return e == null || e === "0" || e === "false" ? !1 : e === "" ? !0 : e;
|
|
73
73
|
}
|
|
74
|
-
function
|
|
75
|
-
if (t === void 0 || t.startsWith("./") || t.startsWith("http") ||
|
|
74
|
+
function dt(o, t) {
|
|
75
|
+
if (t === void 0 || t.startsWith("./") || t.startsWith("http") || o === void 0)
|
|
76
76
|
return t;
|
|
77
|
-
const e =
|
|
77
|
+
const e = o.lastIndexOf("/");
|
|
78
78
|
if (e >= 0) {
|
|
79
|
-
const
|
|
80
|
-
for (;
|
|
79
|
+
const s = o.substring(0, e + 1);
|
|
80
|
+
for (; s.endsWith("/") && t.startsWith("/"); )
|
|
81
81
|
t = t.substring(1);
|
|
82
|
-
return
|
|
82
|
+
return s + t;
|
|
83
83
|
}
|
|
84
84
|
return t;
|
|
85
85
|
}
|
|
86
86
|
let ae;
|
|
87
87
|
function ct() {
|
|
88
|
-
return ae !== void 0 || (ae = /iPhone|iPad|iPod|Android|IEMobile/i.test(navigator.userAgent),
|
|
88
|
+
return ae !== void 0 || (ae = /iPhone|iPad|iPod|Android|IEMobile/i.test(navigator.userAgent), de("debugprogressive") && console.log("[glTF Progressive]: isMobileDevice", ae)), ae;
|
|
89
89
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
90
|
+
function Ge() {
|
|
91
|
+
if (typeof window > "u")
|
|
92
|
+
return !1;
|
|
93
|
+
const o = new URL(window.location.href), t = o.hostname === "localhost" || /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(o.hostname);
|
|
94
|
+
return o.hostname === "127.0.0.1" || t;
|
|
95
|
+
}
|
|
96
|
+
class ft {
|
|
97
|
+
constructor(t = 100, e = {}) {
|
|
98
|
+
u(this, "_running", /* @__PURE__ */ new Map());
|
|
99
|
+
u(this, "_queue", []);
|
|
100
|
+
u(this, "debug", !1);
|
|
101
|
+
u(this, "tick", () => {
|
|
102
|
+
this.internalUpdate(), setTimeout(this.tick, 10);
|
|
103
|
+
});
|
|
104
|
+
this.maxConcurrent = t, this.debug = e.debug ?? !1, window.requestAnimationFrame(this.tick);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Request a slot for a promise with a specific key. This function returns a promise with a `use` method that can be called to add the promise to the queue.
|
|
108
|
+
*/
|
|
109
|
+
slot(t) {
|
|
110
|
+
return this.debug && console.debug(`[PromiseQueue]: Requesting slot for key ${t}, running: ${this._running.size}, waiting: ${this._queue.length}`), new Promise((e) => {
|
|
111
|
+
this._queue.push({ key: t, resolve: e });
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
add(t, e) {
|
|
115
|
+
this._running.has(t) || (this._running.set(t, e), e.finally(() => {
|
|
116
|
+
this._running.delete(t), this.debug && console.debug(`[PromiseQueue]: Promise finished now running: ${this._running.size}, waiting: ${this._queue.length}. (finished ${t})`);
|
|
117
|
+
}), this.debug && console.debug(`[PromiseQueue]: Added new promise, now running: ${this._running.size}, waiting: ${this._queue.length}. (added ${t})`));
|
|
118
|
+
}
|
|
119
|
+
internalUpdate() {
|
|
120
|
+
const t = this.maxConcurrent - this._running.size;
|
|
121
|
+
for (let e = 0; e < t && this._queue.length > 0; e++) {
|
|
122
|
+
this.debug && console.debug(`[PromiseQueue]: Running ${this._running.size} promises, waiting for ${this._queue.length} more.`);
|
|
123
|
+
const { key: s, resolve: n } = this._queue.shift();
|
|
124
|
+
n({
|
|
125
|
+
use: (r) => this.add(s, r)
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const ht = typeof window > "u" && typeof document > "u", Ae = Symbol("needle:raycast-mesh");
|
|
131
|
+
function ce(o) {
|
|
132
|
+
return (o == null ? void 0 : o[Ae]) instanceof Le ? o[Ae] : null;
|
|
93
133
|
}
|
|
94
|
-
function
|
|
95
|
-
if ((
|
|
96
|
-
const
|
|
97
|
-
|
|
134
|
+
function gt(o, t) {
|
|
135
|
+
if ((o.type === "Mesh" || o.type === "SkinnedMesh") && !ce(o)) {
|
|
136
|
+
const s = mt(t);
|
|
137
|
+
s.userData = { isRaycastMesh: !0 }, o[Ae] = s;
|
|
98
138
|
}
|
|
99
139
|
}
|
|
100
|
-
function
|
|
101
|
-
if (
|
|
140
|
+
function pt(o = !0) {
|
|
141
|
+
if (o) {
|
|
102
142
|
if (le)
|
|
103
143
|
return;
|
|
104
|
-
const t = le =
|
|
105
|
-
|
|
106
|
-
const
|
|
107
|
-
let
|
|
108
|
-
|
|
144
|
+
const t = le = se.prototype.raycast;
|
|
145
|
+
se.prototype.raycast = function(e, s) {
|
|
146
|
+
const n = this, r = ce(n);
|
|
147
|
+
let i;
|
|
148
|
+
r && n.isMesh && (i = n.geometry, n.geometry = r), t.call(this, e, s), i && (n.geometry = i);
|
|
109
149
|
};
|
|
110
150
|
} else {
|
|
111
151
|
if (!le)
|
|
112
152
|
return;
|
|
113
|
-
|
|
153
|
+
se.prototype.raycast = le, le = null;
|
|
114
154
|
}
|
|
115
155
|
}
|
|
116
156
|
let le = null;
|
|
117
|
-
function
|
|
118
|
-
const t = new
|
|
119
|
-
for (const e in
|
|
120
|
-
t.setAttribute(e,
|
|
121
|
-
return t.setIndex(
|
|
157
|
+
function mt(o) {
|
|
158
|
+
const t = new Le();
|
|
159
|
+
for (const e in o.attributes)
|
|
160
|
+
t.setAttribute(e, o.getAttribute(e));
|
|
161
|
+
return t.setIndex(o.getIndex()), t;
|
|
122
162
|
}
|
|
123
|
-
const
|
|
124
|
-
let
|
|
125
|
-
if (
|
|
126
|
-
let
|
|
127
|
-
|
|
163
|
+
const j = new Array(), y = de("debugprogressive");
|
|
164
|
+
let me, te = -1;
|
|
165
|
+
if (y) {
|
|
166
|
+
let o = function() {
|
|
167
|
+
te += 1, te >= t && (te = -1), console.log(`Toggle LOD level [${te}]`);
|
|
128
168
|
}, t = 6;
|
|
129
169
|
window.addEventListener("keyup", (e) => {
|
|
130
|
-
e.key === "p" &&
|
|
131
|
-
const
|
|
132
|
-
!isNaN(
|
|
170
|
+
e.key === "p" && o(), e.key === "w" && (me = !me, console.log(`Toggle wireframe [${me}]`));
|
|
171
|
+
const s = parseInt(e.key);
|
|
172
|
+
!isNaN(s) && s >= 0 && (te = s, console.log(`Set LOD level to [${te}]`));
|
|
133
173
|
});
|
|
134
174
|
}
|
|
135
|
-
function
|
|
136
|
-
if (
|
|
137
|
-
if (Array.isArray(
|
|
138
|
-
for (const t of
|
|
139
|
-
|
|
175
|
+
function qe(o) {
|
|
176
|
+
if (y)
|
|
177
|
+
if (Array.isArray(o))
|
|
178
|
+
for (const t of o)
|
|
179
|
+
qe(t);
|
|
140
180
|
else
|
|
141
|
-
|
|
181
|
+
o && "wireframe" in o && (o.wireframe = me === !0);
|
|
142
182
|
}
|
|
143
|
-
const
|
|
183
|
+
const X = "NEEDLE_progressive", Oe = Symbol("needle-progressive-texture"), O = class {
|
|
144
184
|
constructor(t, e) {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
var
|
|
185
|
+
u(this, "parser");
|
|
186
|
+
u(this, "url");
|
|
187
|
+
u(this, "_isLoadingMesh");
|
|
188
|
+
u(this, "loadMesh", (t) => {
|
|
189
|
+
var s, n;
|
|
150
190
|
if (this._isLoadingMesh)
|
|
151
191
|
return null;
|
|
152
|
-
const e = (
|
|
153
|
-
return e ? (this._isLoadingMesh = !0, this.parser.getDependency("mesh", t).then((
|
|
154
|
-
var
|
|
155
|
-
return this._isLoadingMesh = !1,
|
|
192
|
+
const e = (n = (s = this.parser.json.meshes[t]) == null ? void 0 : s.extensions) == null ? void 0 : n[X];
|
|
193
|
+
return e ? (this._isLoadingMesh = !0, this.parser.getDependency("mesh", t).then((r) => {
|
|
194
|
+
var i;
|
|
195
|
+
return this._isLoadingMesh = !1, r && O.registerMesh(this.url, e.guid, r, (i = e.lods) == null ? void 0 : i.length, 0, e), r;
|
|
156
196
|
})) : null;
|
|
157
197
|
});
|
|
158
|
-
|
|
198
|
+
y && console.log("Progressive extension registered for", e), this.parser = t, this.url = e;
|
|
159
199
|
}
|
|
160
200
|
/** The name of the extension */
|
|
161
201
|
get name() {
|
|
162
|
-
return
|
|
202
|
+
return X;
|
|
163
203
|
}
|
|
164
204
|
static getMeshLODExtension(t) {
|
|
165
205
|
const e = this.getAssignedLODInformation(t);
|
|
166
206
|
return e != null && e.key ? this.lodInfos.get(e.key) : null;
|
|
167
207
|
}
|
|
168
208
|
static getPrimitiveIndex(t) {
|
|
169
|
-
var
|
|
170
|
-
const e = (
|
|
209
|
+
var s;
|
|
210
|
+
const e = (s = this.getAssignedLODInformation(t)) == null ? void 0 : s.index;
|
|
171
211
|
return e ?? -1;
|
|
172
212
|
}
|
|
173
213
|
static getMaterialMinMaxLODsCount(t, e) {
|
|
174
|
-
const
|
|
175
|
-
if (
|
|
176
|
-
return
|
|
214
|
+
const s = this, n = "LODS:minmax", r = t[n];
|
|
215
|
+
if (r != null)
|
|
216
|
+
return r;
|
|
177
217
|
if (e || (e = {
|
|
178
218
|
min_count: 1 / 0,
|
|
179
219
|
max_count: 0,
|
|
@@ -181,29 +221,29 @@ const Y = "NEEDLE_progressive", _e = Symbol("needle-progressive-texture"), b = c
|
|
|
181
221
|
}), Array.isArray(t)) {
|
|
182
222
|
for (const a of t)
|
|
183
223
|
this.getMaterialMinMaxLODsCount(a, e);
|
|
184
|
-
return t[
|
|
224
|
+
return t[n] = e, e;
|
|
185
225
|
}
|
|
186
|
-
if (
|
|
226
|
+
if (y === "verbose" && console.log("getMaterialMinMaxLODsCount", t), t.type === "ShaderMaterial" || t.type === "RawShaderMaterial") {
|
|
187
227
|
const a = t;
|
|
188
228
|
for (const l of Object.keys(a.uniforms)) {
|
|
189
|
-
const
|
|
190
|
-
(
|
|
229
|
+
const c = a.uniforms[l].value;
|
|
230
|
+
(c == null ? void 0 : c.isTexture) === !0 && i(c, e);
|
|
191
231
|
}
|
|
192
232
|
} else if (t.isMaterial)
|
|
193
233
|
for (const a of Object.keys(t)) {
|
|
194
234
|
const l = t[a];
|
|
195
|
-
(l == null ? void 0 : l.isTexture) === !0 &&
|
|
235
|
+
(l == null ? void 0 : l.isTexture) === !0 && i(l, e);
|
|
196
236
|
}
|
|
197
|
-
return t[
|
|
198
|
-
function
|
|
199
|
-
const
|
|
200
|
-
if (
|
|
201
|
-
const
|
|
202
|
-
if (
|
|
203
|
-
l.min_count = Math.min(l.min_count,
|
|
204
|
-
for (let h = 0; h <
|
|
205
|
-
const
|
|
206
|
-
|
|
237
|
+
return t[n] = e, e;
|
|
238
|
+
function i(a, l) {
|
|
239
|
+
const c = s.getAssignedLODInformation(a);
|
|
240
|
+
if (c) {
|
|
241
|
+
const d = s.lodInfos.get(c.key);
|
|
242
|
+
if (d && d.lods) {
|
|
243
|
+
l.min_count = Math.min(l.min_count, d.lods.length), l.max_count = Math.max(l.max_count, d.lods.length);
|
|
244
|
+
for (let h = 0; h < d.lods.length; h++) {
|
|
245
|
+
const f = d.lods[h];
|
|
246
|
+
f.width && (l.lods[h] = l.lods[h] || { min_height: 1 / 0, max_height: 0 }, l.lods[h].min_height = Math.min(l.lods[h].min_height, f.height), l.lods[h].max_height = Math.max(l.lods[h].max_height, f.height));
|
|
207
247
|
}
|
|
208
248
|
}
|
|
209
249
|
}
|
|
@@ -215,32 +255,32 @@ const Y = "NEEDLE_progressive", _e = Symbol("needle-progressive-texture"), b = c
|
|
|
215
255
|
* @returns true if the LOD level is available (or if any LOD level is available if level is undefined)
|
|
216
256
|
*/
|
|
217
257
|
static hasLODLevelAvailable(t, e) {
|
|
218
|
-
var
|
|
258
|
+
var r;
|
|
219
259
|
if (Array.isArray(t)) {
|
|
220
|
-
for (const
|
|
221
|
-
if (this.hasLODLevelAvailable(
|
|
260
|
+
for (const i of t)
|
|
261
|
+
if (this.hasLODLevelAvailable(i, e))
|
|
222
262
|
return !0;
|
|
223
263
|
return !1;
|
|
224
264
|
}
|
|
225
265
|
if (t.isMaterial === !0) {
|
|
226
|
-
for (const
|
|
227
|
-
const a = t[
|
|
266
|
+
for (const i of Object.keys(t)) {
|
|
267
|
+
const a = t[i];
|
|
228
268
|
if (a && a.isTexture && this.hasLODLevelAvailable(a, e))
|
|
229
269
|
return !0;
|
|
230
270
|
}
|
|
231
271
|
return !1;
|
|
232
272
|
} else if (t.isGroup === !0) {
|
|
233
|
-
for (const
|
|
234
|
-
if (
|
|
273
|
+
for (const i of t.children)
|
|
274
|
+
if (i.isMesh === !0 && this.hasLODLevelAvailable(i, e))
|
|
235
275
|
return !0;
|
|
236
276
|
}
|
|
237
|
-
let
|
|
238
|
-
if (t.isMesh ?
|
|
239
|
-
const
|
|
240
|
-
if (
|
|
241
|
-
return
|
|
242
|
-
if (
|
|
243
|
-
return Array.isArray(
|
|
277
|
+
let s, n;
|
|
278
|
+
if (t.isMesh ? s = t.geometry : (t.isBufferGeometry || t.isTexture) && (s = t), s && (r = s == null ? void 0 : s.userData) != null && r.LODS) {
|
|
279
|
+
const i = s.userData.LODS;
|
|
280
|
+
if (n = this.lodInfos.get(i.key), e === void 0)
|
|
281
|
+
return n != null;
|
|
282
|
+
if (n)
|
|
283
|
+
return Array.isArray(n.lods) ? e < n.lods.length : e === 0;
|
|
244
284
|
}
|
|
245
285
|
return !1;
|
|
246
286
|
}
|
|
@@ -259,369 +299,469 @@ const Y = "NEEDLE_progressive", _e = Symbol("needle-progressive-texture"), b = c
|
|
|
259
299
|
* ```
|
|
260
300
|
*/
|
|
261
301
|
static assignMeshLOD(t, e) {
|
|
262
|
-
var
|
|
302
|
+
var s;
|
|
263
303
|
if (!t)
|
|
264
304
|
return Promise.resolve(null);
|
|
265
|
-
if (t instanceof
|
|
266
|
-
const
|
|
267
|
-
if (!
|
|
305
|
+
if (t instanceof se || t.isMesh === !0) {
|
|
306
|
+
const n = t.geometry, r = this.getAssignedLODInformation(n);
|
|
307
|
+
if (!r)
|
|
268
308
|
return Promise.resolve(null);
|
|
269
|
-
for (const
|
|
270
|
-
(
|
|
271
|
-
return t["LOD:requested level"] = e,
|
|
272
|
-
if (Array.isArray(
|
|
273
|
-
const a =
|
|
274
|
-
|
|
309
|
+
for (const i of j)
|
|
310
|
+
(s = i.onBeforeGetLODMesh) == null || s.call(i, t, e);
|
|
311
|
+
return t["LOD:requested level"] = e, O.getOrLoadLOD(n, e).then((i) => {
|
|
312
|
+
if (Array.isArray(i)) {
|
|
313
|
+
const a = r.index || 0;
|
|
314
|
+
i = i[a];
|
|
275
315
|
}
|
|
276
|
-
return t["LOD:requested level"] === e && (delete t["LOD:requested level"],
|
|
277
|
-
}).catch((
|
|
316
|
+
return t["LOD:requested level"] === e && (delete t["LOD:requested level"], i && n != i && ((i == null ? void 0 : i.isBufferGeometry) ? t.geometry = i : y && console.error("Invalid LOD geometry", i))), i;
|
|
317
|
+
}).catch((i) => (console.error("Error loading mesh LOD", t, i), null));
|
|
278
318
|
} else
|
|
279
|
-
|
|
319
|
+
y && console.error("Invalid call to assignMeshLOD: Request mesh LOD but the object is not a mesh", t);
|
|
280
320
|
return Promise.resolve(null);
|
|
281
321
|
}
|
|
282
322
|
static assignTextureLOD(t, e = 0) {
|
|
283
323
|
if (!t)
|
|
284
324
|
return Promise.resolve(null);
|
|
285
325
|
if (t.isMesh === !0) {
|
|
286
|
-
const
|
|
287
|
-
if (Array.isArray(
|
|
288
|
-
const
|
|
289
|
-
for (const
|
|
290
|
-
const
|
|
291
|
-
|
|
326
|
+
const s = t;
|
|
327
|
+
if (Array.isArray(s.material)) {
|
|
328
|
+
const n = new Array();
|
|
329
|
+
for (const r of s.material) {
|
|
330
|
+
const i = this.assignTextureLOD(r, e);
|
|
331
|
+
n.push(i);
|
|
292
332
|
}
|
|
293
|
-
return Promise.all(
|
|
294
|
-
const
|
|
295
|
-
for (const a of
|
|
296
|
-
Array.isArray(a) &&
|
|
297
|
-
return
|
|
333
|
+
return Promise.all(n).then((r) => {
|
|
334
|
+
const i = new Array();
|
|
335
|
+
for (const a of r)
|
|
336
|
+
Array.isArray(a) && i.push(...a);
|
|
337
|
+
return i;
|
|
298
338
|
});
|
|
299
339
|
} else
|
|
300
|
-
return this.assignTextureLOD(
|
|
340
|
+
return this.assignTextureLOD(s.material, e);
|
|
301
341
|
}
|
|
302
342
|
if (t.isMaterial === !0) {
|
|
303
|
-
const
|
|
304
|
-
if (
|
|
305
|
-
const
|
|
306
|
-
for (const a of Object.keys(
|
|
307
|
-
const l =
|
|
343
|
+
const s = t, n = [], r = new Array();
|
|
344
|
+
if (s.uniforms && (s.isRawShaderMaterial || s.isShaderMaterial === !0)) {
|
|
345
|
+
const i = s;
|
|
346
|
+
for (const a of Object.keys(i.uniforms)) {
|
|
347
|
+
const l = i.uniforms[a].value;
|
|
308
348
|
if ((l == null ? void 0 : l.isTexture) === !0) {
|
|
309
|
-
const
|
|
310
|
-
|
|
349
|
+
const c = this.assignTextureLODForSlot(l, e, s, a).then((d) => (d && i.uniforms[a].value != d && (i.uniforms[a].value = d, i.uniformsNeedUpdate = !0), d));
|
|
350
|
+
n.push(c), r.push(a);
|
|
311
351
|
}
|
|
312
352
|
}
|
|
313
353
|
} else
|
|
314
|
-
for (const
|
|
315
|
-
const a =
|
|
354
|
+
for (const i of Object.keys(s)) {
|
|
355
|
+
const a = s[i];
|
|
316
356
|
if ((a == null ? void 0 : a.isTexture) === !0) {
|
|
317
|
-
const l = this.assignTextureLODForSlot(a, e,
|
|
318
|
-
|
|
357
|
+
const l = this.assignTextureLODForSlot(a, e, s, i);
|
|
358
|
+
n.push(l), r.push(i);
|
|
319
359
|
}
|
|
320
360
|
}
|
|
321
|
-
return Promise.all(
|
|
361
|
+
return Promise.all(n).then((i) => {
|
|
322
362
|
const a = new Array();
|
|
323
|
-
for (let l = 0; l <
|
|
324
|
-
const
|
|
325
|
-
|
|
363
|
+
for (let l = 0; l < i.length; l++) {
|
|
364
|
+
const c = i[l], d = r[l];
|
|
365
|
+
c && c.isTexture === !0 ? a.push({ material: s, slot: d, texture: c, level: e }) : a.push({ material: s, slot: d, texture: null, level: e });
|
|
326
366
|
}
|
|
327
367
|
return a;
|
|
328
368
|
});
|
|
329
369
|
}
|
|
330
|
-
if (t instanceof
|
|
331
|
-
const
|
|
332
|
-
return this.assignTextureLODForSlot(
|
|
370
|
+
if (t instanceof oe || t.isTexture === !0) {
|
|
371
|
+
const s = t;
|
|
372
|
+
return this.assignTextureLODForSlot(s, e, null, null);
|
|
333
373
|
}
|
|
334
374
|
return Promise.resolve(null);
|
|
335
375
|
}
|
|
336
|
-
static assignTextureLODForSlot(t, e,
|
|
337
|
-
return (t == null ? void 0 : t.isTexture) !== !0 ? Promise.resolve(null) :
|
|
338
|
-
if (Array.isArray(
|
|
339
|
-
return null;
|
|
340
|
-
if ((
|
|
341
|
-
if (
|
|
342
|
-
const
|
|
343
|
-
if (
|
|
344
|
-
const a = this.getAssignedLODInformation(
|
|
376
|
+
static assignTextureLODForSlot(t, e, s, n) {
|
|
377
|
+
return (t == null ? void 0 : t.isTexture) !== !0 ? Promise.resolve(null) : n === "glyphMap" ? Promise.resolve(t) : O.getOrLoadLOD(t, e).then((r) => {
|
|
378
|
+
if (Array.isArray(r))
|
|
379
|
+
return console.warn("Progressive: Got an array of textures for a texture slot, this should not happen", r), null;
|
|
380
|
+
if ((r == null ? void 0 : r.isTexture) === !0) {
|
|
381
|
+
if (r != t && s && n) {
|
|
382
|
+
const i = s[n];
|
|
383
|
+
if (i && !y) {
|
|
384
|
+
const a = this.getAssignedLODInformation(i);
|
|
345
385
|
if (a && (a == null ? void 0 : a.level) < e)
|
|
346
|
-
return
|
|
386
|
+
return y === "verbose" && console.warn("Assigned texture level is already higher: ", a.level, e, s, i, r), null;
|
|
347
387
|
}
|
|
348
|
-
|
|
388
|
+
s[n] = r;
|
|
349
389
|
}
|
|
350
|
-
return
|
|
390
|
+
return r;
|
|
351
391
|
} else
|
|
352
|
-
|
|
392
|
+
y == "verbose" && console.warn("No LOD found for", t, e);
|
|
353
393
|
return null;
|
|
354
|
-
}).catch((
|
|
394
|
+
}).catch((r) => (console.error("Error loading LOD", t, r), null));
|
|
355
395
|
}
|
|
396
|
+
// private _isLoadingTexture;
|
|
397
|
+
// loadTexture = (textureIndex: number) => {
|
|
398
|
+
// if (this._isLoadingTexture) return null;
|
|
399
|
+
// const ext = this.parser.json.textures[textureIndex]?.extensions?.[EXTENSION_NAME] as NEEDLE_ext_progressive_texture;
|
|
400
|
+
// if (!ext) return null;
|
|
401
|
+
// this._isLoadingTexture = true;
|
|
402
|
+
// return this.parser.getDependency("texture", textureIndex).then(tex => {
|
|
403
|
+
// this._isLoadingTexture = false;
|
|
404
|
+
// if (tex) {
|
|
405
|
+
// NEEDLE_progressive.registerTexture(this.url, tex as Texture, ext.lods?.length, textureIndex, ext);
|
|
406
|
+
// }
|
|
407
|
+
// return tex;
|
|
408
|
+
// });
|
|
409
|
+
// }
|
|
356
410
|
afterRoot(t) {
|
|
357
|
-
var e,
|
|
358
|
-
return
|
|
359
|
-
var
|
|
360
|
-
if (
|
|
361
|
-
const a =
|
|
411
|
+
var e, s;
|
|
412
|
+
return y && console.log("AFTER", this.url, t), (e = this.parser.json.textures) == null || e.forEach((n, r) => {
|
|
413
|
+
var i;
|
|
414
|
+
if (n != null && n.extensions) {
|
|
415
|
+
const a = n == null ? void 0 : n.extensions[X];
|
|
362
416
|
if (a) {
|
|
363
417
|
if (!a.lods) {
|
|
364
|
-
|
|
418
|
+
y && console.warn("Texture has no LODs", a);
|
|
365
419
|
return;
|
|
366
420
|
}
|
|
367
421
|
let l = !1;
|
|
368
|
-
for (const
|
|
369
|
-
if (
|
|
370
|
-
const
|
|
371
|
-
(
|
|
422
|
+
for (const c of this.parser.associations.keys())
|
|
423
|
+
if (c.isTexture === !0) {
|
|
424
|
+
const d = this.parser.associations.get(c);
|
|
425
|
+
(d == null ? void 0 : d.textures) === r && (l = !0, O.registerTexture(this.url, c, (i = a.lods) == null ? void 0 : i.length, r, a));
|
|
372
426
|
}
|
|
373
|
-
l || this.parser.getDependency("texture",
|
|
374
|
-
var
|
|
375
|
-
|
|
427
|
+
l || this.parser.getDependency("texture", r).then((c) => {
|
|
428
|
+
var d;
|
|
429
|
+
c && O.registerTexture(this.url, c, (d = a.lods) == null ? void 0 : d.length, r, a);
|
|
376
430
|
});
|
|
377
431
|
}
|
|
378
432
|
}
|
|
379
|
-
}), (
|
|
380
|
-
if (
|
|
381
|
-
const
|
|
382
|
-
if (
|
|
433
|
+
}), (s = this.parser.json.meshes) == null || s.forEach((n, r) => {
|
|
434
|
+
if (n != null && n.extensions) {
|
|
435
|
+
const i = n == null ? void 0 : n.extensions[X];
|
|
436
|
+
if (i && i.lods) {
|
|
383
437
|
for (const a of this.parser.associations.keys())
|
|
384
438
|
if (a.isMesh) {
|
|
385
439
|
const l = this.parser.associations.get(a);
|
|
386
|
-
(l == null ? void 0 : l.meshes) ===
|
|
440
|
+
(l == null ? void 0 : l.meshes) === r && O.registerMesh(this.url, i.guid, a, i.lods.length, l.primitives, i);
|
|
387
441
|
}
|
|
388
442
|
}
|
|
389
443
|
}
|
|
390
444
|
}), null;
|
|
391
445
|
}
|
|
392
446
|
static async getOrLoadLOD(t, e) {
|
|
393
|
-
var a, l,
|
|
394
|
-
const
|
|
395
|
-
if (!
|
|
396
|
-
return null;
|
|
397
|
-
const
|
|
398
|
-
let
|
|
447
|
+
var a, l, c, d;
|
|
448
|
+
const s = y == "verbose", n = this.getAssignedLODInformation(t);
|
|
449
|
+
if (!n)
|
|
450
|
+
return y && console.warn(`[gltf-progressive] No LOD information found: ${t.name}, uuid: ${t.uuid}, type: ${t.type}`, t), null;
|
|
451
|
+
const r = n == null ? void 0 : n.key;
|
|
452
|
+
let i;
|
|
399
453
|
if (t.isTexture === !0) {
|
|
400
454
|
const h = t;
|
|
401
|
-
h.source && h.source[
|
|
455
|
+
h.source && h.source[Oe] && (i = h.source[Oe]);
|
|
402
456
|
}
|
|
403
|
-
if (
|
|
457
|
+
if (i || (i = O.lodInfos.get(r)), i) {
|
|
404
458
|
if (e > 0) {
|
|
405
|
-
let
|
|
406
|
-
const
|
|
407
|
-
if (
|
|
408
|
-
return this.lowresCache.get(
|
|
459
|
+
let w = !1;
|
|
460
|
+
const v = Array.isArray(i.lods);
|
|
461
|
+
if (v && e >= i.lods.length ? w = !0 : v || (w = !0), w)
|
|
462
|
+
return this.lowresCache.get(r);
|
|
409
463
|
}
|
|
410
|
-
const h = Array.isArray(
|
|
464
|
+
const h = Array.isArray(i.lods) ? (a = i.lods[e]) == null ? void 0 : a.path : i.lods;
|
|
411
465
|
if (!h)
|
|
412
|
-
return
|
|
413
|
-
const
|
|
414
|
-
if (
|
|
415
|
-
if (!
|
|
416
|
-
return console.warn("missing pointer for glb/gltf texture",
|
|
417
|
-
const
|
|
418
|
-
if (
|
|
419
|
-
|
|
420
|
-
let
|
|
421
|
-
`,
|
|
422
|
-
if (
|
|
423
|
-
return
|
|
466
|
+
return y && !i["missing:uri"] && (i["missing:uri"] = !0, console.warn("Missing uri for progressive asset for LOD " + e, i)), null;
|
|
467
|
+
const f = dt(n.url, h);
|
|
468
|
+
if (f.endsWith(".glb") || f.endsWith(".gltf")) {
|
|
469
|
+
if (!i.guid)
|
|
470
|
+
return console.warn("missing pointer for glb/gltf texture", i), null;
|
|
471
|
+
const w = f + "_" + i.guid, v = this.previouslyLoaded.get(w);
|
|
472
|
+
if (v !== void 0) {
|
|
473
|
+
s && console.log(`LOD ${e} was already loading/loaded: ${w}`);
|
|
474
|
+
let g = await v.catch((E) => (console.error(`Error loading LOD ${e} from ${f}
|
|
475
|
+
`, E), null)), x = !1;
|
|
476
|
+
if (g == null || (g instanceof oe && t instanceof oe ? (l = g.image) != null && l.data || (c = g.source) != null && c.data ? g = this.copySettings(t, g) : (x = !0, this.previouslyLoaded.delete(w)) : g instanceof Le && t instanceof Le && ((d = g.attributes.position) != null && d.array || (x = !0, this.previouslyLoaded.delete(w)))), !x)
|
|
477
|
+
return g;
|
|
424
478
|
}
|
|
425
|
-
const
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
479
|
+
const P = await this.queue.slot(f);
|
|
480
|
+
if (!P.use)
|
|
481
|
+
return y && console.log(`LOD ${e} was aborted: ${f}`), null;
|
|
482
|
+
const M = i, R = new Promise(async (g, x) => {
|
|
483
|
+
const E = new Ce();
|
|
484
|
+
ze(E), y && (await new Promise((D) => setTimeout(D, 1e3)), s && console.warn("Start loading (delayed) " + f, M.guid));
|
|
485
|
+
let U = f;
|
|
486
|
+
if (M && Array.isArray(M.lods)) {
|
|
487
|
+
const D = M.lods[e];
|
|
488
|
+
D.hash && (U += "?v=" + D.hash);
|
|
432
489
|
}
|
|
433
|
-
const
|
|
434
|
-
`,
|
|
435
|
-
if (!
|
|
436
|
-
return null;
|
|
437
|
-
const
|
|
438
|
-
|
|
439
|
-
let
|
|
440
|
-
if (
|
|
441
|
-
let
|
|
442
|
-
for (const
|
|
443
|
-
if (
|
|
444
|
-
const
|
|
445
|
-
if (
|
|
446
|
-
|
|
490
|
+
const S = await E.loadAsync(U).catch((D) => (console.error(`Error loading LOD ${e} from ${f}
|
|
491
|
+
`, D), g(null)));
|
|
492
|
+
if (!S)
|
|
493
|
+
return g(null);
|
|
494
|
+
const ee = S.parser;
|
|
495
|
+
s && console.log("Loading finished " + f, M.guid);
|
|
496
|
+
let I = 0;
|
|
497
|
+
if (S.parser.json.textures) {
|
|
498
|
+
let D = !1;
|
|
499
|
+
for (const m of S.parser.json.textures) {
|
|
500
|
+
if (m != null && m.extensions) {
|
|
501
|
+
const p = m == null ? void 0 : m.extensions[X];
|
|
502
|
+
if (p != null && p.guid && p.guid === M.guid) {
|
|
503
|
+
D = !0;
|
|
447
504
|
break;
|
|
448
505
|
}
|
|
449
506
|
}
|
|
450
|
-
|
|
507
|
+
I++;
|
|
451
508
|
}
|
|
452
|
-
if (
|
|
453
|
-
let
|
|
454
|
-
return
|
|
509
|
+
if (D) {
|
|
510
|
+
let m = await ee.getDependency("texture", I);
|
|
511
|
+
return m && O.assignLODInformation(n.url, m, r, e, void 0), s && console.log('change "' + t.name + '" → "' + m.name + '"', f, I, m, w), t instanceof oe && (m = this.copySettings(t, m)), m && (m.guid = M.guid), g(m);
|
|
455
512
|
} else
|
|
456
|
-
|
|
513
|
+
y && console.warn("Could not find texture with guid", M.guid, S.parser.json);
|
|
457
514
|
}
|
|
458
|
-
if (
|
|
459
|
-
let
|
|
460
|
-
for (const
|
|
461
|
-
if (
|
|
462
|
-
const
|
|
463
|
-
if (
|
|
464
|
-
|
|
515
|
+
if (I = 0, S.parser.json.meshes) {
|
|
516
|
+
let D = !1;
|
|
517
|
+
for (const m of S.parser.json.meshes) {
|
|
518
|
+
if (m != null && m.extensions) {
|
|
519
|
+
const p = m == null ? void 0 : m.extensions[X];
|
|
520
|
+
if (p != null && p.guid && p.guid === M.guid) {
|
|
521
|
+
D = !0;
|
|
465
522
|
break;
|
|
466
523
|
}
|
|
467
524
|
}
|
|
468
|
-
|
|
525
|
+
I++;
|
|
469
526
|
}
|
|
470
|
-
if (
|
|
471
|
-
const
|
|
472
|
-
if (
|
|
473
|
-
const
|
|
474
|
-
return
|
|
527
|
+
if (D) {
|
|
528
|
+
const m = await ee.getDependency("mesh", I);
|
|
529
|
+
if (s && console.log(`Loaded Mesh "${m.name}"`, f, I, m, w), m.isMesh === !0) {
|
|
530
|
+
const p = m.geometry;
|
|
531
|
+
return O.assignLODInformation(n.url, p, r, e, 0), g(p);
|
|
475
532
|
} else {
|
|
476
|
-
const
|
|
477
|
-
for (let
|
|
478
|
-
const
|
|
479
|
-
if (
|
|
480
|
-
const
|
|
481
|
-
|
|
533
|
+
const p = new Array();
|
|
534
|
+
for (let _ = 0; _ < m.children.length; _++) {
|
|
535
|
+
const $ = m.children[_];
|
|
536
|
+
if ($.isMesh === !0) {
|
|
537
|
+
const A = $.geometry;
|
|
538
|
+
O.assignLODInformation(n.url, A, r, e, _), p.push(A);
|
|
482
539
|
}
|
|
483
540
|
}
|
|
484
|
-
return
|
|
541
|
+
return g(p);
|
|
485
542
|
}
|
|
486
543
|
} else
|
|
487
|
-
|
|
544
|
+
y && console.warn("Could not find mesh with guid", M.guid, S.parser.json);
|
|
488
545
|
}
|
|
489
|
-
return
|
|
546
|
+
return g(null);
|
|
490
547
|
});
|
|
491
|
-
return this.previouslyLoaded.set(
|
|
492
|
-
} else if (t instanceof
|
|
493
|
-
|
|
494
|
-
const
|
|
495
|
-
return
|
|
548
|
+
return this.previouslyLoaded.set(w, R), P.use(R), await R;
|
|
549
|
+
} else if (t instanceof oe) {
|
|
550
|
+
s && console.log("Load texture from uri: " + f);
|
|
551
|
+
const v = await new je().loadAsync(f);
|
|
552
|
+
return v ? (v.guid = i.guid, v.flipY = !1, v.needsUpdate = !0, v.colorSpace = t.colorSpace, s && console.log(i, v)) : y && console.warn("failed loading", f), v;
|
|
496
553
|
}
|
|
497
554
|
} else
|
|
498
|
-
|
|
555
|
+
y && console.warn(`Can not load LOD ${e}: no LOD info found for "${r}" ${t.name}`, t.type);
|
|
499
556
|
return null;
|
|
500
557
|
}
|
|
501
|
-
static assignLODInformation(t, e,
|
|
558
|
+
static assignLODInformation(t, e, s, n, r) {
|
|
502
559
|
if (!e)
|
|
503
560
|
return;
|
|
504
561
|
e.userData || (e.userData = {});
|
|
505
|
-
const
|
|
506
|
-
e.userData.LODS =
|
|
562
|
+
const i = new yt(t, s, n, r);
|
|
563
|
+
e.userData.LODS = i, "source" in e && typeof e.source == "object" && (e.source.LODS = i);
|
|
507
564
|
}
|
|
508
565
|
static getAssignedLODInformation(t) {
|
|
509
|
-
var e;
|
|
510
|
-
return (
|
|
566
|
+
var e, s;
|
|
567
|
+
return t ? (e = t.userData) != null && e.LODS ? t.userData.LODS : "source" in t && ((s = t.source) != null && s.LODS) ? t.source.LODS : null : null;
|
|
511
568
|
}
|
|
512
569
|
// private static readonly _copiedTextures: WeakMap<Texture, Texture> = new Map();
|
|
513
570
|
static copySettings(t, e) {
|
|
514
|
-
return e ? (
|
|
571
|
+
return e ? (y && console.warn(`Copy texture settings
|
|
515
572
|
`, t.uuid, `
|
|
516
573
|
`, 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;
|
|
517
574
|
}
|
|
518
575
|
};
|
|
519
|
-
let
|
|
576
|
+
let T = O;
|
|
520
577
|
/**
|
|
521
578
|
* Register a texture with LOD information
|
|
522
579
|
*/
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
580
|
+
u(T, "registerTexture", (t, e, s, n, r) => {
|
|
581
|
+
var a, l, c, d, h, f, w, v;
|
|
582
|
+
if (!e) {
|
|
583
|
+
y && console.error("gltf-progressive: Called register texture without texture");
|
|
526
584
|
return;
|
|
527
585
|
}
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
586
|
+
if (y) {
|
|
587
|
+
const P = ((a = e.image) == null ? void 0 : a.width) || ((c = (l = e.source) == null ? void 0 : l.data) == null ? void 0 : c.width) || 0, M = ((d = e.image) == null ? void 0 : d.height) || ((f = (h = e.source) == null ? void 0 : h.data) == null ? void 0 : f.height) || 0;
|
|
588
|
+
console.log(`> Progressive: register texture[${n}] "${e.name || e.uuid}", Current: ${P}x${M}, Max: ${(w = r.lods[0]) == null ? void 0 : w.width}x${(v = r.lods[0]) == null ? void 0 : v.height}, uuid: ${e.uuid}`, r, e);
|
|
589
|
+
}
|
|
590
|
+
e.source && (e.source[Oe] = r);
|
|
591
|
+
const i = r.guid;
|
|
592
|
+
O.assignLODInformation(t, e, i, s, n), O.lodInfos.set(i, r), O.lowresCache.set(i, e);
|
|
531
593
|
}), /**
|
|
532
594
|
* Register a mesh with LOD information
|
|
533
595
|
*/
|
|
534
|
-
|
|
535
|
-
var
|
|
536
|
-
const a =
|
|
596
|
+
u(T, "registerMesh", (t, e, s, n, r, i) => {
|
|
597
|
+
var c;
|
|
598
|
+
const a = s.geometry;
|
|
537
599
|
if (!a) {
|
|
538
|
-
|
|
600
|
+
y && console.warn("gltf-progressive: Register mesh without geometry");
|
|
539
601
|
return;
|
|
540
602
|
}
|
|
541
|
-
a.userData || (a.userData = {}),
|
|
542
|
-
let l =
|
|
543
|
-
l ? l.push(
|
|
544
|
-
for (const
|
|
545
|
-
(
|
|
603
|
+
a.userData || (a.userData = {}), y && console.log("> Progressive: register mesh " + s.name, { index: r, uuid: s.uuid }, i, s), O.assignLODInformation(t, a, e, n, r), O.lodInfos.set(e, i);
|
|
604
|
+
let l = O.lowresCache.get(e);
|
|
605
|
+
l ? l.push(s.geometry) : l = [s.geometry], O.lowresCache.set(e, l), n > 0 && !ce(s) && gt(s, a);
|
|
606
|
+
for (const d of j)
|
|
607
|
+
(c = d.onRegisteredNewMesh) == null || c.call(d, s, i);
|
|
546
608
|
}), /** A map of key = asset uuid and value = LOD information */
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
class
|
|
551
|
-
constructor(t, e,
|
|
552
|
-
|
|
609
|
+
u(T, "lodInfos", /* @__PURE__ */ new Map()), /** cache of already loaded mesh lods */
|
|
610
|
+
u(T, "previouslyLoaded", /* @__PURE__ */ new Map()), /** this contains the geometry/textures that were originally loaded */
|
|
611
|
+
u(T, "lowresCache", /* @__PURE__ */ new Map()), u(T, "queue", new ft(100, { debug: y != !1 }));
|
|
612
|
+
class yt {
|
|
613
|
+
constructor(t, e, s, n) {
|
|
614
|
+
u(this, "url");
|
|
553
615
|
/** the key to lookup the LOD information */
|
|
554
|
-
|
|
555
|
-
|
|
616
|
+
u(this, "key");
|
|
617
|
+
u(this, "level");
|
|
556
618
|
/** For multi objects (e.g. a group of meshes) this is the index of the object */
|
|
557
|
-
|
|
558
|
-
this.url = t, this.key = e, this.level =
|
|
619
|
+
u(this, "index");
|
|
620
|
+
this.url = t, this.key = e, this.level = s, n != null && (this.index = n);
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
class ye {
|
|
624
|
+
constructor(t, e) {
|
|
625
|
+
u(this, "frame_start");
|
|
626
|
+
u(this, "frame_capture_end");
|
|
627
|
+
u(this, "ready");
|
|
628
|
+
u(this, "_resolve");
|
|
629
|
+
u(this, "_signal");
|
|
630
|
+
u(this, "_resolved", !1);
|
|
631
|
+
u(this, "_addedCount", 0);
|
|
632
|
+
u(this, "_resolvedCount", 0);
|
|
633
|
+
/** These promises are currently being awaited */
|
|
634
|
+
u(this, "_awaiting", []);
|
|
635
|
+
u(this, "_maxPromisesPerObject", 1);
|
|
636
|
+
u(this, "_currentFrame", 0);
|
|
637
|
+
u(this, "_seen", /* @__PURE__ */ new WeakMap());
|
|
638
|
+
var r;
|
|
639
|
+
const n = Math.max(e.frames ?? 2, 2);
|
|
640
|
+
this.frame_start = t, this.frame_capture_end = t + n, this.ready = new Promise((i) => {
|
|
641
|
+
this._resolve = i;
|
|
642
|
+
}), this.ready.finally(() => {
|
|
643
|
+
this._resolved = !0, this._awaiting.length = 0;
|
|
644
|
+
}), this._signal = e.signal, (r = this._signal) == null || r.addEventListener("abort", () => {
|
|
645
|
+
this.resolveNow();
|
|
646
|
+
}), this._maxPromisesPerObject = Math.max(1, e.maxPromisesPerObject ?? 1);
|
|
647
|
+
}
|
|
648
|
+
/**
|
|
649
|
+
* The number of promises that have been added to this group so far.
|
|
650
|
+
*/
|
|
651
|
+
get awaitedCount() {
|
|
652
|
+
return this._addedCount;
|
|
653
|
+
}
|
|
654
|
+
get resolvedCount() {
|
|
655
|
+
return this._resolvedCount;
|
|
656
|
+
}
|
|
657
|
+
get currentlyAwaiting() {
|
|
658
|
+
return this._awaiting.length;
|
|
659
|
+
}
|
|
660
|
+
update(t) {
|
|
661
|
+
var e;
|
|
662
|
+
this._currentFrame = t, ((e = this._signal) != null && e.aborted || this._currentFrame > this.frame_capture_end && this._awaiting.length === 0) && this.resolveNow();
|
|
663
|
+
}
|
|
664
|
+
add(t, e, s) {
|
|
665
|
+
if (this._resolved) {
|
|
666
|
+
y && console.warn("PromiseGroup: Trying to add a promise to a resolved group, ignoring.");
|
|
667
|
+
return;
|
|
668
|
+
}
|
|
669
|
+
if (!(this._currentFrame > this.frame_capture_end)) {
|
|
670
|
+
if (this._maxPromisesPerObject >= 1)
|
|
671
|
+
if (this._seen.has(e)) {
|
|
672
|
+
let n = this._seen.get(e);
|
|
673
|
+
if (n >= this._maxPromisesPerObject) {
|
|
674
|
+
y && console.warn("PromiseGroup: Already awaiting object ignoring new promise for it.");
|
|
675
|
+
return;
|
|
676
|
+
}
|
|
677
|
+
this._seen.set(e, n + 1);
|
|
678
|
+
} else
|
|
679
|
+
this._seen.set(e, 1);
|
|
680
|
+
this._awaiting.push(s), this._addedCount++, s.finally(() => {
|
|
681
|
+
this._resolvedCount++, this._awaiting.splice(this._awaiting.indexOf(s), 1);
|
|
682
|
+
});
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
resolveNow() {
|
|
686
|
+
var t, e;
|
|
687
|
+
this._resolved || (e = this._resolve) == null || e.call(this, {
|
|
688
|
+
awaited_count: this._addedCount,
|
|
689
|
+
resolved_count: this._resolvedCount,
|
|
690
|
+
cancelled: ((t = this._signal) == null ? void 0 : t.aborted) ?? !1
|
|
691
|
+
});
|
|
559
692
|
}
|
|
560
693
|
}
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
694
|
+
u(ye, "addPromise", (t, e, s, n) => {
|
|
695
|
+
n.forEach((r) => {
|
|
696
|
+
r.add(t, e, s);
|
|
697
|
+
});
|
|
698
|
+
});
|
|
699
|
+
const F = de("debugprogressive"), Lt = de("noprogressive"), be = Symbol("Needle:LODSManager"), Se = Symbol("Needle:LODState"), Q = Symbol("Needle:CurrentLOD"), G = { mesh_lod: -1, texture_lod: -1 };
|
|
700
|
+
var B, K, we, J, ie, _e, Y;
|
|
701
|
+
const b = class {
|
|
564
702
|
// readonly plugins: NEEDLE_progressive_plugin[] = [];
|
|
565
703
|
constructor(t, e) {
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
704
|
+
u(this, "renderer");
|
|
705
|
+
u(this, "context");
|
|
706
|
+
u(this, "projectionScreenMatrix", new Ie());
|
|
569
707
|
/**
|
|
570
708
|
* The target triangle density is the desired max amount of triangles on screen when the mesh is filling the screen.
|
|
571
709
|
* @default 200_000
|
|
572
710
|
*/
|
|
573
|
-
|
|
711
|
+
u(this, "targetTriangleDensity", 2e5);
|
|
574
712
|
/**
|
|
575
713
|
* The interval in frames to automatically update the bounds of skinned meshes.
|
|
576
714
|
* Set to 0 or a negative value to disable automatic bounds updates.
|
|
577
715
|
* @default 30
|
|
578
716
|
*/
|
|
579
|
-
|
|
717
|
+
u(this, "skinnedMeshAutoUpdateBoundsInterval", 30);
|
|
580
718
|
/**
|
|
581
719
|
* The update interval in frames. If set to 0, the LODs will be updated every frame. If set to 2, the LODs will be updated every second frame, etc.
|
|
582
720
|
* @default "auto"
|
|
583
721
|
*/
|
|
584
|
-
|
|
585
|
-
|
|
722
|
+
u(this, "updateInterval", "auto");
|
|
723
|
+
H(this, B, 1);
|
|
586
724
|
/**
|
|
587
725
|
* If set to true, the LODsManager will not update the LODs.
|
|
588
726
|
* @default false
|
|
589
727
|
*/
|
|
590
|
-
|
|
728
|
+
u(this, "pause", !1);
|
|
591
729
|
/**
|
|
592
730
|
* When set to true the LODsManager will not update the LODs. This can be used to manually update the LODs using the `update` method.
|
|
593
731
|
* Otherwise the LODs will be updated automatically when the renderer renders the scene.
|
|
594
732
|
* @default false
|
|
595
733
|
*/
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
734
|
+
u(this, "manual", !1);
|
|
735
|
+
u(this, "_newPromiseGroups", []);
|
|
736
|
+
u(this, "_promiseGroupIds", 0);
|
|
737
|
+
u(this, "_lodchangedlisteners", []);
|
|
738
|
+
H(this, K, void 0);
|
|
739
|
+
H(this, we, new Je());
|
|
740
|
+
H(this, J, 0);
|
|
741
|
+
H(this, ie, 0);
|
|
742
|
+
H(this, _e, 0);
|
|
743
|
+
H(this, Y, 0);
|
|
744
|
+
u(this, "_fpsBuffer", [60, 60, 60, 60, 60]);
|
|
605
745
|
// private testIfLODLevelsAreAvailable() {
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
746
|
+
u(this, "_sphere", new et());
|
|
747
|
+
u(this, "_tempBox", new $e());
|
|
748
|
+
u(this, "_tempBox2", new $e());
|
|
749
|
+
u(this, "tempMatrix", new Ie());
|
|
750
|
+
u(this, "_tempWorldPosition", new W());
|
|
751
|
+
u(this, "_tempBoxSize", new W());
|
|
752
|
+
u(this, "_tempBox2Size", new W());
|
|
613
753
|
this.renderer = t, this.context = { ...e };
|
|
614
754
|
}
|
|
615
755
|
/** @internal */
|
|
616
756
|
static getObjectLODState(t) {
|
|
617
|
-
return t[
|
|
757
|
+
return t[Se];
|
|
618
758
|
}
|
|
619
759
|
static addPlugin(t) {
|
|
620
|
-
|
|
760
|
+
j.push(t);
|
|
621
761
|
}
|
|
622
762
|
static removePlugin(t) {
|
|
623
|
-
const e =
|
|
624
|
-
e >= 0 &&
|
|
763
|
+
const e = j.indexOf(t);
|
|
764
|
+
e >= 0 && j.splice(e, 1);
|
|
625
765
|
}
|
|
626
766
|
/**
|
|
627
767
|
* Gets the LODsManager for the given renderer. If the LODsManager does not exist yet, it will be created.
|
|
@@ -629,79 +769,99 @@ const T = class {
|
|
|
629
769
|
* @returns The LODsManager instance.
|
|
630
770
|
*/
|
|
631
771
|
static get(t, e) {
|
|
632
|
-
if (t[
|
|
633
|
-
return console.debug("[gltf-progressive] LODsManager already exists for this renderer"), t[
|
|
634
|
-
const
|
|
772
|
+
if (t[be])
|
|
773
|
+
return console.debug("[gltf-progressive] LODsManager already exists for this renderer"), t[be];
|
|
774
|
+
const s = new b(t, {
|
|
635
775
|
engine: "unknown",
|
|
636
776
|
...e
|
|
637
777
|
});
|
|
638
|
-
return t[
|
|
778
|
+
return t[be] = s, s;
|
|
639
779
|
}
|
|
640
780
|
/** @deprecated use static `LODsManager.addPlugin()` method. This getter will be removed in later versions */
|
|
641
781
|
get plugins() {
|
|
642
|
-
return
|
|
782
|
+
return j;
|
|
783
|
+
}
|
|
784
|
+
/**
|
|
785
|
+
* Call to await LODs loading during the next render cycle.
|
|
786
|
+
*/
|
|
787
|
+
awaitLoading(t) {
|
|
788
|
+
const e = this._promiseGroupIds++, s = new ye(L(this, J), { ...t });
|
|
789
|
+
this._newPromiseGroups.push(s);
|
|
790
|
+
const n = performance.now();
|
|
791
|
+
return s.ready.finally(() => {
|
|
792
|
+
const r = this._newPromiseGroups.indexOf(s);
|
|
793
|
+
r >= 0 && (this._newPromiseGroups.splice(r, 1), Ge() && performance.measure("LODsManager:awaitLoading", {
|
|
794
|
+
start: n,
|
|
795
|
+
detail: { id: e, name: t == null ? void 0 : t.name, awaited: s.awaitedCount, resolved: s.resolvedCount }
|
|
796
|
+
}));
|
|
797
|
+
}), s.ready;
|
|
798
|
+
}
|
|
799
|
+
_postprocessPromiseGroups() {
|
|
800
|
+
if (this._newPromiseGroups.length !== 0)
|
|
801
|
+
for (let t = this._newPromiseGroups.length - 1; t >= 0; t--)
|
|
802
|
+
this._newPromiseGroups[t].update(L(this, J));
|
|
643
803
|
}
|
|
644
804
|
addEventListener(t, e) {
|
|
645
805
|
t === "changed" && this._lodchangedlisteners.push(e);
|
|
646
806
|
}
|
|
647
807
|
removeEventListener(t, e) {
|
|
648
808
|
if (t === "changed") {
|
|
649
|
-
const
|
|
650
|
-
|
|
809
|
+
const s = this._lodchangedlisteners.indexOf(e);
|
|
810
|
+
s >= 0 && this._lodchangedlisteners.splice(s, 1);
|
|
651
811
|
}
|
|
652
812
|
}
|
|
653
813
|
/**
|
|
654
814
|
* Enable the LODsManager. This will replace the render method of the renderer with a method that updates the LODs.
|
|
655
815
|
*/
|
|
656
816
|
enable() {
|
|
657
|
-
if (
|
|
817
|
+
if (L(this, K))
|
|
658
818
|
return;
|
|
659
819
|
console.debug("[gltf-progressive] Enabling LODsManager for renderer");
|
|
660
820
|
let t = 0;
|
|
661
|
-
V(this,
|
|
821
|
+
V(this, K, this.renderer.render);
|
|
662
822
|
const e = this;
|
|
663
|
-
Ue(this.renderer), this.renderer.render = function(
|
|
664
|
-
const
|
|
665
|
-
(
|
|
666
|
-
const
|
|
667
|
-
|
|
823
|
+
Ue(this.renderer), this.renderer.render = function(s, n) {
|
|
824
|
+
const r = e.renderer.getRenderTarget();
|
|
825
|
+
(r == null || "isXRRenderTarget" in r && r.isXRRenderTarget) && (t = 0, V(e, J, L(e, J) + 1), V(e, ie, L(e, we).getDelta()), V(e, _e, L(e, _e) + L(e, ie)), e._fpsBuffer.shift(), e._fpsBuffer.push(1 / L(e, ie)), V(e, Y, e._fpsBuffer.reduce((a, l) => a + l) / e._fpsBuffer.length), F && L(e, J) % 200 === 0 && console.log("FPS", Math.round(L(e, Y)), "Interval:", L(e, B)));
|
|
826
|
+
const i = t++;
|
|
827
|
+
L(e, K).call(this, s, n), e.onAfterRender(s, n, i);
|
|
668
828
|
};
|
|
669
829
|
}
|
|
670
830
|
disable() {
|
|
671
|
-
|
|
831
|
+
L(this, K) && (console.debug("[gltf-progressive] Disabling LODsManager for renderer"), this.renderer.render = L(this, K), V(this, K, void 0));
|
|
672
832
|
}
|
|
673
833
|
update(t, e) {
|
|
674
834
|
this.internalUpdate(t, e);
|
|
675
835
|
}
|
|
676
|
-
onAfterRender(t, e,
|
|
836
|
+
onAfterRender(t, e, s) {
|
|
677
837
|
if (this.pause)
|
|
678
838
|
return;
|
|
679
|
-
const
|
|
680
|
-
let
|
|
681
|
-
if (
|
|
682
|
-
const a =
|
|
683
|
-
(a.name === "EffectMaterial" || a.name === "CopyShader") && (
|
|
839
|
+
const r = this.renderer.renderLists.get(t, 0).opaque;
|
|
840
|
+
let i = !0;
|
|
841
|
+
if (r.length === 1) {
|
|
842
|
+
const a = r[0].material;
|
|
843
|
+
(a.name === "EffectMaterial" || a.name === "CopyShader") && (i = !1);
|
|
684
844
|
}
|
|
685
|
-
if ((e.parent && e.parent.type === "CubeCamera" ||
|
|
686
|
-
if (
|
|
845
|
+
if ((e.parent && e.parent.type === "CubeCamera" || s >= 1 && e.type === "OrthographicCamera") && (i = !1), i) {
|
|
846
|
+
if (Lt || (this.updateInterval === "auto" ? L(this, Y) < 40 && L(this, B) < 10 ? (V(this, B, L(this, B) + 1), F && console.warn("↓ Reducing LOD updates", L(this, B), L(this, Y).toFixed(0))) : L(this, Y) >= 60 && L(this, B) > 1 && (V(this, B, L(this, B) - 1), F && console.warn("↑ Increasing LOD updates", L(this, B), L(this, Y).toFixed(0))) : V(this, B, this.updateInterval), L(this, B) > 0 && L(this, J) % L(this, B) != 0))
|
|
687
847
|
return;
|
|
688
|
-
this.internalUpdate(t, e);
|
|
848
|
+
this.internalUpdate(t, e), this._postprocessPromiseGroups();
|
|
689
849
|
}
|
|
690
850
|
}
|
|
691
851
|
/**
|
|
692
852
|
* Update LODs in a scene
|
|
693
853
|
*/
|
|
694
854
|
internalUpdate(t, e) {
|
|
695
|
-
var l,
|
|
696
|
-
const
|
|
855
|
+
var l, c;
|
|
856
|
+
const s = this.renderer.renderLists.get(t, 0), n = s.opaque;
|
|
697
857
|
this.projectionScreenMatrix.multiplyMatrices(e.projectionMatrix, e.matrixWorldInverse);
|
|
698
|
-
const
|
|
699
|
-
for (const
|
|
700
|
-
if (
|
|
701
|
-
|
|
858
|
+
const r = this.targetTriangleDensity;
|
|
859
|
+
for (const d of n) {
|
|
860
|
+
if (d.material && (((l = d.geometry) == null ? void 0 : l.type) === "BoxGeometry" || ((c = d.geometry) == null ? void 0 : c.type) === "BufferGeometry") && (d.material.name === "SphericalGaussianBlur" || d.material.name == "BackgroundCubeMaterial" || d.material.name === "CubemapFromEquirect" || d.material.name === "EquirectangularToCubeUV")) {
|
|
861
|
+
F && (d.material["NEEDLE_PROGRESSIVE:IGNORE-WARNING"] || (d.material["NEEDLE_PROGRESSIVE:IGNORE-WARNING"] = !0, console.warn("Ignoring skybox or BLIT object", d, d.material.name, d.material.type)));
|
|
702
862
|
continue;
|
|
703
863
|
}
|
|
704
|
-
switch (
|
|
864
|
+
switch (d.material.type) {
|
|
705
865
|
case "LineBasicMaterial":
|
|
706
866
|
case "LineDashedMaterial":
|
|
707
867
|
case "PointsMaterial":
|
|
@@ -710,39 +870,39 @@ const T = class {
|
|
|
710
870
|
case "MeshDepthMaterial":
|
|
711
871
|
continue;
|
|
712
872
|
}
|
|
713
|
-
if (
|
|
714
|
-
|
|
715
|
-
const
|
|
716
|
-
|
|
873
|
+
if (F === "color" && d.material && !d.object.progressive_debug_color) {
|
|
874
|
+
d.object.progressive_debug_color = !0;
|
|
875
|
+
const f = Math.random() * 16777215, w = new Ze({ color: f });
|
|
876
|
+
d.object.material = w;
|
|
717
877
|
}
|
|
718
|
-
const h =
|
|
719
|
-
(h instanceof
|
|
878
|
+
const h = d.object;
|
|
879
|
+
(h instanceof se || h.isMesh) && this.updateLODs(t, e, h, r);
|
|
720
880
|
}
|
|
721
|
-
const
|
|
722
|
-
for (const
|
|
723
|
-
const h =
|
|
724
|
-
(h instanceof
|
|
881
|
+
const i = s.transparent;
|
|
882
|
+
for (const d of i) {
|
|
883
|
+
const h = d.object;
|
|
884
|
+
(h instanceof se || h.isMesh) && this.updateLODs(t, e, h, r);
|
|
725
885
|
}
|
|
726
|
-
const a =
|
|
727
|
-
for (const
|
|
728
|
-
const h =
|
|
729
|
-
(h instanceof
|
|
886
|
+
const a = s.transmissive;
|
|
887
|
+
for (const d of a) {
|
|
888
|
+
const h = d.object;
|
|
889
|
+
(h instanceof se || h.isMesh) && this.updateLODs(t, e, h, r);
|
|
730
890
|
}
|
|
731
891
|
}
|
|
732
892
|
/** Update the LOD levels for the renderer. */
|
|
733
|
-
updateLODs(t, e,
|
|
893
|
+
updateLODs(t, e, s, n) {
|
|
734
894
|
var a, l;
|
|
735
|
-
|
|
736
|
-
let
|
|
737
|
-
if (
|
|
895
|
+
s.userData || (s.userData = {});
|
|
896
|
+
let r = s[Se];
|
|
897
|
+
if (r || (r = new xt(), s[Se] = r), r.frames++ < 2)
|
|
738
898
|
return;
|
|
739
|
-
for (const
|
|
740
|
-
(a =
|
|
741
|
-
const
|
|
742
|
-
|
|
743
|
-
for (const
|
|
744
|
-
(l =
|
|
745
|
-
|
|
899
|
+
for (const c of j)
|
|
900
|
+
(a = c.onBeforeUpdateLOD) == null || a.call(c, this.renderer, t, e, s);
|
|
901
|
+
const i = b.overrideGlobalLodLevel !== void 0 ? b.overrideGlobalLodLevel : te;
|
|
902
|
+
i >= 0 ? (G.mesh_lod = i, G.texture_lod = i) : (this.calculateLodLevel(e, s, r, n, G), G.mesh_lod = Math.round(G.mesh_lod), G.texture_lod = Math.round(G.texture_lod)), G.mesh_lod >= 0 && this.loadProgressiveMeshes(s, G.mesh_lod), s.material && G.texture_lod >= 0 && this.loadProgressiveTextures(s.material, G.texture_lod), y && s.material && !s.isGizmo && qe(s.material);
|
|
903
|
+
for (const c of j)
|
|
904
|
+
(l = c.onAfterUpdatedLOD) == null || l.call(c, this.renderer, t, e, s, G);
|
|
905
|
+
r.lastLodLevel_Mesh = G.mesh_lod, r.lastLodLevel_Texture = G.texture_lod;
|
|
746
906
|
}
|
|
747
907
|
/** Load progressive textures for the given material
|
|
748
908
|
* @param material the material to load the textures for
|
|
@@ -753,16 +913,20 @@ const T = class {
|
|
|
753
913
|
if (!t)
|
|
754
914
|
return;
|
|
755
915
|
if (Array.isArray(t)) {
|
|
756
|
-
for (const
|
|
757
|
-
this.loadProgressiveTextures(
|
|
916
|
+
for (const r of t)
|
|
917
|
+
this.loadProgressiveTextures(r, e);
|
|
758
918
|
return;
|
|
759
919
|
}
|
|
760
|
-
let
|
|
761
|
-
(t[Q] === void 0 || e < t[Q]) && (
|
|
762
|
-
const
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
920
|
+
let s = !1;
|
|
921
|
+
(t[Q] === void 0 || e < t[Q]) && (s = !0);
|
|
922
|
+
const n = t["DEBUG:LOD"];
|
|
923
|
+
if (n != null && (s = t[Q] != n, e = n), s) {
|
|
924
|
+
t[Q] = e;
|
|
925
|
+
const r = T.assignTextureLOD(t, e).then((i) => {
|
|
926
|
+
this._lodchangedlisteners.forEach((a) => a({ type: "texture", level: e, object: t }));
|
|
927
|
+
});
|
|
928
|
+
ye.addPromise("texture", t, r, this._newPromiseGroups);
|
|
929
|
+
}
|
|
766
930
|
}
|
|
767
931
|
/** Load progressive meshes for the given mesh
|
|
768
932
|
* @param mesh the mesh to load the LOD for
|
|
@@ -773,121 +937,128 @@ const T = class {
|
|
|
773
937
|
loadProgressiveMeshes(t, e) {
|
|
774
938
|
if (!t)
|
|
775
939
|
return Promise.resolve(null);
|
|
776
|
-
let
|
|
777
|
-
const
|
|
778
|
-
if (
|
|
940
|
+
let s = t[Q] !== e;
|
|
941
|
+
const n = t["DEBUG:LOD"];
|
|
942
|
+
if (n != null && (s = t[Q] != n, e = n), s) {
|
|
779
943
|
t[Q] = e;
|
|
780
|
-
const
|
|
781
|
-
return
|
|
944
|
+
const r = t.geometry, i = T.assignMeshLOD(t, e).then((a) => (a && t[Q] == e && r != t.geometry && this._lodchangedlisteners.forEach((l) => l({ type: "mesh", level: e, object: t })), a));
|
|
945
|
+
return ye.addPromise("mesh", t, i, this._newPromiseGroups), i;
|
|
782
946
|
}
|
|
783
947
|
return Promise.resolve(null);
|
|
784
948
|
}
|
|
785
949
|
static isInside(t, e) {
|
|
786
|
-
const
|
|
787
|
-
return this._tempPtInside.set(
|
|
950
|
+
const s = t.min, n = t.max, r = (s.x + n.x) * 0.5, i = (s.y + n.y) * 0.5;
|
|
951
|
+
return this._tempPtInside.set(r, i, s.z).applyMatrix4(e).z < 0;
|
|
788
952
|
}
|
|
789
|
-
calculateLodLevel(t, e,
|
|
790
|
-
var
|
|
953
|
+
calculateLodLevel(t, e, s, n, r) {
|
|
954
|
+
var M, R, Z;
|
|
791
955
|
if (!e) {
|
|
792
|
-
|
|
956
|
+
r.mesh_lod = -1, r.texture_lod = -1;
|
|
793
957
|
return;
|
|
794
958
|
}
|
|
795
959
|
if (!t) {
|
|
796
|
-
|
|
960
|
+
r.mesh_lod = -1, r.texture_lod = -1;
|
|
797
961
|
return;
|
|
798
962
|
}
|
|
799
963
|
let a = 10 + 1, l = !1;
|
|
800
|
-
if (
|
|
964
|
+
if (F && e["DEBUG:LOD"] != null)
|
|
801
965
|
return e["DEBUG:LOD"];
|
|
802
|
-
const
|
|
803
|
-
if (!h && !
|
|
804
|
-
|
|
966
|
+
const c = (M = T.getMeshLODExtension(e.geometry)) == null ? void 0 : M.lods, d = T.getPrimitiveIndex(e.geometry), h = c && c.length > 0, f = T.getMaterialMinMaxLODsCount(e.material), w = (f == null ? void 0 : f.min_count) != 1 / 0 && f.min_count > 0 && f.max_count > 0;
|
|
967
|
+
if (!h && !w) {
|
|
968
|
+
r.mesh_lod = 0, r.texture_lod = 0;
|
|
805
969
|
return;
|
|
806
970
|
}
|
|
807
971
|
h || (l = !0, a = 0);
|
|
808
|
-
const
|
|
809
|
-
let
|
|
972
|
+
const v = this.renderer.domElement.clientHeight || this.renderer.domElement.height;
|
|
973
|
+
let P = e.geometry.boundingBox;
|
|
810
974
|
if (e.type === "SkinnedMesh") {
|
|
811
|
-
const
|
|
812
|
-
if (!
|
|
813
|
-
|
|
814
|
-
else if (this.skinnedMeshAutoUpdateBoundsInterval > 0
|
|
815
|
-
|
|
816
|
-
|
|
975
|
+
const g = e;
|
|
976
|
+
if (!g.boundingBox)
|
|
977
|
+
g.computeBoundingBox();
|
|
978
|
+
else if (this.skinnedMeshAutoUpdateBoundsInterval > 0) {
|
|
979
|
+
if (!g[b.$skinnedMeshBoundsOffset]) {
|
|
980
|
+
const E = b.skinnedMeshBoundsFrameOffsetCounter++;
|
|
981
|
+
g[b.$skinnedMeshBoundsOffset] = E;
|
|
982
|
+
}
|
|
983
|
+
const x = g[b.$skinnedMeshBoundsOffset];
|
|
984
|
+
if ((s.frames + x) % this.skinnedMeshAutoUpdateBoundsInterval === 0) {
|
|
985
|
+
const E = ce(g), U = g.geometry;
|
|
986
|
+
E && (g.geometry = E), g.computeBoundingBox(), g.geometry = U;
|
|
987
|
+
}
|
|
817
988
|
}
|
|
818
|
-
|
|
989
|
+
P = g.boundingBox;
|
|
819
990
|
}
|
|
820
|
-
if (
|
|
821
|
-
const
|
|
991
|
+
if (P) {
|
|
992
|
+
const g = t;
|
|
822
993
|
if (e.geometry.attributes.color && e.geometry.attributes.color.count < 100 && e.geometry.boundingSphere) {
|
|
823
994
|
this._sphere.copy(e.geometry.boundingSphere), this._sphere.applyMatrix4(e.matrixWorld);
|
|
824
|
-
const
|
|
825
|
-
if (this._sphere.containsPoint(
|
|
826
|
-
|
|
995
|
+
const p = t.getWorldPosition(this._tempWorldPosition);
|
|
996
|
+
if (this._sphere.containsPoint(p)) {
|
|
997
|
+
r.mesh_lod = 0, r.texture_lod = 0;
|
|
827
998
|
return;
|
|
828
999
|
}
|
|
829
1000
|
}
|
|
830
|
-
if (this._tempBox.copy(
|
|
831
|
-
|
|
1001
|
+
if (this._tempBox.copy(P), this._tempBox.applyMatrix4(e.matrixWorld), g.isPerspectiveCamera && b.isInside(this._tempBox, this.projectionScreenMatrix)) {
|
|
1002
|
+
r.mesh_lod = 0, r.texture_lod = 0;
|
|
832
1003
|
return;
|
|
833
1004
|
}
|
|
834
|
-
if (this._tempBox.applyMatrix4(this.projectionScreenMatrix), this.renderer.xr.enabled &&
|
|
835
|
-
const
|
|
836
|
-
let
|
|
837
|
-
const fe = 2,
|
|
838
|
-
|
|
839
|
-
const
|
|
840
|
-
|
|
1005
|
+
if (this._tempBox.applyMatrix4(this.projectionScreenMatrix), this.renderer.xr.enabled && g.isPerspectiveCamera && g.fov > 70) {
|
|
1006
|
+
const p = this._tempBox.min, _ = this._tempBox.max;
|
|
1007
|
+
let $ = p.x, A = p.y, z = _.x, ne = _.y;
|
|
1008
|
+
const fe = 2, ve = 1.5, he = (p.x + _.x) * 0.5, ge = (p.y + _.y) * 0.5;
|
|
1009
|
+
$ = ($ - he) * fe + he, A = (A - ge) * fe + ge, z = (z - he) * fe + he, ne = (ne - ge) * fe + ge;
|
|
1010
|
+
const Ke = $ < 0 && z > 0 ? 0 : Math.min(Math.abs(p.x), Math.abs(_.x)), Ye = A < 0 && ne > 0 ? 0 : Math.min(Math.abs(p.y), Math.abs(_.y)), De = Math.max(Ke, Ye);
|
|
1011
|
+
s.lastCentrality = (ve - De) * (ve - De) * (ve - De);
|
|
841
1012
|
} else
|
|
842
|
-
|
|
843
|
-
const
|
|
844
|
-
|
|
845
|
-
const
|
|
846
|
-
|
|
847
|
-
const
|
|
848
|
-
if (Math.max(
|
|
849
|
-
const
|
|
850
|
-
|
|
851
|
-
const
|
|
852
|
-
|
|
853
|
-
const
|
|
854
|
-
|
|
1013
|
+
s.lastCentrality = 1;
|
|
1014
|
+
const x = this._tempBox.getSize(this._tempBoxSize);
|
|
1015
|
+
x.multiplyScalar(0.5), screen.availHeight > 0 && v > 0 && x.multiplyScalar(v / screen.availHeight), t.isPerspectiveCamera ? x.x *= t.aspect : t.isOrthographicCamera;
|
|
1016
|
+
const E = t.matrixWorldInverse, U = this._tempBox2;
|
|
1017
|
+
U.copy(P), U.applyMatrix4(e.matrixWorld), U.applyMatrix4(E);
|
|
1018
|
+
const S = U.getSize(this._tempBox2Size), ee = Math.max(S.x, S.y);
|
|
1019
|
+
if (Math.max(x.x, x.y) != 0 && ee != 0 && (x.z = S.z / Math.max(S.x, S.y) * Math.max(x.x, x.y)), s.lastScreenCoverage = Math.max(x.x, x.y, x.z), s.lastScreenspaceVolume.copy(x), s.lastScreenCoverage *= s.lastCentrality, F && b.debugDrawLine) {
|
|
1020
|
+
const p = this.tempMatrix.copy(this.projectionScreenMatrix);
|
|
1021
|
+
p.invert();
|
|
1022
|
+
const _ = b.corner0, $ = b.corner1, A = b.corner2, z = b.corner3;
|
|
1023
|
+
_.copy(this._tempBox.min), $.copy(this._tempBox.max), $.x = _.x, A.copy(this._tempBox.max), A.y = _.y, z.copy(this._tempBox.max);
|
|
1024
|
+
const ne = (_.z + z.z) * 0.5;
|
|
1025
|
+
_.z = $.z = A.z = z.z = ne, _.applyMatrix4(p), $.applyMatrix4(p), A.applyMatrix4(p), z.applyMatrix4(p), b.debugDrawLine(_, $, 255), b.debugDrawLine(_, A, 255), b.debugDrawLine($, z, 255), b.debugDrawLine(A, z, 255);
|
|
855
1026
|
}
|
|
856
|
-
let
|
|
857
|
-
if (
|
|
858
|
-
for (let
|
|
859
|
-
const
|
|
860
|
-
if ((
|
|
861
|
-
|
|
1027
|
+
let D = 999;
|
|
1028
|
+
if (c && s.lastScreenCoverage > 0)
|
|
1029
|
+
for (let p = 0; p < c.length; p++) {
|
|
1030
|
+
const _ = c[p], A = (((R = _.densities) == null ? void 0 : R[d]) || _.density || 1e-5) / s.lastScreenCoverage;
|
|
1031
|
+
if (d > 0 && Ge() && !_.densities && !globalThis["NEEDLE:MISSING_LOD_PRIMITIVE_DENSITIES"] && (window["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.")), A < n) {
|
|
1032
|
+
D = p;
|
|
862
1033
|
break;
|
|
863
1034
|
}
|
|
864
1035
|
}
|
|
865
|
-
|
|
1036
|
+
D < a && (a = D, l = !0);
|
|
866
1037
|
}
|
|
867
|
-
if (l ?
|
|
868
|
-
const
|
|
869
|
-
|
|
1038
|
+
if (l ? r.mesh_lod = a : r.mesh_lod = s.lastLodLevel_Mesh, F && r.mesh_lod != s.lastLodLevel_Mesh) {
|
|
1039
|
+
const x = c == null ? void 0 : c[r.mesh_lod];
|
|
1040
|
+
x && console.log(`Mesh LOD changed: ${s.lastLodLevel_Mesh} → ${r.mesh_lod} (${x.density.toFixed(0)}) - ${e.name}`);
|
|
870
1041
|
}
|
|
871
|
-
if (
|
|
872
|
-
const
|
|
873
|
-
if (
|
|
874
|
-
if (
|
|
875
|
-
const
|
|
876
|
-
|
|
1042
|
+
if (w) {
|
|
1043
|
+
const g = "saveData" in globalThis.navigator && globalThis.navigator.saveData === !0;
|
|
1044
|
+
if (s.lastLodLevel_Texture < 0) {
|
|
1045
|
+
if (r.texture_lod = f.max_count - 1, F) {
|
|
1046
|
+
const x = f.lods[f.max_count - 1];
|
|
1047
|
+
F && console.log(`First Texture LOD ${r.texture_lod} (${x.max_height}px) - ${e.name}`);
|
|
877
1048
|
}
|
|
878
1049
|
} else {
|
|
879
|
-
const
|
|
880
|
-
let
|
|
881
|
-
((
|
|
882
|
-
const
|
|
883
|
-
let
|
|
884
|
-
for (let
|
|
885
|
-
const
|
|
886
|
-
if (!(
|
|
887
|
-
if (
|
|
888
|
-
const
|
|
889
|
-
|
|
890
|
-
Screensize: ${
|
|
1050
|
+
const x = s.lastScreenspaceVolume.x + s.lastScreenspaceVolume.y + s.lastScreenspaceVolume.z;
|
|
1051
|
+
let E = s.lastScreenCoverage * 4;
|
|
1052
|
+
((Z = this.context) == null ? void 0 : Z.engine) === "model-viewer" && (E *= 1.5);
|
|
1053
|
+
const S = v / window.devicePixelRatio * E;
|
|
1054
|
+
let ee = !1;
|
|
1055
|
+
for (let I = f.lods.length - 1; I >= 0; I--) {
|
|
1056
|
+
const D = f.lods[I];
|
|
1057
|
+
if (!(g && D.max_height >= 2048) && !(ct() && D.max_height > 4096) && (D.max_height > S || !ee && I === 0)) {
|
|
1058
|
+
if (ee = !0, r.texture_lod = I, r.texture_lod < s.lastLodLevel_Texture) {
|
|
1059
|
+
const m = D.max_height;
|
|
1060
|
+
F && console.log(`Texture LOD changed: ${s.lastLodLevel_Texture} → ${r.texture_lod} = ${m}px
|
|
1061
|
+
Screensize: ${S.toFixed(0)}px, Coverage: ${(100 * s.lastScreenCoverage).toFixed(2)}%, Volume ${x.toFixed(1)}
|
|
891
1062
|
${e.name}`);
|
|
892
1063
|
}
|
|
893
1064
|
break;
|
|
@@ -895,100 +1066,100 @@ ${e.name}`);
|
|
|
895
1066
|
}
|
|
896
1067
|
}
|
|
897
1068
|
} else
|
|
898
|
-
|
|
1069
|
+
r.texture_lod = 0;
|
|
899
1070
|
}
|
|
900
1071
|
};
|
|
901
|
-
let
|
|
902
|
-
B = new WeakMap(),
|
|
1072
|
+
let C = b;
|
|
1073
|
+
B = new WeakMap(), K = new WeakMap(), we = new WeakMap(), J = new WeakMap(), ie = new WeakMap(), _e = new WeakMap(), Y = new WeakMap(), /**
|
|
903
1074
|
* Assign a function to draw debug lines for the LODs. This function will be called with the start and end position of the line and the color of the line when the `debugprogressive` query parameter is set.
|
|
904
1075
|
*/
|
|
905
|
-
|
|
1076
|
+
u(C, "debugDrawLine"), /**
|
|
906
1077
|
* Force override the LOD level for all objects in the scene
|
|
907
1078
|
*/
|
|
908
|
-
|
|
909
|
-
class
|
|
1079
|
+
u(C, "overrideGlobalLodLevel"), u(C, "corner0", new W()), u(C, "corner1", new W()), u(C, "corner2", new W()), u(C, "corner3", new W()), u(C, "_tempPtInside", new W()), u(C, "skinnedMeshBoundsFrameOffsetCounter", 0), u(C, "$skinnedMeshBoundsOffset", Symbol("gltf-progressive-skinnedMeshBoundsOffset"));
|
|
1080
|
+
class xt {
|
|
910
1081
|
constructor() {
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
1082
|
+
u(this, "frames", 0);
|
|
1083
|
+
u(this, "lastLodLevel_Mesh", -1);
|
|
1084
|
+
u(this, "lastLodLevel_Texture", -1);
|
|
1085
|
+
u(this, "lastScreenCoverage", 0);
|
|
1086
|
+
u(this, "lastScreenspaceVolume", new W());
|
|
1087
|
+
u(this, "lastCentrality", 0);
|
|
917
1088
|
}
|
|
918
1089
|
}
|
|
919
|
-
const
|
|
920
|
-
let
|
|
921
|
-
function
|
|
922
|
-
const
|
|
923
|
-
|
|
924
|
-
return
|
|
925
|
-
}),
|
|
1090
|
+
const Be = Symbol("NEEDLE_mesh_lod"), pe = Symbol("NEEDLE_texture_lod");
|
|
1091
|
+
let ue = null;
|
|
1092
|
+
function We() {
|
|
1093
|
+
const o = wt();
|
|
1094
|
+
o && (o.mapURLs(function(t) {
|
|
1095
|
+
return ke(), t;
|
|
1096
|
+
}), ke(), ue == null || ue.disconnect(), ue = new MutationObserver((t) => {
|
|
926
1097
|
t.forEach((e) => {
|
|
927
|
-
e.addedNodes.forEach((
|
|
928
|
-
|
|
1098
|
+
e.addedNodes.forEach((s) => {
|
|
1099
|
+
s instanceof HTMLElement && s.tagName.toLowerCase() === "model-viewer" && Xe(s);
|
|
929
1100
|
});
|
|
930
1101
|
});
|
|
931
|
-
}),
|
|
1102
|
+
}), ue.observe(document, { childList: !0, subtree: !0 }));
|
|
932
1103
|
}
|
|
933
|
-
function
|
|
1104
|
+
function wt() {
|
|
934
1105
|
if (typeof customElements > "u")
|
|
935
1106
|
return null;
|
|
936
|
-
const
|
|
937
|
-
return
|
|
938
|
-
console.debug("[gltf-progressive] model-viewer defined"),
|
|
1107
|
+
const o = customElements.get("model-viewer");
|
|
1108
|
+
return o || (customElements.whenDefined("model-viewer").then(() => {
|
|
1109
|
+
console.debug("[gltf-progressive] model-viewer defined"), We();
|
|
939
1110
|
}), null);
|
|
940
1111
|
}
|
|
941
|
-
function
|
|
1112
|
+
function ke() {
|
|
942
1113
|
if (typeof document > "u")
|
|
943
1114
|
return;
|
|
944
1115
|
document.querySelectorAll("model-viewer").forEach((t) => {
|
|
945
|
-
|
|
1116
|
+
Xe(t);
|
|
946
1117
|
});
|
|
947
1118
|
}
|
|
948
|
-
const
|
|
949
|
-
let
|
|
950
|
-
function
|
|
951
|
-
if (!
|
|
1119
|
+
const Re = /* @__PURE__ */ new WeakSet();
|
|
1120
|
+
let _t = 0;
|
|
1121
|
+
function Xe(o) {
|
|
1122
|
+
if (!o || Re.has(o))
|
|
952
1123
|
return null;
|
|
953
|
-
|
|
954
|
-
`,
|
|
955
|
-
let t = null, e = null,
|
|
956
|
-
for (let
|
|
957
|
-
const
|
|
958
|
-
!t &&
|
|
1124
|
+
Re.add(o), console.debug("[gltf-progressive] found new model-viewer..." + ++_t + `
|
|
1125
|
+
`, o.getAttribute("src"));
|
|
1126
|
+
let t = null, e = null, s = null;
|
|
1127
|
+
for (let n = o; n != null; n = Object.getPrototypeOf(n)) {
|
|
1128
|
+
const r = Object.getOwnPropertySymbols(n), i = r.find((c) => c.toString() == "Symbol(renderer)"), a = r.find((c) => c.toString() == "Symbol(scene)"), l = r.find((c) => c.toString() == "Symbol(needsRender)");
|
|
1129
|
+
!t && i != null && (t = o[i].threeRenderer), !e && a != null && (e = o[a]), !s && l != null && (s = o[l]);
|
|
959
1130
|
}
|
|
960
1131
|
if (t && e) {
|
|
961
|
-
let
|
|
962
|
-
if (
|
|
963
|
-
let
|
|
964
|
-
if (
|
|
1132
|
+
let n = function() {
|
|
1133
|
+
if (s) {
|
|
1134
|
+
let i = 0, a = setInterval(() => {
|
|
1135
|
+
if (i++ > 5) {
|
|
965
1136
|
clearInterval(a);
|
|
966
1137
|
return;
|
|
967
1138
|
}
|
|
968
|
-
|
|
1139
|
+
s == null || s.call(o);
|
|
969
1140
|
}, 300);
|
|
970
1141
|
}
|
|
971
1142
|
};
|
|
972
1143
|
console.debug("[gltf-progressive] setup model-viewer");
|
|
973
|
-
const
|
|
974
|
-
return
|
|
975
|
-
|
|
976
|
-
}),
|
|
977
|
-
|
|
978
|
-
}),
|
|
979
|
-
|
|
1144
|
+
const r = C.get(t, { engine: "model-viewer" });
|
|
1145
|
+
return C.addPlugin(new vt()), r.enable(), r.addEventListener("changed", () => {
|
|
1146
|
+
s == null || s.call(o);
|
|
1147
|
+
}), o.addEventListener("model-visibility", (i) => {
|
|
1148
|
+
i.detail.visible && (s == null || s.call(o));
|
|
1149
|
+
}), o.addEventListener("load", () => {
|
|
1150
|
+
n();
|
|
980
1151
|
}), () => {
|
|
981
|
-
|
|
1152
|
+
r.disable();
|
|
982
1153
|
};
|
|
983
1154
|
}
|
|
984
1155
|
return null;
|
|
985
1156
|
}
|
|
986
|
-
class
|
|
1157
|
+
class vt {
|
|
987
1158
|
constructor() {
|
|
988
|
-
|
|
1159
|
+
u(this, "_didWarnAboutMissingUrl", !1);
|
|
989
1160
|
}
|
|
990
|
-
onBeforeUpdateLOD(t, e,
|
|
991
|
-
this.tryParseMeshLOD(e,
|
|
1161
|
+
onBeforeUpdateLOD(t, e, s, n) {
|
|
1162
|
+
this.tryParseMeshLOD(e, n), this.tryParseTextureLOD(e, n);
|
|
992
1163
|
}
|
|
993
1164
|
getUrl(t) {
|
|
994
1165
|
if (!t)
|
|
@@ -1006,28 +1177,28 @@ class xt {
|
|
|
1006
1177
|
if (e[pe] == !0)
|
|
1007
1178
|
return;
|
|
1008
1179
|
e[pe] = !0;
|
|
1009
|
-
const
|
|
1010
|
-
if (
|
|
1011
|
-
let
|
|
1012
|
-
var
|
|
1180
|
+
const s = this.tryGetCurrentGLTF(t), n = this.tryGetCurrentModelViewer(t), r = this.getUrl(n);
|
|
1181
|
+
if (r && s && e.material) {
|
|
1182
|
+
let i = function(l) {
|
|
1183
|
+
var d, h, f;
|
|
1013
1184
|
if (l[pe] == !0)
|
|
1014
1185
|
return;
|
|
1015
1186
|
l[pe] = !0, l.userData && (l.userData.LOD = -1);
|
|
1016
|
-
const
|
|
1017
|
-
for (let
|
|
1018
|
-
const
|
|
1019
|
-
if ((
|
|
1020
|
-
const
|
|
1021
|
-
if (
|
|
1187
|
+
const c = Object.keys(l);
|
|
1188
|
+
for (let w = 0; w < c.length; w++) {
|
|
1189
|
+
const v = c[w], P = l[v];
|
|
1190
|
+
if ((P == null ? void 0 : P.isTexture) === !0) {
|
|
1191
|
+
const M = (h = (d = P.userData) == null ? void 0 : d.associations) == null ? void 0 : h.textures;
|
|
1192
|
+
if (M == null)
|
|
1022
1193
|
continue;
|
|
1023
|
-
const
|
|
1024
|
-
if (!
|
|
1025
|
-
console.warn("Texture data not found for texture index " +
|
|
1194
|
+
const R = s.parser.json.textures[M];
|
|
1195
|
+
if (!R) {
|
|
1196
|
+
console.warn("Texture data not found for texture index " + M);
|
|
1026
1197
|
continue;
|
|
1027
1198
|
}
|
|
1028
|
-
if ((
|
|
1029
|
-
const
|
|
1030
|
-
|
|
1199
|
+
if ((f = R == null ? void 0 : R.extensions) != null && f[X]) {
|
|
1200
|
+
const Z = R.extensions[X];
|
|
1201
|
+
Z && r && T.registerTexture(r, P, Z.lods.length, M, Z);
|
|
1031
1202
|
}
|
|
1032
1203
|
}
|
|
1033
1204
|
}
|
|
@@ -1035,64 +1206,64 @@ class xt {
|
|
|
1035
1206
|
const a = e.material;
|
|
1036
1207
|
if (Array.isArray(a))
|
|
1037
1208
|
for (const l of a)
|
|
1038
|
-
|
|
1209
|
+
i(l);
|
|
1039
1210
|
else
|
|
1040
|
-
|
|
1211
|
+
i(a);
|
|
1041
1212
|
}
|
|
1042
1213
|
}
|
|
1043
1214
|
tryParseMeshLOD(t, e) {
|
|
1044
|
-
var
|
|
1045
|
-
if (e[
|
|
1215
|
+
var i, a;
|
|
1216
|
+
if (e[Be] == !0)
|
|
1046
1217
|
return;
|
|
1047
|
-
e[
|
|
1048
|
-
const
|
|
1049
|
-
if (!
|
|
1218
|
+
e[Be] = !0;
|
|
1219
|
+
const s = this.tryGetCurrentModelViewer(t), n = this.getUrl(s);
|
|
1220
|
+
if (!n)
|
|
1050
1221
|
return;
|
|
1051
|
-
const
|
|
1052
|
-
if (
|
|
1222
|
+
const r = (a = (i = e.userData) == null ? void 0 : i.gltfExtensions) == null ? void 0 : a[X];
|
|
1223
|
+
if (r && n) {
|
|
1053
1224
|
const l = e.uuid;
|
|
1054
|
-
|
|
1225
|
+
T.registerMesh(n, l, e, 0, r.lods.length, r);
|
|
1055
1226
|
}
|
|
1056
1227
|
}
|
|
1057
1228
|
}
|
|
1058
|
-
function Dt(
|
|
1059
|
-
Ue(t),
|
|
1229
|
+
function Dt(o, t, e, s) {
|
|
1230
|
+
Ue(t), ze(e), Ve(e, {
|
|
1060
1231
|
progressive: !0,
|
|
1061
|
-
...
|
|
1062
|
-
}), e.register((
|
|
1063
|
-
const
|
|
1064
|
-
return (
|
|
1232
|
+
...s == null ? void 0 : s.hints
|
|
1233
|
+
}), e.register((r) => new T(r, o));
|
|
1234
|
+
const n = C.get(t);
|
|
1235
|
+
return (s == null ? void 0 : s.enableLODsManager) !== !1 && n.enable(), n;
|
|
1065
1236
|
}
|
|
1066
|
-
|
|
1067
|
-
if (!
|
|
1068
|
-
const
|
|
1237
|
+
We();
|
|
1238
|
+
if (!ht) {
|
|
1239
|
+
const o = {
|
|
1069
1240
|
gltfProgressive: {
|
|
1070
1241
|
useNeedleProgressive: Dt,
|
|
1071
|
-
LODsManager:
|
|
1072
|
-
configureLoader:
|
|
1073
|
-
getRaycastMesh:
|
|
1074
|
-
useRaycastMeshes:
|
|
1242
|
+
LODsManager: C,
|
|
1243
|
+
configureLoader: Ve,
|
|
1244
|
+
getRaycastMesh: ce,
|
|
1245
|
+
useRaycastMeshes: pt
|
|
1075
1246
|
}
|
|
1076
1247
|
};
|
|
1077
1248
|
if (!globalThis.Needle)
|
|
1078
|
-
globalThis.Needle =
|
|
1249
|
+
globalThis.Needle = o;
|
|
1079
1250
|
else
|
|
1080
|
-
for (const t in
|
|
1081
|
-
globalThis.Needle[t] =
|
|
1251
|
+
for (const t in o)
|
|
1252
|
+
globalThis.Needle[t] = o[t];
|
|
1082
1253
|
}
|
|
1083
1254
|
export {
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1255
|
+
X as EXTENSION_NAME,
|
|
1256
|
+
C as LODsManager,
|
|
1257
|
+
T as NEEDLE_progressive,
|
|
1258
|
+
it as VERSION,
|
|
1259
|
+
ze as addDracoAndKTX2Loaders,
|
|
1260
|
+
Ve as configureLoader,
|
|
1090
1261
|
Ue as createLoaders,
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1262
|
+
ce as getRaycastMesh,
|
|
1263
|
+
We as patchModelViewer,
|
|
1264
|
+
gt as registerRaycastMesh,
|
|
1265
|
+
at as setDracoDecoderLocation,
|
|
1266
|
+
lt as setKTX2TranscoderLocation,
|
|
1096
1267
|
Dt as useNeedleProgressive,
|
|
1097
|
-
|
|
1268
|
+
pt as useRaycastMeshes
|
|
1098
1269
|
};
|