locar 0.0.10 → 0.0.11
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 -1
- package/dist/locar.es.js +163 -291
- package/dist/locar.umd.js +3 -3
- package/package.json +1 -1
package/README.md
CHANGED
package/dist/locar.es.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
var W = (
|
|
2
|
-
throw TypeError(
|
|
1
|
+
var W = (a) => {
|
|
2
|
+
throw TypeError(a);
|
|
3
3
|
};
|
|
4
|
-
var S = (
|
|
5
|
-
var
|
|
6
|
-
var
|
|
4
|
+
var S = (a, t, e) => t.has(a) || W("Cannot " + e);
|
|
5
|
+
var n = (a, t, e) => (S(a, t, "read from private field"), e ? e.call(a) : t.get(a)), m = (a, t, e) => t.has(a) ? W("Cannot add the same private member more than once") : t instanceof WeakSet ? t.add(a) : t.set(a, e), u = (a, t, e, i) => (S(a, t, "write to private field"), i ? i.call(a, e) : t.set(a, e), e), p = (a, t, e) => (S(a, t, "access private method"), e);
|
|
6
|
+
var q = (a, t, e, i) => ({
|
|
7
7
|
set _(r) {
|
|
8
|
-
u(
|
|
8
|
+
u(a, t, r, e);
|
|
9
9
|
},
|
|
10
10
|
get _() {
|
|
11
|
-
return
|
|
11
|
+
return n(a, t, i);
|
|
12
12
|
}
|
|
13
13
|
});
|
|
14
|
-
import * as
|
|
15
|
-
import { Vector3 as
|
|
16
|
-
var E,
|
|
17
|
-
class
|
|
14
|
+
import * as b from "three";
|
|
15
|
+
import { Vector3 as Z, Euler as N, Quaternion as _, EventDispatcher as B, MathUtils as C } from "three";
|
|
16
|
+
var E, U, G, X, Q;
|
|
17
|
+
class K {
|
|
18
18
|
/**
|
|
19
19
|
* Create a SphMercProjection.
|
|
20
20
|
*/
|
|
@@ -29,7 +29,7 @@ class $ {
|
|
|
29
29
|
* @return {Array} Two-member array containing easting and northing.
|
|
30
30
|
*/
|
|
31
31
|
project(t, e) {
|
|
32
|
-
return [
|
|
32
|
+
return [p(this, E, U).call(this, t), p(this, E, G).call(this, e)];
|
|
33
33
|
}
|
|
34
34
|
/**
|
|
35
35
|
* Unproject a Spherical Mercator easting and northing.
|
|
@@ -37,7 +37,7 @@ class $ {
|
|
|
37
37
|
* @return {Array} Two-member array containing longitude and latitude
|
|
38
38
|
*/
|
|
39
39
|
unproject(t) {
|
|
40
|
-
return [
|
|
40
|
+
return [p(this, E, X).call(this, t[0]), p(this, E, Q).call(this, t[1])];
|
|
41
41
|
}
|
|
42
42
|
/**
|
|
43
43
|
* Return the projection's ID.
|
|
@@ -47,19 +47,19 @@ class $ {
|
|
|
47
47
|
return "epsg:3857";
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
|
-
E = new WeakSet(),
|
|
50
|
+
E = new WeakSet(), U = function(t) {
|
|
51
51
|
return t / 180 * this.HALF_EARTH;
|
|
52
|
-
},
|
|
52
|
+
}, G = function(t) {
|
|
53
53
|
var e = Math.log(Math.tan((90 + t) * Math.PI / 360)) / (Math.PI / 180);
|
|
54
54
|
return e * this.HALF_EARTH / 180;
|
|
55
|
-
}, V = function(t) {
|
|
56
|
-
return t / this.HALF_EARTH * 180;
|
|
57
55
|
}, X = function(t) {
|
|
56
|
+
return t / this.HALF_EARTH * 180;
|
|
57
|
+
}, Q = function(t) {
|
|
58
58
|
var e = t / this.HALF_EARTH * 180;
|
|
59
59
|
return e = 180 / Math.PI * (2 * Math.atan(Math.exp(e * Math.PI / 180)) - Math.PI / 2), e;
|
|
60
60
|
};
|
|
61
|
-
var
|
|
62
|
-
class
|
|
61
|
+
var I, O, P, x, H, A, y, D, T, M, f, F, V, j, Y;
|
|
62
|
+
class st {
|
|
63
63
|
/**
|
|
64
64
|
* @param {THREE.Scene} scene - The Three.js scene to use.
|
|
65
65
|
* @param {THREE.Camera} camera - The Three.js camera to use. Should usually
|
|
@@ -68,19 +68,19 @@ class K {
|
|
|
68
68
|
* setGpsOptions() below.
|
|
69
69
|
* @param {Object} serverLogger - an object which can optionally log GPS position to a server for debugging. null by default, so no logging will be done. This object should implement a sendData() method to send data (2nd arg) to a given endpoint (1st arg). Please see source code for details. Ensure you comply with privacy laws (GDPR or equivalent) if implementing this.
|
|
70
70
|
*/
|
|
71
|
-
constructor(t, e,
|
|
72
|
-
m(this,
|
|
73
|
-
m(this,
|
|
74
|
-
m(this,
|
|
75
|
-
m(this, b);
|
|
76
|
-
m(this, H);
|
|
77
|
-
m(this, R);
|
|
71
|
+
constructor(t, e, i = {}, r = null) {
|
|
72
|
+
m(this, f);
|
|
73
|
+
m(this, I);
|
|
74
|
+
m(this, O);
|
|
78
75
|
m(this, P);
|
|
79
|
-
m(this,
|
|
76
|
+
m(this, x);
|
|
77
|
+
m(this, H);
|
|
78
|
+
m(this, A);
|
|
79
|
+
m(this, y);
|
|
80
|
+
m(this, D);
|
|
80
81
|
m(this, T);
|
|
81
|
-
m(this,
|
|
82
|
-
|
|
83
|
-
this.scene = t, this.camera = e, u(this, D, new $()), u(this, A, {}), u(this, b, null), u(this, H, 0), u(this, R, 100), u(this, P, null), this.setGpsOptions(n), u(this, M, null), u(this, T, 0), u(this, O, 0), u(this, w, r);
|
|
82
|
+
m(this, M);
|
|
83
|
+
this.scene = t, this.camera = e, u(this, I, new K()), u(this, O, {}), u(this, P, null), u(this, x, 0), u(this, H, 100), u(this, A, null), this.setGpsOptions(i), u(this, y, null), u(this, D, 0), u(this, T, 0), u(this, M, r);
|
|
84
84
|
}
|
|
85
85
|
/**
|
|
86
86
|
* Set the projection to use.
|
|
@@ -89,7 +89,7 @@ class K {
|
|
|
89
89
|
* containing easting and northing.
|
|
90
90
|
*/
|
|
91
91
|
setProjection(t) {
|
|
92
|
-
u(this,
|
|
92
|
+
u(this, I, t);
|
|
93
93
|
}
|
|
94
94
|
/**
|
|
95
95
|
* Set the GPS options.
|
|
@@ -99,7 +99,7 @@ class K {
|
|
|
99
99
|
* minimum accuracy, in metres, for a GPS reading to be counted.
|
|
100
100
|
*/
|
|
101
101
|
setGpsOptions(t = {}) {
|
|
102
|
-
t.gpsMinDistance !== void 0 && u(this,
|
|
102
|
+
t.gpsMinDistance !== void 0 && u(this, x, t.gpsMinDistance), t.gpsMinAccuracy !== void 0 && u(this, H, t.gpsMinAccuracy);
|
|
103
103
|
}
|
|
104
104
|
/**
|
|
105
105
|
* Start the GPS on a real device
|
|
@@ -107,19 +107,19 @@ class K {
|
|
|
107
107
|
* GPS errors can be handled by handling the gpserror event.
|
|
108
108
|
*/
|
|
109
109
|
async startGps() {
|
|
110
|
-
if (
|
|
111
|
-
const e = await (await
|
|
112
|
-
gpsMinDistance:
|
|
113
|
-
gpsMinAccuracy:
|
|
110
|
+
if (n(this, M)) {
|
|
111
|
+
const e = await (await n(this, M).sendData("/gps/start", {
|
|
112
|
+
gpsMinDistance: n(this, x),
|
|
113
|
+
gpsMinAccuracy: n(this, H)
|
|
114
114
|
})).json();
|
|
115
|
-
u(this,
|
|
115
|
+
u(this, T, e.session);
|
|
116
116
|
}
|
|
117
|
-
return
|
|
117
|
+
return n(this, A) === null ? (u(this, A, navigator.geolocation.watchPosition(
|
|
118
118
|
(t) => {
|
|
119
|
-
|
|
119
|
+
p(this, f, j).call(this, t);
|
|
120
120
|
},
|
|
121
121
|
(t) => {
|
|
122
|
-
|
|
122
|
+
n(this, O).gpserror ? n(this, O).gpserror(t.code) : alert(`GPS error: code ${t.code}`);
|
|
123
123
|
},
|
|
124
124
|
{
|
|
125
125
|
enableHighAccuracy: !0
|
|
@@ -132,7 +132,7 @@ class K {
|
|
|
132
132
|
* stopped (i.e. it was never started).
|
|
133
133
|
*/
|
|
134
134
|
stopGps() {
|
|
135
|
-
return
|
|
135
|
+
return n(this, A) !== null ? (navigator.geolocation.clearWatch(n(this, A)), u(this, A, null), !0) : !1;
|
|
136
136
|
}
|
|
137
137
|
/**
|
|
138
138
|
* Send a fake GPS signal. Useful for testing on a desktop or laptop.
|
|
@@ -143,8 +143,8 @@ class K {
|
|
|
143
143
|
* @param {number} acc - The accuracy of the GPS reading in metres. May be
|
|
144
144
|
* ignored if lower than the specified minimum accuracy.
|
|
145
145
|
*/
|
|
146
|
-
fakeGps(t, e,
|
|
147
|
-
|
|
146
|
+
fakeGps(t, e, i = null, r = 0) {
|
|
147
|
+
i !== null && this.setElevation(i), p(this, f, j).call(this, {
|
|
148
148
|
coords: {
|
|
149
149
|
longitude: t,
|
|
150
150
|
latitude: e,
|
|
@@ -163,12 +163,12 @@ class K {
|
|
|
163
163
|
* @return {Array} a two member array containing the WebGL x and z coordinates
|
|
164
164
|
*/
|
|
165
165
|
lonLatToWorldCoords(t, e) {
|
|
166
|
-
const
|
|
167
|
-
if (
|
|
168
|
-
|
|
166
|
+
const i = n(this, I).project(t, e);
|
|
167
|
+
if (n(this, y))
|
|
168
|
+
i[0] -= n(this, y)[0], i[1] -= n(this, y)[1];
|
|
169
169
|
else
|
|
170
170
|
throw "No initial position determined";
|
|
171
|
-
return [
|
|
171
|
+
return [i[0], -i[1]];
|
|
172
172
|
}
|
|
173
173
|
/**
|
|
174
174
|
* Add a new AR object at a given latitude, longitude and elevation.
|
|
@@ -180,14 +180,14 @@ class K {
|
|
|
180
180
|
* @param {Object} properties - properties describing the object (for example,
|
|
181
181
|
* the contents of the GeoJSON properties field).
|
|
182
182
|
*/
|
|
183
|
-
add(t, e,
|
|
183
|
+
add(t, e, i, r, h = {}) {
|
|
184
184
|
var g;
|
|
185
|
-
t.properties =
|
|
185
|
+
t.properties = h, p(this, f, F).call(this, t, e, i, r), this.scene.add(t), (g = n(this, M)) == null || g.sendData("/object/new", {
|
|
186
186
|
position: t.position,
|
|
187
187
|
x: t.position.x,
|
|
188
188
|
z: t.position.z,
|
|
189
|
-
session:
|
|
190
|
-
properties:
|
|
189
|
+
session: n(this, T),
|
|
190
|
+
properties: h
|
|
191
191
|
});
|
|
192
192
|
}
|
|
193
193
|
/**
|
|
@@ -211,49 +211,49 @@ class K {
|
|
|
211
211
|
* @listens LocationBased#gpserror
|
|
212
212
|
*/
|
|
213
213
|
on(t, e) {
|
|
214
|
-
|
|
214
|
+
n(this, O)[t] = e;
|
|
215
215
|
}
|
|
216
216
|
}
|
|
217
|
-
|
|
218
|
-
const
|
|
219
|
-
r !== void 0 && (t.position.y = r), [t.position.x, t.position.z] =
|
|
220
|
-
},
|
|
221
|
-
u(this,
|
|
222
|
-
},
|
|
223
|
-
var
|
|
217
|
+
I = new WeakMap(), O = new WeakMap(), P = new WeakMap(), x = new WeakMap(), H = new WeakMap(), A = new WeakMap(), y = new WeakMap(), D = new WeakMap(), T = new WeakMap(), M = new WeakMap(), f = new WeakSet(), F = function(t, e, i, r) {
|
|
218
|
+
const h = this.lonLatToWorldCoords(e, i);
|
|
219
|
+
r !== void 0 && (t.position.y = r), [t.position.x, t.position.z] = h;
|
|
220
|
+
}, V = function(t, e) {
|
|
221
|
+
u(this, y, n(this, I).project(t, e));
|
|
222
|
+
}, j = function(t) {
|
|
223
|
+
var i, r, h;
|
|
224
224
|
let e = Number.MAX_VALUE;
|
|
225
|
-
|
|
226
|
-
gpsCount:
|
|
225
|
+
q(this, D)._++, (i = n(this, M)) == null || i.sendData("/gps/new", {
|
|
226
|
+
gpsCount: n(this, D),
|
|
227
227
|
lat: t.coords.latitude,
|
|
228
228
|
lon: t.coords.longitude,
|
|
229
229
|
acc: t.coords.accuracy,
|
|
230
|
-
session:
|
|
231
|
-
}), t.coords.accuracy <=
|
|
230
|
+
session: n(this, T)
|
|
231
|
+
}), t.coords.accuracy <= n(this, H) && (n(this, P) === null ? u(this, P, {
|
|
232
232
|
latitude: t.coords.latitude,
|
|
233
233
|
longitude: t.coords.longitude
|
|
234
|
-
}) : e =
|
|
235
|
-
gpsCount:
|
|
234
|
+
}) : e = p(this, f, Y).call(this, n(this, P), t.coords), e >= n(this, x) && (n(this, P).longitude = t.coords.longitude, n(this, P).latitude = t.coords.latitude, n(this, y) || (p(this, f, V).call(this, t.coords.longitude, t.coords.latitude), (r = n(this, M)) == null || r.sendData("/worldorigin/new", {
|
|
235
|
+
gpsCount: n(this, D),
|
|
236
236
|
lat: t.coords.latitude,
|
|
237
237
|
lon: t.coords.longitude,
|
|
238
|
-
session:
|
|
239
|
-
initialPosition:
|
|
240
|
-
})),
|
|
241
|
-
gpsCount:
|
|
238
|
+
session: n(this, T),
|
|
239
|
+
initialPosition: n(this, y)
|
|
240
|
+
})), p(this, f, F).call(this, this.camera, t.coords.longitude, t.coords.latitude), (h = n(this, M)) == null || h.sendData("/gps/accepted", {
|
|
241
|
+
gpsCount: n(this, D),
|
|
242
242
|
cameraX: this.camera.position.x,
|
|
243
243
|
cameraZ: this.camera.position.z,
|
|
244
|
-
session:
|
|
244
|
+
session: n(this, T),
|
|
245
245
|
distMoved: e
|
|
246
|
-
}),
|
|
246
|
+
}), n(this, O).gpsupdate && n(this, O).gpsupdate(t, e)));
|
|
247
247
|
}, /**
|
|
248
248
|
* Calculate haversine distance between two lat/lon pairs.
|
|
249
249
|
*
|
|
250
250
|
* Taken from original A-Frame AR.js location-based components
|
|
251
251
|
*/
|
|
252
|
-
|
|
253
|
-
const
|
|
254
|
-
return 2 * Math.atan2(Math.sqrt(
|
|
252
|
+
Y = function(t, e) {
|
|
253
|
+
const i = b.MathUtils.degToRad(e.longitude - t.longitude), r = b.MathUtils.degToRad(e.latitude - t.latitude), h = Math.sin(r / 2) * Math.sin(r / 2) + Math.cos(b.MathUtils.degToRad(t.latitude)) * Math.cos(b.MathUtils.degToRad(e.latitude)) * (Math.sin(i / 2) * Math.sin(i / 2));
|
|
254
|
+
return 2 * Math.atan2(Math.sqrt(h), Math.sqrt(1 - h)) * 6371e3;
|
|
255
255
|
};
|
|
256
|
-
class
|
|
256
|
+
class ot {
|
|
257
257
|
/**
|
|
258
258
|
* Create a Webcam.
|
|
259
259
|
* @param options {Object} - options to use for initialising the camera.
|
|
@@ -267,9 +267,9 @@ class J {
|
|
|
267
267
|
* undefined), a video element will be created.
|
|
268
268
|
*/
|
|
269
269
|
constructor(t = {}, e) {
|
|
270
|
-
this.sceneWebcam = new
|
|
271
|
-
let
|
|
272
|
-
if (e ?
|
|
270
|
+
this.sceneWebcam = new b.Scene();
|
|
271
|
+
let i;
|
|
272
|
+
if (e ? i = document.querySelector(e) : (i = document.createElement("video"), i.setAttribute("autoplay", !0), i.setAttribute("playsinline", !0), i.style.display = "none", document.body.appendChild(i)), this.texture = new b.VideoTexture(i), navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
|
|
273
273
|
const r = {
|
|
274
274
|
video: {
|
|
275
275
|
width: { ideal: t.idealWidth || 1280 },
|
|
@@ -277,17 +277,17 @@ class J {
|
|
|
277
277
|
facingMode: "environment"
|
|
278
278
|
}
|
|
279
279
|
};
|
|
280
|
-
navigator.mediaDevices.getUserMedia(r).then((
|
|
281
|
-
|
|
280
|
+
navigator.mediaDevices.getUserMedia(r).then((h) => {
|
|
281
|
+
i.addEventListener("loadedmetadata", () => {
|
|
282
282
|
var g;
|
|
283
|
-
|
|
284
|
-
}),
|
|
285
|
-
}).catch((
|
|
283
|
+
i.setAttribute("width", i.videoWidth), i.setAttribute("height", i.videoHeight), i.play(), (g = t.onVideoStarted) == null || g.call(this, this.texture);
|
|
284
|
+
}), i.srcObject = h;
|
|
285
|
+
}).catch((h) => {
|
|
286
286
|
setTimeout(() => {
|
|
287
287
|
alert(
|
|
288
288
|
`Webcam Error
|
|
289
|
-
Name: ` +
|
|
290
|
-
Message: ` +
|
|
289
|
+
Name: ` + h.name + `
|
|
290
|
+
Message: ` + h.message
|
|
291
291
|
);
|
|
292
292
|
}, 1e3);
|
|
293
293
|
});
|
|
@@ -304,8 +304,8 @@ Message: ` + d.message
|
|
|
304
304
|
this.texture.dispose();
|
|
305
305
|
}
|
|
306
306
|
}
|
|
307
|
-
const
|
|
308
|
-
class
|
|
307
|
+
const k = navigator.userAgent.match(/iPhone|iPad|iPod/i) || /Macintosh/i.test(navigator.userAgent) && navigator.maxTouchPoints != null && navigator.maxTouchPoints > 1, $ = new Z(0, 0, 1), z = new N(), J = new _(), tt = new _(-Math.sqrt(0.5), 0, 0, Math.sqrt(0.5)), et = { type: "change" };
|
|
308
|
+
class at extends B {
|
|
309
309
|
/**
|
|
310
310
|
* Create an instance of DeviceOrientationControls.
|
|
311
311
|
* @param {Object} object - the object to attach the controls to
|
|
@@ -315,19 +315,19 @@ class st extends Z {
|
|
|
315
315
|
super(), window.isSecureContext === !1 && console.error(
|
|
316
316
|
"THREE.DeviceOrientationControls: DeviceOrientationEvent is only available in secure contexts (https)"
|
|
317
317
|
);
|
|
318
|
-
const e = this,
|
|
318
|
+
const e = this, i = 1e-6, r = new _();
|
|
319
319
|
this.object = t, this.object.rotation.reorder("YXZ"), this.enabled = !0, this.deviceOrientation = null, this.screenOrientation = 0, this.alphaOffset = 0, this.initialOffset = null, this.TWO_PI = 2 * Math.PI, this.HALF_PI = 0.5 * Math.PI, this.orientationChangeEventName = "ondeviceorientationabsolute" in window ? "deviceorientationabsolute" : "deviceorientation", this.smoothingFactor = 1;
|
|
320
|
-
const
|
|
321
|
-
alpha:
|
|
320
|
+
const h = function({
|
|
321
|
+
alpha: s,
|
|
322
322
|
beta: c,
|
|
323
|
-
gamma:
|
|
324
|
-
webkitCompassHeading:
|
|
323
|
+
gamma: d,
|
|
324
|
+
webkitCompassHeading: o
|
|
325
325
|
}) {
|
|
326
|
-
if (
|
|
327
|
-
const
|
|
328
|
-
e.alphaOffset = C.degToRad(
|
|
326
|
+
if (k) {
|
|
327
|
+
const l = 360 - o;
|
|
328
|
+
e.alphaOffset = C.degToRad(l - s), e.deviceOrientation = { alpha: s, beta: c, gamma: d, webkitCompassHeading: o };
|
|
329
329
|
} else
|
|
330
|
-
|
|
330
|
+
s < 0 && (s += 360), e.deviceOrientation = { alpha: s, beta: c, gamma: d };
|
|
331
331
|
window.dispatchEvent(
|
|
332
332
|
new CustomEvent("camera-rotation-change", {
|
|
333
333
|
detail: { cameraRotation: t.rotation }
|
|
@@ -335,29 +335,29 @@ class st extends Z {
|
|
|
335
335
|
);
|
|
336
336
|
}, g = function() {
|
|
337
337
|
e.screenOrientation = window.orientation || 0;
|
|
338
|
-
},
|
|
339
|
-
|
|
338
|
+
}, L = function(s, c, d, o, l) {
|
|
339
|
+
z.set(d, c, -o, "YXZ"), s.setFromEuler(z), s.multiply(tt), s.multiply(J.setFromAxisAngle($, -l));
|
|
340
340
|
};
|
|
341
341
|
this.connect = function() {
|
|
342
|
-
g(), window.DeviceOrientationEvent !== void 0 && typeof window.DeviceOrientationEvent.requestPermission == "function" ? window.DeviceOrientationEvent.requestPermission().then((
|
|
343
|
-
|
|
342
|
+
g(), window.DeviceOrientationEvent !== void 0 && typeof window.DeviceOrientationEvent.requestPermission == "function" ? window.DeviceOrientationEvent.requestPermission().then((s) => {
|
|
343
|
+
s === "granted" && (window.addEventListener(
|
|
344
344
|
"orientationchange",
|
|
345
345
|
g
|
|
346
346
|
), window.addEventListener(
|
|
347
347
|
e.orientationChangeEventName,
|
|
348
|
-
|
|
348
|
+
h
|
|
349
349
|
));
|
|
350
|
-
}).catch(function(
|
|
350
|
+
}).catch(function(s) {
|
|
351
351
|
console.error(
|
|
352
352
|
"THREE.DeviceOrientationControls: Unable to use DeviceOrientation API:",
|
|
353
|
-
|
|
353
|
+
s
|
|
354
354
|
);
|
|
355
355
|
}) : (window.addEventListener(
|
|
356
356
|
"orientationchange",
|
|
357
357
|
g
|
|
358
358
|
), window.addEventListener(
|
|
359
359
|
e.orientationChangeEventName,
|
|
360
|
-
|
|
360
|
+
h
|
|
361
361
|
)), e.enabled = !0;
|
|
362
362
|
}, this.disconnect = function() {
|
|
363
363
|
window.removeEventListener(
|
|
@@ -365,86 +365,86 @@ class st extends Z {
|
|
|
365
365
|
g
|
|
366
366
|
), window.removeEventListener(
|
|
367
367
|
e.orientationChangeEventName,
|
|
368
|
-
|
|
368
|
+
h
|
|
369
369
|
), e.enabled = !1, e.initialOffset = !1, e.deviceOrientation = null;
|
|
370
|
-
}, this.update = function({ theta:
|
|
370
|
+
}, this.update = function({ theta: s = 0 } = { theta: 0 }) {
|
|
371
371
|
if (e.enabled === !1) return;
|
|
372
372
|
const c = e.deviceOrientation;
|
|
373
373
|
if (c) {
|
|
374
|
-
let
|
|
375
|
-
const
|
|
376
|
-
if (
|
|
374
|
+
let d = c.alpha ? C.degToRad(c.alpha) + e.alphaOffset : 0, o = c.beta ? C.degToRad(c.beta) : 0, l = c.gamma ? C.degToRad(c.gamma) : 0;
|
|
375
|
+
const R = e.screenOrientation ? C.degToRad(e.screenOrientation) : 0;
|
|
376
|
+
if (k) {
|
|
377
377
|
const v = new _();
|
|
378
|
-
|
|
379
|
-
const
|
|
378
|
+
L(v, d, o, l, R);
|
|
379
|
+
const w = new N().setFromQuaternion(
|
|
380
380
|
v,
|
|
381
381
|
"YXZ"
|
|
382
382
|
);
|
|
383
|
-
console.log(
|
|
383
|
+
console.log(w.x, w.y, w.z), w.y = C.degToRad(
|
|
384
384
|
360 - c.webkitCompassHeading
|
|
385
|
-
), v.setFromEuler(
|
|
385
|
+
), v.setFromEuler(w), e.object.quaternion.copy(v);
|
|
386
386
|
} else {
|
|
387
387
|
if (this.smoothingFactor < 1) {
|
|
388
388
|
if (this.lastOrientation) {
|
|
389
389
|
const v = this.smoothingFactor;
|
|
390
|
-
|
|
391
|
-
|
|
390
|
+
d = this._getSmoothedAngle(
|
|
391
|
+
d,
|
|
392
392
|
this.lastOrientation.alpha,
|
|
393
393
|
v
|
|
394
|
-
),
|
|
395
|
-
|
|
394
|
+
), o = this._getSmoothedAngle(
|
|
395
|
+
o + Math.PI,
|
|
396
396
|
this.lastOrientation.beta,
|
|
397
397
|
v
|
|
398
|
-
),
|
|
399
|
-
|
|
398
|
+
), l = this._getSmoothedAngle(
|
|
399
|
+
l + this.HALF_PI,
|
|
400
400
|
this.lastOrientation.gamma,
|
|
401
401
|
v,
|
|
402
402
|
Math.PI
|
|
403
403
|
);
|
|
404
404
|
} else
|
|
405
|
-
|
|
405
|
+
o += Math.PI, l += this.HALF_PI;
|
|
406
406
|
this.lastOrientation = {
|
|
407
|
-
alpha:
|
|
408
|
-
beta:
|
|
409
|
-
gamma:
|
|
407
|
+
alpha: d,
|
|
408
|
+
beta: o,
|
|
409
|
+
gamma: l
|
|
410
410
|
};
|
|
411
411
|
}
|
|
412
|
-
|
|
412
|
+
L(
|
|
413
413
|
e.object.quaternion,
|
|
414
|
-
|
|
415
|
-
this.smoothingFactor < 1 ?
|
|
416
|
-
this.smoothingFactor < 1 ?
|
|
417
|
-
|
|
414
|
+
d + s,
|
|
415
|
+
this.smoothingFactor < 1 ? o - Math.PI : o,
|
|
416
|
+
this.smoothingFactor < 1 ? l - this.HALF_PI : l,
|
|
417
|
+
R
|
|
418
418
|
);
|
|
419
419
|
}
|
|
420
|
-
8 * (1 - r.dot(e.object.quaternion)) >
|
|
420
|
+
8 * (1 - r.dot(e.object.quaternion)) > i && (r.copy(e.object.quaternion), e.dispatchEvent(et));
|
|
421
421
|
}
|
|
422
|
-
}, this._orderAngle = function(
|
|
423
|
-
return c >
|
|
424
|
-
}, this._getSmoothedAngle = function(
|
|
425
|
-
const
|
|
426
|
-
|
|
427
|
-
let
|
|
428
|
-
return
|
|
422
|
+
}, this._orderAngle = function(s, c, d = this.TWO_PI) {
|
|
423
|
+
return c > s && Math.abs(c - s) < d / 2 || s > c && Math.abs(c - s) > d / 2 ? { left: s, right: c } : { left: c, right: s };
|
|
424
|
+
}, this._getSmoothedAngle = function(s, c, d, o = this.TWO_PI) {
|
|
425
|
+
const l = this._orderAngle(s, c, o), R = l.left, v = l.right;
|
|
426
|
+
l.left = 0, l.right -= R, l.right < 0 && (l.right += o);
|
|
427
|
+
let w = v == c ? (1 - d) * l.right + d * l.left : d * l.right + (1 - d) * l.left;
|
|
428
|
+
return w += R, w >= o && (w -= o), w;
|
|
429
429
|
}, this.updateAlphaOffset = function() {
|
|
430
430
|
e.initialOffset = !1;
|
|
431
431
|
}, this.dispose = function() {
|
|
432
432
|
e.disconnect();
|
|
433
433
|
}, this.getAlpha = function() {
|
|
434
|
-
const { deviceOrientation:
|
|
435
|
-
return
|
|
434
|
+
const { deviceOrientation: s } = e;
|
|
435
|
+
return s && s.alpha ? C.degToRad(s.alpha) + e.alphaOffset : 0;
|
|
436
436
|
}, this.getBeta = function() {
|
|
437
|
-
const { deviceOrientation:
|
|
438
|
-
return
|
|
437
|
+
const { deviceOrientation: s } = e;
|
|
438
|
+
return s && s.beta ? C.degToRad(s.beta) : 0;
|
|
439
439
|
}, window.DeviceOrientationEvent !== void 0 && typeof window.DeviceOrientationEvent.requestPermission == "function" ? this.initPermissionDialog() : this.connect();
|
|
440
440
|
}
|
|
441
441
|
// Provide gesture before initialising device orientation controls
|
|
442
442
|
// From PR #659 on the main AR.js repo
|
|
443
443
|
// Thanks to @ma2yama
|
|
444
444
|
initPermissionDialog() {
|
|
445
|
-
const t = document.createElement("div"), e = document.createElement("div"),
|
|
445
|
+
const t = document.createElement("div"), e = document.createElement("div"), i = document.createElement("div"), r = document.createElement("div");
|
|
446
446
|
document.body.appendChild(t);
|
|
447
|
-
const
|
|
447
|
+
const h = {
|
|
448
448
|
display: "flex",
|
|
449
449
|
position: "fixed",
|
|
450
450
|
top: 0,
|
|
@@ -461,32 +461,32 @@ class st extends Z {
|
|
|
461
461
|
borderRadius: "3px",
|
|
462
462
|
width: "36rem",
|
|
463
463
|
height: "24rem"
|
|
464
|
-
},
|
|
464
|
+
}, L = {
|
|
465
465
|
width: "100%",
|
|
466
466
|
height: "70%",
|
|
467
467
|
display: "flex",
|
|
468
468
|
justifyContent: "center",
|
|
469
469
|
alignItems: "center"
|
|
470
|
-
},
|
|
470
|
+
}, s = {
|
|
471
471
|
display: "inline-flex",
|
|
472
472
|
width: "100%",
|
|
473
473
|
height: "30%",
|
|
474
474
|
justifyContent: "center",
|
|
475
475
|
alignItems: "center"
|
|
476
476
|
};
|
|
477
|
-
for (let
|
|
478
|
-
t.style[
|
|
479
|
-
for (let
|
|
480
|
-
e.style[
|
|
481
|
-
for (let
|
|
482
|
-
|
|
483
|
-
for (let
|
|
484
|
-
r.style[
|
|
485
|
-
t.appendChild(e), e.appendChild(
|
|
477
|
+
for (let o in h)
|
|
478
|
+
t.style[o] = h[o];
|
|
479
|
+
for (let o in g)
|
|
480
|
+
e.style[o] = g[o];
|
|
481
|
+
for (let o in L)
|
|
482
|
+
i.style[o] = L[o];
|
|
483
|
+
for (let o in s)
|
|
484
|
+
r.style[o] = s[o];
|
|
485
|
+
t.appendChild(e), e.appendChild(i), e.appendChild(r), i.innerHTML = '<div style="font-size: 24pt; margin: 1rem;">This immersive website requires access to your device motion sensors.</div>';
|
|
486
486
|
const c = () => {
|
|
487
487
|
this.connect(), t.style.display = "none";
|
|
488
|
-
},
|
|
489
|
-
|
|
488
|
+
}, d = document.createElement("button");
|
|
489
|
+
d.addEventListener("click", c), d.style.width = "50%", d.style.height = "80%", d.style.fontSize = "20pt", d.appendChild(document.createTextNode("OK")), r.appendChild(d), document.body.appendChild(t);
|
|
490
490
|
}
|
|
491
491
|
}
|
|
492
492
|
class rt {
|
|
@@ -496,7 +496,7 @@ class rt {
|
|
|
496
496
|
* events will be handled.
|
|
497
497
|
*/
|
|
498
498
|
constructor(t) {
|
|
499
|
-
this.raycaster = new
|
|
499
|
+
this.raycaster = new b.Raycaster(), this.normalisedMousePosition = new b.Vector2(null, null), t.domElement.addEventListener("click", (e) => {
|
|
500
500
|
this.normalisedMousePosition.set(
|
|
501
501
|
e.clientX / t.domElement.clientWidth * 2 - 1,
|
|
502
502
|
-(e.clientY / t.domElement.clientHeight * 2) + 1
|
|
@@ -514,146 +514,18 @@ class rt {
|
|
|
514
514
|
raycast(t, e) {
|
|
515
515
|
if (this.normalisedMousePosition.x !== null && this.normalisedMousePosition.y !== null) {
|
|
516
516
|
this.raycaster.setFromCamera(this.normalisedMousePosition, t);
|
|
517
|
-
const
|
|
518
|
-
return this.normalisedMousePosition.set(null, null),
|
|
517
|
+
const i = this.raycaster.intersectObjects(e.children, !1);
|
|
518
|
+
return this.normalisedMousePosition.set(null, null), i;
|
|
519
519
|
}
|
|
520
520
|
return [];
|
|
521
521
|
}
|
|
522
522
|
}
|
|
523
|
-
|
|
524
|
-
schema: {
|
|
525
|
-
idealWidth: {
|
|
526
|
-
type: "number",
|
|
527
|
-
default: 1024
|
|
528
|
-
},
|
|
529
|
-
idealHeight: {
|
|
530
|
-
type: "number",
|
|
531
|
-
default: 768
|
|
532
|
-
},
|
|
533
|
-
videoElement: {
|
|
534
|
-
type: "string",
|
|
535
|
-
default: ""
|
|
536
|
-
}
|
|
537
|
-
},
|
|
538
|
-
init: function() {
|
|
539
|
-
new J({
|
|
540
|
-
idealWidth: this.data.idealWidth,
|
|
541
|
-
idealHeight: this.data.idealHeight,
|
|
542
|
-
onVideoStarted: (i) => {
|
|
543
|
-
this.el.object3D.background = i;
|
|
544
|
-
}
|
|
545
|
-
}, this.data.videoElement || null);
|
|
546
|
-
}
|
|
547
|
-
});
|
|
548
|
-
AFRAME.registerComponent("locar-camera", {
|
|
549
|
-
schema: {
|
|
550
|
-
simulateLatitude: {
|
|
551
|
-
type: "number",
|
|
552
|
-
default: 0
|
|
553
|
-
},
|
|
554
|
-
simulateLongitude: {
|
|
555
|
-
type: "number",
|
|
556
|
-
default: 0
|
|
557
|
-
},
|
|
558
|
-
simulateAltitude: {
|
|
559
|
-
type: "number",
|
|
560
|
-
default: -Number.MAX_VALUE
|
|
561
|
-
},
|
|
562
|
-
positionMinAccuracy: {
|
|
563
|
-
type: "number",
|
|
564
|
-
default: 100
|
|
565
|
-
}
|
|
566
|
-
},
|
|
567
|
-
init: function() {
|
|
568
|
-
this.locar = new K(
|
|
569
|
-
this.el.sceneEl.object3D,
|
|
570
|
-
this.el.object3D
|
|
571
|
-
), this.locar.on("gpsupdate", (i, t) => {
|
|
572
|
-
this.el.emit("gpsupdate", {
|
|
573
|
-
position: i,
|
|
574
|
-
distMoved: t
|
|
575
|
-
});
|
|
576
|
-
}), this.locar.on("gpserror", (i) => {
|
|
577
|
-
const t = [
|
|
578
|
-
"User denied access to GPS.",
|
|
579
|
-
"GPS satellites not available.",
|
|
580
|
-
"Timeout communicating with GPS satellites - try moving to a more open area."
|
|
581
|
-
];
|
|
582
|
-
i >= 1 && i <= 3 ? alert(t[i - 1]) : alert(`Unknown geolocation error code ${i}.`);
|
|
583
|
-
}), this._isMobile() && (this.deviceOrientationControls = new st(this.el.object3D));
|
|
584
|
-
},
|
|
585
|
-
update: function(i) {
|
|
586
|
-
this.locar.setGpsOptions({
|
|
587
|
-
gpsMinAccuracy: this.data.positionMinAccuracy,
|
|
588
|
-
gpsMinDistance: this.data.gpsMinDistance
|
|
589
|
-
}), (this.data.simulateLatitude !== 0 || this.data.simulateLongitude !== 0) && (this.data.simulateLatitude != (i == null ? void 0 : i.simulateLatitude) || this.data.simulateLongitude != (i == null ? void 0 : i.simulateLongitude)) && (this.locar.stopGps(), this.locar.fakeGps(
|
|
590
|
-
this.data.simulateLongitude,
|
|
591
|
-
this.data.simulateLatitude
|
|
592
|
-
), this.data.simulateLongitude = 0, this.data.simulateLatitude = 0), this.data.simulateAltitude > -Number.MAX_VALUE && this.locar.setElevation(this.data.simulateAltitude + 1.6);
|
|
593
|
-
},
|
|
594
|
-
play: function() {
|
|
595
|
-
this.locar.startGps();
|
|
596
|
-
},
|
|
597
|
-
pause: function() {
|
|
598
|
-
this.locar.stopGps();
|
|
599
|
-
},
|
|
600
|
-
/**
|
|
601
|
-
* Convert longitude and latitude to three.js/WebGL world coordinates.
|
|
602
|
-
* Uses the specified projection, and negates the northing (in typical
|
|
603
|
-
* projections, northings increase northwards, but in the WebGL coordinate
|
|
604
|
-
* system, we face negative z if the camera is at the origin with default
|
|
605
|
-
* rotation).
|
|
606
|
-
* @param {number} lon - The longitude.
|
|
607
|
-
* @param {number} lat - The latitude.
|
|
608
|
-
* @return {Array} a two member array containing the WebGL x and z coordinates
|
|
609
|
-
*/
|
|
610
|
-
lonLatToWorldCoords: function(i, t) {
|
|
611
|
-
return this.locar.lonLatToWorldCoords(i, t);
|
|
612
|
-
},
|
|
613
|
-
tick: function() {
|
|
614
|
-
var i;
|
|
615
|
-
(i = this.deviceOrientationControls) == null || i.update();
|
|
616
|
-
},
|
|
617
|
-
_isMobile: function() {
|
|
618
|
-
return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
|
|
619
|
-
navigator.userAgent
|
|
620
|
-
) || /Macintosh/i.test(navigator.userAgent) && navigator.maxTouchPoints != null && navigator.maxTouchPoints > 1;
|
|
621
|
-
}
|
|
622
|
-
});
|
|
623
|
-
AFRAME.registerComponent("locar-entity-place", {
|
|
624
|
-
schema: {
|
|
625
|
-
latitude: {
|
|
626
|
-
type: "number",
|
|
627
|
-
default: 0
|
|
628
|
-
},
|
|
629
|
-
longitude: {
|
|
630
|
-
type: "number",
|
|
631
|
-
default: 0
|
|
632
|
-
}
|
|
633
|
-
},
|
|
634
|
-
init: function() {
|
|
635
|
-
const i = this.el.sceneEl.querySelector("[locar-camera]");
|
|
636
|
-
this.locarCamera = i.components["locar-camera"];
|
|
637
|
-
},
|
|
638
|
-
update: function(i) {
|
|
639
|
-
this.locarCamera || console.error("Cannot update locar-entity-place without a locar-camera component on the scene camera.");
|
|
640
|
-
const t = this.locarCamera.lonLatToWorldCoords(
|
|
641
|
-
this.data.longitude,
|
|
642
|
-
this.data.latitude
|
|
643
|
-
);
|
|
644
|
-
this.el.object3D.position.set(
|
|
645
|
-
t[0],
|
|
646
|
-
this.el.object3D.position.y,
|
|
647
|
-
t[1]
|
|
648
|
-
);
|
|
649
|
-
}
|
|
650
|
-
});
|
|
651
|
-
const ct = "0.0.10";
|
|
523
|
+
const ct = "0.0.10-noaframe-1";
|
|
652
524
|
export {
|
|
653
525
|
rt as ClickHandler,
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
526
|
+
at as DeviceOrientationControls,
|
|
527
|
+
st as LocationBased,
|
|
528
|
+
K as SphMercProjection,
|
|
529
|
+
ot as Webcam,
|
|
658
530
|
ct as version
|
|
659
531
|
};
|
package/dist/locar.umd.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
(function(
|
|
2
|
-
Name: `+
|
|
3
|
-
Message: `+
|
|
1
|
+
(function(a,n){typeof exports=="object"&&typeof module<"u"?n(exports,require("three")):typeof define=="function"&&define.amd?define(["exports","three"],n):(a=typeof globalThis<"u"?globalThis:a||self,n(a.locar={},a.THREE))})(this,function(a,n){"use strict";var z=a=>{throw TypeError(a)};var W=(a,n,f)=>n.has(a)||z("Cannot "+f);var s=(a,n,f)=>(W(a,n,"read from private field"),f?f.call(a):n.get(a)),v=(a,n,f)=>n.has(a)?z("Cannot add the same private member more than once"):n instanceof WeakSet?n.add(a):n.set(a,f),g=(a,n,f,p)=>(W(a,n,"write to private field"),p?p.call(a,f):n.set(a,f),f),y=(a,n,f)=>(W(a,n,"access private method"),f);var N=(a,n,f,p)=>({set _(U){g(a,n,U,f)},get _(){return s(a,n,p)}});var w,Q,G,X,V,E,D,I,S,j,L,O,_,T,P,M,q,Y,H,Z;function f(b){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(b){for(const e in b)if(e!=="default"){const i=Object.getOwnPropertyDescriptor(b,e);Object.defineProperty(t,e,i.get?i:{enumerable:!0,get:()=>b[e]})}}return t.default=b,Object.freeze(t)}const p=f(n);class U{constructor(){v(this,w);this.EARTH=4007501668e-2,this.HALF_EARTH=2003750834e-2}project(t,e){return[y(this,w,Q).call(this,t),y(this,w,G).call(this,e)]}unproject(t){return[y(this,w,X).call(this,t[0]),y(this,w,V).call(this,t[1])]}getID(){return"epsg:3857"}}w=new WeakSet,Q=function(t){return t/180*this.HALF_EARTH},G=function(t){var e=Math.log(Math.tan((90+t)*Math.PI/360))/(Math.PI/180);return e*this.HALF_EARTH/180},X=function(t){return t/this.HALF_EARTH*180},V=function(t){var e=t/this.HALF_EARTH*180;return e=180/Math.PI*(2*Math.atan(Math.exp(e*Math.PI/180))-Math.PI/2),e};class B{constructor(t,e,i={},d=null){v(this,M);v(this,E);v(this,D);v(this,I);v(this,S);v(this,j);v(this,L);v(this,O);v(this,_);v(this,T);v(this,P);this.scene=t,this.camera=e,g(this,E,new U),g(this,D,{}),g(this,I,null),g(this,S,0),g(this,j,100),g(this,L,null),this.setGpsOptions(i),g(this,O,null),g(this,_,0),g(this,T,0),g(this,P,d)}setProjection(t){g(this,E,t)}setGpsOptions(t={}){t.gpsMinDistance!==void 0&&g(this,S,t.gpsMinDistance),t.gpsMinAccuracy!==void 0&&g(this,j,t.gpsMinAccuracy)}async startGps(){if(s(this,P)){const e=await(await s(this,P).sendData("/gps/start",{gpsMinDistance:s(this,S),gpsMinAccuracy:s(this,j)})).json();g(this,T,e.session)}return s(this,L)===null?(g(this,L,navigator.geolocation.watchPosition(t=>{y(this,M,H).call(this,t)},t=>{s(this,D).gpserror?s(this,D).gpserror(t.code):alert(`GPS error: code ${t.code}`)},{enableHighAccuracy:!0})),!0):!1}stopGps(){return s(this,L)!==null?(navigator.geolocation.clearWatch(s(this,L)),g(this,L,null),!0):!1}fakeGps(t,e,i=null,d=0){i!==null&&this.setElevation(i),y(this,M,H).call(this,{coords:{longitude:t,latitude:e,accuracy:d}})}lonLatToWorldCoords(t,e){const i=s(this,E).project(t,e);if(s(this,O))i[0]-=s(this,O)[0],i[1]-=s(this,O)[1];else throw"No initial position determined";return[i[0],-i[1]]}add(t,e,i,d,h={}){var m;t.properties=h,y(this,M,q).call(this,t,e,i,d),this.scene.add(t),(m=s(this,P))==null||m.sendData("/object/new",{position:t.position,x:t.position.x,z:t.position.z,session:s(this,T),properties:h})}setElevation(t){this.camera.position.y=t}on(t,e){s(this,D)[t]=e}}E=new WeakMap,D=new WeakMap,I=new WeakMap,S=new WeakMap,j=new WeakMap,L=new WeakMap,O=new WeakMap,_=new WeakMap,T=new WeakMap,P=new WeakMap,M=new WeakSet,q=function(t,e,i,d){const h=this.lonLatToWorldCoords(e,i);d!==void 0&&(t.position.y=d),[t.position.x,t.position.z]=h},Y=function(t,e){g(this,O,s(this,E).project(t,e))},H=function(t){var i,d,h;let e=Number.MAX_VALUE;N(this,_)._++,(i=s(this,P))==null||i.sendData("/gps/new",{gpsCount:s(this,_),lat:t.coords.latitude,lon:t.coords.longitude,acc:t.coords.accuracy,session:s(this,T)}),t.coords.accuracy<=s(this,j)&&(s(this,I)===null?g(this,I,{latitude:t.coords.latitude,longitude:t.coords.longitude}):e=y(this,M,Z).call(this,s(this,I),t.coords),e>=s(this,S)&&(s(this,I).longitude=t.coords.longitude,s(this,I).latitude=t.coords.latitude,s(this,O)||(y(this,M,Y).call(this,t.coords.longitude,t.coords.latitude),(d=s(this,P))==null||d.sendData("/worldorigin/new",{gpsCount:s(this,_),lat:t.coords.latitude,lon:t.coords.longitude,session:s(this,T),initialPosition:s(this,O)})),y(this,M,q).call(this,this.camera,t.coords.longitude,t.coords.latitude),(h=s(this,P))==null||h.sendData("/gps/accepted",{gpsCount:s(this,_),cameraX:this.camera.position.x,cameraZ:this.camera.position.z,session:s(this,T),distMoved:e}),s(this,D).gpsupdate&&s(this,D).gpsupdate(t,e)))},Z=function(t,e){const i=p.MathUtils.degToRad(e.longitude-t.longitude),d=p.MathUtils.degToRad(e.latitude-t.latitude),h=Math.sin(d/2)*Math.sin(d/2)+Math.cos(p.MathUtils.degToRad(t.latitude))*Math.cos(p.MathUtils.degToRad(e.latitude))*(Math.sin(i/2)*Math.sin(i/2));return 2*Math.atan2(Math.sqrt(h),Math.sqrt(1-h))*6371e3};class K{constructor(t={},e){this.sceneWebcam=new p.Scene;let i;if(e?i=document.querySelector(e):(i=document.createElement("video"),i.setAttribute("autoplay",!0),i.setAttribute("playsinline",!0),i.style.display="none",document.body.appendChild(i)),this.texture=new p.VideoTexture(i),navigator.mediaDevices&&navigator.mediaDevices.getUserMedia){const d={video:{width:{ideal:t.idealWidth||1280},height:{ideal:t.idealHeight||720},facingMode:"environment"}};navigator.mediaDevices.getUserMedia(d).then(h=>{i.addEventListener("loadedmetadata",()=>{var m;i.setAttribute("width",i.videoWidth),i.setAttribute("height",i.videoHeight),i.play(),(m=t.onVideoStarted)==null||m.call(this,this.texture)}),i.srcObject=h}).catch(h=>{setTimeout(()=>{alert(`Webcam Error
|
|
2
|
+
Name: `+h.name+`
|
|
3
|
+
Message: `+h.message)},1e3)})}else setTimeout(()=>{alert("sorry - media devices API not supported")},1e3)}dispose(){this.texture.dispose()}}const k=navigator.userAgent.match(/iPhone|iPad|iPod/i)||/Macintosh/i.test(navigator.userAgent)&&navigator.maxTouchPoints!=null&&navigator.maxTouchPoints>1,$=new n.Vector3(0,0,1),R=new n.Euler,J=new n.Quaternion,tt=new n.Quaternion(-Math.sqrt(.5),0,0,Math.sqrt(.5)),et={type:"change"};class it extends n.EventDispatcher{constructor(t){super(),window.isSecureContext===!1&&console.error("THREE.DeviceOrientationControls: DeviceOrientationEvent is only available in secure contexts (https)");const e=this,i=1e-6,d=new n.Quaternion;this.object=t,this.object.rotation.reorder("YXZ"),this.enabled=!0,this.deviceOrientation=null,this.screenOrientation=0,this.alphaOffset=0,this.initialOffset=null,this.TWO_PI=2*Math.PI,this.HALF_PI=.5*Math.PI,this.orientationChangeEventName="ondeviceorientationabsolute"in window?"deviceorientationabsolute":"deviceorientation",this.smoothingFactor=1;const h=function({alpha:o,beta:c,gamma:l,webkitCompassHeading:r}){if(k){const u=360-r;e.alphaOffset=n.MathUtils.degToRad(u-o),e.deviceOrientation={alpha:o,beta:c,gamma:l,webkitCompassHeading:r}}else o<0&&(o+=360),e.deviceOrientation={alpha:o,beta:c,gamma:l};window.dispatchEvent(new CustomEvent("camera-rotation-change",{detail:{cameraRotation:t.rotation}}))},m=function(){e.screenOrientation=window.orientation||0},x=function(o,c,l,r,u){R.set(l,c,-r,"YXZ"),o.setFromEuler(R),o.multiply(tt),o.multiply(J.setFromAxisAngle($,-u))};this.connect=function(){m(),window.DeviceOrientationEvent!==void 0&&typeof window.DeviceOrientationEvent.requestPermission=="function"?window.DeviceOrientationEvent.requestPermission().then(o=>{o==="granted"&&(window.addEventListener("orientationchange",m),window.addEventListener(e.orientationChangeEventName,h))}).catch(function(o){console.error("THREE.DeviceOrientationControls: Unable to use DeviceOrientation API:",o)}):(window.addEventListener("orientationchange",m),window.addEventListener(e.orientationChangeEventName,h)),e.enabled=!0},this.disconnect=function(){window.removeEventListener("orientationchange",m),window.removeEventListener(e.orientationChangeEventName,h),e.enabled=!1,e.initialOffset=!1,e.deviceOrientation=null},this.update=function({theta:o=0}={theta:0}){if(e.enabled===!1)return;const c=e.deviceOrientation;if(c){let l=c.alpha?n.MathUtils.degToRad(c.alpha)+e.alphaOffset:0,r=c.beta?n.MathUtils.degToRad(c.beta):0,u=c.gamma?n.MathUtils.degToRad(c.gamma):0;const F=e.screenOrientation?n.MathUtils.degToRad(e.screenOrientation):0;if(k){const A=new n.Quaternion;x(A,l,r,u,F);const C=new n.Euler().setFromQuaternion(A,"YXZ");console.log(C.x,C.y,C.z),C.y=n.MathUtils.degToRad(360-c.webkitCompassHeading),A.setFromEuler(C),e.object.quaternion.copy(A)}else{if(this.smoothingFactor<1){if(this.lastOrientation){const A=this.smoothingFactor;l=this._getSmoothedAngle(l,this.lastOrientation.alpha,A),r=this._getSmoothedAngle(r+Math.PI,this.lastOrientation.beta,A),u=this._getSmoothedAngle(u+this.HALF_PI,this.lastOrientation.gamma,A,Math.PI)}else r+=Math.PI,u+=this.HALF_PI;this.lastOrientation={alpha:l,beta:r,gamma:u}}x(e.object.quaternion,l+o,this.smoothingFactor<1?r-Math.PI:r,this.smoothingFactor<1?u-this.HALF_PI:u,F)}8*(1-d.dot(e.object.quaternion))>i&&(d.copy(e.object.quaternion),e.dispatchEvent(et))}},this._orderAngle=function(o,c,l=this.TWO_PI){return c>o&&Math.abs(c-o)<l/2||o>c&&Math.abs(c-o)>l/2?{left:o,right:c}:{left:c,right:o}},this._getSmoothedAngle=function(o,c,l,r=this.TWO_PI){const u=this._orderAngle(o,c,r),F=u.left,A=u.right;u.left=0,u.right-=F,u.right<0&&(u.right+=r);let C=A==c?(1-l)*u.right+l*u.left:l*u.right+(1-l)*u.left;return C+=F,C>=r&&(C-=r),C},this.updateAlphaOffset=function(){e.initialOffset=!1},this.dispose=function(){e.disconnect()},this.getAlpha=function(){const{deviceOrientation:o}=e;return o&&o.alpha?n.MathUtils.degToRad(o.alpha)+e.alphaOffset:0},this.getBeta=function(){const{deviceOrientation:o}=e;return o&&o.beta?n.MathUtils.degToRad(o.beta):0},window.DeviceOrientationEvent!==void 0&&typeof window.DeviceOrientationEvent.requestPermission=="function"?this.initPermissionDialog():this.connect()}initPermissionDialog(){const t=document.createElement("div"),e=document.createElement("div"),i=document.createElement("div"),d=document.createElement("div");document.body.appendChild(t);const h={display:"flex",position:"fixed",top:0,left:0,width:"100%",height:"100%",zIndex:1,backgroundColor:"rgba(0,0,0,0.6)",justifyContent:"center",alignItems:"center"},m={backgroundColor:"white",padding:"6px",borderRadius:"3px",width:"36rem",height:"24rem"},x={width:"100%",height:"70%",display:"flex",justifyContent:"center",alignItems:"center"},o={display:"inline-flex",width:"100%",height:"30%",justifyContent:"center",alignItems:"center"};for(let r in h)t.style[r]=h[r];for(let r in m)e.style[r]=m[r];for(let r in x)i.style[r]=x[r];for(let r in o)d.style[r]=o[r];t.appendChild(e),e.appendChild(i),e.appendChild(d),i.innerHTML='<div style="font-size: 24pt; margin: 1rem;">This immersive website requires access to your device motion sensors.</div>';const c=()=>{this.connect(),t.style.display="none"},l=document.createElement("button");l.addEventListener("click",c),l.style.width="50%",l.style.height="80%",l.style.fontSize="20pt",l.appendChild(document.createTextNode("OK")),d.appendChild(l),document.body.appendChild(t)}}class nt{constructor(t){this.raycaster=new p.Raycaster,this.normalisedMousePosition=new p.Vector2(null,null),t.domElement.addEventListener("click",e=>{this.normalisedMousePosition.set(e.clientX/t.domElement.clientWidth*2-1,-(e.clientY/t.domElement.clientHeight*2)+1)})}raycast(t,e){if(this.normalisedMousePosition.x!==null&&this.normalisedMousePosition.y!==null){this.raycaster.setFromCamera(this.normalisedMousePosition,t);const i=this.raycaster.intersectObjects(e.children,!1);return this.normalisedMousePosition.set(null,null),i}return[]}}const st="0.0.10-noaframe-1";a.ClickHandler=nt,a.DeviceOrientationControls=it,a.LocationBased=B,a.SphMercProjection=U,a.Webcam=K,a.version=st,Object.defineProperty(a,Symbol.toStringTag,{value:"Module"})});
|