three-render-objects 1.41.1 → 1.43.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.
@@ -1,4 +1,4 @@
1
- import { SphereGeometry, Color, TextureLoader, SRGBColorSpace, MeshBasicMaterial, BackSide, Vector2, WebGLRenderer, Mesh, Timer, PerspectiveCamera, Scene, Raycaster, Vector3, Box3 } from 'three';
1
+ import { Timer, PerspectiveCamera, Scene, SphereGeometry, Color, TextureLoader, SRGBColorSpace, MeshBasicMaterial, BackSide, Vector2, WebGLRenderer, Mesh, Raycaster, Vector3, Box3 } from 'three';
2
2
  import { WebGPURenderer } from 'three/webgpu';
3
3
  import { TrackballControls } from 'three/examples/jsm/controls/TrackballControls.js';
4
4
  import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
@@ -39,89 +39,9 @@ function styleInject(css, ref) {
39
39
  var css_248z = ".scene-nav-info {\n position: absolute;\n bottom: 5px;\n width: 100%;\n text-align: center;\n color: slategrey;\n opacity: 0.7;\n font-size: 10px;\n font-family: sans-serif;\n pointer-events: none;\n user-select: none;\n}\n\n.scene-container canvas:focus {\n outline: none;\n}";
40
40
  styleInject(css_248z);
41
41
 
42
- function _arrayLikeToArray(r, a) {
43
- (null == a || a > r.length) && (a = r.length);
44
- for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
45
- return n;
46
- }
47
- function _arrayWithHoles(r) {
48
- if (Array.isArray(r)) return r;
49
- }
50
- function _arrayWithoutHoles(r) {
51
- if (Array.isArray(r)) return _arrayLikeToArray(r);
52
- }
53
- function _defineProperty(e, r, t) {
54
- return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
55
- value: t,
56
- enumerable: true,
57
- configurable: true,
58
- writable: true
59
- }) : e[r] = t, e;
60
- }
61
- function _iterableToArray(r) {
62
- if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r);
63
- }
64
- function _iterableToArrayLimit(r, l) {
65
- var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
66
- if (null != t) {
67
- var e,
68
- n,
69
- i,
70
- u,
71
- a = [],
72
- f = true,
73
- o = false;
74
- try {
75
- if (i = (t = t.call(r)).next, 0 === l) ; else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);
76
- } catch (r) {
77
- o = true, n = r;
78
- } finally {
79
- try {
80
- if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;
81
- } finally {
82
- if (o) throw n;
83
- }
84
- }
85
- return a;
86
- }
87
- }
88
- function _nonIterableRest() {
89
- throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
90
- }
91
- function _nonIterableSpread() {
92
- throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
93
- }
94
- function _slicedToArray(r, e) {
95
- return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();
96
- }
97
- function _toConsumableArray(r) {
98
- return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread();
99
- }
100
- function _toPrimitive(t, r) {
101
- if ("object" != typeof t || !t) return t;
102
- var e = t[Symbol.toPrimitive];
103
- if (void 0 !== e) {
104
- var i = e.call(t, r);
105
- if ("object" != typeof i) return i;
106
- throw new TypeError("@@toPrimitive must return a primitive value.");
107
- }
108
- return ("string" === r ? String : Number)(t);
109
- }
110
- function _toPropertyKey(t) {
111
- var i = _toPrimitive(t, "string");
112
- return "symbol" == typeof i ? i : i + "";
113
- }
114
- function _unsupportedIterableToArray(r, a) {
115
- if (r) {
116
- if ("string" == typeof r) return _arrayLikeToArray(r, a);
117
- var t = {}.toString.call(r).slice(8, -1);
118
- return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
119
- }
120
- }
121
-
122
- var _materialDispose = function materialDispose(material) {
42
+ const materialDispose = material => {
123
43
  if (material instanceof Array) {
124
- material.forEach(_materialDispose);
44
+ material.forEach(materialDispose);
125
45
  } else {
126
46
  if (material.map) {
127
47
  material.map.dispose();
@@ -129,83 +49,83 @@ var _materialDispose = function materialDispose(material) {
129
49
  material.dispose();
130
50
  }
131
51
  };
132
- var _deallocate = function deallocate(obj) {
52
+ const deallocate = obj => {
133
53
  if (obj.geometry) {
134
54
  obj.geometry.dispose();
135
55
  }
136
56
  if (obj.material) {
137
- _materialDispose(obj.material);
57
+ materialDispose(obj.material);
138
58
  }
139
59
  if (obj.texture) {
140
60
  obj.texture.dispose();
141
61
  }
142
62
  if (obj.children) {
143
- obj.children.forEach(_deallocate);
63
+ obj.children.forEach(deallocate);
144
64
  }
145
65
  };
146
- var emptyObject = function emptyObject(obj) {
66
+ const emptyObject = obj => {
147
67
  while (obj.children.length) {
148
- var childObj = obj.children[0];
68
+ const childObj = obj.children[0];
149
69
  obj.remove(childObj);
150
- _deallocate(childObj);
70
+ deallocate(childObj);
151
71
  }
152
72
  };
153
73
 
154
- var three = window.THREE ? window.THREE // Prefer consumption from global THREE, if exists
74
+ const three = window.THREE ? window.THREE // Prefer consumption from global THREE, if exists
155
75
  : {
156
- WebGLRenderer: WebGLRenderer,
157
- Scene: Scene,
158
- PerspectiveCamera: PerspectiveCamera,
159
- Raycaster: Raycaster,
160
- SRGBColorSpace: SRGBColorSpace,
161
- TextureLoader: TextureLoader,
162
- Vector2: Vector2,
163
- Vector3: Vector3,
164
- Box3: Box3,
165
- Color: Color,
166
- Mesh: Mesh,
167
- SphereGeometry: SphereGeometry,
168
- MeshBasicMaterial: MeshBasicMaterial,
169
- BackSide: BackSide,
170
- Timer: Timer
76
+ WebGLRenderer,
77
+ Scene,
78
+ PerspectiveCamera,
79
+ Raycaster,
80
+ SRGBColorSpace,
81
+ TextureLoader,
82
+ Vector2,
83
+ Vector3,
84
+ Box3,
85
+ Color,
86
+ Mesh,
87
+ SphereGeometry,
88
+ MeshBasicMaterial,
89
+ BackSide,
90
+ Timer
171
91
  };
172
92
  var threeRenderObjects = Kapsule({
173
93
  props: {
174
94
  width: {
175
- "default": window.innerWidth,
176
- onChange: function onChange(width, state, prevWidth) {
95
+ default: window.innerWidth,
96
+ onChange(width, state, prevWidth) {
177
97
  isNaN(width) && (state.width = prevWidth);
178
98
  }
179
99
  },
180
100
  height: {
181
- "default": window.innerHeight,
182
- onChange: function onChange(height, state, prevHeight) {
101
+ default: window.innerHeight,
102
+ onChange(height, state, prevHeight) {
183
103
  isNaN(height) && (state.height = prevHeight);
184
104
  }
185
105
  },
186
106
  viewOffset: {
187
- "default": [0, 0]
107
+ default: [0, 0]
188
108
  },
189
109
  backgroundColor: {
190
- "default": '#000011'
110
+ default: '#000011'
191
111
  },
192
112
  backgroundImageUrl: {},
193
113
  onBackgroundImageLoaded: {},
194
114
  showNavInfo: {
195
- "default": true
115
+ default: true
196
116
  },
197
117
  skyRadius: {
198
- "default": 50000
118
+ default: 50000
199
119
  },
200
120
  objects: {
201
- "default": []
121
+ default: []
202
122
  },
203
123
  lights: {
204
- "default": []
124
+ default: []
205
125
  },
206
126
  enablePointerInteraction: {
207
- "default": true,
208
- onChange: function onChange(_, state) {
127
+ default: true,
128
+ onChange(_, state) {
209
129
  // Reset hover state
210
130
  state.hoverObj = null;
211
131
  state.tooltip && state.tooltip.content(null);
@@ -213,15 +133,15 @@ var threeRenderObjects = Kapsule({
213
133
  triggerUpdate: false
214
134
  },
215
135
  pointerRaycasterThrottleMs: {
216
- "default": 50,
136
+ default: 50,
217
137
  triggerUpdate: false
218
138
  },
219
139
  lineHoverPrecision: {
220
- "default": 1,
140
+ default: 1,
221
141
  triggerUpdate: false
222
142
  },
223
143
  pointsHoverPrecision: {
224
- "default": 1,
144
+ default: 1,
225
145
  triggerUpdate: false
226
146
  },
227
147
  hoverOrderComparator: {
@@ -229,9 +149,7 @@ var threeRenderObjects = Kapsule({
229
149
  },
230
150
  // keep existing order by default
231
151
  hoverFilter: {
232
- "default": function _default() {
233
- return true;
234
- },
152
+ default: () => true,
235
153
  triggerUpdate: false
236
154
  },
237
155
  // exclude objects from interaction
@@ -239,19 +157,19 @@ var threeRenderObjects = Kapsule({
239
157
  triggerUpdate: false
240
158
  },
241
159
  hoverDuringDrag: {
242
- "default": false,
160
+ default: false,
243
161
  triggerUpdate: false
244
162
  },
245
163
  clickAfterDrag: {
246
- "default": false,
164
+ default: false,
247
165
  triggerUpdate: false
248
166
  },
249
167
  onHover: {
250
- "default": function _default() {},
168
+ default: () => {},
251
169
  triggerUpdate: false
252
170
  },
253
171
  onClick: {
254
- "default": function _default() {},
172
+ default: () => {},
255
173
  triggerUpdate: false
256
174
  },
257
175
  onRightClick: {
@@ -259,28 +177,22 @@ var threeRenderObjects = Kapsule({
259
177
  }
260
178
  },
261
179
  methods: {
262
- tick: function tick(state) {
180
+ tick: function (state) {
263
181
  if (state.initialised) {
264
182
  state.controls.enabled && state.controls.update && state.controls.update(Math.min(1, state.timer.update().getDelta())); // timedelta is required for fly controls
265
183
 
266
184
  state.postProcessingComposer ? state.postProcessingComposer.render() // if using postprocessing, switch the output to it
267
185
  : state.renderer.render(state.scene, state.camera);
268
- state.extraRenderers.forEach(function (r) {
269
- return r.render(state.scene, state.camera);
270
- });
271
- var now = +new Date();
186
+ state.extraRenderers.forEach(r => r.render(state.scene, state.camera));
187
+ const now = +new Date();
272
188
  if (state.enablePointerInteraction && now - state.lastRaycasterCheck >= state.pointerRaycasterThrottleMs) {
273
189
  state.lastRaycasterCheck = now;
274
190
  // Update tooltip and trigger onHover events
275
- var topObject = null;
191
+ let topObject = null;
276
192
  if (state.hoverDuringDrag || !state.isPointerDragging) {
277
- var intersects = this.intersectingObjects(state.pointerPos.x, state.pointerPos.y);
278
- state.hoverOrderComparator && intersects.sort(function (a, b) {
279
- return state.hoverOrderComparator(a.object, b.object);
280
- });
281
- var topIntersect = intersects.find(function (d) {
282
- return state.hoverFilter(d.object);
283
- }) || null;
193
+ const intersects = this.intersectingObjects(state.pointerPos.x, state.pointerPos.y);
194
+ state.hoverOrderComparator && intersects.sort((a, b) => state.hoverOrderComparator(a.object, b.object));
195
+ const topIntersect = intersects.find(d => state.hoverFilter(d.object)) || null;
284
196
  topObject = topIntersect ? topIntersect.object : null;
285
197
  state.intersection = topIntersect || null;
286
198
  }
@@ -294,39 +206,46 @@ var threeRenderObjects = Kapsule({
294
206
  }
295
207
  return this;
296
208
  },
297
- getPointerPos: function getPointerPos(state) {
298
- var _state$pointerPos = state.pointerPos,
299
- x = _state$pointerPos.x,
300
- y = _state$pointerPos.y;
209
+ getPointerPos: function (state) {
210
+ const {
211
+ x,
212
+ y
213
+ } = state.pointerPos;
301
214
  return {
302
- x: x,
303
- y: y
215
+ x,
216
+ y
304
217
  };
305
218
  },
306
- cameraPosition: function cameraPosition(state, position, lookAt, transitionDuration) {
307
- var camera = state.camera;
219
+ cameraPosition: function (state, position, lookAt, transitionDuration) {
220
+ const camera = state.camera;
308
221
 
309
222
  // Setter
310
223
  if (position && state.initialised) {
311
- var finalPos = position;
312
- var finalLookAt = lookAt || {
224
+ const finalPos = position;
225
+ const finalLookAt = lookAt || {
313
226
  x: 0,
314
227
  y: 0,
315
228
  z: 0
316
229
  };
230
+
231
+ // cancel any ongoing pov animation
232
+ state.povPosTween?.end();
233
+ state.povTgtTween?.end();
317
234
  if (!transitionDuration) {
318
235
  // no animation
319
236
  setCameraPos(finalPos);
320
237
  setLookAt(finalLookAt);
321
238
  } else {
322
- var camPos = Object.assign({}, camera.position);
323
- var camLookAt = getLookAt();
324
- state.tweenGroup.add(new Tween(camPos).to(finalPos, transitionDuration).easing(Easing.Quadratic.Out).onUpdate(setCameraPos).onComplete(function () {
239
+ const camPos = Object.assign({}, camera.position);
240
+ const camLookAt = getLookAt();
241
+ state.tweenGroup.add(state.povPosTween = new Tween(camPos).to(finalPos, transitionDuration).easing(Easing.Quadratic.Out).onUpdate(setCameraPos).onComplete(function () {
242
+ state.povPosTween = undefined;
325
243
  state.tweenGroup.remove(this);
326
244
  }).start());
327
245
 
328
246
  // Face direction in 1/3rd of time
329
- state.tweenGroup.add(new Tween(camLookAt).to(finalLookAt, transitionDuration / 3).easing(Easing.Quadratic.Out).onUpdate(setLookAt).onComplete(function () {
247
+ state.tweenGroup.add(state.povTgtTween = new Tween(camLookAt).to(finalLookAt, transitionDuration / 3).easing(Easing.Quadratic.Out).onUpdate(setLookAt).onComplete(function () {
248
+ state.povTgtTween = undefined;
330
249
  state.tweenGroup.remove(this);
331
250
  }).start());
332
251
  }
@@ -341,15 +260,17 @@ var threeRenderObjects = Kapsule({
341
260
  //
342
261
 
343
262
  function setCameraPos(pos) {
344
- var x = pos.x,
345
- y = pos.y,
346
- z = pos.z;
263
+ const {
264
+ x,
265
+ y,
266
+ z
267
+ } = pos;
347
268
  if (x !== undefined) camera.position.x = x;
348
269
  if (y !== undefined) camera.position.y = y;
349
270
  if (z !== undefined) camera.position.z = z;
350
271
  }
351
272
  function setLookAt(lookAt) {
352
- var lookAtVect = new three.Vector3(lookAt.x, lookAt.y, lookAt.z);
273
+ const lookAtVect = new three.Vector3(lookAt.x, lookAt.y, lookAt.z);
353
274
  if (state.controls.enabled && state.controls.target) {
354
275
  state.controls.target = lookAtVect;
355
276
  } else {
@@ -361,60 +282,53 @@ var threeRenderObjects = Kapsule({
361
282
  return Object.assign(new three.Vector3(0, 0, -1e3).applyQuaternion(camera.quaternion).add(camera.position));
362
283
  }
363
284
  },
364
- zoomToFit: function zoomToFit(state) {
365
- var transitionDuration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
366
- var padding = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 10;
367
- for (var _len = arguments.length, bboxArgs = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {
368
- bboxArgs[_key - 3] = arguments[_key];
369
- }
370
- return this.fitToBbox(this.getBbox.apply(this, bboxArgs), transitionDuration, padding);
285
+ zoomToFit: function (state, transitionDuration = 0, padding = 10, bboxArg, preserveLookDirection) {
286
+ return this.fitToBbox(this.getBbox(bboxArg), transitionDuration, padding, preserveLookDirection);
371
287
  },
372
- fitToBbox: function fitToBbox(state, bbox) {
373
- var transitionDuration = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
374
- var padding = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 10;
375
- // based on https://discourse.threejs.org/t/camera-zoom-to-fit-object/936/24
376
- var camera = state.camera;
288
+ fitToBbox: function (state, bbox, transitionDuration = 0, padding = 10, preserveLookDirection = false) {
289
+ const camera = state.camera;
377
290
  if (bbox) {
378
- var center = new three.Vector3(0, 0, 0); // reset camera aim to center
379
- var maxBoxSide = Math.max.apply(Math, _toConsumableArray(Object.entries(bbox).map(function (_ref) {
380
- var _ref2 = _slicedToArray(_ref, 2),
381
- coordType = _ref2[0],
382
- coords = _ref2[1];
383
- return Math.max.apply(Math, _toConsumableArray(coords.map(function (c) {
384
- return Math.abs(center[coordType] - c);
385
- })));
386
- }))) * 2;
387
-
388
- // find distance that fits whole bbox within padded fov
389
- var paddedFov = (1 - padding * 2 / state.height) * camera.fov;
390
- var fitHeightDistance = maxBoxSide / Math.atan(paddedFov * Math.PI / 180);
391
- var fitWidthDistance = fitHeightDistance / camera.aspect;
392
- var distance = Math.max(fitHeightDistance, fitWidthDistance);
393
- if (distance > 0) {
394
- var newCameraPosition = center.clone().sub(camera.position).normalize().multiplyScalar(-distance);
395
- this.cameraPosition(newCameraPosition, center, transitionDuration);
396
- }
291
+ camera.updateMatrixWorld();
292
+ const camRight = new three.Vector3();
293
+ const camUp = new three.Vector3();
294
+ const camForward = new three.Vector3();
295
+ const camPos = new three.Vector3();
296
+ camera.getWorldPosition(camPos);
297
+ camera.getWorldDirection(camForward);
298
+ camRight.crossVectors(camForward, camera.up).normalize();
299
+ camUp.crossVectors(camRight, camForward).normalize();
300
+ const paddedFov = (1 - padding * 2 / state.height) * camera.fov;
301
+ const vFovHalf = paddedFov / 2 * (Math.PI / 180);
302
+ const hFovHalf = Math.atan(Math.tan(vFovHalf) * camera.aspect);
303
+ const bboxCenter = new three.Vector3((bbox.x[0] + bbox.x[1]) / 2, (bbox.y[0] + bbox.y[1]) / 2, (bbox.z[0] + bbox.z[1]) / 2);
304
+ const center = preserveLookDirection ? camForward.clone().multiplyScalar(camPos.distanceTo(bboxCenter)).add(camPos) : bboxCenter;
305
+ const distance = Math.max(0, ...[new three.Vector3(bbox.x[0], bbox.y[0], bbox.z[0]), new three.Vector3(bbox.x[0], bbox.y[0], bbox.z[1]), new three.Vector3(bbox.x[0], bbox.y[1], bbox.z[0]), new three.Vector3(bbox.x[0], bbox.y[1], bbox.z[1]), new three.Vector3(bbox.x[1], bbox.y[0], bbox.z[0]), new three.Vector3(bbox.x[1], bbox.y[0], bbox.z[1]), new three.Vector3(bbox.x[1], bbox.y[1], bbox.z[0]), new three.Vector3(bbox.x[1], bbox.y[1], bbox.z[1])].map(corner => {
306
+ const localPos = corner.clone().sub(center);
307
+ return Math.max(Math.abs(localPos.dot(camUp)) / Math.tan(vFovHalf), Math.abs(localPos.dot(camRight)) / Math.tan(hFovHalf)) - localPos.dot(camForward);
308
+ }));
309
+ const dir = camForward.clone().negate();
310
+ const newCameraPos = {
311
+ x: center.x + dir.x * distance,
312
+ y: center.y + dir.y * distance,
313
+ z: center.z + dir.z * distance
314
+ };
315
+ this.cameraPosition(newCameraPos, center, transitionDuration);
397
316
  }
398
317
  return this;
399
318
  },
400
- getBbox: function getBbox(state) {
401
- var objFilter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {
402
- return true;
403
- };
404
- var box = new three.Box3(new three.Vector3(0, 0, 0), new three.Vector3(0, 0, 0));
405
- var objs = state.objects.filter(objFilter);
319
+ getBbox: function (state, objFilter = () => true) {
320
+ const box = new three.Box3();
321
+ const objs = state.objects.filter(objFilter);
406
322
  if (!objs.length) return null;
407
- objs.forEach(function (obj) {
408
- return box.expandByObject(obj);
409
- });
323
+ objs.forEach(obj => box.expandByObject(obj));
410
324
 
411
325
  // extract global x,y,z min/max
412
- return Object.assign.apply(Object, _toConsumableArray(['x', 'y', 'z'].map(function (c) {
413
- return _defineProperty({}, c, [box.min[c], box.max[c]]);
326
+ return Object.assign(...['x', 'y', 'z'].map(c => ({
327
+ [c]: [box.min[c], box.max[c]]
414
328
  })));
415
329
  },
416
- getScreenCoords: function getScreenCoords(state, x, y, z) {
417
- var vec = new three.Vector3(x, y, z);
330
+ getScreenCoords: function (state, x, y, z) {
331
+ const vec = new three.Vector3(x, y, z);
418
332
  vec.project(this.camera()); // project to the camera plane
419
333
  return {
420
334
  // align relative pos to canvas dimensions
@@ -422,69 +336,48 @@ var threeRenderObjects = Kapsule({
422
336
  y: -(vec.y - 1) * state.height / 2
423
337
  };
424
338
  },
425
- getSceneCoords: function getSceneCoords(state, screenX, screenY) {
426
- var distance = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
427
- var relCoords = new three.Vector2(screenX / state.width * 2 - 1, -(screenY / state.height) * 2 + 1);
428
- var raycaster = new three.Raycaster();
339
+ getSceneCoords: function (state, screenX, screenY, distance = 0) {
340
+ const relCoords = new three.Vector2(screenX / state.width * 2 - 1, -(screenY / state.height) * 2 + 1);
341
+ const raycaster = new three.Raycaster();
429
342
  raycaster.setFromCamera(relCoords, state.camera);
430
343
  return Object.assign({}, raycaster.ray.at(distance, new three.Vector3()));
431
344
  },
432
- intersectingObjects: function intersectingObjects(state, x, y) {
433
- var relCoords = new three.Vector2(x / state.width * 2 - 1, -(y / state.height) * 2 + 1);
434
- var raycaster = new three.Raycaster();
345
+ intersectingObjects: function (state, x, y) {
346
+ const relCoords = new three.Vector2(x / state.width * 2 - 1, -(y / state.height) * 2 + 1);
347
+ const raycaster = new three.Raycaster();
435
348
  raycaster.params.Line.threshold = state.lineHoverPrecision; // set linePrecision
436
349
  raycaster.params.Points.threshold = state.pointsHoverPrecision; // set pointsPrecision
437
350
  raycaster.setFromCamera(relCoords, state.camera);
438
351
  return raycaster.intersectObjects(state.objects, true);
439
352
  },
440
- renderer: function renderer(state) {
441
- return state.renderer;
442
- },
443
- scene: function scene(state) {
444
- return state.scene;
445
- },
446
- camera: function camera(state) {
447
- return state.camera;
448
- },
449
- postProcessingComposer: function postProcessingComposer(state) {
450
- return state.postProcessingComposer;
451
- },
452
- controls: function controls(state) {
453
- return state.controls;
454
- },
455
- tbControls: function tbControls(state) {
456
- return state.controls;
457
- },
353
+ renderer: state => state.renderer,
354
+ scene: state => state.scene,
355
+ camera: state => state.camera,
356
+ postProcessingComposer: state => state.postProcessingComposer,
357
+ controls: state => state.controls,
358
+ tbControls: state => state.controls,
458
359
  // to be deprecated
459
- _destructor: function _destructor(state) {
460
- var _state$controls, _state$renderer, _state$postProcessing;
360
+ _destructor: function (state) {
461
361
  emptyObject(state.scene);
462
- (_state$controls = state.controls) === null || _state$controls === void 0 || _state$controls.dispose();
463
- (_state$renderer = state.renderer) === null || _state$renderer === void 0 || _state$renderer.dispose();
464
- (_state$postProcessing = state.postProcessingComposer) === null || _state$postProcessing === void 0 || _state$postProcessing.dispose();
362
+ state.controls?.dispose();
363
+ state.renderer?.dispose();
364
+ state.postProcessingComposer?.dispose();
465
365
  }
466
366
  },
467
- stateInit: function stateInit() {
468
- return {
469
- scene: new three.Scene(),
470
- camera: new three.PerspectiveCamera(),
471
- timer: new three.Timer(),
472
- tweenGroup: new Group(),
473
- lastRaycasterCheck: 0
474
- };
475
- },
476
- init: function init(domNode, state) {
477
- var _ref4 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
478
- _ref4$controlType = _ref4.controlType,
479
- controlType = _ref4$controlType === void 0 ? 'trackball' : _ref4$controlType,
480
- _ref4$useWebGPU = _ref4.useWebGPU,
481
- useWebGPU = _ref4$useWebGPU === void 0 ? false : _ref4$useWebGPU,
482
- _ref4$rendererConfig = _ref4.rendererConfig,
483
- rendererConfig = _ref4$rendererConfig === void 0 ? {} : _ref4$rendererConfig,
484
- _ref4$extraRenderers = _ref4.extraRenderers,
485
- extraRenderers = _ref4$extraRenderers === void 0 ? [] : _ref4$extraRenderers,
486
- _ref4$waitForLoadComp = _ref4.waitForLoadComplete,
487
- waitForLoadComplete = _ref4$waitForLoadComp === void 0 ? true : _ref4$waitForLoadComp;
367
+ stateInit: () => ({
368
+ scene: new three.Scene(),
369
+ camera: new three.PerspectiveCamera(),
370
+ timer: new three.Timer(),
371
+ tweenGroup: new Group(),
372
+ lastRaycasterCheck: 0
373
+ }),
374
+ init(domNode, state, {
375
+ controlType = 'trackball',
376
+ useWebGPU = false,
377
+ rendererConfig = {},
378
+ extraRenderers = [],
379
+ waitForLoadComplete = true
380
+ } = {}) {
488
381
  // Wipe DOM
489
382
  domNode.innerHTML = '';
490
383
 
@@ -510,39 +403,35 @@ var threeRenderObjects = Kapsule({
510
403
  state.pointerPos = new three.Vector2();
511
404
  state.pointerPos.x = -2; // Initialize off canvas
512
405
  state.pointerPos.y = -2;
513
- ['pointermove', 'pointerdown'].forEach(function (evType) {
514
- return state.container.addEventListener(evType, function (ev) {
515
- // track click state
516
- evType === 'pointerdown' && (state.isPointerPressed = true);
406
+ ['pointermove', 'pointerdown'].forEach(evType => state.container.addEventListener(evType, ev => {
407
+ // track click state
408
+ evType === 'pointerdown' && (state.isPointerPressed = true);
517
409
 
518
- // detect point drag
519
- !state.isPointerDragging && ev.type === 'pointermove' && (ev.pressure > 0 || state.isPointerPressed) // ev.pressure always 0 on Safari, so we used the isPointerPressed tracker
520
- && (ev.pointerType === 'mouse' || ev.movementX === undefined || [ev.movementX, ev.movementY].some(function (m) {
521
- return Math.abs(m) > 1;
522
- })) // relax drag trigger sensitivity on non-mouse (touch/pen) events
523
- && (state.isPointerDragging = true);
524
- if (state.enablePointerInteraction) {
525
- // update the pointer pos
526
- var offset = getOffset(state.container);
527
- state.pointerPos.x = ev.pageX - offset.left;
528
- state.pointerPos.y = ev.pageY - offset.top;
529
- }
530
- function getOffset(el) {
531
- var rect = el.getBoundingClientRect(),
532
- scrollLeft = window.pageXOffset || document.documentElement.scrollLeft,
533
- scrollTop = window.pageYOffset || document.documentElement.scrollTop;
534
- return {
535
- top: rect.top + scrollTop,
536
- left: rect.left + scrollLeft
537
- };
538
- }
539
- }, {
540
- passive: true
541
- });
542
- });
410
+ // detect point drag
411
+ !state.isPointerDragging && ev.type === 'pointermove' && (ev.pressure > 0 || state.isPointerPressed) // ev.pressure always 0 on Safari, so we used the isPointerPressed tracker
412
+ && (ev.pointerType === 'mouse' || ev.movementX === undefined || [ev.movementX, ev.movementY].some(m => Math.abs(m) > 1)) // relax drag trigger sensitivity on non-mouse (touch/pen) events
413
+ && (state.isPointerDragging = true);
414
+ if (state.enablePointerInteraction) {
415
+ // update the pointer pos
416
+ const offset = getOffset(state.container);
417
+ state.pointerPos.x = ev.pageX - offset.left;
418
+ state.pointerPos.y = ev.pageY - offset.top;
419
+ }
420
+ function getOffset(el) {
421
+ const rect = el.getBoundingClientRect(),
422
+ scrollLeft = window.pageXOffset || document.documentElement.scrollLeft,
423
+ scrollTop = window.pageYOffset || document.documentElement.scrollTop;
424
+ return {
425
+ top: rect.top + scrollTop,
426
+ left: rect.left + scrollLeft
427
+ };
428
+ }
429
+ }, {
430
+ passive: true
431
+ }));
543
432
 
544
433
  // Handle click events on objs
545
- state.container.addEventListener('pointerup', function (ev) {
434
+ state.container.addEventListener('pointerup', ev => {
546
435
  if (!state.isPointerPressed) return; // don't trigger click events if pointer is not pressed on the canvas
547
436
 
548
437
  state.isPointerPressed = false;
@@ -550,7 +439,7 @@ var threeRenderObjects = Kapsule({
550
439
  state.isPointerDragging = false;
551
440
  if (!state.clickAfterDrag) return; // don't trigger onClick after pointer drag (camera motion via controls)
552
441
  }
553
- requestAnimationFrame(function () {
442
+ requestAnimationFrame(() => {
554
443
  // trigger click events asynchronously, to allow hoverObj to be set (on frame)
555
444
  if (ev.button === 0) {
556
445
  // left-click
@@ -566,7 +455,7 @@ var threeRenderObjects = Kapsule({
566
455
  capture: true
567
456
  }); // use capture phase to prevent propagation blocking from controls (specifically for fly)
568
457
 
569
- state.container.addEventListener('contextmenu', function (ev) {
458
+ state.container.addEventListener('contextmenu', ev => {
570
459
  if (state.onRightClick) ev.preventDefault(); // prevent default contextmenu behavior and allow pointerup to fire instead
571
460
  });
572
461
 
@@ -580,7 +469,7 @@ var threeRenderObjects = Kapsule({
580
469
 
581
470
  // Setup extra renderers
582
471
  state.extraRenderers = extraRenderers;
583
- state.extraRenderers.forEach(function (r) {
472
+ state.extraRenderers.forEach(r => {
584
473
  // overlay them on top of main renderer
585
474
  r.domElement.style.position = 'absolute';
586
475
  r.domElement.style.top = '0px';
@@ -606,22 +495,20 @@ var threeRenderObjects = Kapsule({
606
495
  if (controlType === 'trackball' || controlType === 'orbit') {
607
496
  state.controls.minDistance = 0.1;
608
497
  state.controls.maxDistance = state.skyRadius;
609
- state.controls.addEventListener('start', function () {
498
+ state.controls.addEventListener('start', () => {
610
499
  state.controlsEngaged = true;
611
500
  });
612
- state.controls.addEventListener('change', function () {
501
+ state.controls.addEventListener('change', () => {
613
502
  if (state.controlsEngaged) {
614
503
  state.controlsDragging = true;
615
504
  }
616
505
  });
617
- state.controls.addEventListener('end', function () {
506
+ state.controls.addEventListener('end', () => {
618
507
  state.controlsEngaged = false;
619
508
  state.controlsDragging = false;
620
509
  });
621
510
  }
622
- [state.renderer, state.postProcessingComposer].concat(_toConsumableArray(state.extraRenderers)).forEach(function (r) {
623
- return r.setSize(state.width, state.height);
624
- });
511
+ [state.renderer, state.postProcessingComposer, ...state.extraRenderers].forEach(r => r.setSize(state.width, state.height));
625
512
  state.camera.aspect = state.width / state.height;
626
513
  state.camera.updateProjectionMatrix();
627
514
  state.camera.position.z = 1000;
@@ -632,32 +519,24 @@ var threeRenderObjects = Kapsule({
632
519
  state.loadComplete = state.scene.visible = !waitForLoadComplete;
633
520
  window.scene = state.scene;
634
521
  },
635
- update: function update(state, changedProps) {
522
+ update(state, changedProps) {
636
523
  // resize canvas
637
524
  if (state.width && state.height && (changedProps.hasOwnProperty('width') || changedProps.hasOwnProperty('height'))) {
638
- var _state$camera;
639
- var w = state.width;
640
- var h = state.height;
641
- state.container.style.width = "".concat(w, "px");
642
- state.container.style.height = "".concat(h, "px");
643
- [state.renderer, state.postProcessingComposer].concat(_toConsumableArray(state.extraRenderers)).forEach(function (r) {
644
- return r.setSize(w, h);
645
- });
525
+ const w = state.width;
526
+ const h = state.height;
527
+ state.container.style.width = `${w}px`;
528
+ state.container.style.height = `${h}px`;
529
+ [state.renderer, state.postProcessingComposer, ...state.extraRenderers].forEach(r => r.setSize(w, h));
646
530
  state.camera.aspect = w / h;
647
- var o = state.viewOffset.slice(0, 2);
648
- o.some(function (n) {
649
- return n;
650
- }) && (_state$camera = state.camera).setViewOffset.apply(_state$camera, [w, h].concat(_toConsumableArray(o), [w, h]));
531
+ const o = state.viewOffset.slice(0, 2);
532
+ o.some(n => n) && state.camera.setViewOffset(w, h, ...o, w, h);
651
533
  state.camera.updateProjectionMatrix();
652
534
  }
653
535
  if (changedProps.hasOwnProperty('viewOffset')) {
654
- var _state$camera2;
655
- var _w = state.width;
656
- var _h = state.height;
657
- var _o = state.viewOffset.slice(0, 2);
658
- _o.some(function (n) {
659
- return n;
660
- }) ? (_state$camera2 = state.camera).setViewOffset.apply(_state$camera2, [_w, _h].concat(_toConsumableArray(_o), [_w, _h])) : state.camera.clearViewOffset();
536
+ const w = state.width;
537
+ const h = state.height;
538
+ const o = state.viewOffset.slice(0, 2);
539
+ o.some(n => n) ? state.camera.setViewOffset(w, h, ...o, w, h) : state.camera.clearViewOffset();
661
540
  }
662
541
  if (changedProps.hasOwnProperty('skyRadius') && state.skyRadius) {
663
542
  state.controls.hasOwnProperty('maxDistance') && changedProps.skyRadius && (state.controls.maxDistance = Math.min(state.controls.maxDistance, state.skyRadius));
@@ -666,7 +545,7 @@ var threeRenderObjects = Kapsule({
666
545
  state.skysphere.geometry = new three.SphereGeometry(state.skyRadius);
667
546
  }
668
547
  if (changedProps.hasOwnProperty('backgroundColor')) {
669
- var alpha = parseToRgb(state.backgroundColor).alpha;
548
+ let alpha = parseToRgb(state.backgroundColor).alpha;
670
549
  if (alpha === undefined) alpha = 1;
671
550
  state.renderer.setClearColor(new three.Color(opacify(1, state.backgroundColor)), alpha);
672
551
  }
@@ -676,7 +555,7 @@ var threeRenderObjects = Kapsule({
676
555
  state.skysphere.material.map = null;
677
556
  !state.loadComplete && finishLoad();
678
557
  } else {
679
- new three.TextureLoader().load(state.backgroundImageUrl, function (texture) {
558
+ new three.TextureLoader().load(state.backgroundImageUrl, texture => {
680
559
  texture.colorSpace = three.SRGBColorSpace;
681
560
  state.skysphere.material = new three.MeshBasicMaterial({
682
561
  map: texture,
@@ -692,20 +571,12 @@ var threeRenderObjects = Kapsule({
692
571
  }
693
572
  changedProps.hasOwnProperty('showNavInfo') && (state.navInfo.style.display = state.showNavInfo ? null : 'none');
694
573
  if (changedProps.hasOwnProperty('lights')) {
695
- (changedProps.lights || []).forEach(function (light) {
696
- return state.scene.remove(light);
697
- }); // Clear the place
698
- state.lights.forEach(function (light) {
699
- return state.scene.add(light);
700
- }); // Add to scene
574
+ (changedProps.lights || []).forEach(light => state.scene.remove(light)); // Clear the place
575
+ state.lights.forEach(light => state.scene.add(light)); // Add to scene
701
576
  }
702
577
  if (changedProps.hasOwnProperty('objects')) {
703
- (changedProps.objects || []).forEach(function (obj) {
704
- return state.scene.remove(obj);
705
- }); // Clear the place
706
- state.objects.forEach(function (obj) {
707
- return state.scene.add(obj);
708
- }); // Add to scene
578
+ (changedProps.objects || []).forEach(obj => state.scene.remove(obj)); // Clear the place
579
+ state.objects.forEach(obj => state.scene.add(obj)); // Add to scene
709
580
  }
710
581
 
711
582
  //