three-render-objects 1.41.1 → 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 +30698 -23665
- package/dist/three-render-objects.js.map +1 -1
- package/dist/three-render-objects.min.js +2 -2
- package/dist/three-render-objects.mjs +197 -326
- 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,39 +206,46 @@ 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
|
-
|
|
224
|
+
const finalPos = position;
|
|
225
|
+
const finalLookAt = lookAt || {
|
|
313
226
|
x: 0,
|
|
314
227
|
y: 0,
|
|
315
228
|
z: 0
|
|
316
229
|
};
|
|
230
|
+
|
|
231
|
+
// cancel any ongoing pov animation
|
|
232
|
+
state.povPosTween?.end();
|
|
233
|
+
state.povTgtTween?.end();
|
|
317
234
|
if (!transitionDuration) {
|
|
318
235
|
// no animation
|
|
319
236
|
setCameraPos(finalPos);
|
|
320
237
|
setLookAt(finalLookAt);
|
|
321
238
|
} else {
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
state.tweenGroup.add(new Tween(camPos).to(finalPos, transitionDuration).easing(Easing.Quadratic.Out).onUpdate(setCameraPos).onComplete(function () {
|
|
239
|
+
const camPos = Object.assign({}, camera.position);
|
|
240
|
+
const camLookAt = getLookAt();
|
|
241
|
+
state.tweenGroup.add(state.povPosTween = new Tween(camPos).to(finalPos, transitionDuration).easing(Easing.Quadratic.Out).onUpdate(setCameraPos).onComplete(function () {
|
|
242
|
+
state.povPosTween = undefined;
|
|
325
243
|
state.tweenGroup.remove(this);
|
|
326
244
|
}).start());
|
|
327
245
|
|
|
328
246
|
// Face direction in 1/3rd of time
|
|
329
|
-
state.tweenGroup.add(new Tween(camLookAt).to(finalLookAt, transitionDuration / 3).easing(Easing.Quadratic.Out).onUpdate(setLookAt).onComplete(function () {
|
|
247
|
+
state.tweenGroup.add(state.povTgtTween = new Tween(camLookAt).to(finalLookAt, transitionDuration / 3).easing(Easing.Quadratic.Out).onUpdate(setLookAt).onComplete(function () {
|
|
248
|
+
state.povTgtTween = undefined;
|
|
330
249
|
state.tweenGroup.remove(this);
|
|
331
250
|
}).start());
|
|
332
251
|
}
|
|
@@ -341,15 +260,17 @@ var threeRenderObjects = Kapsule({
|
|
|
341
260
|
//
|
|
342
261
|
|
|
343
262
|
function setCameraPos(pos) {
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
263
|
+
const {
|
|
264
|
+
x,
|
|
265
|
+
y,
|
|
266
|
+
z
|
|
267
|
+
} = pos;
|
|
347
268
|
if (x !== undefined) camera.position.x = x;
|
|
348
269
|
if (y !== undefined) camera.position.y = y;
|
|
349
270
|
if (z !== undefined) camera.position.z = z;
|
|
350
271
|
}
|
|
351
272
|
function setLookAt(lookAt) {
|
|
352
|
-
|
|
273
|
+
const lookAtVect = new three.Vector3(lookAt.x, lookAt.y, lookAt.z);
|
|
353
274
|
if (state.controls.enabled && state.controls.target) {
|
|
354
275
|
state.controls.target = lookAtVect;
|
|
355
276
|
} else {
|
|
@@ -361,60 +282,53 @@ var threeRenderObjects = Kapsule({
|
|
|
361
282
|
return Object.assign(new three.Vector3(0, 0, -1e3).applyQuaternion(camera.quaternion).add(camera.position));
|
|
362
283
|
}
|
|
363
284
|
},
|
|
364
|
-
zoomToFit: function
|
|
365
|
-
|
|
366
|
-
var padding = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 10;
|
|
367
|
-
for (var _len = arguments.length, bboxArgs = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {
|
|
368
|
-
bboxArgs[_key - 3] = arguments[_key];
|
|
369
|
-
}
|
|
370
|
-
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);
|
|
371
287
|
},
|
|
372
|
-
fitToBbox: function
|
|
373
|
-
|
|
374
|
-
var padding = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 10;
|
|
375
|
-
// based on https://discourse.threejs.org/t/camera-zoom-to-fit-object/936/24
|
|
376
|
-
var camera = state.camera;
|
|
288
|
+
fitToBbox: function (state, bbox, transitionDuration = 0, padding = 10, preserveLookDirection = false) {
|
|
289
|
+
const camera = state.camera;
|
|
377
290
|
if (bbox) {
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
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);
|
|
397
316
|
}
|
|
398
317
|
return this;
|
|
399
318
|
},
|
|
400
|
-
getBbox: function
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
};
|
|
404
|
-
var box = new three.Box3(new three.Vector3(0, 0, 0), new three.Vector3(0, 0, 0));
|
|
405
|
-
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);
|
|
406
322
|
if (!objs.length) return null;
|
|
407
|
-
objs.forEach(
|
|
408
|
-
return box.expandByObject(obj);
|
|
409
|
-
});
|
|
323
|
+
objs.forEach(obj => box.expandByObject(obj));
|
|
410
324
|
|
|
411
325
|
// extract global x,y,z min/max
|
|
412
|
-
return Object.assign
|
|
413
|
-
|
|
326
|
+
return Object.assign(...['x', 'y', 'z'].map(c => ({
|
|
327
|
+
[c]: [box.min[c], box.max[c]]
|
|
414
328
|
})));
|
|
415
329
|
},
|
|
416
|
-
getScreenCoords: function
|
|
417
|
-
|
|
330
|
+
getScreenCoords: function (state, x, y, z) {
|
|
331
|
+
const vec = new three.Vector3(x, y, z);
|
|
418
332
|
vec.project(this.camera()); // project to the camera plane
|
|
419
333
|
return {
|
|
420
334
|
// align relative pos to canvas dimensions
|
|
@@ -422,69 +336,48 @@ var threeRenderObjects = Kapsule({
|
|
|
422
336
|
y: -(vec.y - 1) * state.height / 2
|
|
423
337
|
};
|
|
424
338
|
},
|
|
425
|
-
getSceneCoords: function
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
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();
|
|
429
342
|
raycaster.setFromCamera(relCoords, state.camera);
|
|
430
343
|
return Object.assign({}, raycaster.ray.at(distance, new three.Vector3()));
|
|
431
344
|
},
|
|
432
|
-
intersectingObjects: function
|
|
433
|
-
|
|
434
|
-
|
|
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();
|
|
435
348
|
raycaster.params.Line.threshold = state.lineHoverPrecision; // set linePrecision
|
|
436
349
|
raycaster.params.Points.threshold = state.pointsHoverPrecision; // set pointsPrecision
|
|
437
350
|
raycaster.setFromCamera(relCoords, state.camera);
|
|
438
351
|
return raycaster.intersectObjects(state.objects, true);
|
|
439
352
|
},
|
|
440
|
-
renderer:
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
camera: function camera(state) {
|
|
447
|
-
return state.camera;
|
|
448
|
-
},
|
|
449
|
-
postProcessingComposer: function postProcessingComposer(state) {
|
|
450
|
-
return state.postProcessingComposer;
|
|
451
|
-
},
|
|
452
|
-
controls: function controls(state) {
|
|
453
|
-
return state.controls;
|
|
454
|
-
},
|
|
455
|
-
tbControls: function tbControls(state) {
|
|
456
|
-
return state.controls;
|
|
457
|
-
},
|
|
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,
|
|
458
359
|
// to be deprecated
|
|
459
|
-
_destructor: function
|
|
460
|
-
var _state$controls, _state$renderer, _state$postProcessing;
|
|
360
|
+
_destructor: function (state) {
|
|
461
361
|
emptyObject(state.scene);
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
362
|
+
state.controls?.dispose();
|
|
363
|
+
state.renderer?.dispose();
|
|
364
|
+
state.postProcessingComposer?.dispose();
|
|
465
365
|
}
|
|
466
366
|
},
|
|
467
|
-
stateInit:
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
useWebGPU = _ref4$useWebGPU === void 0 ? false : _ref4$useWebGPU,
|
|
482
|
-
_ref4$rendererConfig = _ref4.rendererConfig,
|
|
483
|
-
rendererConfig = _ref4$rendererConfig === void 0 ? {} : _ref4$rendererConfig,
|
|
484
|
-
_ref4$extraRenderers = _ref4.extraRenderers,
|
|
485
|
-
extraRenderers = _ref4$extraRenderers === void 0 ? [] : _ref4$extraRenderers,
|
|
486
|
-
_ref4$waitForLoadComp = _ref4.waitForLoadComplete,
|
|
487
|
-
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
|
+
} = {}) {
|
|
488
381
|
// Wipe DOM
|
|
489
382
|
domNode.innerHTML = '';
|
|
490
383
|
|
|
@@ -510,39 +403,35 @@ var threeRenderObjects = Kapsule({
|
|
|
510
403
|
state.pointerPos = new three.Vector2();
|
|
511
404
|
state.pointerPos.x = -2; // Initialize off canvas
|
|
512
405
|
state.pointerPos.y = -2;
|
|
513
|
-
['pointermove', 'pointerdown'].forEach(
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
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);
|
|
517
409
|
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
passive: true
|
|
541
|
-
});
|
|
542
|
-
});
|
|
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
|
+
}));
|
|
543
432
|
|
|
544
433
|
// Handle click events on objs
|
|
545
|
-
state.container.addEventListener('pointerup',
|
|
434
|
+
state.container.addEventListener('pointerup', ev => {
|
|
546
435
|
if (!state.isPointerPressed) return; // don't trigger click events if pointer is not pressed on the canvas
|
|
547
436
|
|
|
548
437
|
state.isPointerPressed = false;
|
|
@@ -550,7 +439,7 @@ var threeRenderObjects = Kapsule({
|
|
|
550
439
|
state.isPointerDragging = false;
|
|
551
440
|
if (!state.clickAfterDrag) return; // don't trigger onClick after pointer drag (camera motion via controls)
|
|
552
441
|
}
|
|
553
|
-
requestAnimationFrame(
|
|
442
|
+
requestAnimationFrame(() => {
|
|
554
443
|
// trigger click events asynchronously, to allow hoverObj to be set (on frame)
|
|
555
444
|
if (ev.button === 0) {
|
|
556
445
|
// left-click
|
|
@@ -566,7 +455,7 @@ var threeRenderObjects = Kapsule({
|
|
|
566
455
|
capture: true
|
|
567
456
|
}); // use capture phase to prevent propagation blocking from controls (specifically for fly)
|
|
568
457
|
|
|
569
|
-
state.container.addEventListener('contextmenu',
|
|
458
|
+
state.container.addEventListener('contextmenu', ev => {
|
|
570
459
|
if (state.onRightClick) ev.preventDefault(); // prevent default contextmenu behavior and allow pointerup to fire instead
|
|
571
460
|
});
|
|
572
461
|
|
|
@@ -580,7 +469,7 @@ var threeRenderObjects = Kapsule({
|
|
|
580
469
|
|
|
581
470
|
// Setup extra renderers
|
|
582
471
|
state.extraRenderers = extraRenderers;
|
|
583
|
-
state.extraRenderers.forEach(
|
|
472
|
+
state.extraRenderers.forEach(r => {
|
|
584
473
|
// overlay them on top of main renderer
|
|
585
474
|
r.domElement.style.position = 'absolute';
|
|
586
475
|
r.domElement.style.top = '0px';
|
|
@@ -606,22 +495,20 @@ var threeRenderObjects = Kapsule({
|
|
|
606
495
|
if (controlType === 'trackball' || controlType === 'orbit') {
|
|
607
496
|
state.controls.minDistance = 0.1;
|
|
608
497
|
state.controls.maxDistance = state.skyRadius;
|
|
609
|
-
state.controls.addEventListener('start',
|
|
498
|
+
state.controls.addEventListener('start', () => {
|
|
610
499
|
state.controlsEngaged = true;
|
|
611
500
|
});
|
|
612
|
-
state.controls.addEventListener('change',
|
|
501
|
+
state.controls.addEventListener('change', () => {
|
|
613
502
|
if (state.controlsEngaged) {
|
|
614
503
|
state.controlsDragging = true;
|
|
615
504
|
}
|
|
616
505
|
});
|
|
617
|
-
state.controls.addEventListener('end',
|
|
506
|
+
state.controls.addEventListener('end', () => {
|
|
618
507
|
state.controlsEngaged = false;
|
|
619
508
|
state.controlsDragging = false;
|
|
620
509
|
});
|
|
621
510
|
}
|
|
622
|
-
[state.renderer, state.postProcessingComposer
|
|
623
|
-
return r.setSize(state.width, state.height);
|
|
624
|
-
});
|
|
511
|
+
[state.renderer, state.postProcessingComposer, ...state.extraRenderers].forEach(r => r.setSize(state.width, state.height));
|
|
625
512
|
state.camera.aspect = state.width / state.height;
|
|
626
513
|
state.camera.updateProjectionMatrix();
|
|
627
514
|
state.camera.position.z = 1000;
|
|
@@ -632,32 +519,24 @@ var threeRenderObjects = Kapsule({
|
|
|
632
519
|
state.loadComplete = state.scene.visible = !waitForLoadComplete;
|
|
633
520
|
window.scene = state.scene;
|
|
634
521
|
},
|
|
635
|
-
update
|
|
522
|
+
update(state, changedProps) {
|
|
636
523
|
// resize canvas
|
|
637
524
|
if (state.width && state.height && (changedProps.hasOwnProperty('width') || changedProps.hasOwnProperty('height'))) {
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
state.container.style.
|
|
642
|
-
state.
|
|
643
|
-
[state.renderer, state.postProcessingComposer].concat(_toConsumableArray(state.extraRenderers)).forEach(function (r) {
|
|
644
|
-
return r.setSize(w, h);
|
|
645
|
-
});
|
|
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));
|
|
646
530
|
state.camera.aspect = w / h;
|
|
647
|
-
|
|
648
|
-
o.some(
|
|
649
|
-
return n;
|
|
650
|
-
}) && (_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);
|
|
651
533
|
state.camera.updateProjectionMatrix();
|
|
652
534
|
}
|
|
653
535
|
if (changedProps.hasOwnProperty('viewOffset')) {
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
_o.some(function (n) {
|
|
659
|
-
return n;
|
|
660
|
-
}) ? (_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();
|
|
661
540
|
}
|
|
662
541
|
if (changedProps.hasOwnProperty('skyRadius') && state.skyRadius) {
|
|
663
542
|
state.controls.hasOwnProperty('maxDistance') && changedProps.skyRadius && (state.controls.maxDistance = Math.min(state.controls.maxDistance, state.skyRadius));
|
|
@@ -666,7 +545,7 @@ var threeRenderObjects = Kapsule({
|
|
|
666
545
|
state.skysphere.geometry = new three.SphereGeometry(state.skyRadius);
|
|
667
546
|
}
|
|
668
547
|
if (changedProps.hasOwnProperty('backgroundColor')) {
|
|
669
|
-
|
|
548
|
+
let alpha = parseToRgb(state.backgroundColor).alpha;
|
|
670
549
|
if (alpha === undefined) alpha = 1;
|
|
671
550
|
state.renderer.setClearColor(new three.Color(opacify(1, state.backgroundColor)), alpha);
|
|
672
551
|
}
|
|
@@ -676,7 +555,7 @@ var threeRenderObjects = Kapsule({
|
|
|
676
555
|
state.skysphere.material.map = null;
|
|
677
556
|
!state.loadComplete && finishLoad();
|
|
678
557
|
} else {
|
|
679
|
-
new three.TextureLoader().load(state.backgroundImageUrl,
|
|
558
|
+
new three.TextureLoader().load(state.backgroundImageUrl, texture => {
|
|
680
559
|
texture.colorSpace = three.SRGBColorSpace;
|
|
681
560
|
state.skysphere.material = new three.MeshBasicMaterial({
|
|
682
561
|
map: texture,
|
|
@@ -692,20 +571,12 @@ var threeRenderObjects = Kapsule({
|
|
|
692
571
|
}
|
|
693
572
|
changedProps.hasOwnProperty('showNavInfo') && (state.navInfo.style.display = state.showNavInfo ? null : 'none');
|
|
694
573
|
if (changedProps.hasOwnProperty('lights')) {
|
|
695
|
-
(changedProps.lights || []).forEach(
|
|
696
|
-
|
|
697
|
-
}); // Clear the place
|
|
698
|
-
state.lights.forEach(function (light) {
|
|
699
|
-
return state.scene.add(light);
|
|
700
|
-
}); // 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
|
|
701
576
|
}
|
|
702
577
|
if (changedProps.hasOwnProperty('objects')) {
|
|
703
|
-
(changedProps.objects || []).forEach(
|
|
704
|
-
|
|
705
|
-
}); // Clear the place
|
|
706
|
-
state.objects.forEach(function (obj) {
|
|
707
|
-
return state.scene.add(obj);
|
|
708
|
-
}); // 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
|
|
709
580
|
}
|
|
710
581
|
|
|
711
582
|
//
|