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