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.
- package/README.md +1 -5
- package/dist/three-render-objects.js +91 -96
- 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 → three-render-objects.mjs} +0 -0
- package/package.json +20 -14
- package/dist/three-render-objects.common.js +0 -657
|
@@ -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;
|