three-render-objects 1.27.8 → 1.28.1

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