@speridlabs/visus 2.1.1 → 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/react.es.js +535 -533
- 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:
|
|
31
|
-
type:
|
|
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,
|
|
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,24 +45,24 @@ 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
|
-
case
|
|
63
|
+
case L:
|
|
65
64
|
return "Suspense";
|
|
66
|
-
case
|
|
65
|
+
case A:
|
|
67
66
|
return "SuspenseList";
|
|
68
67
|
case T:
|
|
69
68
|
return "Activity";
|
|
@@ -72,21 +71,21 @@ function Ce() {
|
|
|
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
|
-
case
|
|
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 Ce() {
|
|
|
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,30 +103,30 @@ function Ce() {
|
|
|
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
|
|
112
111
|
), e(s);
|
|
113
112
|
}
|
|
114
113
|
}
|
|
115
|
-
function
|
|
114
|
+
function t(s) {
|
|
116
115
|
if (s === I) return "<>";
|
|
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 Ce() {
|
|
|
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", {
|
|
@@ -179,33 +178,33 @@ function Ce() {
|
|
|
179
178
|
configurable: !1,
|
|
180
179
|
enumerable: !1,
|
|
181
180
|
writable: !0,
|
|
182
|
-
value:
|
|
181
|
+
value: y
|
|
183
182
|
}), Object.defineProperty(s, "_debugTask", {
|
|
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
|
-
|
|
236
|
-
|
|
237
|
-
|
|
233
|
+
r(),
|
|
234
|
+
M,
|
|
235
|
+
y,
|
|
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
|
|
285
|
+
var Ie = Ee();
|
|
287
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
|
|
@@ -342,16 +341,16 @@ class 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,29 +383,29 @@ 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
|
-
this.rotations[
|
|
396
|
-
this.rotations[
|
|
397
|
-
this.rotations[
|
|
398
|
-
this.rotations[
|
|
394
|
+
this.rotations[t],
|
|
395
|
+
this.rotations[t + 1],
|
|
396
|
+
this.rotations[t + 2],
|
|
397
|
+
this.rotations[t + 3]
|
|
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,12 +417,12 @@ class Ie {
|
|
|
418
417
|
calculateBoundingBox() {
|
|
419
418
|
this.boundingBox.reset();
|
|
420
419
|
const e = new l.Vector3();
|
|
421
|
-
for (let
|
|
422
|
-
const
|
|
420
|
+
for (let o = 0; o < this.numSplats; o++) {
|
|
421
|
+
const t = o * 3;
|
|
423
422
|
e.set(
|
|
424
|
-
this.positions[
|
|
425
|
-
this.positions[
|
|
426
|
-
this.positions[
|
|
423
|
+
this.positions[t],
|
|
424
|
+
this.positions[t + 1],
|
|
425
|
+
this.positions[t + 2]
|
|
427
426
|
), this.boundingBox.expandByPoint(e);
|
|
428
427
|
}
|
|
429
428
|
return this.boundingBox;
|
|
@@ -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 =
|
|
444
|
-
|
|
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;
|
|
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,34 +462,34 @@ class Ie {
|
|
|
463
462
|
), e;
|
|
464
463
|
}
|
|
465
464
|
}
|
|
466
|
-
class
|
|
467
|
-
constructor(
|
|
468
|
-
super(
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
const
|
|
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:
|
|
481
|
-
if (!a) return console.warn(`PlyLoader: Received response for unknown request ${
|
|
482
|
-
if (this.pendingCallbacks.delete(
|
|
483
|
-
if (!
|
|
478
|
+
onWorkerMessage(o) {
|
|
479
|
+
const { requestId: t, error: r, result: n } = o.data, a = this.pendingCallbacks.get(t);
|
|
480
|
+
if (!a) return console.warn(`PlyLoader: Received response for unknown request ${t}`);
|
|
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
|
-
|
|
490
|
+
n.boundingBox.maxX,
|
|
491
|
+
n.boundingBox.maxY,
|
|
492
|
+
n.boundingBox.maxZ
|
|
494
493
|
), this.worker.terminate(), a.resolve(i);
|
|
495
494
|
} catch (i) {
|
|
496
495
|
a.reject(i);
|
|
@@ -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((
|
|
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
|
-
const i =
|
|
576
|
-
requestId:
|
|
574
|
+
const i = t(a), u = {
|
|
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 r
|
|
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,88 +599,88 @@ 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
|
-
for (let
|
|
607
|
-
if (a[m +
|
|
605
|
+
for (let y = 0; y < u.length; y++)
|
|
606
|
+
if (a[m + y] !== u.charCodeAt(y)) {
|
|
608
607
|
c = !1;
|
|
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
|
-
const
|
|
629
|
-
switch (
|
|
627
|
+
const y = c.split(" ");
|
|
628
|
+
switch (y[0]) {
|
|
630
629
|
case "format":
|
|
631
|
-
|
|
630
|
+
b = y[1];
|
|
632
631
|
break;
|
|
633
632
|
case "element":
|
|
634
|
-
|
|
635
|
-
name:
|
|
636
|
-
count: parseInt(
|
|
633
|
+
h.push({
|
|
634
|
+
name: y[1],
|
|
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
|
-
|
|
646
|
-
type:
|
|
647
|
-
name:
|
|
644
|
+
h[h.length - 1].properties.push({
|
|
645
|
+
type: y[1],
|
|
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
678
|
T,
|
|
680
|
-
|
|
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 =
|
|
701
|
+
ee = L.getInt8(A), A += 1;
|
|
703
702
|
break;
|
|
704
703
|
case "uchar":
|
|
705
|
-
ee =
|
|
704
|
+
ee = L.getUint8(A), A += 1;
|
|
706
705
|
break;
|
|
707
706
|
case "short":
|
|
708
|
-
ee =
|
|
707
|
+
ee = L.getInt16(A, !0), A += 2;
|
|
709
708
|
break;
|
|
710
709
|
case "ushort":
|
|
711
|
-
ee =
|
|
710
|
+
ee = L.getUint16(A, !0), A += 2;
|
|
712
711
|
break;
|
|
713
712
|
case "int":
|
|
714
|
-
ee =
|
|
713
|
+
ee = L.getInt32(A, !0), A += 4;
|
|
715
714
|
break;
|
|
716
715
|
case "uint":
|
|
717
|
-
ee =
|
|
716
|
+
ee = L.getUint32(A, !0), A += 4;
|
|
718
717
|
break;
|
|
719
718
|
case "float":
|
|
720
|
-
ee =
|
|
719
|
+
ee = L.getFloat32(A, !0), A += 4;
|
|
721
720
|
break;
|
|
722
721
|
case "double":
|
|
723
|
-
ee =
|
|
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
|
|
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
|
-
|
|
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
|
-
colors:
|
|
754
|
-
opacities:
|
|
752
|
+
colors: W.buffer,
|
|
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
|
|
779
|
-
this.worker = new Worker(URL.createObjectURL(
|
|
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" });
|
|
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:
|
|
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,35 +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
|
-
if (!
|
|
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.");
|
|
811
|
-
if (
|
|
810
|
+
if (t.buffer.byteLength === 0)
|
|
812
811
|
throw new Error(
|
|
813
812
|
"SplatSorter: positions buffer is detached (likely React StrictMode + cached asset). "
|
|
814
813
|
);
|
|
815
|
-
const a =
|
|
816
|
-
this.orderTexture =
|
|
814
|
+
const a = t.length / 3;
|
|
815
|
+
this.orderTexture = o, n ? this.centers = null : this.centers = t.slice();
|
|
817
816
|
const i = this.orderTexture.image.data;
|
|
818
|
-
for (let
|
|
817
|
+
for (let h = 0; h < a; h++) i[h] = h;
|
|
819
818
|
this.orderTexture.source.data.updateRanges || (this.orderTexture.source.data.updateRanges = []), this.orderTexture.needsUpdate = !0;
|
|
820
|
-
const u = i.buffer.slice(0),
|
|
819
|
+
const u = i.buffer.slice(0), w = n ? t.buffer : t.buffer.slice(0), C = {
|
|
821
820
|
order: u,
|
|
822
|
-
centers:
|
|
823
|
-
},
|
|
821
|
+
centers: w
|
|
822
|
+
}, _ = [
|
|
824
823
|
u,
|
|
825
|
-
|
|
824
|
+
w
|
|
826
825
|
];
|
|
827
|
-
if (
|
|
828
|
-
this.chunks =
|
|
829
|
-
const
|
|
830
|
-
|
|
826
|
+
if (r) {
|
|
827
|
+
this.chunks = r.slice();
|
|
828
|
+
const h = this.chunks.buffer.slice(0);
|
|
829
|
+
C.chunks = h, _.push(h);
|
|
831
830
|
}
|
|
832
|
-
this.worker.postMessage(
|
|
831
|
+
this.worker.postMessage(C, _), queueMicrotask(() => {
|
|
833
832
|
this.dispatchEvent({
|
|
834
833
|
type: "updated",
|
|
835
834
|
count: a
|
|
@@ -841,51 +840,51 @@ class Pe extends l.EventDispatcher {
|
|
|
841
840
|
* The sorter will only consider splats whose original indices are present in the mapping.
|
|
842
841
|
* @param mapping A Uint32Array where each element is the *original* index of a splat to include, or null to reset mapping.
|
|
843
842
|
*/
|
|
844
|
-
setMapping(
|
|
843
|
+
setMapping(o) {
|
|
845
844
|
if (!this.centers)
|
|
846
845
|
return console.warn(
|
|
847
846
|
"SplatSorter: Cannot set mapping before initialization."
|
|
848
847
|
);
|
|
849
|
-
let
|
|
850
|
-
const
|
|
851
|
-
if (!
|
|
848
|
+
let t;
|
|
849
|
+
const r = [];
|
|
850
|
+
if (!o) {
|
|
852
851
|
const u = this.centers.buffer.slice(0);
|
|
853
|
-
return
|
|
852
|
+
return t = {
|
|
854
853
|
centers: u,
|
|
855
854
|
mapping: null
|
|
856
|
-
},
|
|
855
|
+
}, r.push(u), this.worker.postMessage(t, r);
|
|
857
856
|
}
|
|
858
|
-
const
|
|
859
|
-
for (let u = 0; u <
|
|
860
|
-
const
|
|
861
|
-
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) {
|
|
862
861
|
console.warn(
|
|
863
|
-
`SplatSorter: Mapping index ${
|
|
862
|
+
`SplatSorter: Mapping index ${w} out of bounds.`
|
|
864
863
|
);
|
|
865
864
|
continue;
|
|
866
865
|
}
|
|
867
|
-
const
|
|
868
|
-
|
|
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];
|
|
869
868
|
}
|
|
870
|
-
const a =
|
|
871
|
-
|
|
869
|
+
const a = n.buffer.slice(0), i = o.buffer.slice(0);
|
|
870
|
+
t = {
|
|
872
871
|
centers: a,
|
|
873
872
|
mapping: i
|
|
874
|
-
},
|
|
873
|
+
}, r.push(a, i), this.worker.postMessage(t, r);
|
|
875
874
|
}
|
|
876
875
|
/**
|
|
877
876
|
* Updates the camera parameters used for sorting.
|
|
878
877
|
* @param position The camera's position in the sorter's local coordinate space.
|
|
879
878
|
* @param direction The camera's forward direction in the sorter's local coordinate space.
|
|
880
879
|
*/
|
|
881
|
-
setCamera(
|
|
882
|
-
const
|
|
883
|
-
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)
|
|
884
883
|
return;
|
|
885
|
-
this.lastCameraPosition.copy(
|
|
884
|
+
this.lastCameraPosition.copy(o), this.lastCameraDirection.copy(t);
|
|
886
885
|
const a = {
|
|
887
|
-
cameraPosition: { x:
|
|
888
|
-
cameraDirection: { x:
|
|
886
|
+
cameraPosition: { x: o.x, y: o.y, z: o.z },
|
|
887
|
+
cameraDirection: { x: t.x, y: t.y, z: t.z }
|
|
889
888
|
};
|
|
890
889
|
this.worker.postMessage(a);
|
|
891
890
|
}
|
|
@@ -901,165 +900,165 @@ class Pe extends l.EventDispatcher {
|
|
|
901
900
|
*/
|
|
902
901
|
createWorkerCode() {
|
|
903
902
|
return `(${(function() {
|
|
904
|
-
let
|
|
905
|
-
const
|
|
906
|
-
let
|
|
907
|
-
const
|
|
908
|
-
for (;
|
|
909
|
-
const T =
|
|
910
|
-
if (
|
|
911
|
-
else if (
|
|
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;
|
|
912
911
|
else return T;
|
|
913
912
|
}
|
|
914
|
-
return ~
|
|
915
|
-
},
|
|
916
|
-
if (!
|
|
913
|
+
return ~A;
|
|
914
|
+
}, L = () => {
|
|
915
|
+
if (!t || !r || !i || !u)
|
|
917
916
|
return;
|
|
918
|
-
if (
|
|
917
|
+
if (r.length === 0) {
|
|
919
918
|
const c = {
|
|
920
|
-
order:
|
|
919
|
+
order: t.buffer,
|
|
921
920
|
count: 0
|
|
922
921
|
};
|
|
923
|
-
self.postMessage(c, [
|
|
922
|
+
self.postMessage(c, [t.buffer]), t = null;
|
|
924
923
|
return;
|
|
925
924
|
}
|
|
926
|
-
const
|
|
927
|
-
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)
|
|
928
927
|
return;
|
|
929
|
-
|
|
928
|
+
w = !1, C.x = A, C.y = g, C.z = D, _.x = T, _.y = v, _.z = R;
|
|
930
929
|
let Z = 1 / 0, U = -1 / 0;
|
|
931
930
|
for (let c = 0; c < 8; ++c) {
|
|
932
|
-
const
|
|
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;
|
|
933
932
|
Z = Math.min(Z, k), U = Math.max(U, k);
|
|
934
933
|
}
|
|
935
|
-
const F =
|
|
934
|
+
const F = r.length / 3, N = U - Z, s = (1 << Math.max(
|
|
936
935
|
10,
|
|
937
936
|
Math.min(20, Math.ceil(Math.log2(F / 4)))
|
|
938
937
|
)) + 1;
|
|
939
|
-
if ((!
|
|
940
|
-
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;
|
|
941
940
|
I[0] = F;
|
|
942
|
-
} else if (
|
|
943
|
-
const c =
|
|
941
|
+
} else if (n && n.length > 0) {
|
|
942
|
+
const c = n.length / 6;
|
|
944
943
|
j.fill(0);
|
|
945
|
-
for (let
|
|
946
|
-
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(
|
|
947
946
|
0,
|
|
948
|
-
Math.floor(
|
|
949
|
-
),
|
|
950
|
-
|
|
951
|
-
Math.ceil(
|
|
947
|
+
Math.floor(K * P / N)
|
|
948
|
+
), ne = Math.min(
|
|
949
|
+
P,
|
|
950
|
+
Math.ceil(Q * P / N)
|
|
952
951
|
);
|
|
953
|
-
for (let J = re; J <
|
|
952
|
+
for (let J = re; J < ne; ++J)
|
|
954
953
|
j[J]++;
|
|
955
954
|
}
|
|
956
|
-
let
|
|
957
|
-
for (let
|
|
958
|
-
|
|
959
|
-
for (let
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
const
|
|
963
|
-
for (let
|
|
964
|
-
const k =
|
|
955
|
+
let y = 0;
|
|
956
|
+
for (let d = 0; d < P; ++d) y += j[d];
|
|
957
|
+
W[0] = 0, H[0] = 0;
|
|
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(
|
|
965
964
|
0,
|
|
966
965
|
Math.min(
|
|
967
|
-
|
|
968
|
-
Math.floor(
|
|
966
|
+
P - 1,
|
|
967
|
+
Math.floor(K)
|
|
969
968
|
)
|
|
970
|
-
), re =
|
|
971
|
-
|
|
969
|
+
), re = K - Q, ne = H[Q] + W[Q] * re >>> 0, J = Math.min(ne, s - 1);
|
|
970
|
+
S[d] = J, I[J]++;
|
|
972
971
|
}
|
|
973
972
|
} else {
|
|
974
973
|
const c = (s - 1) / N;
|
|
975
|
-
for (let
|
|
976
|
-
const
|
|
977
|
-
|
|
974
|
+
for (let y = 0; y < F; ++y) {
|
|
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]++;
|
|
978
977
|
}
|
|
979
978
|
}
|
|
980
979
|
for (let c = 1; c < s; c++)
|
|
981
980
|
I[c] += I[c - 1];
|
|
982
981
|
for (let c = F - 1; c >= 0; c--) {
|
|
983
|
-
const
|
|
984
|
-
|
|
982
|
+
const y = S[c], z = --I[y];
|
|
983
|
+
t[z] = a ? a[c] : c;
|
|
985
984
|
}
|
|
986
|
-
const p =
|
|
987
|
-
if (!
|
|
988
|
-
const
|
|
989
|
-
if (!
|
|
985
|
+
const p = A * T + g * v + D * R, M = (c) => {
|
|
986
|
+
if (!t) return -1 / 0;
|
|
987
|
+
const y = t[c], z = y;
|
|
988
|
+
if (!r || z * 3 + 2 >= r.length)
|
|
990
989
|
return -1 / 0;
|
|
991
|
-
const
|
|
992
|
-
return
|
|
990
|
+
const d = z * 3;
|
|
991
|
+
return r[d] * T + r[d + 1] * v + r[d + 2] * R - p;
|
|
993
992
|
};
|
|
994
993
|
let E = F;
|
|
995
|
-
if (F > 0 &&
|
|
996
|
-
const c =
|
|
994
|
+
if (F > 0 && M(F - 1) < 0) {
|
|
995
|
+
const c = oe(
|
|
997
996
|
0,
|
|
998
997
|
F - 1,
|
|
999
|
-
|
|
998
|
+
M
|
|
1000
999
|
);
|
|
1001
1000
|
E = c < 0 ? ~c : c;
|
|
1002
1001
|
}
|
|
1003
1002
|
const m = {
|
|
1004
|
-
order:
|
|
1003
|
+
order: t.buffer,
|
|
1005
1004
|
count: E
|
|
1006
1005
|
};
|
|
1007
|
-
self.postMessage(m, [
|
|
1006
|
+
self.postMessage(m, [t.buffer]), t = null;
|
|
1008
1007
|
};
|
|
1009
|
-
self.onmessage = (
|
|
1010
|
-
const
|
|
1011
|
-
|
|
1008
|
+
self.onmessage = (A) => {
|
|
1009
|
+
const g = A.data;
|
|
1010
|
+
g.order && (t = new Uint32Array(g.order));
|
|
1012
1011
|
let D = !1;
|
|
1013
|
-
if (
|
|
1014
|
-
if (
|
|
1015
|
-
for (let T = 0; T <
|
|
1016
|
-
const
|
|
1017
|
-
|
|
1018
|
-
(
|
|
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
|
|
1019
1018
|
) * 0.5;
|
|
1020
1019
|
}
|
|
1021
|
-
|
|
1020
|
+
w = !0;
|
|
1022
1021
|
}
|
|
1023
|
-
if (D &&
|
|
1024
|
-
|
|
1025
|
-
for (let T = 1; T <
|
|
1026
|
-
const
|
|
1027
|
-
|
|
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]);
|
|
1028
1027
|
}
|
|
1029
|
-
} else D &&
|
|
1030
|
-
|
|
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();
|
|
1031
1030
|
};
|
|
1032
1031
|
}).toString()})();`;
|
|
1033
1032
|
}
|
|
1034
1033
|
}
|
|
1035
|
-
const
|
|
1036
|
-
const
|
|
1037
|
-
return
|
|
1034
|
+
const Be = (x, e) => {
|
|
1035
|
+
const o = ye(x), t = ye(e);
|
|
1036
|
+
return o | t << 16;
|
|
1038
1037
|
};
|
|
1039
|
-
function
|
|
1040
|
-
const e = new Float32Array([
|
|
1041
|
-
let
|
|
1042
|
-
const a =
|
|
1043
|
-
return a < 103 ?
|
|
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;
|
|
1041
|
+
const a = t >> 23 & 255;
|
|
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);
|
|
1044
1043
|
}
|
|
1045
|
-
const
|
|
1046
|
-
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 {
|
|
1047
1046
|
/**
|
|
1048
1047
|
* Create a new TextureManager for a set of splats
|
|
1049
1048
|
* @param splatData The splat data to manage textures for
|
|
1050
1049
|
*/
|
|
1051
1050
|
constructor(e) {
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1051
|
+
f(this, "textureWidth");
|
|
1052
|
+
f(this, "textureHeight");
|
|
1053
|
+
f(this, "transformA");
|
|
1055
1054
|
// position xyz and rotation quaternion y,z components
|
|
1056
|
-
|
|
1055
|
+
f(this, "transformB");
|
|
1057
1056
|
// rotation quaternion x and scale xyz
|
|
1058
|
-
|
|
1057
|
+
f(this, "colorTexture");
|
|
1059
1058
|
// color an opacity
|
|
1060
|
-
|
|
1061
|
-
const
|
|
1062
|
-
this.textureWidth = Math.ceil(Math.sqrt(
|
|
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);
|
|
1063
1062
|
}
|
|
1064
1063
|
/**
|
|
1065
1064
|
* Create the transform A texture (positions and quaternion w component)
|
|
@@ -1067,24 +1066,24 @@ class Oe {
|
|
|
1067
1066
|
* @returns DataTexture containing position data
|
|
1068
1067
|
*/
|
|
1069
1068
|
createTransformATexture(e) {
|
|
1070
|
-
const
|
|
1069
|
+
const o = e.numSplats, t = new Float32Array(
|
|
1071
1070
|
this.textureWidth * this.textureHeight * 4
|
|
1072
1071
|
);
|
|
1073
|
-
for (let
|
|
1074
|
-
const a =
|
|
1075
|
-
|
|
1076
|
-
const
|
|
1077
|
-
|
|
1072
|
+
for (let n = 0; n < o; n++) {
|
|
1073
|
+
const a = n * 4, i = n * 3, u = n * 4;
|
|
1074
|
+
t[a] = e.positions[i], t[a + 1] = e.positions[i + 1], t[a + 2] = e.positions[i + 2];
|
|
1075
|
+
const w = e.rotations[u + 0], C = e.rotations[u + 1], _ = Be(w, C);
|
|
1076
|
+
t[a + 3] = Oe(_);
|
|
1078
1077
|
}
|
|
1079
|
-
const
|
|
1080
|
-
|
|
1078
|
+
const r = new l.DataTexture(
|
|
1079
|
+
t,
|
|
1081
1080
|
this.textureWidth,
|
|
1082
1081
|
this.textureHeight,
|
|
1083
1082
|
l.RGBAFormat,
|
|
1084
1083
|
l.FloatType
|
|
1085
1084
|
// Store as Float32, shader will reinterpret bits
|
|
1086
1085
|
);
|
|
1087
|
-
return
|
|
1086
|
+
return r.magFilter = l.NearestFilter, r.minFilter = l.NearestFilter, r.source.data.updateRanges || (r.source.data.updateRanges = []), r.needsUpdate = !0, r;
|
|
1088
1087
|
}
|
|
1089
1088
|
/**
|
|
1090
1089
|
* Create the transform B texture (scale and rotation xyz)
|
|
@@ -1092,21 +1091,21 @@ class Oe {
|
|
|
1092
1091
|
* @returns DataTexture containing scale and rotation data
|
|
1093
1092
|
*/
|
|
1094
1093
|
createTransformBTexture(e) {
|
|
1095
|
-
const
|
|
1094
|
+
const o = e.numSplats, t = new Float32Array(
|
|
1096
1095
|
this.textureWidth * this.textureHeight * 4
|
|
1097
1096
|
);
|
|
1098
|
-
for (let
|
|
1099
|
-
const a =
|
|
1100
|
-
|
|
1097
|
+
for (let n = 0; n < o; n++) {
|
|
1098
|
+
const a = n * 4, i = n * 3, u = n * 4;
|
|
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];
|
|
1101
1100
|
}
|
|
1102
|
-
const
|
|
1103
|
-
|
|
1101
|
+
const r = new l.DataTexture(
|
|
1102
|
+
t,
|
|
1104
1103
|
this.textureWidth,
|
|
1105
1104
|
this.textureHeight,
|
|
1106
1105
|
l.RGBAFormat,
|
|
1107
1106
|
l.FloatType
|
|
1108
1107
|
);
|
|
1109
|
-
return
|
|
1108
|
+
return r.magFilter = l.NearestFilter, r.minFilter = l.NearestFilter, r.source.data.updateRanges || (r.source.data.updateRanges = []), r.needsUpdate = !0, r;
|
|
1110
1109
|
}
|
|
1111
1110
|
/**
|
|
1112
1111
|
* Create the color texture (RGB and opacity)
|
|
@@ -1114,21 +1113,21 @@ class Oe {
|
|
|
1114
1113
|
* @returns DataTexture containing color data
|
|
1115
1114
|
*/
|
|
1116
1115
|
createColorTexture(e) {
|
|
1117
|
-
const
|
|
1116
|
+
const o = e.numSplats, t = new Float32Array(
|
|
1118
1117
|
this.textureWidth * this.textureHeight * 4
|
|
1119
1118
|
);
|
|
1120
|
-
for (let
|
|
1121
|
-
const a =
|
|
1122
|
-
|
|
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];
|
|
1123
1122
|
}
|
|
1124
|
-
const
|
|
1125
|
-
|
|
1123
|
+
const r = new l.DataTexture(
|
|
1124
|
+
t,
|
|
1126
1125
|
this.textureWidth,
|
|
1127
1126
|
this.textureHeight,
|
|
1128
1127
|
l.RGBAFormat,
|
|
1129
1128
|
l.FloatType
|
|
1130
1129
|
);
|
|
1131
|
-
return
|
|
1130
|
+
return r.source.data.updateRanges || (r.source.data.updateRanges = []), r.needsUpdate = !0, r;
|
|
1132
1131
|
}
|
|
1133
1132
|
/**
|
|
1134
1133
|
* Create the order texture for sorting
|
|
@@ -1136,23 +1135,23 @@ class Oe {
|
|
|
1136
1135
|
* @returns DataTexture for storing order indices
|
|
1137
1136
|
*/
|
|
1138
1137
|
createOrderTexture(e) {
|
|
1139
|
-
const
|
|
1140
|
-
for (let
|
|
1141
|
-
|
|
1142
|
-
const
|
|
1143
|
-
|
|
1138
|
+
const o = new Uint32Array(this.textureWidth * this.textureHeight);
|
|
1139
|
+
for (let r = 0; r < e; r++)
|
|
1140
|
+
o[r] = r;
|
|
1141
|
+
const t = new l.DataTexture(
|
|
1142
|
+
o,
|
|
1144
1143
|
this.textureWidth,
|
|
1145
1144
|
this.textureHeight,
|
|
1146
1145
|
l.RedIntegerFormat,
|
|
1147
1146
|
l.UnsignedIntType
|
|
1148
1147
|
);
|
|
1149
|
-
return
|
|
1148
|
+
return t.source.data.updateRanges || (t.source.data.updateRanges = []), t.needsUpdate = !0, t;
|
|
1150
1149
|
}
|
|
1151
1150
|
dispose() {
|
|
1152
1151
|
this.transformA.dispose(), this.transformB.dispose(), this.colorTexture.dispose(), this.orderTexture.dispose();
|
|
1153
1152
|
}
|
|
1154
1153
|
}
|
|
1155
|
-
const
|
|
1154
|
+
const Ue = (
|
|
1156
1155
|
/* glsl */
|
|
1157
1156
|
`
|
|
1158
1157
|
precision highp float;
|
|
@@ -1410,7 +1409,7 @@ void main(void) {
|
|
|
1410
1409
|
vUv = clippedCornerOffset;
|
|
1411
1410
|
}
|
|
1412
1411
|
`
|
|
1413
|
-
),
|
|
1412
|
+
), qe = (
|
|
1414
1413
|
/* glsl */
|
|
1415
1414
|
`
|
|
1416
1415
|
precision highp float;
|
|
@@ -1446,7 +1445,7 @@ void main(void) {
|
|
|
1446
1445
|
);
|
|
1447
1446
|
class Ve extends l.ShaderMaterial {
|
|
1448
1447
|
constructor(e = {}) {
|
|
1449
|
-
const
|
|
1448
|
+
const o = {
|
|
1450
1449
|
// Textures (values set via methods)
|
|
1451
1450
|
transformA: { value: null },
|
|
1452
1451
|
transformB: { value: null },
|
|
@@ -1459,9 +1458,9 @@ class Ve extends l.ShaderMaterial {
|
|
|
1459
1458
|
// Max splats to render (updated by sorter)
|
|
1460
1459
|
};
|
|
1461
1460
|
super({
|
|
1462
|
-
vertexShader:
|
|
1463
|
-
fragmentShader:
|
|
1464
|
-
uniforms:
|
|
1461
|
+
vertexShader: Ue,
|
|
1462
|
+
fragmentShader: qe,
|
|
1463
|
+
uniforms: o,
|
|
1465
1464
|
transparent: !0,
|
|
1466
1465
|
blending: l.CustomBlending,
|
|
1467
1466
|
// Premultiplied alpha blending:
|
|
@@ -1492,8 +1491,8 @@ class Ve extends l.ShaderMaterial {
|
|
|
1492
1491
|
* @param width Viewport width
|
|
1493
1492
|
* @param height Viewport height
|
|
1494
1493
|
*/
|
|
1495
|
-
updateViewport(e,
|
|
1496
|
-
this.uniforms.viewport.value.set(e,
|
|
1494
|
+
updateViewport(e, o) {
|
|
1495
|
+
this.uniforms.viewport.value.set(e, o);
|
|
1497
1496
|
}
|
|
1498
1497
|
/**
|
|
1499
1498
|
* Set transform texture A (positions)
|
|
@@ -1538,41 +1537,41 @@ const se = class se extends l.Mesh {
|
|
|
1538
1537
|
* @param splatData The splat data to render
|
|
1539
1538
|
* @param options Rendering options
|
|
1540
1539
|
*/
|
|
1541
|
-
constructor(
|
|
1542
|
-
const
|
|
1543
|
-
super(
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
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());
|
|
1553
1552
|
// Cached inverse matrix
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
const
|
|
1563
|
-
this.geometry.instanceCount = Math.ceil(
|
|
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;
|
|
1562
|
+
this.geometry.instanceCount = Math.ceil(t / se.INSTANCE_SIZE), this.material.setNumSplats(t);
|
|
1564
1563
|
});
|
|
1565
|
-
this.geometry =
|
|
1564
|
+
this.geometry = n, this.material = r, this.splatData = o, this.frustumCulled = !1, this.options = {
|
|
1566
1565
|
autoSort: !0,
|
|
1567
|
-
...
|
|
1568
|
-
}, this.textureManager = new
|
|
1566
|
+
...t
|
|
1567
|
+
}, this.textureManager = new De(o), this.sorter = new Pe();
|
|
1569
1568
|
let a = this.createChunks() || void 0;
|
|
1570
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(
|
|
1571
1570
|
this.textureManager.orderTexture,
|
|
1572
1571
|
this.splatData.positions,
|
|
1573
1572
|
a ?? void 0,
|
|
1574
1573
|
!this.options.keepSplatData
|
|
1575
|
-
), 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);
|
|
1576
1575
|
}
|
|
1577
1576
|
/**
|
|
1578
1577
|
* Creates the instanced geometry for rendering splats.
|
|
@@ -1580,8 +1579,8 @@ const se = class se extends l.Mesh {
|
|
|
1580
1579
|
* @param instanceSize Number of splats per instance.
|
|
1581
1580
|
* @returns InstancedBufferGeometry
|
|
1582
1581
|
*/
|
|
1583
|
-
static createInstancedGeometry(
|
|
1584
|
-
const
|
|
1582
|
+
static createInstancedGeometry(o, t) {
|
|
1583
|
+
const r = Math.ceil(o / t), n = new l.BufferGeometry(), a = new Float32Array([
|
|
1585
1584
|
// x, y, splat_index_in_instance
|
|
1586
1585
|
-1,
|
|
1587
1586
|
-1,
|
|
@@ -1595,24 +1594,24 @@ const se = class se extends l.Mesh {
|
|
|
1595
1594
|
-1,
|
|
1596
1595
|
1,
|
|
1597
1596
|
0
|
|
1598
|
-
]), i = new Uint16Array([0, 1, 2, 0, 2, 3]), u = new Float32Array(4 * 3 *
|
|
1599
|
-
for (let
|
|
1600
|
-
const
|
|
1601
|
-
for (let
|
|
1602
|
-
u[
|
|
1597
|
+
]), i = new Uint16Array([0, 1, 2, 0, 2, 3]), u = new Float32Array(4 * 3 * t);
|
|
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;
|
|
1603
1602
|
}
|
|
1604
|
-
const
|
|
1605
|
-
for (let
|
|
1606
|
-
const
|
|
1607
|
-
|
|
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;
|
|
1608
1607
|
}
|
|
1609
|
-
|
|
1610
|
-
const
|
|
1611
|
-
|
|
1612
|
-
const
|
|
1613
|
-
for (let
|
|
1614
|
-
|
|
1615
|
-
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;
|
|
1616
1615
|
}
|
|
1617
1616
|
/**
|
|
1618
1617
|
* Create chunks data (bounding box min/max) for the sorter.
|
|
@@ -1621,14 +1620,14 @@ const se = class se extends l.Mesh {
|
|
|
1621
1620
|
createChunks() {
|
|
1622
1621
|
if (!this.splatData)
|
|
1623
1622
|
return null;
|
|
1624
|
-
const
|
|
1625
|
-
return
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
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
|
|
1632
1631
|
]);
|
|
1633
1632
|
}
|
|
1634
1633
|
/**
|
|
@@ -1636,17 +1635,17 @@ const se = class se extends l.Mesh {
|
|
|
1636
1635
|
* @param width Viewport width
|
|
1637
1636
|
* @param height Viewport height
|
|
1638
1637
|
*/
|
|
1639
|
-
updateViewport(
|
|
1640
|
-
|
|
1638
|
+
updateViewport(o, t) {
|
|
1639
|
+
o === this._vpW && t === this._vpH || (this._vpW = o, this._vpH = t, this.material.updateViewport(o, t));
|
|
1641
1640
|
}
|
|
1642
1641
|
/**
|
|
1643
1642
|
* Sorts splats based on camera position and direction.
|
|
1644
1643
|
* @param camera The camera to sort against.
|
|
1645
1644
|
*/
|
|
1646
|
-
sort(
|
|
1647
|
-
|
|
1648
|
-
const
|
|
1649
|
-
this.options.autoSort && (
|
|
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));
|
|
1650
1649
|
}
|
|
1651
1650
|
/**
|
|
1652
1651
|
* THREE.js hook called before rendering the object.
|
|
@@ -1657,8 +1656,8 @@ const se = class se extends l.Mesh {
|
|
|
1657
1656
|
*/
|
|
1658
1657
|
// prettier-ignore
|
|
1659
1658
|
// @ts-expect-error scene is not used
|
|
1660
|
-
onBeforeRender(
|
|
1661
|
-
this.sort(
|
|
1659
|
+
onBeforeRender(o, t, r) {
|
|
1660
|
+
this.sort(r), o.getSize(this._size), this.updateViewport(this._size.x, this._size.y);
|
|
1662
1661
|
}
|
|
1663
1662
|
/**
|
|
1664
1663
|
* Dispose of resources
|
|
@@ -1668,36 +1667,39 @@ const se = class se extends l.Mesh {
|
|
|
1668
1667
|
}
|
|
1669
1668
|
};
|
|
1670
1669
|
/** Number of splats combined into a single instanced draw call. */
|
|
1671
|
-
|
|
1672
|
-
let
|
|
1673
|
-
const
|
|
1674
|
-
|
|
1675
|
-
Object.defineProperty(le.prototype, qe, {
|
|
1676
|
-
value: !0,
|
|
1677
|
-
configurable: !1,
|
|
1678
|
-
enumerable: !1,
|
|
1679
|
-
writable: !1
|
|
1680
|
-
});
|
|
1681
|
-
} catch {
|
|
1682
|
-
console.warn("Couldn't define Visus SplatMesh symbol");
|
|
1683
|
-
}
|
|
1684
|
-
const Ye = ({
|
|
1685
|
-
plyUrl: A,
|
|
1670
|
+
f(se, "INSTANCE_SIZE", 128);
|
|
1671
|
+
let de = se;
|
|
1672
|
+
const le = /* @__PURE__ */ new Map(), He = ({
|
|
1673
|
+
plyUrl: x,
|
|
1686
1674
|
debug: e = !1,
|
|
1687
|
-
splatOptions:
|
|
1688
|
-
...
|
|
1675
|
+
splatOptions: o = {},
|
|
1676
|
+
...t
|
|
1689
1677
|
}) => {
|
|
1690
|
-
|
|
1691
|
-
const
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
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;
|
|
1698
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
|
+
}
|
|
1699
1701
|
export {
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1702
|
+
ze as PlyLoader,
|
|
1703
|
+
He as Splat,
|
|
1704
|
+
de as SplatMesh
|
|
1703
1705
|
};
|