three-render-objects 1.27.4 → 1.27.6

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.
@@ -11,24 +11,15 @@ var TWEEN = require('@tweenjs/tween.js');
11
11
  var accessorFn = require('accessor-fn');
12
12
  var Kapsule = require('kapsule');
13
13
 
14
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
15
-
16
- var TWEEN__default = /*#__PURE__*/_interopDefaultLegacy(TWEEN);
17
- var accessorFn__default = /*#__PURE__*/_interopDefaultLegacy(accessorFn);
18
- var Kapsule__default = /*#__PURE__*/_interopDefaultLegacy(Kapsule);
19
-
20
14
  function styleInject(css, ref) {
21
15
  if (ref === void 0) ref = {};
22
16
  var insertAt = ref.insertAt;
23
-
24
17
  if (!css || typeof document === 'undefined') {
25
18
  return;
26
19
  }
27
-
28
20
  var head = document.head || document.getElementsByTagName('head')[0];
29
21
  var style = document.createElement('style');
30
22
  style.type = 'text/css';
31
-
32
23
  if (insertAt === 'top') {
33
24
  if (head.firstChild) {
34
25
  head.insertBefore(style, head.firstChild);
@@ -38,7 +29,6 @@ function styleInject(css, ref) {
38
29
  } else {
39
30
  head.appendChild(style);
40
31
  }
41
-
42
32
  if (style.styleSheet) {
43
33
  style.styleSheet.cssText = css;
44
34
  } else {
@@ -60,44 +50,33 @@ function _defineProperty(obj, key, value) {
60
50
  } else {
61
51
  obj[key] = value;
62
52
  }
63
-
64
53
  return obj;
65
54
  }
66
-
67
55
  function _slicedToArray(arr, i) {
68
56
  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
69
57
  }
70
-
71
58
  function _toConsumableArray(arr) {
72
59
  return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
73
60
  }
74
-
75
61
  function _arrayWithoutHoles(arr) {
76
62
  if (Array.isArray(arr)) return _arrayLikeToArray(arr);
77
63
  }
78
-
79
64
  function _arrayWithHoles(arr) {
80
65
  if (Array.isArray(arr)) return arr;
81
66
  }
82
-
83
67
  function _iterableToArray(iter) {
84
68
  if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
85
69
  }
86
-
87
70
  function _iterableToArrayLimit(arr, i) {
88
71
  var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
89
-
90
72
  if (_i == null) return;
91
73
  var _arr = [];
92
74
  var _n = true;
93
75
  var _d = false;
94
-
95
76
  var _s, _e;
96
-
97
77
  try {
98
78
  for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {
99
79
  _arr.push(_s.value);
100
-
101
80
  if (i && _arr.length === i) break;
102
81
  }
103
82
  } catch (err) {
@@ -110,10 +89,8 @@ function _iterableToArrayLimit(arr, i) {
110
89
  if (_d) throw _e;
111
90
  }
112
91
  }
113
-
114
92
  return _arr;
115
93
  }
116
-
117
94
  function _unsupportedIterableToArray(o, minLen) {
118
95
  if (!o) return;
119
96
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);
@@ -122,19 +99,14 @@ function _unsupportedIterableToArray(o, minLen) {
122
99
  if (n === "Map" || n === "Set") return Array.from(o);
123
100
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
124
101
  }
125
-
126
102
  function _arrayLikeToArray(arr, len) {
127
103
  if (len == null || len > arr.length) len = arr.length;
128
-
129
104
  for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
130
-
131
105
  return arr2;
132
106
  }
133
-
134
107
  function _nonIterableSpread() {
135
108
  throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
136
109
  }
137
-
138
110
  function _nonIterableRest() {
139
111
  throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
140
112
  }
@@ -160,7 +132,7 @@ var three = window.THREE ? window.THREE // Prefer consumption from global THREE,
160
132
  Spherical: three$1.Spherical,
161
133
  Clock: three$1.Clock
162
134
  };
163
- var threeRenderObjects = Kapsule__default["default"]({
135
+ var threeRenderObjects = Kapsule({
164
136
  props: {
165
137
  width: {
166
138
  "default": window.innerWidth,
@@ -248,11 +220,9 @@ var threeRenderObjects = Kapsule__default["default"]({
248
220
  state.extraRenderers.forEach(function (r) {
249
221
  return r.render(state.scene, state.camera);
250
222
  });
251
-
252
223
  if (state.enablePointerInteraction) {
253
224
  // Update tooltip and trigger onHover events
254
225
  var topObject = null;
255
-
256
226
  if (state.hoverDuringDrag || !state.isPointerDragging) {
257
227
  var intersects = this.intersectingObjects(state.pointerPos.x, state.pointerPos.y).filter(function (d) {
258
228
  return state.hoverFilter(d.object);
@@ -263,31 +233,30 @@ var threeRenderObjects = Kapsule__default["default"]({
263
233
  topObject = topIntersect ? topIntersect.object : null;
264
234
  state.intersectionPoint = topIntersect ? topIntersect.point : null;
265
235
  }
266
-
267
236
  if (topObject !== state.hoverObj) {
268
237
  state.onHover(topObject, state.hoverObj);
269
- state.toolTipElem.innerHTML = topObject ? accessorFn__default["default"](state.tooltipContent)(topObject) || '' : '';
238
+ state.toolTipElem.innerHTML = topObject ? accessorFn(state.tooltipContent)(topObject) || '' : '';
270
239
  state.hoverObj = topObject;
271
240
  }
272
241
  }
273
-
274
- TWEEN__default["default"].update(); // update camera animation tweens
242
+ TWEEN.update(); // update camera animation tweens
275
243
  }
276
244
 
277
245
  return this;
278
246
  },
279
247
  getPointerPos: function getPointerPos(state) {
280
248
  var _state$pointerPos = state.pointerPos,
281
- x = _state$pointerPos.x,
282
- y = _state$pointerPos.y;
249
+ x = _state$pointerPos.x,
250
+ y = _state$pointerPos.y;
283
251
  return {
284
252
  x: x,
285
253
  y: y
286
254
  };
287
255
  },
288
256
  cameraPosition: function cameraPosition(state, position, lookAt, transitionDuration) {
289
- var camera = state.camera; // Setter
257
+ var camera = state.camera;
290
258
 
259
+ // Setter
291
260
  if (position && state.initialised) {
292
261
  var finalPos = position;
293
262
  var finalLookAt = lookAt || {
@@ -295,7 +264,6 @@ var threeRenderObjects = Kapsule__default["default"]({
295
264
  y: 0,
296
265
  z: 0
297
266
  };
298
-
299
267
  if (!transitionDuration) {
300
268
  // no animation
301
269
  setCameraPos(finalPos);
@@ -303,31 +271,31 @@ var threeRenderObjects = Kapsule__default["default"]({
303
271
  } else {
304
272
  var camPos = Object.assign({}, camera.position);
305
273
  var camLookAt = getLookAt();
306
- new TWEEN__default["default"].Tween(camPos).to(finalPos, transitionDuration).easing(TWEEN__default["default"].Easing.Quadratic.Out).onUpdate(setCameraPos).start(); // Face direction in 1/3rd of time
274
+ new TWEEN.Tween(camPos).to(finalPos, transitionDuration).easing(TWEEN.Easing.Quadratic.Out).onUpdate(setCameraPos).start();
307
275
 
308
- new TWEEN__default["default"].Tween(camLookAt).to(finalLookAt, transitionDuration / 3).easing(TWEEN__default["default"].Easing.Quadratic.Out).onUpdate(setLookAt).start();
276
+ // Face direction in 1/3rd of time
277
+ new TWEEN.Tween(camLookAt).to(finalLookAt, transitionDuration / 3).easing(TWEEN.Easing.Quadratic.Out).onUpdate(setLookAt).start();
309
278
  }
310
-
311
279
  return this;
312
- } // Getter
313
-
280
+ }
314
281
 
282
+ // Getter
315
283
  return Object.assign({}, camera.position, {
316
284
  lookAt: getLookAt()
317
- }); //
285
+ });
286
+
287
+ //
318
288
 
319
289
  function setCameraPos(pos) {
320
290
  var x = pos.x,
321
- y = pos.y,
322
- z = pos.z;
291
+ y = pos.y,
292
+ z = pos.z;
323
293
  if (x !== undefined) camera.position.x = x;
324
294
  if (y !== undefined) camera.position.y = y;
325
295
  if (z !== undefined) camera.position.z = z;
326
296
  }
327
-
328
297
  function setLookAt(lookAt) {
329
298
  var lookAtVect = new three.Vector3(lookAt.x, lookAt.y, lookAt.z);
330
-
331
299
  if (state.controls.target) {
332
300
  state.controls.target = lookAtVect;
333
301
  } else {
@@ -343,11 +311,9 @@ var threeRenderObjects = Kapsule__default["default"]({
343
311
  zoomToFit: function zoomToFit(state) {
344
312
  var transitionDuration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
345
313
  var padding = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 10;
346
-
347
314
  for (var _len = arguments.length, bboxArgs = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {
348
315
  bboxArgs[_key - 3] = arguments[_key];
349
316
  }
350
-
351
317
  return this.fitToBbox(this.getBbox.apply(this, bboxArgs), transitionDuration, padding);
352
318
  },
353
319
  fitToBbox: function fitToBbox(state, bbox) {
@@ -355,31 +321,27 @@ var threeRenderObjects = Kapsule__default["default"]({
355
321
  var padding = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 10;
356
322
  // based on https://discourse.threejs.org/t/camera-zoom-to-fit-object/936/24
357
323
  var camera = state.camera;
358
-
359
324
  if (bbox) {
360
325
  var center = new three.Vector3(0, 0, 0); // reset camera aim to center
361
-
362
326
  var maxBoxSide = Math.max.apply(Math, _toConsumableArray(Object.entries(bbox).map(function (_ref) {
363
327
  var _ref2 = _slicedToArray(_ref, 2),
364
- coordType = _ref2[0],
365
- coords = _ref2[1];
366
-
328
+ coordType = _ref2[0],
329
+ coords = _ref2[1];
367
330
  return Math.max.apply(Math, _toConsumableArray(coords.map(function (c) {
368
331
  return Math.abs(center[coordType] - c);
369
332
  })));
370
- }))) * 2; // find distance that fits whole bbox within padded fov
333
+ }))) * 2;
371
334
 
335
+ // find distance that fits whole bbox within padded fov
372
336
  var paddedFov = (1 - padding * 2 / state.height) * camera.fov;
373
337
  var fitHeightDistance = maxBoxSide / Math.atan(paddedFov * Math.PI / 180);
374
338
  var fitWidthDistance = fitHeightDistance / camera.aspect;
375
339
  var distance = Math.max(fitHeightDistance, fitWidthDistance);
376
-
377
340
  if (distance > 0) {
378
341
  var newCameraPosition = center.clone().sub(camera.position).normalize().multiplyScalar(-distance);
379
342
  this.cameraPosition(newCameraPosition, center, transitionDuration);
380
343
  }
381
344
  }
382
-
383
345
  return this;
384
346
  },
385
347
  getBbox: function getBbox(state) {
@@ -391,8 +353,9 @@ var threeRenderObjects = Kapsule__default["default"]({
391
353
  if (!objs.length) return null;
392
354
  objs.forEach(function (obj) {
393
355
  return box.expandByObject(obj);
394
- }); // extract global x,y,z min/max
356
+ });
395
357
 
358
+ // extract global x,y,z min/max
396
359
  return Object.assign.apply(Object, _toConsumableArray(['x', 'y', 'z'].map(function (c) {
397
360
  return _defineProperty({}, c, [box.min[c], box.max[c]]);
398
361
  })));
@@ -400,7 +363,6 @@ var threeRenderObjects = Kapsule__default["default"]({
400
363
  getScreenCoords: function getScreenCoords(state, x, y, z) {
401
364
  var vec = new three.Vector3(x, y, z);
402
365
  vec.project(this.camera()); // project to the camera plane
403
-
404
366
  return {
405
367
  // align relative pos to canvas dimensions
406
368
  x: (vec.x + 1) * state.width / 2,
@@ -418,7 +380,6 @@ var threeRenderObjects = Kapsule__default["default"]({
418
380
  var relCoords = new three.Vector2(x / state.width * 2 - 1, -(y / state.height) * 2 + 1);
419
381
  var raycaster = new three.Raycaster();
420
382
  raycaster.params.Line.threshold = state.lineHoverPrecision; // set linePrecision
421
-
422
383
  raycaster.setFromCamera(relCoords, state.camera);
423
384
  return raycaster.intersectObjects(state.objects, true);
424
385
  },
@@ -440,8 +401,8 @@ var threeRenderObjects = Kapsule__default["default"]({
440
401
  tbControls: function tbControls(state) {
441
402
  return state.controls;
442
403
  } // to be deprecated
443
-
444
404
  },
405
+
445
406
  stateInit: function stateInit() {
446
407
  return {
447
408
  scene: new three.Scene(),
@@ -451,22 +412,23 @@ var threeRenderObjects = Kapsule__default["default"]({
451
412
  },
452
413
  init: function init(domNode, state) {
453
414
  var _ref4 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
454
- _ref4$controlType = _ref4.controlType,
455
- controlType = _ref4$controlType === void 0 ? 'trackball' : _ref4$controlType,
456
- _ref4$rendererConfig = _ref4.rendererConfig,
457
- rendererConfig = _ref4$rendererConfig === void 0 ? {} : _ref4$rendererConfig,
458
- _ref4$extraRenderers = _ref4.extraRenderers,
459
- extraRenderers = _ref4$extraRenderers === void 0 ? [] : _ref4$extraRenderers,
460
- _ref4$waitForLoadComp = _ref4.waitForLoadComplete,
461
- waitForLoadComplete = _ref4$waitForLoadComp === void 0 ? true : _ref4$waitForLoadComp;
462
-
415
+ _ref4$controlType = _ref4.controlType,
416
+ controlType = _ref4$controlType === void 0 ? 'trackball' : _ref4$controlType,
417
+ _ref4$rendererConfig = _ref4.rendererConfig,
418
+ rendererConfig = _ref4$rendererConfig === void 0 ? {} : _ref4$rendererConfig,
419
+ _ref4$extraRenderers = _ref4.extraRenderers,
420
+ extraRenderers = _ref4$extraRenderers === void 0 ? [] : _ref4$extraRenderers,
421
+ _ref4$waitForLoadComp = _ref4.waitForLoadComplete,
422
+ waitForLoadComplete = _ref4$waitForLoadComp === void 0 ? true : _ref4$waitForLoadComp;
463
423
  // Wipe DOM
464
- domNode.innerHTML = ''; // Add relative container
424
+ domNode.innerHTML = '';
465
425
 
426
+ // Add relative container
466
427
  domNode.appendChild(state.container = document.createElement('div'));
467
428
  state.container.className = 'scene-container';
468
- state.container.style.position = 'relative'; // Add nav info section
429
+ state.container.style.position = 'relative';
469
430
 
431
+ // Add nav info section
470
432
  state.container.appendChild(state.navInfo = document.createElement('div'));
471
433
  state.navInfo.className = 'scene-nav-info';
472
434
  state.navInfo.textContent = {
@@ -474,44 +436,46 @@ var threeRenderObjects = Kapsule__default["default"]({
474
436
  trackball: 'Left-click: rotate, Mouse-wheel/middle-click: zoom, Right-click: pan',
475
437
  fly: 'WASD: move, R|F: up | down, Q|E: roll, up|down: pitch, left|right: yaw'
476
438
  }[controlType] || '';
477
- state.navInfo.style.display = state.showNavInfo ? null : 'none'; // Setup tooltip
439
+ state.navInfo.style.display = state.showNavInfo ? null : 'none';
478
440
 
441
+ // Setup tooltip
479
442
  state.toolTipElem = document.createElement('div');
480
443
  state.toolTipElem.classList.add('scene-tooltip');
481
- state.container.appendChild(state.toolTipElem); // Capture pointer coords on move or touchstart
444
+ state.container.appendChild(state.toolTipElem);
482
445
 
446
+ // Capture pointer coords on move or touchstart
483
447
  state.pointerPos = new three.Vector2();
484
448
  state.pointerPos.x = -2; // Initialize off canvas
485
-
486
449
  state.pointerPos.y = -2;
487
450
  ['pointermove', 'pointerdown'].forEach(function (evType) {
488
451
  return state.container.addEventListener(evType, function (ev) {
489
452
  // track click state
490
- evType === 'pointerdown' && (state.isPointerPressed = true); // detect point drag
453
+ evType === 'pointerdown' && (state.isPointerPressed = true);
491
454
 
455
+ // detect point drag
492
456
  !state.isPointerDragging && ev.type === 'pointermove' && (ev.pressure > 0 || state.isPointerPressed) // ev.pressure always 0 on Safari, so we used the isPointerPressed tracker
493
457
  && (ev.pointerType !== 'touch' || ev.movementX === undefined || [ev.movementX, ev.movementY].some(function (m) {
494
458
  return Math.abs(m) > 1;
495
459
  })) // relax drag trigger sensitivity on touch events
496
460
  && (state.isPointerDragging = true);
497
-
498
461
  if (state.enablePointerInteraction) {
499
462
  // update the pointer pos
500
463
  var offset = getOffset(state.container);
501
464
  state.pointerPos.x = ev.pageX - offset.left;
502
- state.pointerPos.y = ev.pageY - offset.top; // Move tooltip
465
+ state.pointerPos.y = ev.pageY - offset.top;
503
466
 
467
+ // Move tooltip
504
468
  state.toolTipElem.style.top = "".concat(state.pointerPos.y, "px");
505
- state.toolTipElem.style.left = "".concat(state.pointerPos.x, "px"); // adjust horizontal position to not exceed canvas boundaries
506
-
507
- state.toolTipElem.style.transform = "translate(-".concat(state.pointerPos.x / state.width * 100, "%, ").concat( // flip to above if near bottom
469
+ state.toolTipElem.style.left = "".concat(state.pointerPos.x, "px");
470
+ // adjust horizontal position to not exceed canvas boundaries
471
+ state.toolTipElem.style.transform = "translate(-".concat(state.pointerPos.x / state.width * 100, "%, ").concat(
472
+ // flip to above if near bottom
508
473
  state.height - state.pointerPos.y < 100 ? 'calc(-100% - 8px)' : '21px', ")");
509
474
  }
510
-
511
475
  function getOffset(el) {
512
476
  var rect = el.getBoundingClientRect(),
513
- scrollLeft = window.pageXOffset || document.documentElement.scrollLeft,
514
- scrollTop = window.pageYOffset || document.documentElement.scrollTop;
477
+ scrollLeft = window.pageXOffset || document.documentElement.scrollLeft,
478
+ scrollTop = window.pageYOffset || document.documentElement.scrollTop;
515
479
  return {
516
480
  top: rect.top + scrollTop,
517
481
  left: rect.left + scrollLeft
@@ -520,11 +484,11 @@ var threeRenderObjects = Kapsule__default["default"]({
520
484
  }, {
521
485
  passive: true
522
486
  });
523
- }); // Handle click events on objs
487
+ });
524
488
 
489
+ // Handle click events on objs
525
490
  state.container.addEventListener('pointerup', function (ev) {
526
491
  state.isPointerPressed = false;
527
-
528
492
  if (state.isPointerDragging) {
529
493
  state.isPointerDragging = false;
530
494
  if (!state.clickAfterDrag) return; // don't trigger onClick after pointer drag (camera motion via controls)
@@ -549,16 +513,17 @@ var threeRenderObjects = Kapsule__default["default"]({
549
513
 
550
514
  state.container.addEventListener('contextmenu', function (ev) {
551
515
  if (state.onRightClick) ev.preventDefault(); // prevent default contextmenu behavior and allow pointerup to fire instead
552
- }); // Setup renderer, camera and controls
516
+ });
553
517
 
518
+ // Setup renderer, camera and controls
554
519
  state.renderer = new three.WebGLRenderer(Object.assign({
555
520
  antialias: true,
556
521
  alpha: true
557
522
  }, rendererConfig));
558
523
  state.renderer.setPixelRatio(Math.min(2, window.devicePixelRatio)); // clamp device pixel ratio
524
+ state.container.appendChild(state.renderer.domElement);
559
525
 
560
- state.container.appendChild(state.renderer.domElement); // Setup extra renderers
561
-
526
+ // Setup extra renderers
562
527
  state.extraRenderers = extraRenderers;
563
528
  state.extraRenderers.forEach(function (r) {
564
529
  // overlay them on top of main renderer
@@ -566,24 +531,23 @@ var threeRenderObjects = Kapsule__default["default"]({
566
531
  r.domElement.style.top = '0px';
567
532
  r.domElement.style.pointerEvents = 'none';
568
533
  state.container.appendChild(r.domElement);
569
- }); // configure post-processing composer
534
+ });
570
535
 
536
+ // configure post-processing composer
571
537
  state.postProcessingComposer = new EffectComposer_js.EffectComposer(state.renderer);
572
538
  state.postProcessingComposer.addPass(new RenderPass_js.RenderPass(state.scene, state.camera)); // render scene as first pass
573
- // configure controls
574
539
 
540
+ // configure controls
575
541
  state.controls = new {
576
542
  trackball: TrackballControls_js.TrackballControls,
577
543
  orbit: OrbitControls_js.OrbitControls,
578
544
  fly: FlyControls_js.FlyControls
579
545
  }[controlType](state.camera, state.renderer.domElement);
580
-
581
546
  if (controlType === 'fly') {
582
547
  state.controls.movementSpeed = 300;
583
548
  state.controls.rollSpeed = Math.PI / 6;
584
549
  state.controls.dragToLook = true;
585
550
  }
586
-
587
551
  if (controlType === 'trackball' || controlType === 'orbit') {
588
552
  state.controls.minDistance = 0.1;
589
553
  state.controls.maxDistance = state.skyRadius;
@@ -600,14 +564,14 @@ var threeRenderObjects = Kapsule__default["default"]({
600
564
  state.controlsDragging = false;
601
565
  });
602
566
  }
603
-
604
567
  [state.renderer, state.postProcessingComposer].concat(_toConsumableArray(state.extraRenderers)).forEach(function (r) {
605
568
  return r.setSize(state.width, state.height);
606
569
  });
607
570
  state.camera.aspect = state.width / state.height;
608
571
  state.camera.updateProjectionMatrix();
609
- state.camera.position.z = 1000; // add sky
572
+ state.camera.position.z = 1000;
610
573
 
574
+ // add sky
611
575
  state.scene.add(state.skysphere = new three.Mesh());
612
576
  state.skysphere.visible = false;
613
577
  state.loadComplete = state.scene.visible = !waitForLoadComplete;
@@ -624,20 +588,17 @@ var threeRenderObjects = Kapsule__default["default"]({
624
588
  state.camera.aspect = state.width / state.height;
625
589
  state.camera.updateProjectionMatrix();
626
590
  }
627
-
628
591
  if (changedProps.hasOwnProperty('skyRadius') && state.skyRadius) {
629
592
  state.controls.hasOwnProperty('maxDistance') && changedProps.skyRadius && (state.controls.maxDistance = Math.min(state.controls.maxDistance, state.skyRadius));
630
593
  state.camera.far = state.skyRadius * 2.5;
631
594
  state.camera.updateProjectionMatrix();
632
595
  state.skysphere.geometry = new three.SphereGeometry(state.skyRadius);
633
596
  }
634
-
635
597
  if (changedProps.hasOwnProperty('backgroundColor')) {
636
598
  var alpha = polished.parseToRgb(state.backgroundColor).alpha;
637
599
  if (alpha === undefined) alpha = 1;
638
600
  state.renderer.setClearColor(new three.Color(polished.opacify(1, state.backgroundColor)), alpha);
639
601
  }
640
-
641
602
  if (changedProps.hasOwnProperty('backgroundImageUrl')) {
642
603
  if (!state.backgroundImageUrl) {
643
604
  state.skysphere.visible = false;
@@ -649,26 +610,25 @@ var threeRenderObjects = Kapsule__default["default"]({
649
610
  map: texture,
650
611
  side: three.BackSide
651
612
  });
652
- state.skysphere.visible = true; // triggered when background image finishes loading (asynchronously to allow 1 frame to load texture)
613
+ state.skysphere.visible = true;
653
614
 
615
+ // triggered when background image finishes loading (asynchronously to allow 1 frame to load texture)
654
616
  state.onBackgroundImageLoaded && setTimeout(state.onBackgroundImageLoaded);
655
617
  !state.loadComplete && finishLoad();
656
618
  });
657
619
  }
658
620
  }
659
-
660
621
  changedProps.hasOwnProperty('showNavInfo') && (state.navInfo.style.display = state.showNavInfo ? null : 'none');
661
-
662
622
  if (changedProps.hasOwnProperty('objects')) {
663
623
  (changedProps.objects || []).forEach(function (obj) {
664
624
  return state.scene.remove(obj);
665
625
  }); // Clear the place
666
-
667
626
  state.objects.forEach(function (obj) {
668
627
  return state.scene.add(obj);
669
628
  }); // Add to scene
670
- } //
629
+ }
671
630
 
631
+ //
672
632
 
673
633
  function finishLoad() {
674
634
  state.loadComplete = state.scene.visible = true;
@@ -1,4 +1,7 @@
1
1
  import { WebGLRendererParameters, Renderer, Object3D, WebGLRenderer, Scene, Camera, Intersection } from 'three';
2
+ import { TrackballControls } from 'three/examples/jsm/controls/TrackballControls.js';
3
+ import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
4
+ import { FlyControls } from 'three/examples/jsm/controls/FlyControls.js';
2
5
  import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js';
3
6
 
4
7
  interface ConfigOptions {
@@ -48,7 +51,7 @@ interface ThreeRenderObjectsGenericInstance<ChainableInstance> {
48
51
  renderer(): WebGLRenderer;
49
52
  scene(): Scene;
50
53
  camera(): Camera;
51
- controls(): object;
54
+ controls(): TrackballControls | OrbitControls | FlyControls;
52
55
 
53
56
  // Interaction
54
57
  onClick(callback: (obj: object | null, event: MouseEvent, intersectionPoint: { x: number, y: number, z: number }) => void): ChainableInstance;