@nebula-spatial/viewer 0.4.2 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,9 @@
1
- var v = Object.defineProperty;
2
- var y = (c, e, t) => e in c ? v(c, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : c[e] = t;
3
- var a = (c, e, t) => y(c, typeof e != "symbol" ? e + "" : e, t);
4
- import * as o from "three";
5
- import { V as p } from "./index-C9CW-EyW.js";
6
- const x = 1, b = (
1
+ var y = Object.defineProperty;
2
+ var b = (u, e, t) => e in u ? y(u, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : u[e] = t;
3
+ var a = (u, e, t) => b(u, typeof e != "symbol" ? e + "" : e, t);
4
+ import * as r from "three";
5
+ import { V as g } from "./index-D-o1ODOX.js";
6
+ const m = 1, M = (
7
7
  /* glsl */
8
8
  `
9
9
  uniform mat4 textureMatrix;
@@ -19,7 +19,7 @@ const x = 1, b = (
19
19
  gl_Position = projectionMatrix * mvPosition;
20
20
  }
21
21
  `
22
- ), M = (
22
+ ), w = (
23
23
  /* glsl */
24
24
  `
25
25
  uniform sampler2D tDiffuse;
@@ -86,38 +86,38 @@ const x = 1, b = (
86
86
  }
87
87
  `
88
88
  );
89
- class w extends o.Mesh {
90
- constructor({ size: t = 20, textureWidth: i = 512, textureHeight: r = 512 } = {}) {
91
- const s = new o.Matrix4(), n = new o.WebGLRenderTarget(i, r, {
92
- type: o.HalfFloatType,
93
- minFilter: o.LinearFilter,
94
- magFilter: o.LinearFilter,
95
- format: o.RGBAFormat,
89
+ class P extends r.Mesh {
90
+ constructor({ size: t = 20, textureWidth: i = 512, textureHeight: o = 512 } = {}) {
91
+ const s = new r.Matrix4(), l = new r.WebGLRenderTarget(i, o, {
92
+ type: r.HalfFloatType,
93
+ minFilter: r.LinearFilter,
94
+ magFilter: r.LinearFilter,
95
+ format: r.RGBAFormat,
96
96
  depthBuffer: !0,
97
97
  samples: 0
98
- }), l = new o.ShaderMaterial({
98
+ }), n = new r.ShaderMaterial({
99
99
  uniforms: {
100
- tDiffuse: { value: n.texture },
100
+ tDiffuse: { value: l.texture },
101
101
  textureMatrix: { value: s },
102
- resolution: { value: new o.Vector2(i, r) },
103
- fineGridColor: { value: new o.Color(2502702) },
104
- coarseGridColor: { value: new o.Color(7897726) },
102
+ resolution: { value: new r.Vector2(i, o) },
103
+ fineGridColor: { value: new r.Color(2502702) },
104
+ coarseGridColor: { value: new r.Color(7897726) },
105
105
  blurIntensity: { value: 1.7 },
106
106
  reflectionMix: { value: 0.07 },
107
107
  gridOpacity: { value: 1 },
108
108
  gridScale: { value: 0.2 },
109
- groundCenter: { value: new o.Vector2() },
109
+ groundCenter: { value: new r.Vector2() },
110
110
  maxRadius: { value: t * 0.5 },
111
111
  fadeSoftness: { value: t * 0.325 }
112
112
  },
113
- vertexShader: b,
114
- fragmentShader: M,
113
+ vertexShader: M,
114
+ fragmentShader: w,
115
115
  transparent: !0,
116
116
  depthWrite: !1,
117
117
  toneMapped: !0,
118
118
  fog: !1
119
119
  });
120
- super(new o.PlaneGeometry(t, t), l);
120
+ super(new r.PlaneGeometry(t, t), n);
121
121
  a(this, "renderTarget");
122
122
  a(this, "textureMatrix");
123
123
  a(this, "virtualCamera");
@@ -132,11 +132,11 @@ class w extends o.Mesh {
132
132
  a(this, "view");
133
133
  a(this, "target");
134
134
  a(this, "q");
135
- this.renderTarget = n, this.textureMatrix = s, this.virtualCamera = new o.PerspectiveCamera(), this.virtualCamera.layers.set(x), this.clipBias = 3e-3, this.frustumCulled = !1, this.renderOrder = 1, this.position.z = 2e-3, this.reflectorPlane = new o.Plane(), this.normal = new o.Vector3(), this.reflectorWorldPosition = new o.Vector3(), this.cameraWorldPosition = new o.Vector3(), this.rotationMatrix = new o.Matrix4(), this.lookAtPosition = new o.Vector3(0, 0, -1), this.clipPlane = new o.Vector4(), this.view = new o.Vector3(), this.target = new o.Vector3(), this.q = new o.Vector4();
135
+ this.renderTarget = l, this.textureMatrix = s, this.virtualCamera = new r.PerspectiveCamera(), this.virtualCamera.layers.set(m), this.clipBias = 3e-3, this.frustumCulled = !1, this.renderOrder = 1, this.position.z = 2e-3, this.reflectorPlane = new r.Plane(), this.normal = new r.Vector3(), this.reflectorWorldPosition = new r.Vector3(), this.cameraWorldPosition = new r.Vector3(), this.rotationMatrix = new r.Matrix4(), this.lookAtPosition = new r.Vector3(0, 0, -1), this.clipPlane = new r.Vector4(), this.view = new r.Vector3(), this.target = new r.Vector3(), this.q = new r.Vector4();
136
136
  }
137
- renderReflection(t, i, r) {
138
- if (this.reflectorWorldPosition.setFromMatrixPosition(this.matrixWorld), this.cameraWorldPosition.setFromMatrixPosition(r.matrixWorld), this.rotationMatrix.extractRotation(this.matrixWorld), this.normal.set(0, 0, 1).applyMatrix4(this.rotationMatrix), this.view.subVectors(this.reflectorWorldPosition, this.cameraWorldPosition), this.view.dot(this.normal) > 0) return;
139
- this.view.reflect(this.normal).negate().add(this.reflectorWorldPosition), this.rotationMatrix.extractRotation(r.matrixWorld), this.lookAtPosition.set(0, 0, -1).applyMatrix4(this.rotationMatrix).add(this.cameraWorldPosition), this.target.subVectors(this.reflectorWorldPosition, this.lookAtPosition).reflect(this.normal).negate().add(this.reflectorWorldPosition), this.virtualCamera.position.copy(this.view), this.virtualCamera.up.set(0, 1, 0).applyMatrix4(this.rotationMatrix).reflect(this.normal), this.virtualCamera.lookAt(this.target), this.virtualCamera.near = r.near, this.virtualCamera.far = r.far, this.virtualCamera.updateMatrixWorld(), this.virtualCamera.projectionMatrix.copy(r.projectionMatrix), this.textureMatrix.set(
137
+ renderReflection(t, i, o) {
138
+ if (this.reflectorWorldPosition.setFromMatrixPosition(this.matrixWorld), this.cameraWorldPosition.setFromMatrixPosition(o.matrixWorld), this.rotationMatrix.extractRotation(this.matrixWorld), this.normal.set(0, 0, 1).applyMatrix4(this.rotationMatrix), this.view.subVectors(this.reflectorWorldPosition, this.cameraWorldPosition), this.view.dot(this.normal) > 0) return;
139
+ this.view.reflect(this.normal).negate().add(this.reflectorWorldPosition), this.rotationMatrix.extractRotation(o.matrixWorld), this.lookAtPosition.set(0, 0, -1).applyMatrix4(this.rotationMatrix).add(this.cameraWorldPosition), this.target.subVectors(this.reflectorWorldPosition, this.lookAtPosition).reflect(this.normal).negate().add(this.reflectorWorldPosition), this.virtualCamera.position.copy(this.view), this.virtualCamera.up.set(0, 1, 0).applyMatrix4(this.rotationMatrix).reflect(this.normal), this.virtualCamera.lookAt(this.target), this.virtualCamera.near = o.near, this.virtualCamera.far = o.far, this.virtualCamera.updateMatrixWorld(), this.virtualCamera.projectionMatrix.copy(o.projectionMatrix), this.textureMatrix.set(
140
140
  0.5,
141
141
  0,
142
142
  0,
@@ -166,83 +166,85 @@ class w extends o.Mesh {
166
166
  -1,
167
167
  (1 + s.elements[10]) / s.elements[14]
168
168
  ), this.clipPlane.multiplyScalar(2 / this.clipPlane.dot(this.q)), s.elements[2] = this.clipPlane.x, s.elements[6] = this.clipPlane.y, s.elements[10] = this.clipPlane.z + 1 - this.clipBias, s.elements[14] = this.clipPlane.w, this.virtualCamera.projectionMatrixInverse.copy(s).invert();
169
- const n = t.getRenderTarget(), l = t.xr.enabled, u = t.shadowMap.autoUpdate, d = t.shadowMap.enabled;
169
+ const l = t.getRenderTarget(), n = t.xr.enabled, c = t.shadowMap.autoUpdate, d = t.shadowMap.enabled;
170
170
  try {
171
171
  t.xr.enabled = !1, t.shadowMap.enabled = !1, t.shadowMap.autoUpdate = !1, t.setRenderTarget(this.renderTarget), t.state.buffers.depth.setMask(!0), t.clear(), t.render(i, this.virtualCamera);
172
172
  } finally {
173
- t.setRenderTarget(n), t.xr.enabled = l, t.shadowMap.enabled = d, t.shadowMap.autoUpdate = u;
173
+ t.setRenderTarget(l), t.xr.enabled = n, t.shadowMap.enabled = d, t.shadowMap.autoUpdate = c;
174
174
  }
175
175
  }
176
176
  setRenderSize(t, i) {
177
177
  this.renderTarget.setSize(t, i), this.material.uniforms.resolution.value.set(t, i);
178
178
  }
179
179
  // Radius is in world units; the outer 65% fades before the square mesh edge.
180
- setRadius(t, i, r = this.material.uniforms.groundCenter.value) {
181
- this.scale.setScalar(t * 2 / this.geometry.parameters.width), this.position.x = r.x, this.position.y = r.y, this.material.uniforms.groundCenter.value.set(r.x, r.y), this.material.uniforms.gridScale.value = i, this.material.uniforms.maxRadius.value = t, this.material.uniforms.fadeSoftness.value = t * 0.65;
180
+ setRadius(t, i, o = this.material.uniforms.groundCenter.value) {
181
+ this.scale.setScalar(t * 2 / this.geometry.parameters.width), this.position.x = o.x, this.position.y = o.y, this.material.uniforms.groundCenter.value.set(o.x, o.y), this.material.uniforms.gridScale.value = i, this.material.uniforms.maxRadius.value = t, this.material.uniforms.fadeSoftness.value = t * 0.65;
182
182
  }
183
183
  }
184
- const g = {
184
+ const v = {
185
185
  light: {
186
- background: p.light,
186
+ background: g.light,
187
187
  fineGrid: 5859168,
188
188
  coarseGrid: 3427136,
189
189
  gridOpacity: 0.85,
190
190
  reflectionMix: 0.06
191
191
  },
192
192
  dark: {
193
- background: p.dark,
193
+ background: g.dark,
194
194
  fineGrid: 7375236,
195
195
  coarseGrid: 5552554,
196
196
  gridOpacity: 0.9,
197
197
  reflectionMix: 0.06
198
198
  }
199
- }, P = {
199
+ }, C = {
200
200
  simulation: 0.68,
201
201
  model: 1.4
202
202
  };
203
- function C(c) {
204
- const e = /* @__PURE__ */ new Set(), t = /* @__PURE__ */ new Set(), i = /* @__PURE__ */ new Set(), r = /* @__PURE__ */ new Set();
205
- c.traverse((s) => {
206
- var l;
207
- const n = s;
208
- n.geometry && e.add(n.geometry);
209
- for (const u of Array.isArray(n.material) ? n.material : [n.material])
210
- if (u) {
211
- t.add(u);
212
- for (const d of Object.values(u)) {
213
- if (!S(d)) continue;
214
- i.add(d);
215
- const h = (l = d.source) == null ? void 0 : l.data;
216
- h && typeof h.close == "function" && r.add(h);
217
- }
203
+ function x(u, e = []) {
204
+ var l;
205
+ const t = /* @__PURE__ */ new Set(), i = /* @__PURE__ */ new Set(), o = new Set(e), s = /* @__PURE__ */ new Set();
206
+ u.traverse((n) => {
207
+ const c = n;
208
+ c.geometry && t.add(c.geometry);
209
+ for (const d of Array.isArray(c.material) ? c.material : [c.material])
210
+ if (d) {
211
+ i.add(d);
212
+ for (const h of Object.values(d))
213
+ S(h) && o.add(h);
218
214
  }
219
215
  });
220
- for (const s of e) s.dispose();
221
- for (const s of t) s.dispose();
222
- for (const s of i) s.dispose();
223
- for (const s of r) s.close();
216
+ for (const n of t) n.dispose();
217
+ for (const n of i) n.dispose();
218
+ for (const n of o) {
219
+ const c = (l = n.source) == null ? void 0 : l.data;
220
+ c && typeof c.close == "function" && s.add(c), n.dispose();
221
+ }
222
+ for (const n of s) n.close();
224
223
  }
225
- function S(c) {
226
- return !!(c && typeof c == "object" && c.isTexture);
224
+ function S(u) {
225
+ return !!(u && typeof u == "object" && u.isTexture);
227
226
  }
228
- const f = 2213822, G = 6000111, R = 6;
229
- function L(c, e, t) {
227
+ const V = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
228
+ __proto__: null,
229
+ disposeModelResources: x
230
+ }, Symbol.toStringTag, { value: "Module" })), f = 2213822, G = 6000111, R = 6;
231
+ function T(u, e, t) {
230
232
  e.updateMatrixWorld();
231
- const i = new o.Vector3();
232
- return e.getWorldDirection(i).normalize(), c.setFromNormalAndCoplanarPoint(i, t);
233
+ const i = new r.Vector3();
234
+ return e.getWorldDirection(i).normalize(), u.setFromNormalAndCoplanarPoint(i, t);
233
235
  }
234
- class F {
235
- constructor(e, t = "dark", i, r = "simulation") {
236
- a(this, "root", new o.Group());
237
- a(this, "reflector", new w({ size: 100, textureWidth: 256, textureHeight: 256 }));
236
+ class W {
237
+ constructor(e, t = "dark", i, o = "simulation") {
238
+ a(this, "root", new r.Group());
239
+ a(this, "reflector", new P({ size: 100, textureWidth: 256, textureHeight: 256 }));
238
240
  a(this, "values");
239
241
  a(this, "fog");
240
- a(this, "raycaster", new o.Raycaster());
241
- a(this, "pointer", new o.Vector2());
242
- a(this, "dragPlane", new o.Plane());
243
- a(this, "dragTarget", new o.Vector3());
244
- a(this, "dragIntersection", new o.Vector3());
245
- a(this, "dragOffset", new o.Vector3());
242
+ a(this, "raycaster", new r.Raycaster());
243
+ a(this, "pointer", new r.Vector2());
244
+ a(this, "dragPlane", new r.Plane());
245
+ a(this, "dragTarget", new r.Vector3());
246
+ a(this, "dragIntersection", new r.Vector3());
247
+ a(this, "dragOffset", new r.Vector3());
246
248
  a(this, "bodyGroups", /* @__PURE__ */ new Map());
247
249
  a(this, "auxiliaries", /* @__PURE__ */ new Set());
248
250
  a(this, "forceLine");
@@ -252,24 +254,36 @@ class F {
252
254
  a(this, "size", "");
253
255
  a(this, "groundVisible");
254
256
  a(this, "disposed", !1);
255
- this.model = e, this.runtime = i, this.presentation = r, this.values = g[t];
256
- const s = this.values, n = new o.Box3().setFromObject(e), l = Math.max(...n.getSize(new o.Vector3()).toArray());
257
- if (!Number.isFinite(l) || l <= 0) throw new Error("Empty simulation geometry.");
258
- this.root.add(e), this.forceLine = this.createForceLine(), this.root.add(this.forceLine), e.traverse((m) => {
259
- m instanceof o.Mesh && m.layers.enable(x);
257
+ this.model = e, this.runtime = i, this.presentation = o, this.values = v[t];
258
+ const s = this.values, l = new r.Box3().setFromObject(e), n = Math.max(...l.getSize(new r.Vector3()).toArray());
259
+ if (!Number.isFinite(n) || n <= 0) throw new Error("Empty simulation geometry.");
260
+ this.root.add(e), this.forceLine = this.createForceLine(), this.root.add(this.forceLine), e.traverse((p) => {
261
+ p instanceof r.Mesh && p.layers.enable(m);
260
262
  }), this.root.add(this.reflector);
261
- const u = Math.max(n.getSize(new o.Vector3()).length() * 0.5, 0.02), d = this.reflector.material.uniforms;
262
- d.fineGridColor.value.setHex(s.fineGrid), d.coarseGridColor.value.setHex(s.coarseGrid), d.gridOpacity.value = s.gridOpacity, d.reflectionMix.value = s.reflectionMix, this.layoutGround(n, u), this.groundVisible = r === "simulation", this.setGroundVisible(this.groundVisible);
263
- const h = u / Math.sin(o.MathUtils.degToRad(38) / 2) * 1.25;
264
- this.fog = new o.Fog(s.background, h * 2.5, h * 8);
263
+ const c = Math.max(l.getSize(new r.Vector3()).length() * 0.5, 0.02), d = this.reflector.material.uniforms;
264
+ d.fineGridColor.value.setHex(s.fineGrid), d.coarseGridColor.value.setHex(s.coarseGrid), d.gridOpacity.value = s.gridOpacity, d.reflectionMix.value = s.reflectionMix, this.layoutGround(l, c), this.groundVisible = o === "simulation", this.setGroundVisible(this.groundVisible);
265
+ const h = c / Math.sin(r.MathUtils.degToRad(38) / 2) * 1.25;
266
+ this.fog = new r.Fog(s.background, h * 2.5, h * 8);
267
+ }
268
+ setRuntime(e) {
269
+ this.disposed || this.runtime === e || (this.endGrab(), this.runtime = e, this.bodyGroups.clear());
270
+ }
271
+ replaceModel(e, t = !0) {
272
+ this.disposed || e === this.model || (this.endGrab(), this.bodyGroups.clear(), this.model.removeFromParent(), this.model = e, this.root.add(e), e.traverse((i) => {
273
+ i instanceof r.Mesh && i.layers.enable(m);
274
+ }), t && this.reseatGround());
275
+ }
276
+ resetGround() {
277
+ var e;
278
+ this.disposed || (this.reflector.position.z = (((e = this.runtime) == null ? void 0 : e.defaultGroundHeight) ?? 0) + 2e-3);
265
279
  }
266
280
  setTheme(e) {
267
281
  if (this.disposed) return;
268
- const t = this.values = g[e], i = this.reflector.material.uniforms;
282
+ const t = this.values = v[e], i = this.reflector.material.uniforms;
269
283
  i.fineGridColor.value.setHex(t.fineGrid), i.coarseGridColor.value.setHex(t.coarseGrid), i.gridOpacity.value = t.gridOpacity, i.reflectionMix.value = t.reflectionMix, this.fog.color.setHex(t.background);
270
284
  }
271
285
  layoutGround(e, t) {
272
- this.reflector.setRadius(t * 8, Math.pow(10, Math.floor(Math.log10(Math.max(t, 0.01)))), e.getCenter(new o.Vector3()));
286
+ this.reflector.setRadius(t * 8, Math.pow(10, Math.floor(Math.log10(Math.max(t, 0.01)))), e.getCenter(new r.Vector3()));
273
287
  }
274
288
  /**
275
289
  * Re-fits the ground disc and reflection to the model's current world bounds.
@@ -280,18 +294,18 @@ class F {
280
294
  reseatGround() {
281
295
  if (this.disposed) return;
282
296
  this.root.updateMatrixWorld(!0);
283
- const e = new o.Box3().setFromObject(this.model);
284
- e.isEmpty() || this.layoutGround(e, Math.max(e.getSize(new o.Vector3()).length() * 0.5, 0.02));
297
+ const e = new r.Box3().setFromObject(this.model);
298
+ e.isEmpty() || this.layoutGround(e, Math.max(e.getSize(new r.Vector3()).length() * 0.5, 0.02));
285
299
  }
286
300
  createForceLine() {
287
- const e = new o.BufferGeometry().setFromPoints([
288
- new o.Vector3(),
289
- new o.Vector3()
290
- ]), t = new o.LineBasicMaterial({
301
+ const e = new r.BufferGeometry().setFromPoints([
302
+ new r.Vector3(),
303
+ new r.Vector3()
304
+ ]), t = new r.LineBasicMaterial({
291
305
  color: f,
292
306
  depthTest: !1,
293
307
  transparent: !0
294
- }), i = new o.Line(e, t);
308
+ }), i = new r.Line(e, t);
295
309
  return i.renderOrder = 1e3, i.visible = !1, i;
296
310
  }
297
311
  findBodyGroup(e) {
@@ -306,15 +320,15 @@ class F {
306
320
  getBodyGroup(e) {
307
321
  let t = this.bodyGroups.get(e);
308
322
  return t || this.model.traverse((i) => {
309
- var r;
310
- ((r = i.userData) == null ? void 0 : r.bodyId) === e && (t = i, this.bodyGroups.set(e, i));
323
+ var o;
324
+ ((o = i.userData) == null ? void 0 : o.bodyId) === e && (t = i, this.bodyGroups.set(e, i));
311
325
  }), t;
312
326
  }
313
327
  pointerRay(e, t, i) {
314
- const r = i.getBoundingClientRect();
328
+ const o = i.getBoundingClientRect();
315
329
  this.pointer.set(
316
- (e.clientX - r.left) / r.width * 2 - 1,
317
- -((e.clientY - r.top) / r.height) * 2 + 1
330
+ (e.clientX - o.left) / o.width * 2 - 1,
331
+ -((e.clientY - o.top) / o.height) * 2 + 1
318
332
  ), this.raycaster.setFromCamera(this.pointer, t);
319
333
  }
320
334
  setForceBoost(e) {
@@ -324,17 +338,17 @@ class F {
324
338
  beginGrab(e, t, i) {
325
339
  if (!this.runtime || this.disposed) return !1;
326
340
  this.pointerRay(e, t, i);
327
- const r = this.raycaster.intersectObject(this.model, !0).find((u) => u.object.isMesh);
328
- if (!r) return !1;
329
- const s = this.findBodyGroup(r.object);
341
+ const o = this.raycaster.intersectObject(this.model, !0).find((c) => c.object.isMesh);
342
+ if (!o) return !1;
343
+ const s = this.findBodyGroup(o.object);
330
344
  if (!s) return !1;
331
- const n = s.worldToLocal(r.point.clone());
332
- this.dragTarget.copy(r.point), L(this.dragPlane, t, r.point), this.dragOffset.set(0, 0, 0);
333
- const l = this.root.worldToLocal(r.point.clone());
345
+ const l = s.worldToLocal(o.point.clone());
346
+ this.dragTarget.copy(o.point), T(this.dragPlane, t, o.point), this.dragOffset.set(0, 0, 0);
347
+ const n = this.root.worldToLocal(o.point.clone());
334
348
  return this.bodyGroups.set(s.userData.bodyId, s), this.runtime.beginGrab({
335
349
  bodyId: s.userData.bodyId,
336
- localPoint: [n.x, n.y, n.z],
337
- target: [l.x, l.y, l.z]
350
+ localPoint: [l.x, l.y, l.z],
351
+ target: [n.x, n.y, n.z]
338
352
  }), this.forceBoosted = !1, this.setForceBoost(e.shiftKey), this.forceLine.visible = !0, this.updateForceLine(), this.grabCanvas = i, i != null && i.style && (this.previousCursor = i.style.cursor, i.style.cursor = "grabbing"), !0;
339
353
  }
340
354
  moveGrab(e, t, i) {
@@ -344,25 +358,25 @@ class F {
344
358
  this.dragTarget.copy(this.dragIntersection).add(this.dragOffset);
345
359
  else
346
360
  return;
347
- const r = this.root.worldToLocal(this.dragTarget.clone());
348
- this.runtime.updateGrabTarget([r.x, r.y, r.z]), this.updateForceLine();
361
+ const o = this.root.worldToLocal(this.dragTarget.clone());
362
+ this.runtime.updateGrabTarget([o.x, o.y, o.z]), this.updateForceLine();
349
363
  }
350
364
  endGrab() {
351
365
  var e;
352
366
  this.runtime && (this.runtime.endGrab(), this.forceBoosted = !1, this.forceLine.visible = !1, this.forceLine.material.color.setHex(f), (e = this.grabCanvas) != null && e.style && (this.grabCanvas.style.cursor = this.previousCursor), this.grabCanvas = null);
353
367
  }
354
368
  updateForceLine() {
355
- var l;
356
- const e = (l = this.runtime) == null ? void 0 : l.grab;
369
+ var n;
370
+ const e = (n = this.runtime) == null ? void 0 : n.grab;
357
371
  if (!e) return;
358
372
  const t = this.getBodyGroup(e.bodyId);
359
373
  if (!t) return;
360
- const i = new o.Vector3().fromArray(e.localPoint), r = t.localToWorld(i), s = this.root.worldToLocal(r), n = this.forceLine.geometry.attributes.position;
361
- n.setXYZ(0, s.x, s.y, s.z), n.setXYZ(1, e.target[0], e.target[1], e.target[2]), n.needsUpdate = !0;
374
+ const i = new r.Vector3().fromArray(e.localPoint), o = t.localToWorld(i), s = this.root.worldToLocal(o), l = this.forceLine.geometry.attributes.position;
375
+ l.setXYZ(0, s.x, s.y, s.z), l.setXYZ(1, e.target[0], e.target[1], e.target[2]), l.needsUpdate = !0;
362
376
  }
363
377
  beforeRender(e, t, i) {
364
- var n;
365
- const r = {
378
+ var l, n;
379
+ const o = {
366
380
  tone: e.toneMapping,
367
381
  exposure: e.toneMappingExposure,
368
382
  color: e.outputColorSpace,
@@ -370,15 +384,17 @@ class F {
370
384
  fog: t.fog,
371
385
  background: t.background
372
386
  }, s = () => {
373
- e.toneMapping = r.tone, e.toneMappingExposure = r.exposure, e.outputColorSpace = r.color, t.environment = r.environment, t.fog = r.fog, t.background = r.background;
387
+ e.toneMapping = o.tone, e.toneMappingExposure = o.exposure, e.outputColorSpace = o.color, t.environment = o.environment, t.fog = o.fog, t.background = o.background;
374
388
  };
375
389
  if (this.disposed) return s;
376
390
  try {
377
- (n = this.runtime) != null && n.grab && this.updateForceLine(), e.toneMapping = o.ACESFilmicToneMapping, e.toneMappingExposure = P[this.presentation], e.outputColorSpace = o.SRGBColorSpace, t.background = new o.Color(this.values.background), t.fog = this.fog;
378
- const l = e.getSize(new o.Vector2()), u = `${l.x}:${l.y}`;
379
- return u !== this.size && (this.size = u, this.reflector.setRenderSize(Math.max(1, Math.floor(l.x * 0.35)), Math.max(1, Math.floor(l.y * 0.35)))), t.updateMatrixWorld(!0), i.updateMatrixWorld(!0), this.groundVisible && i instanceof o.PerspectiveCamera && this.reflector.renderReflection(e, t, i), s;
380
- } catch (l) {
381
- throw s(), l;
391
+ (l = this.runtime) != null && l.grab && this.updateForceLine();
392
+ const c = (n = this.runtime) == null ? void 0 : n.defaultGroundHeight;
393
+ c !== void 0 && (this.reflector.position.z = c + 2e-3), e.toneMapping = r.ACESFilmicToneMapping, e.toneMappingExposure = C[this.presentation], e.outputColorSpace = r.SRGBColorSpace, t.background = new r.Color(this.values.background), t.fog = this.fog;
394
+ const d = e.getSize(new r.Vector2()), h = `${d.x}:${d.y}`;
395
+ return h !== this.size && (this.size = h, this.reflector.setRenderSize(Math.max(1, Math.floor(d.x * 0.35)), Math.max(1, Math.floor(d.y * 0.35)))), t.updateMatrixWorld(!0), i.updateMatrixWorld(!0), this.groundVisible && i instanceof r.PerspectiveCamera && this.reflector.renderReflection(e, t, i), s;
396
+ } catch (c) {
397
+ throw s(), c;
382
398
  }
383
399
  }
384
400
  /**
@@ -400,22 +416,26 @@ class F {
400
416
  attachAuxiliary(e) {
401
417
  this.auxiliaries.add(e), this.root.add(e);
402
418
  }
419
+ detachAuxiliary(e) {
420
+ this.auxiliaries.delete(e) && e.removeFromParent();
421
+ }
403
422
  getModelBounds() {
404
423
  this.root.updateMatrixWorld(!0);
405
- const e = new o.Box3().setFromObject(this.model);
424
+ const e = new r.Box3().setFromObject(this.model);
406
425
  if (!e.isEmpty()) return e;
407
- const t = new o.Box3();
426
+ const t = new r.Box3();
408
427
  return t.min.set(-5e3, -5e3, -5e3), t.max.set(5e3, 5e3, 5e3), t;
409
428
  }
410
429
  dispose() {
411
430
  if (!this.disposed) {
412
431
  this.disposed = !0, this.endGrab(), this.model.removeFromParent();
413
432
  for (const e of this.auxiliaries) e.removeFromParent();
414
- this.auxiliaries.clear(), this.root.removeFromParent(), this.reflector.renderTarget.dispose(), C(this.root);
433
+ this.auxiliaries.clear(), this.root.removeFromParent(), this.reflector.renderTarget.dispose(), x(this.root);
415
434
  }
416
435
  }
417
436
  }
418
437
  export {
419
- F as S,
420
- C as d
438
+ W as S,
439
+ x as d,
440
+ V as r
421
441
  };
package/dist/types.d.ts CHANGED
@@ -88,6 +88,8 @@ export interface ViewerFitViewOptions {
88
88
  viewMode?: ViewerViewMode;
89
89
  }
90
90
  export interface ViewerPickOptions {
91
+ /** Stop at the nearest intersection when accelerated picking is available. */
92
+ firstHitOnly?: boolean;
91
93
  roots?: readonly Object3D[];
92
94
  recursive?: boolean;
93
95
  includeInvisible?: boolean;
@@ -33,6 +33,8 @@ export interface ViewerUiOptions {
33
33
  cad?: ViewerCadUiOptions;
34
34
  /** Shared scene controls for model and simulation assets, gated by capabilities. */
35
35
  scene?: ViewerSceneUiOptions;
36
+ /** Built-in URDF review workbench. Defaults to true for preset 'auto'. */
37
+ urdf?: boolean;
36
38
  }
37
39
  export interface ViewerUiTokens {
38
40
  accent?: string;