@speridlabs/visus 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/main.d.ts +2 -2
- package/dist/main.es.js +255 -251
- package/dist/main.umd.js +5 -5
- package/dist/react.es.js +491 -485
- package/package.json +1 -1
package/dist/react.es.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var
|
|
4
|
-
import
|
|
5
|
-
import { useLoader as Ae } from "@react-three/fiber";
|
|
1
|
+
var be = Object.defineProperty;
|
|
2
|
+
var Se = (x, e, o) => e in x ? be(x, e, { enumerable: !0, configurable: !0, writable: !0, value: o }) : x[e] = o;
|
|
3
|
+
var f = (x, e, o) => Se(x, typeof e != "symbol" ? e + "" : e, o);
|
|
4
|
+
import Me, { useState as Ce, useRef as Ae, useEffect as Te } from "react";
|
|
6
5
|
import * as l from "three";
|
|
7
6
|
var ce = { exports: {} }, ae = {};
|
|
8
7
|
/**
|
|
@@ -14,27 +13,27 @@ var ce = { exports: {} }, ae = {};
|
|
|
14
13
|
* This source code is licensed under the MIT license found in the
|
|
15
14
|
* LICENSE file in the root directory of this source tree.
|
|
16
15
|
*/
|
|
17
|
-
var
|
|
18
|
-
function
|
|
19
|
-
if (
|
|
20
|
-
|
|
21
|
-
var
|
|
22
|
-
function
|
|
16
|
+
var me;
|
|
17
|
+
function _e() {
|
|
18
|
+
if (me) return ae;
|
|
19
|
+
me = 1;
|
|
20
|
+
var x = Symbol.for("react.transitional.element"), e = Symbol.for("react.fragment");
|
|
21
|
+
function o(t, r, n) {
|
|
23
22
|
var a = null;
|
|
24
|
-
if (
|
|
25
|
-
|
|
26
|
-
for (var i in
|
|
27
|
-
i !== "key" && (
|
|
28
|
-
} else
|
|
29
|
-
return
|
|
30
|
-
$$typeof:
|
|
23
|
+
if (n !== void 0 && (a = "" + n), r.key !== void 0 && (a = "" + r.key), "key" in r) {
|
|
24
|
+
n = {};
|
|
25
|
+
for (var i in r)
|
|
26
|
+
i !== "key" && (n[i] = r[i]);
|
|
27
|
+
} else n = r;
|
|
28
|
+
return r = n.ref, {
|
|
29
|
+
$$typeof: x,
|
|
31
30
|
type: t,
|
|
32
31
|
key: a,
|
|
33
|
-
ref:
|
|
34
|
-
props:
|
|
32
|
+
ref: r !== void 0 ? r : null,
|
|
33
|
+
props: n
|
|
35
34
|
};
|
|
36
35
|
}
|
|
37
|
-
return ae.Fragment = e, ae.jsx =
|
|
36
|
+
return ae.Fragment = e, ae.jsx = o, ae.jsxs = o, ae;
|
|
38
37
|
}
|
|
39
38
|
var ie = {};
|
|
40
39
|
/**
|
|
@@ -46,47 +45,47 @@ var ie = {};
|
|
|
46
45
|
* This source code is licensed under the MIT license found in the
|
|
47
46
|
* LICENSE file in the root directory of this source tree.
|
|
48
47
|
*/
|
|
49
|
-
var
|
|
50
|
-
function
|
|
51
|
-
return
|
|
52
|
-
function
|
|
48
|
+
var xe;
|
|
49
|
+
function ke() {
|
|
50
|
+
return xe || (xe = 1, process.env.NODE_ENV !== "production" && function() {
|
|
51
|
+
function x(s) {
|
|
53
52
|
if (s == null) return null;
|
|
54
53
|
if (typeof s == "function")
|
|
55
|
-
return s.$$typeof ===
|
|
54
|
+
return s.$$typeof === v ? null : s.displayName || s.name || null;
|
|
56
55
|
if (typeof s == "string") return s;
|
|
57
56
|
switch (s) {
|
|
58
57
|
case I:
|
|
59
58
|
return "Fragment";
|
|
60
59
|
case j:
|
|
61
60
|
return "Profiler";
|
|
62
|
-
case
|
|
61
|
+
case P:
|
|
63
62
|
return "StrictMode";
|
|
64
63
|
case L:
|
|
65
64
|
return "Suspense";
|
|
66
|
-
case
|
|
65
|
+
case A:
|
|
67
66
|
return "SuspenseList";
|
|
68
|
-
case
|
|
67
|
+
case T:
|
|
69
68
|
return "Activity";
|
|
70
69
|
}
|
|
71
70
|
if (typeof s == "object")
|
|
72
71
|
switch (typeof s.tag == "number" && console.error(
|
|
73
72
|
"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."
|
|
74
73
|
), s.$$typeof) {
|
|
75
|
-
case
|
|
74
|
+
case S:
|
|
76
75
|
return "Portal";
|
|
77
76
|
case W:
|
|
78
77
|
return (s.displayName || "Context") + ".Provider";
|
|
79
78
|
case H:
|
|
80
79
|
return (s._context.displayName || "Context") + ".Consumer";
|
|
81
|
-
case
|
|
80
|
+
case oe:
|
|
82
81
|
var p = s.render;
|
|
83
82
|
return s = s.displayName, s || (s = p.displayName || p.name || "", s = s !== "" ? "ForwardRef(" + s + ")" : "ForwardRef"), s;
|
|
84
|
-
case
|
|
85
|
-
return p = s.displayName || null, p !== null ? p :
|
|
83
|
+
case g:
|
|
84
|
+
return p = s.displayName || null, p !== null ? p : x(s.type) || "Memo";
|
|
86
85
|
case D:
|
|
87
86
|
p = s._payload, s = s._init;
|
|
88
87
|
try {
|
|
89
|
-
return
|
|
88
|
+
return x(s(p));
|
|
90
89
|
} catch {
|
|
91
90
|
}
|
|
92
91
|
}
|
|
@@ -95,7 +94,7 @@ function Te() {
|
|
|
95
94
|
function e(s) {
|
|
96
95
|
return "" + s;
|
|
97
96
|
}
|
|
98
|
-
function
|
|
97
|
+
function o(s) {
|
|
99
98
|
try {
|
|
100
99
|
e(s);
|
|
101
100
|
var p = !1;
|
|
@@ -104,8 +103,8 @@ function Te() {
|
|
|
104
103
|
}
|
|
105
104
|
if (p) {
|
|
106
105
|
p = console;
|
|
107
|
-
var
|
|
108
|
-
return
|
|
106
|
+
var M = p.error, E = typeof Symbol == "function" && Symbol.toStringTag && s[Symbol.toStringTag] || s.constructor.name || "Object";
|
|
107
|
+
return M.call(
|
|
109
108
|
p,
|
|
110
109
|
"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",
|
|
111
110
|
E
|
|
@@ -117,17 +116,17 @@ function Te() {
|
|
|
117
116
|
if (typeof s == "object" && s !== null && s.$$typeof === D)
|
|
118
117
|
return "<...>";
|
|
119
118
|
try {
|
|
120
|
-
var p =
|
|
119
|
+
var p = x(s);
|
|
121
120
|
return p ? "<" + p + ">" : "<...>";
|
|
122
121
|
} catch {
|
|
123
122
|
return "<...>";
|
|
124
123
|
}
|
|
125
124
|
}
|
|
126
|
-
function
|
|
125
|
+
function r() {
|
|
127
126
|
var s = R.A;
|
|
128
127
|
return s === null ? null : s.getOwner();
|
|
129
128
|
}
|
|
130
|
-
function
|
|
129
|
+
function n() {
|
|
131
130
|
return Error("react-stack-top-frame");
|
|
132
131
|
}
|
|
133
132
|
function a(s) {
|
|
@@ -138,31 +137,31 @@ function Te() {
|
|
|
138
137
|
return s.key !== void 0;
|
|
139
138
|
}
|
|
140
139
|
function i(s, p) {
|
|
141
|
-
function
|
|
140
|
+
function M() {
|
|
142
141
|
Z || (Z = !0, console.error(
|
|
143
142
|
"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",
|
|
144
143
|
p
|
|
145
144
|
));
|
|
146
145
|
}
|
|
147
|
-
|
|
148
|
-
get:
|
|
146
|
+
M.isReactWarning = !0, Object.defineProperty(s, "key", {
|
|
147
|
+
get: M,
|
|
149
148
|
configurable: !0
|
|
150
149
|
});
|
|
151
150
|
}
|
|
152
151
|
function u() {
|
|
153
|
-
var s =
|
|
152
|
+
var s = x(this.type);
|
|
154
153
|
return U[s] || (U[s] = !0, console.error(
|
|
155
154
|
"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release."
|
|
156
155
|
)), s = this.props.ref, s !== void 0 ? s : null;
|
|
157
156
|
}
|
|
158
|
-
function
|
|
159
|
-
return
|
|
160
|
-
$$typeof:
|
|
157
|
+
function w(s, p, M, E, m, c, y, z) {
|
|
158
|
+
return M = c.ref, s = {
|
|
159
|
+
$$typeof: b,
|
|
161
160
|
type: s,
|
|
162
161
|
key: p,
|
|
163
162
|
props: c,
|
|
164
163
|
_owner: m
|
|
165
|
-
}, (
|
|
164
|
+
}, (M !== void 0 ? M : null) !== null ? Object.defineProperty(s, "ref", {
|
|
166
165
|
enumerable: !1,
|
|
167
166
|
get: u
|
|
168
167
|
}) : Object.defineProperty(s, "ref", { enumerable: !1, value: null }), s._store = {}, Object.defineProperty(s._store, "validated", {
|
|
@@ -184,28 +183,28 @@ function Te() {
|
|
|
184
183
|
configurable: !1,
|
|
185
184
|
enumerable: !1,
|
|
186
185
|
writable: !0,
|
|
187
|
-
value:
|
|
186
|
+
value: z
|
|
188
187
|
}), Object.freeze && (Object.freeze(s.props), Object.freeze(s)), s;
|
|
189
188
|
}
|
|
190
|
-
function
|
|
191
|
-
var
|
|
192
|
-
if (
|
|
189
|
+
function C(s, p, M, E, m, c, y, z) {
|
|
190
|
+
var d = p.children;
|
|
191
|
+
if (d !== void 0)
|
|
193
192
|
if (E)
|
|
194
|
-
if (
|
|
195
|
-
for (E = 0; E <
|
|
196
|
-
|
|
197
|
-
Object.freeze && Object.freeze(
|
|
193
|
+
if ($(d)) {
|
|
194
|
+
for (E = 0; E < d.length; E++)
|
|
195
|
+
_(d[E]);
|
|
196
|
+
Object.freeze && Object.freeze(d);
|
|
198
197
|
} else
|
|
199
198
|
console.error(
|
|
200
199
|
"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead."
|
|
201
200
|
);
|
|
202
|
-
else
|
|
201
|
+
else _(d);
|
|
203
202
|
if (B.call(p, "key")) {
|
|
204
|
-
|
|
205
|
-
var k = Object.keys(p).filter(function(
|
|
206
|
-
return
|
|
203
|
+
d = x(s);
|
|
204
|
+
var k = Object.keys(p).filter(function(q) {
|
|
205
|
+
return q !== "key";
|
|
207
206
|
});
|
|
208
|
-
E = 0 < k.length ? "{key: someKey, " + k.join(": ..., ") + ": ...}" : "{key: someKey}", te[
|
|
207
|
+
E = 0 < k.length ? "{key: someKey, " + k.join(": ..., ") + ": ...}" : "{key: someKey}", te[d + E] || (k = 0 < k.length ? "{" + k.join(": ..., ") + ": ...}" : "{}", console.error(
|
|
209
208
|
`A props object containing a "key" prop is being spread into JSX:
|
|
210
209
|
let props = %s;
|
|
211
210
|
<%s {...props} />
|
|
@@ -213,84 +212,84 @@ React keys must be passed directly to JSX without using spread:
|
|
|
213
212
|
let props = %s;
|
|
214
213
|
<%s key={someKey} {...props} />`,
|
|
215
214
|
E,
|
|
216
|
-
|
|
215
|
+
d,
|
|
217
216
|
k,
|
|
218
|
-
|
|
219
|
-
), te[
|
|
217
|
+
d
|
|
218
|
+
), te[d + E] = !0);
|
|
220
219
|
}
|
|
221
|
-
if (
|
|
222
|
-
|
|
220
|
+
if (d = null, M !== void 0 && (o(M), d = "" + M), a(p) && (o(p.key), d = "" + p.key), "key" in p) {
|
|
221
|
+
M = {};
|
|
223
222
|
for (var O in p)
|
|
224
|
-
O !== "key" && (
|
|
225
|
-
} else
|
|
226
|
-
return
|
|
227
|
-
|
|
223
|
+
O !== "key" && (M[O] = p[O]);
|
|
224
|
+
} else M = p;
|
|
225
|
+
return d && i(
|
|
226
|
+
M,
|
|
228
227
|
typeof s == "function" ? s.displayName || s.name || "Unknown" : s
|
|
229
|
-
),
|
|
228
|
+
), w(
|
|
230
229
|
s,
|
|
231
|
-
|
|
230
|
+
d,
|
|
232
231
|
c,
|
|
233
232
|
m,
|
|
234
|
-
|
|
235
|
-
|
|
233
|
+
r(),
|
|
234
|
+
M,
|
|
236
235
|
y,
|
|
237
|
-
|
|
236
|
+
z
|
|
238
237
|
);
|
|
239
238
|
}
|
|
240
|
-
function
|
|
241
|
-
typeof s == "object" && s !== null && s.$$typeof ===
|
|
239
|
+
function _(s) {
|
|
240
|
+
typeof s == "object" && s !== null && s.$$typeof === b && s._store && (s._store.validated = 1);
|
|
242
241
|
}
|
|
243
|
-
var
|
|
242
|
+
var h = Me, b = Symbol.for("react.transitional.element"), S = Symbol.for("react.portal"), I = Symbol.for("react.fragment"), P = Symbol.for("react.strict_mode"), j = Symbol.for("react.profiler"), H = Symbol.for("react.consumer"), W = Symbol.for("react.context"), oe = Symbol.for("react.forward_ref"), L = Symbol.for("react.suspense"), A = Symbol.for("react.suspense_list"), g = Symbol.for("react.memo"), D = Symbol.for("react.lazy"), T = Symbol.for("react.activity"), v = Symbol.for("react.client.reference"), R = h.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE, B = Object.prototype.hasOwnProperty, $ = Array.isArray, X = console.createTask ? console.createTask : function() {
|
|
244
243
|
return null;
|
|
245
244
|
};
|
|
246
|
-
|
|
245
|
+
h = {
|
|
247
246
|
"react-stack-bottom-frame": function(s) {
|
|
248
247
|
return s();
|
|
249
248
|
}
|
|
250
249
|
};
|
|
251
|
-
var Z, U = {}, F =
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
)(), N =
|
|
255
|
-
ie.Fragment = I, ie.jsx = function(s, p,
|
|
250
|
+
var Z, U = {}, F = h["react-stack-bottom-frame"].bind(
|
|
251
|
+
h,
|
|
252
|
+
n
|
|
253
|
+
)(), N = X(t(n)), te = {};
|
|
254
|
+
ie.Fragment = I, ie.jsx = function(s, p, M, E, m) {
|
|
256
255
|
var c = 1e4 > R.recentlyCreatedOwnerStacks++;
|
|
257
|
-
return
|
|
256
|
+
return C(
|
|
258
257
|
s,
|
|
259
258
|
p,
|
|
260
|
-
|
|
259
|
+
M,
|
|
261
260
|
!1,
|
|
262
261
|
E,
|
|
263
262
|
m,
|
|
264
263
|
c ? Error("react-stack-top-frame") : F,
|
|
265
|
-
c ?
|
|
264
|
+
c ? X(t(s)) : N
|
|
266
265
|
);
|
|
267
|
-
}, ie.jsxs = function(s, p,
|
|
266
|
+
}, ie.jsxs = function(s, p, M, E, m) {
|
|
268
267
|
var c = 1e4 > R.recentlyCreatedOwnerStacks++;
|
|
269
|
-
return
|
|
268
|
+
return C(
|
|
270
269
|
s,
|
|
271
270
|
p,
|
|
272
|
-
|
|
271
|
+
M,
|
|
273
272
|
!0,
|
|
274
273
|
E,
|
|
275
274
|
m,
|
|
276
275
|
c ? Error("react-stack-top-frame") : F,
|
|
277
|
-
c ?
|
|
276
|
+
c ? X(t(s)) : N
|
|
278
277
|
);
|
|
279
278
|
};
|
|
280
279
|
}()), ie;
|
|
281
280
|
}
|
|
282
|
-
var
|
|
283
|
-
function
|
|
284
|
-
return
|
|
281
|
+
var ge;
|
|
282
|
+
function Ee() {
|
|
283
|
+
return ge || (ge = 1, process.env.NODE_ENV === "production" ? ce.exports = _e() : ce.exports = ke()), ce.exports;
|
|
285
284
|
}
|
|
286
|
-
var
|
|
287
|
-
class
|
|
285
|
+
var Ie = Ee();
|
|
286
|
+
class fe {
|
|
288
287
|
constructor() {
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
288
|
+
f(this, "min", new l.Vector3(1 / 0, 1 / 0, 1 / 0));
|
|
289
|
+
f(this, "max", new l.Vector3(-1 / 0, -1 / 0, -1 / 0));
|
|
290
|
+
f(this, "center", new l.Vector3());
|
|
292
291
|
/** Half extents (size/2) */
|
|
293
|
-
|
|
292
|
+
f(this, "halfExtents", new l.Vector3());
|
|
294
293
|
}
|
|
295
294
|
/**
|
|
296
295
|
* Reset the bounding box to its initial state
|
|
@@ -338,20 +337,20 @@ class he {
|
|
|
338
337
|
* @returns New bounding box with the same values
|
|
339
338
|
*/
|
|
340
339
|
clone() {
|
|
341
|
-
const e = new
|
|
340
|
+
const e = new fe();
|
|
342
341
|
return e.min.copy(this.min), e.max.copy(this.max), e.center.copy(this.center), e.halfExtents.copy(this.halfExtents), e;
|
|
343
342
|
}
|
|
344
343
|
}
|
|
345
|
-
class
|
|
344
|
+
class Re {
|
|
346
345
|
// TODO: there is no sh spherical harmonics
|
|
347
346
|
constructor(e = 0) {
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
347
|
+
f(this, "numSplats", 0);
|
|
348
|
+
f(this, "positions");
|
|
349
|
+
f(this, "rotations");
|
|
350
|
+
f(this, "scales");
|
|
351
|
+
f(this, "colors");
|
|
352
|
+
f(this, "opacities");
|
|
353
|
+
f(this, "boundingBox", new fe());
|
|
355
354
|
this.numSplats = e, this.allocateBuffers(e);
|
|
356
355
|
}
|
|
357
356
|
allocateBuffers(e) {
|
|
@@ -366,13 +365,13 @@ class Ie {
|
|
|
366
365
|
* @param color Color
|
|
367
366
|
* @param opacity Opacity value
|
|
368
367
|
*/
|
|
369
|
-
setSplat(e,
|
|
368
|
+
setSplat(e, o, t, r, n, a) {
|
|
370
369
|
if (e >= this.numSplats)
|
|
371
370
|
throw new Error(
|
|
372
371
|
`Splat index out of bounds: ${e} >= ${this.numSplats}`
|
|
373
372
|
);
|
|
374
|
-
const i = e * 3, u = e * 4,
|
|
375
|
-
this.positions[i] =
|
|
373
|
+
const i = e * 3, u = e * 4, w = e * 3, C = e * 3;
|
|
374
|
+
this.positions[i] = o.x, this.positions[i + 1] = o.y, this.positions[i + 2] = o.z, this.rotations[u] = t.x, this.rotations[u + 1] = t.y, this.rotations[u + 2] = t.z, this.rotations[u + 3] = t.w, this.scales[w] = r.x, this.scales[w + 1] = r.y, this.scales[w + 2] = r.z, this.colors[C] = n.r, this.colors[C + 1] = n.g, this.colors[C + 2] = n.b, this.opacities[e] = a;
|
|
376
375
|
}
|
|
377
376
|
/**
|
|
378
377
|
* Get a splat's data
|
|
@@ -384,12 +383,12 @@ class Ie {
|
|
|
384
383
|
throw new Error(
|
|
385
384
|
`Splat index out of bounds: ${e} >= ${this.numSplats}`
|
|
386
385
|
);
|
|
387
|
-
const
|
|
386
|
+
const o = e * 3, t = e * 4, r = e * 3, n = e * 3;
|
|
388
387
|
return {
|
|
389
388
|
position: new l.Vector3(
|
|
390
|
-
this.positions[
|
|
391
|
-
this.positions[
|
|
392
|
-
this.positions[
|
|
389
|
+
this.positions[o],
|
|
390
|
+
this.positions[o + 1],
|
|
391
|
+
this.positions[o + 2]
|
|
393
392
|
),
|
|
394
393
|
rotation: new l.Quaternion(
|
|
395
394
|
this.rotations[t],
|
|
@@ -399,14 +398,14 @@ class Ie {
|
|
|
399
398
|
),
|
|
400
399
|
// Convert log scale back to linear scale for external use
|
|
401
400
|
scale: new l.Vector3(
|
|
402
|
-
Math.exp(this.scales[
|
|
403
|
-
Math.exp(this.scales[
|
|
404
|
-
Math.exp(this.scales[
|
|
401
|
+
Math.exp(this.scales[r]),
|
|
402
|
+
Math.exp(this.scales[r + 1]),
|
|
403
|
+
Math.exp(this.scales[r + 2])
|
|
405
404
|
),
|
|
406
405
|
color: new l.Color(
|
|
407
|
-
this.colors[
|
|
408
|
-
this.colors[
|
|
409
|
-
this.colors[
|
|
406
|
+
this.colors[n],
|
|
407
|
+
this.colors[n + 1],
|
|
408
|
+
this.colors[n + 2]
|
|
410
409
|
),
|
|
411
410
|
opacity: this.opacities[e]
|
|
412
411
|
};
|
|
@@ -418,8 +417,8 @@ class Ie {
|
|
|
418
417
|
calculateBoundingBox() {
|
|
419
418
|
this.boundingBox.reset();
|
|
420
419
|
const e = new l.Vector3();
|
|
421
|
-
for (let
|
|
422
|
-
const t =
|
|
420
|
+
for (let o = 0; o < this.numSplats; o++) {
|
|
421
|
+
const t = o * 3;
|
|
423
422
|
e.set(
|
|
424
423
|
this.positions[t],
|
|
425
424
|
this.positions[t + 1],
|
|
@@ -438,19 +437,19 @@ class Ie {
|
|
|
438
437
|
"position",
|
|
439
438
|
new l.BufferAttribute(this.positions, 3)
|
|
440
439
|
);
|
|
441
|
-
const
|
|
442
|
-
for (let
|
|
443
|
-
const a =
|
|
440
|
+
const o = new Float32Array(this.numSplats * 3), t = new l.Quaternion(), r = new l.Euler();
|
|
441
|
+
for (let n = 0; n < this.numSplats; n++) {
|
|
442
|
+
const a = n * 4, i = n * 3;
|
|
444
443
|
t.set(
|
|
445
444
|
this.rotations[a],
|
|
446
445
|
this.rotations[a + 1],
|
|
447
446
|
this.rotations[a + 2],
|
|
448
447
|
this.rotations[a + 3]
|
|
449
|
-
),
|
|
448
|
+
), r.setFromQuaternion(t), o[i] = r.x, o[i + 1] = r.y, o[i + 2] = r.z;
|
|
450
449
|
}
|
|
451
450
|
return e.setAttribute(
|
|
452
451
|
"rotation",
|
|
453
|
-
new l.BufferAttribute(
|
|
452
|
+
new l.BufferAttribute(o, 3)
|
|
454
453
|
), e.setAttribute(
|
|
455
454
|
"scale",
|
|
456
455
|
new l.BufferAttribute(this.scales, 3)
|
|
@@ -463,35 +462,35 @@ class Ie {
|
|
|
463
462
|
), e;
|
|
464
463
|
}
|
|
465
464
|
}
|
|
466
|
-
class
|
|
467
|
-
constructor(
|
|
468
|
-
super(
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
const t = this.createWorkerCode(),
|
|
473
|
-
this.worker = new Worker(URL.createObjectURL(
|
|
465
|
+
class ze extends l.Loader {
|
|
466
|
+
constructor(o) {
|
|
467
|
+
super(o);
|
|
468
|
+
f(this, "requestId", 0);
|
|
469
|
+
f(this, "worker");
|
|
470
|
+
f(this, "pendingCallbacks", /* @__PURE__ */ new Map());
|
|
471
|
+
const t = this.createWorkerCode(), r = new Blob([t], { type: "application/javascript" });
|
|
472
|
+
this.worker = new Worker(URL.createObjectURL(r)), this.worker.onmessage = this.onWorkerMessage.bind(this);
|
|
474
473
|
}
|
|
475
474
|
/**
|
|
476
475
|
* Handles messages received from the parsing worker
|
|
477
476
|
* @param event The message event from the worker
|
|
478
477
|
*/
|
|
479
|
-
onWorkerMessage(
|
|
480
|
-
const { requestId: t, error:
|
|
478
|
+
onWorkerMessage(o) {
|
|
479
|
+
const { requestId: t, error: r, result: n } = o.data, a = this.pendingCallbacks.get(t);
|
|
481
480
|
if (!a) return console.warn(`PlyLoader: Received response for unknown request ${t}`);
|
|
482
|
-
if (this.pendingCallbacks.delete(t),
|
|
483
|
-
if (!
|
|
481
|
+
if (this.pendingCallbacks.delete(t), r) return a.reject(new Error(r));
|
|
482
|
+
if (!n) return a.reject(new Error("Worker returned no result"));
|
|
484
483
|
try {
|
|
485
|
-
const i = new
|
|
486
|
-
i.numSplats =
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
484
|
+
const i = new Re(0);
|
|
485
|
+
i.numSplats = n.numSplats, i.positions = new Float32Array(n.positions), i.rotations = new Float32Array(n.rotations), i.scales = new Float32Array(n.scales), i.colors = new Float32Array(n.colors), i.opacities = new Float32Array(n.opacities), i.boundingBox.min.set(
|
|
486
|
+
n.boundingBox.minX,
|
|
487
|
+
n.boundingBox.minY,
|
|
488
|
+
n.boundingBox.minZ
|
|
490
489
|
), i.boundingBox.max.set(
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
), a.resolve(i);
|
|
490
|
+
n.boundingBox.maxX,
|
|
491
|
+
n.boundingBox.maxY,
|
|
492
|
+
n.boundingBox.maxZ
|
|
493
|
+
), this.worker.terminate(), a.resolve(i);
|
|
495
494
|
} catch (i) {
|
|
496
495
|
a.reject(i);
|
|
497
496
|
}
|
|
@@ -503,19 +502,19 @@ class Re extends l.Loader {
|
|
|
503
502
|
* @param onProgress Optional progress callback
|
|
504
503
|
* @param onError Optional error callback
|
|
505
504
|
*/
|
|
506
|
-
load(
|
|
505
|
+
load(o, t, r, n) {
|
|
507
506
|
const a = new l.FileLoader(this.manager);
|
|
508
507
|
a.setResponseType("arraybuffer"), a.setRequestHeader(this.requestHeader), a.setPath(this.path), a.setWithCredentials(this.withCredentials), a.load(
|
|
509
|
-
|
|
508
|
+
o,
|
|
510
509
|
(i) => {
|
|
511
510
|
this.parseAsync(i).then((u) => {
|
|
512
511
|
t && t(u);
|
|
513
512
|
}).catch((u) => {
|
|
514
|
-
|
|
513
|
+
n ? n(u) : console.error(u), this.manager.itemError(o);
|
|
515
514
|
});
|
|
516
515
|
},
|
|
517
|
-
|
|
518
|
-
|
|
516
|
+
r,
|
|
517
|
+
n
|
|
519
518
|
);
|
|
520
519
|
}
|
|
521
520
|
/**
|
|
@@ -524,19 +523,19 @@ class Re extends l.Loader {
|
|
|
524
523
|
* @param onProgress Optional progress callback
|
|
525
524
|
* @returns A Promise that resolves with the parsed SplatData
|
|
526
525
|
*/
|
|
527
|
-
loadAsync(
|
|
528
|
-
return new Promise((
|
|
526
|
+
loadAsync(o, t) {
|
|
527
|
+
return new Promise((r, n) => {
|
|
529
528
|
const a = new l.FileLoader(this.manager);
|
|
530
529
|
a.setResponseType("arraybuffer"), a.setRequestHeader(this.requestHeader), a.setPath(this.path), a.setWithCredentials(this.withCredentials), a.load(
|
|
531
|
-
|
|
530
|
+
o,
|
|
532
531
|
(i) => {
|
|
533
|
-
this.parseAsync(i).then(
|
|
534
|
-
|
|
532
|
+
this.parseAsync(i).then(r).catch((u) => {
|
|
533
|
+
n(u), this.manager.itemError(o);
|
|
535
534
|
});
|
|
536
535
|
},
|
|
537
536
|
t,
|
|
538
537
|
(i) => {
|
|
539
|
-
|
|
538
|
+
n(i), this.manager.itemError(o);
|
|
540
539
|
}
|
|
541
540
|
);
|
|
542
541
|
});
|
|
@@ -546,15 +545,15 @@ class Re extends l.Loader {
|
|
|
546
545
|
* @param buffer ArrayBuffer containing PLY data
|
|
547
546
|
* @returns Promise that resolves with parsed SplatData
|
|
548
547
|
*/
|
|
549
|
-
parseAsync(
|
|
550
|
-
return new Promise((t,
|
|
551
|
-
const
|
|
552
|
-
this.pendingCallbacks.set(
|
|
548
|
+
parseAsync(o) {
|
|
549
|
+
return new Promise((t, r) => {
|
|
550
|
+
const n = this.requestId++;
|
|
551
|
+
this.pendingCallbacks.set(n, { resolve: t, reject: r });
|
|
553
552
|
const a = {
|
|
554
|
-
requestId:
|
|
555
|
-
buffer:
|
|
553
|
+
requestId: n,
|
|
554
|
+
buffer: o
|
|
556
555
|
};
|
|
557
|
-
this.worker.postMessage(a, [
|
|
556
|
+
this.worker.postMessage(a, [o]);
|
|
558
557
|
});
|
|
559
558
|
}
|
|
560
559
|
/**
|
|
@@ -569,11 +568,11 @@ class Re extends l.Loader {
|
|
|
569
568
|
*/
|
|
570
569
|
createWorkerCode() {
|
|
571
570
|
return `(${(function() {
|
|
572
|
-
self.onmessage = (
|
|
573
|
-
const { requestId:
|
|
571
|
+
self.onmessage = (r) => {
|
|
572
|
+
const { requestId: n, buffer: a } = r.data;
|
|
574
573
|
try {
|
|
575
574
|
const i = t(a), u = {
|
|
576
|
-
requestId:
|
|
575
|
+
requestId: n,
|
|
577
576
|
result: i
|
|
578
577
|
};
|
|
579
578
|
self.postMessage(u, [
|
|
@@ -585,14 +584,14 @@ class Re extends l.Loader {
|
|
|
585
584
|
]);
|
|
586
585
|
} catch (i) {
|
|
587
586
|
const u = {
|
|
588
|
-
requestId:
|
|
587
|
+
requestId: n,
|
|
589
588
|
error: i instanceof Error ? i.message : String(i)
|
|
590
589
|
};
|
|
591
590
|
self.postMessage(u);
|
|
592
591
|
}
|
|
593
592
|
};
|
|
594
|
-
function t(
|
|
595
|
-
const
|
|
593
|
+
function t(r) {
|
|
594
|
+
const n = new TextDecoder(), a = new Uint8Array(r), i = [112, 108, 121, 10], u = `
|
|
596
595
|
end_header
|
|
597
596
|
`;
|
|
598
597
|
for (let m = 0; m < i.length; m++)
|
|
@@ -600,7 +599,7 @@ end_header
|
|
|
600
599
|
throw new Error(
|
|
601
600
|
"Invalid PLY file: Missing magic bytes"
|
|
602
601
|
);
|
|
603
|
-
let
|
|
602
|
+
let w = 0;
|
|
604
603
|
for (let m = 0; m < a.length - u.length; m++) {
|
|
605
604
|
let c = !0;
|
|
606
605
|
for (let y = 0; y < u.length; y++)
|
|
@@ -609,79 +608,79 @@ end_header
|
|
|
609
608
|
break;
|
|
610
609
|
}
|
|
611
610
|
if (c) {
|
|
612
|
-
|
|
611
|
+
w = m + u.length;
|
|
613
612
|
break;
|
|
614
613
|
}
|
|
615
614
|
}
|
|
616
|
-
if (
|
|
615
|
+
if (w === 0)
|
|
617
616
|
throw new Error(
|
|
618
617
|
"Invalid PLY file: Could not find end of header"
|
|
619
618
|
);
|
|
620
|
-
const
|
|
621
|
-
a.subarray(0,
|
|
619
|
+
const _ = n.decode(
|
|
620
|
+
a.subarray(0, w)
|
|
622
621
|
).split(`
|
|
623
|
-
`),
|
|
624
|
-
let
|
|
625
|
-
for (let m = 1; m <
|
|
626
|
-
const c =
|
|
622
|
+
`), h = [];
|
|
623
|
+
let b = null;
|
|
624
|
+
for (let m = 1; m < _.length; m++) {
|
|
625
|
+
const c = _[m].trim();
|
|
627
626
|
if (c === "" || c === "end_header") continue;
|
|
628
627
|
const y = c.split(" ");
|
|
629
628
|
switch (y[0]) {
|
|
630
629
|
case "format":
|
|
631
|
-
|
|
630
|
+
b = y[1];
|
|
632
631
|
break;
|
|
633
632
|
case "element":
|
|
634
|
-
|
|
633
|
+
h.push({
|
|
635
634
|
name: y[1],
|
|
636
635
|
count: parseInt(y[2], 10),
|
|
637
636
|
properties: []
|
|
638
637
|
});
|
|
639
638
|
break;
|
|
640
639
|
case "property":
|
|
641
|
-
if (
|
|
640
|
+
if (h.length === 0)
|
|
642
641
|
throw new Error(
|
|
643
642
|
"Invalid PLY file: Property without element"
|
|
644
643
|
);
|
|
645
|
-
|
|
644
|
+
h[h.length - 1].properties.push({
|
|
646
645
|
type: y[1],
|
|
647
646
|
name: y[2]
|
|
648
647
|
});
|
|
649
648
|
break;
|
|
650
649
|
}
|
|
651
650
|
}
|
|
652
|
-
if (
|
|
653
|
-
throw new Error(`Unsupported PLY format: ${
|
|
654
|
-
const
|
|
655
|
-
if (!
|
|
651
|
+
if (b !== "binary_little_endian")
|
|
652
|
+
throw new Error(`Unsupported PLY format: ${b}`);
|
|
653
|
+
const S = h.find((m) => m.name === "vertex");
|
|
654
|
+
if (!S)
|
|
656
655
|
throw new Error(
|
|
657
656
|
"Invalid PLY file: No vertex element found"
|
|
658
657
|
);
|
|
659
|
-
const I =
|
|
660
|
-
let
|
|
661
|
-
const
|
|
658
|
+
const I = S.count, P = new Float32Array(I * 3), j = new Float32Array(I * 4), H = new Float32Array(I * 3), W = new Float32Array(I * 3), oe = new Float32Array(I), L = new DataView(r);
|
|
659
|
+
let A = w;
|
|
660
|
+
const g = (m) => S.properties.findIndex(
|
|
662
661
|
(c) => c.name === m
|
|
663
|
-
), D =
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
662
|
+
), D = g("x"), T = g("y"), v = g("z"), R = [
|
|
663
|
+
g("rot_0"),
|
|
664
|
+
g("rot_1"),
|
|
665
|
+
g("rot_2"),
|
|
666
|
+
g("rot_3")
|
|
668
667
|
], B = [
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
],
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
],
|
|
668
|
+
g("scale_0"),
|
|
669
|
+
g("scale_1"),
|
|
670
|
+
g("scale_2")
|
|
671
|
+
], $ = [
|
|
672
|
+
g("f_dc_0"),
|
|
673
|
+
g("f_dc_1"),
|
|
674
|
+
g("f_dc_2")
|
|
675
|
+
], X = g("opacity");
|
|
677
676
|
if ([
|
|
678
677
|
D,
|
|
679
|
-
|
|
680
|
-
|
|
678
|
+
T,
|
|
679
|
+
v,
|
|
681
680
|
...R,
|
|
682
681
|
...B,
|
|
683
|
-
|
|
684
|
-
|
|
682
|
+
...$,
|
|
683
|
+
X
|
|
685
684
|
].some((m) => m === -1))
|
|
686
685
|
throw new Error(
|
|
687
686
|
"Invalid PLY file: Missing required properties"
|
|
@@ -691,73 +690,73 @@ end_header
|
|
|
691
690
|
const c = Math.exp(m);
|
|
692
691
|
return c / (1 + c);
|
|
693
692
|
};
|
|
694
|
-
let N = 1 / 0, te = 1 / 0, s = 1 / 0, p = -1 / 0,
|
|
693
|
+
let N = 1 / 0, te = 1 / 0, s = 1 / 0, p = -1 / 0, M = -1 / 0, E = -1 / 0;
|
|
695
694
|
for (let m = 0; m < I; m++) {
|
|
696
695
|
const c = [];
|
|
697
|
-
for (let
|
|
698
|
-
const
|
|
696
|
+
for (let he = 0; he < S.properties.length; he++) {
|
|
697
|
+
const pe = S.properties[he].type;
|
|
699
698
|
let ee;
|
|
700
|
-
switch (
|
|
699
|
+
switch (pe) {
|
|
701
700
|
case "char":
|
|
702
|
-
ee = L.getInt8(
|
|
701
|
+
ee = L.getInt8(A), A += 1;
|
|
703
702
|
break;
|
|
704
703
|
case "uchar":
|
|
705
|
-
ee = L.getUint8(
|
|
704
|
+
ee = L.getUint8(A), A += 1;
|
|
706
705
|
break;
|
|
707
706
|
case "short":
|
|
708
|
-
ee = L.getInt16(
|
|
707
|
+
ee = L.getInt16(A, !0), A += 2;
|
|
709
708
|
break;
|
|
710
709
|
case "ushort":
|
|
711
|
-
ee = L.getUint16(
|
|
710
|
+
ee = L.getUint16(A, !0), A += 2;
|
|
712
711
|
break;
|
|
713
712
|
case "int":
|
|
714
|
-
ee = L.getInt32(
|
|
713
|
+
ee = L.getInt32(A, !0), A += 4;
|
|
715
714
|
break;
|
|
716
715
|
case "uint":
|
|
717
|
-
ee = L.getUint32(
|
|
716
|
+
ee = L.getUint32(A, !0), A += 4;
|
|
718
717
|
break;
|
|
719
718
|
case "float":
|
|
720
|
-
ee = L.getFloat32(
|
|
719
|
+
ee = L.getFloat32(A, !0), A += 4;
|
|
721
720
|
break;
|
|
722
721
|
case "double":
|
|
723
|
-
ee = L.getFloat64(
|
|
722
|
+
ee = L.getFloat64(A, !0), A += 8;
|
|
724
723
|
break;
|
|
725
724
|
default:
|
|
726
725
|
throw new Error(
|
|
727
|
-
`Unsupported property type: ${
|
|
726
|
+
`Unsupported property type: ${pe}`
|
|
728
727
|
);
|
|
729
728
|
}
|
|
730
729
|
c.push(ee);
|
|
731
730
|
}
|
|
732
|
-
const y = c[D],
|
|
733
|
-
|
|
734
|
-
let O = c[R[1]],
|
|
731
|
+
const y = c[D], z = c[T], d = c[v], k = m * 3;
|
|
732
|
+
P[k] = y, P[k + 1] = z, P[k + 2] = d, N = Math.min(N, y), te = Math.min(te, z), s = Math.min(s, d), p = Math.max(p, y), M = Math.max(M, z), E = Math.max(E, d);
|
|
733
|
+
let O = c[R[1]], q = c[R[2]], G = c[R[3]], V = c[R[0]];
|
|
735
734
|
const Y = Math.sqrt(
|
|
736
|
-
O * O +
|
|
735
|
+
O * O + q * q + G * G + V * V
|
|
737
736
|
);
|
|
738
|
-
Y > 0 && (O /= Y,
|
|
739
|
-
const
|
|
740
|
-
j[
|
|
741
|
-
const
|
|
742
|
-
H[
|
|
743
|
-
let re = 0.5 + c[
|
|
744
|
-
re = Math.max(0, Math.min(1, re)),
|
|
737
|
+
Y > 0 && (O /= Y, q /= Y, G /= Y, V /= Y), V < 0 && (O = -O, q = -q, G = -G, V = -V);
|
|
738
|
+
const K = m * 4;
|
|
739
|
+
j[K] = O, j[K + 1] = q, j[K + 2] = G, j[K + 3] = V;
|
|
740
|
+
const Q = m * 3;
|
|
741
|
+
H[Q] = c[B[0]], H[Q + 1] = c[B[1]], H[Q + 2] = c[B[2]];
|
|
742
|
+
let re = 0.5 + c[$[0]] * U, ne = 0.5 + c[$[1]] * U, J = 0.5 + c[$[2]] * U;
|
|
743
|
+
re = Math.max(0, Math.min(1, re)), ne = Math.max(0, Math.min(1, ne)), J = Math.max(0, Math.min(1, J));
|
|
745
744
|
const ue = m * 3;
|
|
746
|
-
W[ue] = re, W[ue + 1] =
|
|
745
|
+
W[ue] = re, W[ue + 1] = ne, W[ue + 2] = J, oe[m] = F(c[X]);
|
|
747
746
|
}
|
|
748
747
|
return {
|
|
749
748
|
numSplats: I,
|
|
750
|
-
positions:
|
|
749
|
+
positions: P.buffer,
|
|
751
750
|
rotations: j.buffer,
|
|
752
751
|
scales: H.buffer,
|
|
753
752
|
colors: W.buffer,
|
|
754
|
-
opacities:
|
|
753
|
+
opacities: oe.buffer,
|
|
755
754
|
boundingBox: {
|
|
756
755
|
minX: N,
|
|
757
756
|
minY: te,
|
|
758
757
|
minZ: s,
|
|
759
758
|
maxX: p,
|
|
760
|
-
maxY:
|
|
759
|
+
maxY: M,
|
|
761
760
|
maxZ: E
|
|
762
761
|
}
|
|
763
762
|
};
|
|
@@ -768,31 +767,31 @@ end_header
|
|
|
768
767
|
class Pe extends l.EventDispatcher {
|
|
769
768
|
constructor() {
|
|
770
769
|
super();
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
770
|
+
f(this, "worker");
|
|
771
|
+
f(this, "centers", null);
|
|
772
|
+
f(this, "orderTexture", null);
|
|
774
773
|
/** Bounding box data for optimization */
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
const
|
|
774
|
+
f(this, "chunks", null);
|
|
775
|
+
f(this, "lastCameraPosition", new l.Vector3());
|
|
776
|
+
f(this, "lastCameraDirection", new l.Vector3());
|
|
777
|
+
const o = this.createWorkerCode(), t = new Blob([o], { type: "application/javascript" });
|
|
779
778
|
this.worker = new Worker(URL.createObjectURL(t)), this.worker.onmessage = this.onWorkerMessage.bind(this);
|
|
780
779
|
}
|
|
781
780
|
/**
|
|
782
781
|
* Handles messages received from the sorting worker.
|
|
783
782
|
* @param event The message event from the worker.
|
|
784
783
|
*/
|
|
785
|
-
onWorkerMessage(
|
|
784
|
+
onWorkerMessage(o) {
|
|
786
785
|
if (!this.orderTexture || !this.orderTexture.image)
|
|
787
786
|
return console.error("SplatSorter: Order texture not initialized!");
|
|
788
|
-
const { order: t, count:
|
|
789
|
-
if (!(
|
|
787
|
+
const { order: t, count: r } = o.data, n = this.orderTexture.image.data;
|
|
788
|
+
if (!(n instanceof Uint32Array))
|
|
790
789
|
return console.error(
|
|
791
790
|
"SplatSorter: Order texture data is not a Uint32Array!"
|
|
792
791
|
);
|
|
793
|
-
|
|
794
|
-
const a =
|
|
795
|
-
this.worker.postMessage(i, [a]), this.dispatchEvent({ type: "updated", count:
|
|
792
|
+
n.set(new Uint32Array(t)), this.orderTexture.source.data.updateRanges || (this.orderTexture.source.data.updateRanges = []), this.orderTexture.needsUpdate = !0;
|
|
793
|
+
const a = n.buffer.slice(0), i = { order: a };
|
|
794
|
+
this.worker.postMessage(i, [a]), this.dispatchEvent({ type: "updated", count: r });
|
|
796
795
|
}
|
|
797
796
|
/**
|
|
798
797
|
* Initializes the sorter with necessary data and textures.
|
|
@@ -801,31 +800,35 @@ class Pe extends l.EventDispatcher {
|
|
|
801
800
|
* @param chunks Optional: A Float32Array containing bounding box chunk data [minX, minY, minZ, maxX, maxY, maxZ, ...] for optimization.
|
|
802
801
|
* @param transferOwnership Optional: If true, transfers ownership of centers buffer to worker (saves memory, main thread loses access). Default: false.
|
|
803
802
|
*/
|
|
804
|
-
init(
|
|
805
|
-
if (!
|
|
803
|
+
init(o, t, r, n = !1) {
|
|
804
|
+
if (!o || !(o.image.data instanceof Uint32Array))
|
|
806
805
|
throw new Error("SplatSorter: Invalid orderTexture provided. Must be DataTexture with Uint32Array data.");
|
|
807
806
|
if (!t || t.length % 3 !== 0)
|
|
808
807
|
throw new Error("SplatSorter: Invalid centers array provided. Length must be multiple of 3.");
|
|
809
|
-
if (
|
|
808
|
+
if (o.image.data.length < t.length / 3)
|
|
810
809
|
throw new Error("SplatSorter: orderTexture data buffer is smaller than the number of splats.");
|
|
810
|
+
if (t.buffer.byteLength === 0)
|
|
811
|
+
throw new Error(
|
|
812
|
+
"SplatSorter: positions buffer is detached (likely React StrictMode + cached asset). "
|
|
813
|
+
);
|
|
811
814
|
const a = t.length / 3;
|
|
812
|
-
this.orderTexture =
|
|
815
|
+
this.orderTexture = o, n ? this.centers = null : this.centers = t.slice();
|
|
813
816
|
const i = this.orderTexture.image.data;
|
|
814
|
-
for (let
|
|
815
|
-
this.orderTexture.needsUpdate = !0;
|
|
816
|
-
const u = i.buffer.slice(0),
|
|
817
|
+
for (let h = 0; h < a; h++) i[h] = h;
|
|
818
|
+
this.orderTexture.source.data.updateRanges || (this.orderTexture.source.data.updateRanges = []), this.orderTexture.needsUpdate = !0;
|
|
819
|
+
const u = i.buffer.slice(0), w = n ? t.buffer : t.buffer.slice(0), C = {
|
|
817
820
|
order: u,
|
|
818
|
-
centers:
|
|
819
|
-
},
|
|
821
|
+
centers: w
|
|
822
|
+
}, _ = [
|
|
820
823
|
u,
|
|
821
|
-
|
|
824
|
+
w
|
|
822
825
|
];
|
|
823
|
-
if (
|
|
824
|
-
this.chunks =
|
|
825
|
-
const
|
|
826
|
-
|
|
826
|
+
if (r) {
|
|
827
|
+
this.chunks = r.slice();
|
|
828
|
+
const h = this.chunks.buffer.slice(0);
|
|
829
|
+
C.chunks = h, _.push(h);
|
|
827
830
|
}
|
|
828
|
-
this.worker.postMessage(
|
|
831
|
+
this.worker.postMessage(C, _), queueMicrotask(() => {
|
|
829
832
|
this.dispatchEvent({
|
|
830
833
|
type: "updated",
|
|
831
834
|
count: a
|
|
@@ -837,50 +840,50 @@ class Pe extends l.EventDispatcher {
|
|
|
837
840
|
* The sorter will only consider splats whose original indices are present in the mapping.
|
|
838
841
|
* @param mapping A Uint32Array where each element is the *original* index of a splat to include, or null to reset mapping.
|
|
839
842
|
*/
|
|
840
|
-
setMapping(
|
|
843
|
+
setMapping(o) {
|
|
841
844
|
if (!this.centers)
|
|
842
845
|
return console.warn(
|
|
843
846
|
"SplatSorter: Cannot set mapping before initialization."
|
|
844
847
|
);
|
|
845
848
|
let t;
|
|
846
|
-
const
|
|
847
|
-
if (!
|
|
849
|
+
const r = [];
|
|
850
|
+
if (!o) {
|
|
848
851
|
const u = this.centers.buffer.slice(0);
|
|
849
852
|
return t = {
|
|
850
853
|
centers: u,
|
|
851
854
|
mapping: null
|
|
852
|
-
},
|
|
855
|
+
}, r.push(u), this.worker.postMessage(t, r);
|
|
853
856
|
}
|
|
854
|
-
const
|
|
855
|
-
for (let u = 0; u <
|
|
856
|
-
const
|
|
857
|
-
if (
|
|
857
|
+
const n = new Float32Array(o.length * 3);
|
|
858
|
+
for (let u = 0; u < o.length; u++) {
|
|
859
|
+
const w = o[u];
|
|
860
|
+
if (w * 3 + 2 >= this.centers.length) {
|
|
858
861
|
console.warn(
|
|
859
|
-
`SplatSorter: Mapping index ${
|
|
862
|
+
`SplatSorter: Mapping index ${w} out of bounds.`
|
|
860
863
|
);
|
|
861
864
|
continue;
|
|
862
865
|
}
|
|
863
|
-
const
|
|
864
|
-
|
|
866
|
+
const C = w * 3, _ = u * 3;
|
|
867
|
+
n[_ + 0] = this.centers[C + 0], n[_ + 1] = this.centers[C + 1], n[_ + 2] = this.centers[C + 2];
|
|
865
868
|
}
|
|
866
|
-
const a =
|
|
869
|
+
const a = n.buffer.slice(0), i = o.buffer.slice(0);
|
|
867
870
|
t = {
|
|
868
871
|
centers: a,
|
|
869
872
|
mapping: i
|
|
870
|
-
},
|
|
873
|
+
}, r.push(a, i), this.worker.postMessage(t, r);
|
|
871
874
|
}
|
|
872
875
|
/**
|
|
873
876
|
* Updates the camera parameters used for sorting.
|
|
874
877
|
* @param position The camera's position in the sorter's local coordinate space.
|
|
875
878
|
* @param direction The camera's forward direction in the sorter's local coordinate space.
|
|
876
879
|
*/
|
|
877
|
-
setCamera(
|
|
878
|
-
const
|
|
879
|
-
if (!
|
|
880
|
+
setCamera(o, t) {
|
|
881
|
+
const r = this.lastCameraPosition.distanceToSquared(o) > 1e-7, n = this.lastCameraDirection.dot(t) < 0.9999;
|
|
882
|
+
if (!r && !n)
|
|
880
883
|
return;
|
|
881
|
-
this.lastCameraPosition.copy(
|
|
884
|
+
this.lastCameraPosition.copy(o), this.lastCameraDirection.copy(t);
|
|
882
885
|
const a = {
|
|
883
|
-
cameraPosition: { x:
|
|
886
|
+
cameraPosition: { x: o.x, y: o.y, z: o.z },
|
|
884
887
|
cameraDirection: { x: t.x, y: t.y, z: t.z }
|
|
885
888
|
};
|
|
886
889
|
this.worker.postMessage(a);
|
|
@@ -897,21 +900,21 @@ class Pe extends l.EventDispatcher {
|
|
|
897
900
|
*/
|
|
898
901
|
createWorkerCode() {
|
|
899
902
|
return `(${(function() {
|
|
900
|
-
let t = null,
|
|
901
|
-
const
|
|
902
|
-
let
|
|
903
|
-
const
|
|
904
|
-
for (;
|
|
905
|
-
const
|
|
906
|
-
if (
|
|
907
|
-
else if (
|
|
908
|
-
else return
|
|
903
|
+
let t = null, r = null, n = null, a = null, i = null, u = null, w = !1;
|
|
904
|
+
const C = { x: 0, y: 0, z: 0 }, _ = { x: 0, y: 0, z: 0 }, h = { x: 0, y: 0, z: 0 }, b = { x: 0, y: 0, z: 0 };
|
|
905
|
+
let S = null, I = null;
|
|
906
|
+
const P = 32, j = new Array(P).fill(0), H = new Array(P).fill(0), W = new Array(P).fill(0), oe = (A, g, D) => {
|
|
907
|
+
for (; A <= g; ) {
|
|
908
|
+
const T = g + A >> 1, v = D(T);
|
|
909
|
+
if (v > 0) A = T + 1;
|
|
910
|
+
else if (v < 0) g = T - 1;
|
|
911
|
+
else return T;
|
|
909
912
|
}
|
|
910
|
-
return ~
|
|
913
|
+
return ~A;
|
|
911
914
|
}, L = () => {
|
|
912
|
-
if (!t || !
|
|
915
|
+
if (!t || !r || !i || !u)
|
|
913
916
|
return;
|
|
914
|
-
if (
|
|
917
|
+
if (r.length === 0) {
|
|
915
918
|
const c = {
|
|
916
919
|
order: t.buffer,
|
|
917
920
|
count: 0
|
|
@@ -919,80 +922,80 @@ class Pe extends l.EventDispatcher {
|
|
|
919
922
|
self.postMessage(c, [t.buffer]), t = null;
|
|
920
923
|
return;
|
|
921
924
|
}
|
|
922
|
-
const
|
|
923
|
-
if (!
|
|
925
|
+
const A = i.x, g = i.y, D = i.z, T = u.x, v = u.y, R = u.z, B = 1e-4, $ = Math.abs(A - C.x) > B || Math.abs(g - C.y) > B || Math.abs(D - C.z) > B, X = Math.abs(T - _.x) > B || Math.abs(v - _.y) > B || Math.abs(R - _.z) > B;
|
|
926
|
+
if (!w && !$ && !X)
|
|
924
927
|
return;
|
|
925
|
-
|
|
928
|
+
w = !1, C.x = A, C.y = g, C.z = D, _.x = T, _.y = v, _.z = R;
|
|
926
929
|
let Z = 1 / 0, U = -1 / 0;
|
|
927
930
|
for (let c = 0; c < 8; ++c) {
|
|
928
|
-
const y = c & 1 ?
|
|
931
|
+
const y = c & 1 ? h.x : b.x, z = c & 2 ? h.y : b.y, d = c & 4 ? h.z : b.z, k = y * T + z * v + d * R;
|
|
929
932
|
Z = Math.min(Z, k), U = Math.max(U, k);
|
|
930
933
|
}
|
|
931
|
-
const F =
|
|
934
|
+
const F = r.length / 3, N = U - Z, s = (1 << Math.max(
|
|
932
935
|
10,
|
|
933
936
|
Math.min(20, Math.ceil(Math.log2(F / 4)))
|
|
934
937
|
)) + 1;
|
|
935
|
-
if ((!
|
|
936
|
-
for (let c = 0; c < F; ++c)
|
|
938
|
+
if ((!S || S.length !== F) && (S = new Uint32Array(F)), !I || I.length !== s ? I = new Uint32Array(s) : I.fill(0), N < 1e-7) {
|
|
939
|
+
for (let c = 0; c < F; ++c) S[c] = 0;
|
|
937
940
|
I[0] = F;
|
|
938
|
-
} else if (
|
|
939
|
-
const c =
|
|
941
|
+
} else if (n && n.length > 0) {
|
|
942
|
+
const c = n.length / 6;
|
|
940
943
|
j.fill(0);
|
|
941
|
-
for (let
|
|
942
|
-
const k =
|
|
944
|
+
for (let d = 0; d < c; ++d) {
|
|
945
|
+
const k = d * 6, O = n[k + 0], q = n[k + 1], G = n[k + 2], V = n[k + 3], Y = O * T + q * v + G * R - Z, K = Y - V, Q = Y + V, re = Math.max(
|
|
943
946
|
0,
|
|
944
|
-
Math.floor(
|
|
945
|
-
),
|
|
946
|
-
|
|
947
|
-
Math.ceil(
|
|
947
|
+
Math.floor(K * P / N)
|
|
948
|
+
), ne = Math.min(
|
|
949
|
+
P,
|
|
950
|
+
Math.ceil(Q * P / N)
|
|
948
951
|
);
|
|
949
|
-
for (let J = re; J <
|
|
952
|
+
for (let J = re; J < ne; ++J)
|
|
950
953
|
j[J]++;
|
|
951
954
|
}
|
|
952
955
|
let y = 0;
|
|
953
|
-
for (let
|
|
956
|
+
for (let d = 0; d < P; ++d) y += j[d];
|
|
954
957
|
W[0] = 0, H[0] = 0;
|
|
955
|
-
for (let
|
|
956
|
-
W[
|
|
957
|
-
W[
|
|
958
|
-
const
|
|
959
|
-
for (let
|
|
960
|
-
const k =
|
|
958
|
+
for (let d = 1; d < P; ++d)
|
|
959
|
+
W[d - 1] = j[d - 1] / y * s >>> 0, H[d] = H[d - 1] + W[d - 1];
|
|
960
|
+
W[P - 1] = j[P - 1] / y * s >>> 0;
|
|
961
|
+
const z = N / P;
|
|
962
|
+
for (let d = 0; d < F; ++d) {
|
|
963
|
+
const k = d * 3, O = r[k + 0], q = r[k + 1], G = r[k + 2], V = O * T + q * v + G * R, K = (U - V) / z, Q = Math.max(
|
|
961
964
|
0,
|
|
962
965
|
Math.min(
|
|
963
|
-
|
|
964
|
-
Math.floor(
|
|
966
|
+
P - 1,
|
|
967
|
+
Math.floor(K)
|
|
965
968
|
)
|
|
966
|
-
), re =
|
|
967
|
-
|
|
969
|
+
), re = K - Q, ne = H[Q] + W[Q] * re >>> 0, J = Math.min(ne, s - 1);
|
|
970
|
+
S[d] = J, I[J]++;
|
|
968
971
|
}
|
|
969
972
|
} else {
|
|
970
973
|
const c = (s - 1) / N;
|
|
971
974
|
for (let y = 0; y < F; ++y) {
|
|
972
|
-
const
|
|
973
|
-
|
|
975
|
+
const z = y * 3, d = r[z + 0], k = r[z + 1], O = r[z + 2], q = d * T + k * v + O * R, V = (U - q) * c >>> 0, Y = Math.min(V, s - 1);
|
|
976
|
+
S[y] = Y, I[Y]++;
|
|
974
977
|
}
|
|
975
978
|
}
|
|
976
979
|
for (let c = 1; c < s; c++)
|
|
977
980
|
I[c] += I[c - 1];
|
|
978
981
|
for (let c = F - 1; c >= 0; c--) {
|
|
979
|
-
const y =
|
|
980
|
-
t[
|
|
982
|
+
const y = S[c], z = --I[y];
|
|
983
|
+
t[z] = a ? a[c] : c;
|
|
981
984
|
}
|
|
982
|
-
const p =
|
|
985
|
+
const p = A * T + g * v + D * R, M = (c) => {
|
|
983
986
|
if (!t) return -1 / 0;
|
|
984
|
-
const y = t[c],
|
|
985
|
-
if (!
|
|
987
|
+
const y = t[c], z = y;
|
|
988
|
+
if (!r || z * 3 + 2 >= r.length)
|
|
986
989
|
return -1 / 0;
|
|
987
|
-
const
|
|
988
|
-
return
|
|
990
|
+
const d = z * 3;
|
|
991
|
+
return r[d] * T + r[d + 1] * v + r[d + 2] * R - p;
|
|
989
992
|
};
|
|
990
993
|
let E = F;
|
|
991
|
-
if (F > 0 &&
|
|
992
|
-
const c =
|
|
994
|
+
if (F > 0 && M(F - 1) < 0) {
|
|
995
|
+
const c = oe(
|
|
993
996
|
0,
|
|
994
997
|
F - 1,
|
|
995
|
-
|
|
998
|
+
M
|
|
996
999
|
);
|
|
997
1000
|
E = c < 0 ? ~c : c;
|
|
998
1001
|
}
|
|
@@ -1002,60 +1005,60 @@ class Pe extends l.EventDispatcher {
|
|
|
1002
1005
|
};
|
|
1003
1006
|
self.postMessage(m, [t.buffer]), t = null;
|
|
1004
1007
|
};
|
|
1005
|
-
self.onmessage = (
|
|
1006
|
-
const
|
|
1007
|
-
|
|
1008
|
+
self.onmessage = (A) => {
|
|
1009
|
+
const g = A.data;
|
|
1010
|
+
g.order && (t = new Uint32Array(g.order));
|
|
1008
1011
|
let D = !1;
|
|
1009
|
-
if (
|
|
1010
|
-
if (
|
|
1011
|
-
for (let
|
|
1012
|
-
const
|
|
1013
|
-
|
|
1014
|
-
(
|
|
1012
|
+
if (g.centers && (r = new Float32Array(g.centers), D = !0, w = !0), Object.prototype.hasOwnProperty.call(g, "mapping") && (a = g.mapping ? new Uint32Array(g.mapping) : null, w = !0), g.chunks) {
|
|
1013
|
+
if (n = new Float32Array(g.chunks), n.length > 0 && n[3] > 0)
|
|
1014
|
+
for (let T = 0; T < n.length / 6; ++T) {
|
|
1015
|
+
const v = T * 6, R = n[v + 0], B = n[v + 1], $ = n[v + 2], X = n[v + 3], Z = n[v + 4], U = n[v + 5];
|
|
1016
|
+
n[v + 0] = (R + X) * 0.5, n[v + 1] = (B + Z) * 0.5, n[v + 2] = ($ + U) * 0.5, n[v + 3] = Math.sqrt(
|
|
1017
|
+
(X - R) ** 2 + (Z - B) ** 2 + (U - $) ** 2
|
|
1015
1018
|
) * 0.5;
|
|
1016
1019
|
}
|
|
1017
|
-
|
|
1020
|
+
w = !0;
|
|
1018
1021
|
}
|
|
1019
|
-
if (D &&
|
|
1020
|
-
|
|
1021
|
-
for (let
|
|
1022
|
-
const
|
|
1023
|
-
|
|
1022
|
+
if (D && r && r.length > 0) {
|
|
1023
|
+
h.x = b.x = r[0], h.y = b.y = r[1], h.z = b.z = r[2];
|
|
1024
|
+
for (let T = 1; T < r.length / 3; T++) {
|
|
1025
|
+
const v = T * 3;
|
|
1026
|
+
h.x = Math.min(h.x, r[v + 0]), b.x = Math.max(b.x, r[v + 0]), h.y = Math.min(h.y, r[v + 1]), b.y = Math.max(b.y, r[v + 1]), h.z = Math.min(h.z, r[v + 2]), b.z = Math.max(b.z, r[v + 2]);
|
|
1024
1027
|
}
|
|
1025
|
-
} else D &&
|
|
1026
|
-
|
|
1028
|
+
} else D && r && r.length === 0 && (h.x = b.x = h.y = b.y = h.z = b.z = 0);
|
|
1029
|
+
g.cameraPosition && (i = g.cameraPosition), g.cameraDirection && (u = g.cameraDirection), L();
|
|
1027
1030
|
};
|
|
1028
1031
|
}).toString()})();`;
|
|
1029
1032
|
}
|
|
1030
1033
|
}
|
|
1031
|
-
const
|
|
1032
|
-
const
|
|
1033
|
-
return
|
|
1034
|
+
const Be = (x, e) => {
|
|
1035
|
+
const o = ye(x), t = ye(e);
|
|
1036
|
+
return o | t << 16;
|
|
1034
1037
|
};
|
|
1035
|
-
function ye(
|
|
1036
|
-
const e = new Float32Array([
|
|
1037
|
-
let
|
|
1038
|
+
function ye(x) {
|
|
1039
|
+
const e = new Float32Array([x]), t = new Int32Array(e.buffer)[0];
|
|
1040
|
+
let r = t >> 16 & 32768, n = t >> 12 & 2047;
|
|
1038
1041
|
const a = t >> 23 & 255;
|
|
1039
|
-
return a < 103 ?
|
|
1042
|
+
return a < 103 ? r : a > 142 ? (r |= 31744, r |= (a === 255 ? 0 : 1) && t & 8388607, r) : a < 113 ? (n |= 2048, r |= (n >> 114 - a) + (n >> 113 - a & 1), r) : (r |= a - 112 << 10 | n >> 1, r += n & 1, r);
|
|
1040
1043
|
}
|
|
1041
|
-
const
|
|
1042
|
-
class
|
|
1044
|
+
const Fe = new ArrayBuffer(4), ve = new DataView(Fe), Oe = (x) => (ve.setUint32(0, x, !0), ve.getFloat32(0, !0));
|
|
1045
|
+
class De {
|
|
1043
1046
|
/**
|
|
1044
1047
|
* Create a new TextureManager for a set of splats
|
|
1045
1048
|
* @param splatData The splat data to manage textures for
|
|
1046
1049
|
*/
|
|
1047
1050
|
constructor(e) {
|
|
1048
|
-
|
|
1051
|
+
f(this, "textureWidth");
|
|
1052
|
+
f(this, "textureHeight");
|
|
1053
|
+
f(this, "transformA");
|
|
1049
1054
|
// position xyz and rotation quaternion y,z components
|
|
1050
|
-
|
|
1055
|
+
f(this, "transformB");
|
|
1051
1056
|
// rotation quaternion x and scale xyz
|
|
1052
|
-
|
|
1057
|
+
f(this, "colorTexture");
|
|
1053
1058
|
// color an opacity
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
const n = e.numSplats;
|
|
1058
|
-
this.textureWidth = Math.ceil(Math.sqrt(n)), this.textureHeight = Math.ceil(n / this.textureWidth), this.transformA = this.createTransformATexture(e), this.transformB = this.createTransformBTexture(e), this.colorTexture = this.createColorTexture(e), this.orderTexture = this.createOrderTexture(n);
|
|
1059
|
+
f(this, "orderTexture");
|
|
1060
|
+
const o = e.numSplats;
|
|
1061
|
+
this.textureWidth = Math.ceil(Math.sqrt(o)), this.textureHeight = Math.ceil(o / this.textureWidth), this.transformA = this.createTransformATexture(e), this.transformB = this.createTransformBTexture(e), this.colorTexture = this.createColorTexture(e), this.orderTexture = this.createOrderTexture(o);
|
|
1059
1062
|
}
|
|
1060
1063
|
/**
|
|
1061
1064
|
* Create the transform A texture (positions and quaternion w component)
|
|
@@ -1063,16 +1066,16 @@ class Oe {
|
|
|
1063
1066
|
* @returns DataTexture containing position data
|
|
1064
1067
|
*/
|
|
1065
1068
|
createTransformATexture(e) {
|
|
1066
|
-
const
|
|
1069
|
+
const o = e.numSplats, t = new Float32Array(
|
|
1067
1070
|
this.textureWidth * this.textureHeight * 4
|
|
1068
1071
|
);
|
|
1069
|
-
for (let
|
|
1070
|
-
const a =
|
|
1072
|
+
for (let n = 0; n < o; n++) {
|
|
1073
|
+
const a = n * 4, i = n * 3, u = n * 4;
|
|
1071
1074
|
t[a] = e.positions[i], t[a + 1] = e.positions[i + 1], t[a + 2] = e.positions[i + 2];
|
|
1072
|
-
const
|
|
1073
|
-
t[a + 3] =
|
|
1075
|
+
const w = e.rotations[u + 0], C = e.rotations[u + 1], _ = Be(w, C);
|
|
1076
|
+
t[a + 3] = Oe(_);
|
|
1074
1077
|
}
|
|
1075
|
-
const
|
|
1078
|
+
const r = new l.DataTexture(
|
|
1076
1079
|
t,
|
|
1077
1080
|
this.textureWidth,
|
|
1078
1081
|
this.textureHeight,
|
|
@@ -1080,7 +1083,7 @@ class Oe {
|
|
|
1080
1083
|
l.FloatType
|
|
1081
1084
|
// Store as Float32, shader will reinterpret bits
|
|
1082
1085
|
);
|
|
1083
|
-
return
|
|
1086
|
+
return r.magFilter = l.NearestFilter, r.minFilter = l.NearestFilter, r.source.data.updateRanges || (r.source.data.updateRanges = []), r.needsUpdate = !0, r;
|
|
1084
1087
|
}
|
|
1085
1088
|
/**
|
|
1086
1089
|
* Create the transform B texture (scale and rotation xyz)
|
|
@@ -1088,21 +1091,21 @@ class Oe {
|
|
|
1088
1091
|
* @returns DataTexture containing scale and rotation data
|
|
1089
1092
|
*/
|
|
1090
1093
|
createTransformBTexture(e) {
|
|
1091
|
-
const
|
|
1094
|
+
const o = e.numSplats, t = new Float32Array(
|
|
1092
1095
|
this.textureWidth * this.textureHeight * 4
|
|
1093
1096
|
);
|
|
1094
|
-
for (let
|
|
1095
|
-
const a =
|
|
1097
|
+
for (let n = 0; n < o; n++) {
|
|
1098
|
+
const a = n * 4, i = n * 3, u = n * 4;
|
|
1096
1099
|
t[a] = e.scales[i], t[a + 1] = e.scales[i + 1], t[a + 2] = e.scales[i + 2], t[a + 3] = e.rotations[u + 2];
|
|
1097
1100
|
}
|
|
1098
|
-
const
|
|
1101
|
+
const r = new l.DataTexture(
|
|
1099
1102
|
t,
|
|
1100
1103
|
this.textureWidth,
|
|
1101
1104
|
this.textureHeight,
|
|
1102
1105
|
l.RGBAFormat,
|
|
1103
1106
|
l.FloatType
|
|
1104
1107
|
);
|
|
1105
|
-
return
|
|
1108
|
+
return r.magFilter = l.NearestFilter, r.minFilter = l.NearestFilter, r.source.data.updateRanges || (r.source.data.updateRanges = []), r.needsUpdate = !0, r;
|
|
1106
1109
|
}
|
|
1107
1110
|
/**
|
|
1108
1111
|
* Create the color texture (RGB and opacity)
|
|
@@ -1110,21 +1113,21 @@ class Oe {
|
|
|
1110
1113
|
* @returns DataTexture containing color data
|
|
1111
1114
|
*/
|
|
1112
1115
|
createColorTexture(e) {
|
|
1113
|
-
const
|
|
1116
|
+
const o = e.numSplats, t = new Float32Array(
|
|
1114
1117
|
this.textureWidth * this.textureHeight * 4
|
|
1115
1118
|
);
|
|
1116
|
-
for (let
|
|
1117
|
-
const a =
|
|
1118
|
-
t[a] = e.colors[i], t[a + 1] = e.colors[i + 1], t[a + 2] = e.colors[i + 2], t[a + 3] = e.opacities[
|
|
1119
|
+
for (let n = 0; n < o; n++) {
|
|
1120
|
+
const a = n * 4, i = n * 3;
|
|
1121
|
+
t[a] = e.colors[i], t[a + 1] = e.colors[i + 1], t[a + 2] = e.colors[i + 2], t[a + 3] = e.opacities[n];
|
|
1119
1122
|
}
|
|
1120
|
-
const
|
|
1123
|
+
const r = new l.DataTexture(
|
|
1121
1124
|
t,
|
|
1122
1125
|
this.textureWidth,
|
|
1123
1126
|
this.textureHeight,
|
|
1124
1127
|
l.RGBAFormat,
|
|
1125
1128
|
l.FloatType
|
|
1126
1129
|
);
|
|
1127
|
-
return
|
|
1130
|
+
return r.source.data.updateRanges || (r.source.data.updateRanges = []), r.needsUpdate = !0, r;
|
|
1128
1131
|
}
|
|
1129
1132
|
/**
|
|
1130
1133
|
* Create the order texture for sorting
|
|
@@ -1132,23 +1135,23 @@ class Oe {
|
|
|
1132
1135
|
* @returns DataTexture for storing order indices
|
|
1133
1136
|
*/
|
|
1134
1137
|
createOrderTexture(e) {
|
|
1135
|
-
const
|
|
1136
|
-
for (let
|
|
1137
|
-
|
|
1138
|
+
const o = new Uint32Array(this.textureWidth * this.textureHeight);
|
|
1139
|
+
for (let r = 0; r < e; r++)
|
|
1140
|
+
o[r] = r;
|
|
1138
1141
|
const t = new l.DataTexture(
|
|
1139
|
-
|
|
1142
|
+
o,
|
|
1140
1143
|
this.textureWidth,
|
|
1141
1144
|
this.textureHeight,
|
|
1142
1145
|
l.RedIntegerFormat,
|
|
1143
1146
|
l.UnsignedIntType
|
|
1144
1147
|
);
|
|
1145
|
-
return t.needsUpdate = !0, t;
|
|
1148
|
+
return t.source.data.updateRanges || (t.source.data.updateRanges = []), t.needsUpdate = !0, t;
|
|
1146
1149
|
}
|
|
1147
1150
|
dispose() {
|
|
1148
1151
|
this.transformA.dispose(), this.transformB.dispose(), this.colorTexture.dispose(), this.orderTexture.dispose();
|
|
1149
1152
|
}
|
|
1150
1153
|
}
|
|
1151
|
-
const
|
|
1154
|
+
const Ue = (
|
|
1152
1155
|
/* glsl */
|
|
1153
1156
|
`
|
|
1154
1157
|
precision highp float;
|
|
@@ -1406,7 +1409,7 @@ void main(void) {
|
|
|
1406
1409
|
vUv = clippedCornerOffset;
|
|
1407
1410
|
}
|
|
1408
1411
|
`
|
|
1409
|
-
),
|
|
1412
|
+
), qe = (
|
|
1410
1413
|
/* glsl */
|
|
1411
1414
|
`
|
|
1412
1415
|
precision highp float;
|
|
@@ -1442,7 +1445,7 @@ void main(void) {
|
|
|
1442
1445
|
);
|
|
1443
1446
|
class Ve extends l.ShaderMaterial {
|
|
1444
1447
|
constructor(e = {}) {
|
|
1445
|
-
const
|
|
1448
|
+
const o = {
|
|
1446
1449
|
// Textures (values set via methods)
|
|
1447
1450
|
transformA: { value: null },
|
|
1448
1451
|
transformB: { value: null },
|
|
@@ -1455,9 +1458,9 @@ class Ve extends l.ShaderMaterial {
|
|
|
1455
1458
|
// Max splats to render (updated by sorter)
|
|
1456
1459
|
};
|
|
1457
1460
|
super({
|
|
1458
|
-
vertexShader:
|
|
1459
|
-
fragmentShader:
|
|
1460
|
-
uniforms:
|
|
1461
|
+
vertexShader: Ue,
|
|
1462
|
+
fragmentShader: qe,
|
|
1463
|
+
uniforms: o,
|
|
1461
1464
|
transparent: !0,
|
|
1462
1465
|
blending: l.CustomBlending,
|
|
1463
1466
|
// Premultiplied alpha blending:
|
|
@@ -1488,8 +1491,8 @@ class Ve extends l.ShaderMaterial {
|
|
|
1488
1491
|
* @param width Viewport width
|
|
1489
1492
|
* @param height Viewport height
|
|
1490
1493
|
*/
|
|
1491
|
-
updateViewport(e,
|
|
1492
|
-
this.uniforms.viewport.value.set(e,
|
|
1494
|
+
updateViewport(e, o) {
|
|
1495
|
+
this.uniforms.viewport.value.set(e, o);
|
|
1493
1496
|
}
|
|
1494
1497
|
/**
|
|
1495
1498
|
* Set transform texture A (positions)
|
|
@@ -1534,41 +1537,41 @@ const se = class se extends l.Mesh {
|
|
|
1534
1537
|
* @param splatData The splat data to render
|
|
1535
1538
|
* @param options Rendering options
|
|
1536
1539
|
*/
|
|
1537
|
-
constructor(
|
|
1538
|
-
const
|
|
1539
|
-
super(
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1540
|
+
constructor(o, t = {}) {
|
|
1541
|
+
const r = new Ve(t), n = se.createInstancedGeometry(o.numSplats, se.INSTANCE_SIZE);
|
|
1542
|
+
super(n, r);
|
|
1543
|
+
f(this, "sorter");
|
|
1544
|
+
f(this, "splatData");
|
|
1545
|
+
f(this, "options");
|
|
1546
|
+
f(this, "textureManager");
|
|
1547
|
+
f(this, "material");
|
|
1548
|
+
f(this, "geometry");
|
|
1549
|
+
f(this, "lastCameraPositionLocal", new l.Vector3());
|
|
1550
|
+
f(this, "lastCameraDirectionLocal", new l.Vector3());
|
|
1551
|
+
f(this, "invModelMatrix", new l.Matrix4());
|
|
1549
1552
|
// Cached inverse matrix
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
const t =
|
|
1553
|
+
f(this, "_vpW", -1);
|
|
1554
|
+
f(this, "_vpH", -1);
|
|
1555
|
+
f(this, "_size", new l.Vector2());
|
|
1556
|
+
f(this, "_camPosW", new l.Vector3());
|
|
1557
|
+
f(this, "_camDirW", new l.Vector3());
|
|
1558
|
+
f(this, "_camPosL", new l.Vector3());
|
|
1559
|
+
f(this, "_camDirL", new l.Vector3());
|
|
1560
|
+
f(this, "onSorterUpdated", (o) => {
|
|
1561
|
+
const t = o.count;
|
|
1559
1562
|
this.geometry.instanceCount = Math.ceil(t / se.INSTANCE_SIZE), this.material.setNumSplats(t);
|
|
1560
1563
|
});
|
|
1561
|
-
this.geometry =
|
|
1564
|
+
this.geometry = n, this.material = r, this.splatData = o, this.frustumCulled = !1, this.options = {
|
|
1562
1565
|
autoSort: !0,
|
|
1563
1566
|
...t
|
|
1564
|
-
}, this.textureManager = new
|
|
1567
|
+
}, this.textureManager = new De(o), this.sorter = new Pe();
|
|
1565
1568
|
let a = this.createChunks() || void 0;
|
|
1566
1569
|
a === null && console.warn("Visus: Could not create sorter chunks, bounding box might be invalid."), a = void 0, this.sorter.addEventListener("updated", this.onSorterUpdated), this.sorter.init(
|
|
1567
1570
|
this.textureManager.orderTexture,
|
|
1568
1571
|
this.splatData.positions,
|
|
1569
1572
|
a ?? void 0,
|
|
1570
1573
|
!this.options.keepSplatData
|
|
1571
|
-
), this.material.setTransformA(this.textureManager.transformA), this.material.setTransformB(this.textureManager.transformB), this.material.setColorTexture(this.textureManager.colorTexture), this.material.setOrderTexture(this.textureManager.orderTexture), this.material.setNumSplats(0), this.geometry.boundingBox =
|
|
1574
|
+
), this.material.setTransformA(this.textureManager.transformA), this.material.setTransformB(this.textureManager.transformB), this.material.setColorTexture(this.textureManager.colorTexture), this.material.setOrderTexture(this.textureManager.orderTexture), this.material.setNumSplats(0), this.geometry.boundingBox = o.boundingBox.toBox3(), this.geometry.boundingSphere = new l.Sphere(), this.geometry.boundingBox.getBoundingSphere(this.geometry.boundingSphere), this.options.keepSplatData || (this.splatData = null);
|
|
1572
1575
|
}
|
|
1573
1576
|
/**
|
|
1574
1577
|
* Creates the instanced geometry for rendering splats.
|
|
@@ -1576,8 +1579,8 @@ const se = class se extends l.Mesh {
|
|
|
1576
1579
|
* @param instanceSize Number of splats per instance.
|
|
1577
1580
|
* @returns InstancedBufferGeometry
|
|
1578
1581
|
*/
|
|
1579
|
-
static createInstancedGeometry(
|
|
1580
|
-
const
|
|
1582
|
+
static createInstancedGeometry(o, t) {
|
|
1583
|
+
const r = Math.ceil(o / t), n = new l.BufferGeometry(), a = new Float32Array([
|
|
1581
1584
|
// x, y, splat_index_in_instance
|
|
1582
1585
|
-1,
|
|
1583
1586
|
-1,
|
|
@@ -1592,23 +1595,23 @@ const se = class se extends l.Mesh {
|
|
|
1592
1595
|
1,
|
|
1593
1596
|
0
|
|
1594
1597
|
]), i = new Uint16Array([0, 1, 2, 0, 2, 3]), u = new Float32Array(4 * 3 * t);
|
|
1595
|
-
for (let
|
|
1596
|
-
const
|
|
1597
|
-
for (let
|
|
1598
|
-
u[
|
|
1598
|
+
for (let h = 0; h < t; h++) {
|
|
1599
|
+
const b = h * 4 * 3;
|
|
1600
|
+
for (let S = 0; S < 4; S++)
|
|
1601
|
+
u[b + S * 3 + 0] = a[S * 3 + 0], u[b + S * 3 + 1] = a[S * 3 + 1], u[b + S * 3 + 2] = h;
|
|
1599
1602
|
}
|
|
1600
|
-
const
|
|
1601
|
-
for (let
|
|
1602
|
-
const
|
|
1603
|
-
|
|
1603
|
+
const w = new Uint32Array(6 * t);
|
|
1604
|
+
for (let h = 0; h < t; h++) {
|
|
1605
|
+
const b = h * 6, S = h * 4;
|
|
1606
|
+
w[b + 0] = i[0] + S, w[b + 1] = i[1] + S, w[b + 2] = i[2] + S, w[b + 3] = i[3] + S, w[b + 4] = i[4] + S, w[b + 5] = i[5] + S;
|
|
1604
1607
|
}
|
|
1605
|
-
|
|
1606
|
-
const
|
|
1607
|
-
|
|
1608
|
-
const
|
|
1609
|
-
for (let
|
|
1610
|
-
|
|
1611
|
-
return
|
|
1608
|
+
n.setAttribute("position", new l.BufferAttribute(u, 3)), n.setIndex(new l.BufferAttribute(w, 1));
|
|
1609
|
+
const C = new l.InstancedBufferGeometry();
|
|
1610
|
+
C.index = n.index, C.setAttribute("position", n.getAttribute("position"));
|
|
1611
|
+
const _ = new Uint32Array(r);
|
|
1612
|
+
for (let h = 0; h < r; h++)
|
|
1613
|
+
_[h] = h * t;
|
|
1614
|
+
return C.setAttribute("splatInstanceIndex", new l.InstancedBufferAttribute(_, 1, !1)), C.instanceCount = 0, C;
|
|
1612
1615
|
}
|
|
1613
1616
|
/**
|
|
1614
1617
|
* Create chunks data (bounding box min/max) for the sorter.
|
|
@@ -1617,14 +1620,14 @@ const se = class se extends l.Mesh {
|
|
|
1617
1620
|
createChunks() {
|
|
1618
1621
|
if (!this.splatData)
|
|
1619
1622
|
return null;
|
|
1620
|
-
const
|
|
1621
|
-
return
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1623
|
+
const o = this.splatData.boundingBox;
|
|
1624
|
+
return o.min.x === 1 / 0 || o.max.x === -1 / 0 ? null : new Float32Array([
|
|
1625
|
+
o.min.x,
|
|
1626
|
+
o.min.y,
|
|
1627
|
+
o.min.z,
|
|
1628
|
+
o.max.x,
|
|
1629
|
+
o.max.y,
|
|
1630
|
+
o.max.z
|
|
1628
1631
|
]);
|
|
1629
1632
|
}
|
|
1630
1633
|
/**
|
|
@@ -1632,17 +1635,17 @@ const se = class se extends l.Mesh {
|
|
|
1632
1635
|
* @param width Viewport width
|
|
1633
1636
|
* @param height Viewport height
|
|
1634
1637
|
*/
|
|
1635
|
-
updateViewport(
|
|
1636
|
-
|
|
1638
|
+
updateViewport(o, t) {
|
|
1639
|
+
o === this._vpW && t === this._vpH || (this._vpW = o, this._vpH = t, this.material.updateViewport(o, t));
|
|
1637
1640
|
}
|
|
1638
1641
|
/**
|
|
1639
1642
|
* Sorts splats based on camera position and direction.
|
|
1640
1643
|
* @param camera The camera to sort against.
|
|
1641
1644
|
*/
|
|
1642
|
-
sort(
|
|
1643
|
-
|
|
1644
|
-
const t = this.lastCameraPositionLocal.distanceToSquared(this._camPosL) > 1e-6,
|
|
1645
|
-
this.options.autoSort && (t ||
|
|
1645
|
+
sort(o) {
|
|
1646
|
+
o.getWorldPosition(this._camPosW), o.getWorldDirection(this._camDirW), this.invModelMatrix.copy(this.matrixWorld).invert(), this._camPosL.copy(this._camPosW).applyMatrix4(this.invModelMatrix), this._camDirL.copy(this._camDirW).transformDirection(this.invModelMatrix);
|
|
1647
|
+
const t = this.lastCameraPositionLocal.distanceToSquared(this._camPosL) > 1e-6, r = this.lastCameraDirectionLocal.dot(this._camDirL) < 0.999;
|
|
1648
|
+
this.options.autoSort && (t || r) && (this.lastCameraPositionLocal.copy(this._camPosL), this.lastCameraDirectionLocal.copy(this._camDirL), this.sorter.setCamera(this._camPosL, this._camDirL));
|
|
1646
1649
|
}
|
|
1647
1650
|
/**
|
|
1648
1651
|
* THREE.js hook called before rendering the object.
|
|
@@ -1653,8 +1656,8 @@ const se = class se extends l.Mesh {
|
|
|
1653
1656
|
*/
|
|
1654
1657
|
// prettier-ignore
|
|
1655
1658
|
// @ts-expect-error scene is not used
|
|
1656
|
-
onBeforeRender(
|
|
1657
|
-
this.sort(
|
|
1659
|
+
onBeforeRender(o, t, r) {
|
|
1660
|
+
this.sort(r), o.getSize(this._size), this.updateViewport(this._size.x, this._size.y);
|
|
1658
1661
|
}
|
|
1659
1662
|
/**
|
|
1660
1663
|
* Dispose of resources
|
|
@@ -1664,36 +1667,39 @@ const se = class se extends l.Mesh {
|
|
|
1664
1667
|
}
|
|
1665
1668
|
};
|
|
1666
1669
|
/** Number of splats combined into a single instanced draw call. */
|
|
1667
|
-
|
|
1668
|
-
let
|
|
1669
|
-
const
|
|
1670
|
-
|
|
1671
|
-
Object.defineProperty(le.prototype, qe, {
|
|
1672
|
-
value: !0,
|
|
1673
|
-
configurable: !1,
|
|
1674
|
-
enumerable: !1,
|
|
1675
|
-
writable: !1
|
|
1676
|
-
});
|
|
1677
|
-
} catch {
|
|
1678
|
-
console.warn("Couldn't define Visus SplatMesh symbol");
|
|
1679
|
-
}
|
|
1680
|
-
const Ye = ({
|
|
1681
|
-
plyUrl: A,
|
|
1670
|
+
f(se, "INSTANCE_SIZE", 128);
|
|
1671
|
+
let de = se;
|
|
1672
|
+
const le = /* @__PURE__ */ new Map(), He = ({
|
|
1673
|
+
plyUrl: x,
|
|
1682
1674
|
debug: e = !1,
|
|
1683
|
-
splatOptions:
|
|
1675
|
+
splatOptions: o = {},
|
|
1684
1676
|
...t
|
|
1685
1677
|
}) => {
|
|
1686
|
-
|
|
1687
|
-
const
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1678
|
+
e && console.debug("SPLAT: rendering", { plyUrl: x, splatOptions: o, meshProps: t });
|
|
1679
|
+
const [r, n] = Ce(null), a = Ae(null);
|
|
1680
|
+
return Te(() => {
|
|
1681
|
+
const i = we(x, o);
|
|
1682
|
+
return je(x, o).then(
|
|
1683
|
+
(u) => {
|
|
1684
|
+
n(u);
|
|
1685
|
+
}
|
|
1686
|
+
), () => {
|
|
1687
|
+
e && console.debug("SPLAT: releasing mesh for", x), We(i);
|
|
1688
|
+
};
|
|
1689
|
+
}, [x, o, e]), r ? /* @__PURE__ */ Ie.jsx("primitive", { ref: a, object: r, ...t }) : null;
|
|
1690
|
+
}, we = (x, e) => `${x}:${JSON.stringify(e)}`, je = async (x, e) => {
|
|
1691
|
+
const o = we(x, e), t = le.get(o);
|
|
1692
|
+
if (t)
|
|
1693
|
+
return t.refCount++, t.mesh;
|
|
1694
|
+
const n = await new ze().loadAsync(x), a = new de(n, e);
|
|
1695
|
+
return le.set(o, { mesh: a, refCount: 1 }), a;
|
|
1694
1696
|
};
|
|
1697
|
+
function We(x) {
|
|
1698
|
+
const e = le.get(x);
|
|
1699
|
+
e && (e.refCount--, e.refCount <= 0 && (e.mesh.dispose(), le.delete(x)));
|
|
1700
|
+
}
|
|
1695
1701
|
export {
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1702
|
+
ze as PlyLoader,
|
|
1703
|
+
He as Splat,
|
|
1704
|
+
de as SplatMesh
|
|
1699
1705
|
};
|