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.
- package/dist/three-render-objects.common.js +65 -105
- package/dist/three-render-objects.d.ts +4 -1
- package/dist/three-render-objects.js +111 -123
- package/dist/three-render-objects.js.map +1 -1
- package/dist/three-render-objects.min.js +2 -2
- package/dist/three-render-objects.module.js +61 -95
- package/package.json +13 -13
|
@@ -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 =
|
|
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 ?
|
|
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
|
-
|
|
282
|
-
|
|
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;
|
|
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
|
|
274
|
+
new TWEEN.Tween(camPos).to(finalPos, transitionDuration).easing(TWEEN.Easing.Quadratic.Out).onUpdate(setCameraPos).start();
|
|
307
275
|
|
|
308
|
-
|
|
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
|
-
}
|
|
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
|
-
|
|
322
|
-
|
|
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
|
-
|
|
365
|
-
|
|
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;
|
|
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
|
-
});
|
|
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
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
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 = '';
|
|
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';
|
|
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';
|
|
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);
|
|
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);
|
|
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;
|
|
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");
|
|
506
|
-
|
|
507
|
-
state.toolTipElem.style.transform = "translate(-".concat(state.pointerPos.x / state.width * 100, "%, ").concat(
|
|
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
|
-
|
|
514
|
-
|
|
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
|
-
});
|
|
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
|
-
});
|
|
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
|
-
|
|
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
|
-
});
|
|
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;
|
|
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;
|
|
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():
|
|
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;
|