locar 0.1.4 → 0.1.6
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/dist/locar.es.js +56 -41
- package/dist/locar.umd.js +1 -1
- package/package.json +1 -1
package/dist/locar.es.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import * as
|
|
2
|
-
import { Vector3 as
|
|
3
|
-
class
|
|
1
|
+
import * as m from "three";
|
|
2
|
+
import { Vector3 as y, Euler as C, Quaternion as I, EventDispatcher as w, MathUtils as g } from "three";
|
|
3
|
+
class R {
|
|
4
4
|
/**
|
|
5
5
|
* Create a SphMercProjection.
|
|
6
6
|
*/
|
|
@@ -56,18 +56,31 @@ class A {
|
|
|
56
56
|
* @param {Function} eventHandler - the event handler function.
|
|
57
57
|
*/
|
|
58
58
|
on(e, i) {
|
|
59
|
-
this.eventHandlers[e] = i;
|
|
59
|
+
this.eventHandlers[e] === void 0 && (this.eventHandlers[e] = []), this.eventHandlers[e].push(i);
|
|
60
60
|
}
|
|
61
61
|
/**
|
|
62
62
|
* Emit an event.
|
|
63
63
|
* @param {string} eventName - the event to emit.
|
|
64
|
-
* @param ...params - parameters to pass to the event
|
|
64
|
+
* @param ...params - parameters to pass to the event handlers.
|
|
65
65
|
*/
|
|
66
66
|
emit(e, ...i) {
|
|
67
|
-
this.eventHandlers[e]?.
|
|
67
|
+
this.eventHandlers[e]?.forEach((t) => {
|
|
68
|
+
t(...i);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Remove an event handler.
|
|
73
|
+
* @param {string} eventName - the event to remove a handler from.
|
|
74
|
+
* @param {Function} eventHandler - the event handler function to remove.
|
|
75
|
+
*/
|
|
76
|
+
off(e, i) {
|
|
77
|
+
if (this.eventHandlers[e]) {
|
|
78
|
+
const t = this.eventHandlers[e].indexOf(i);
|
|
79
|
+
t > -1 && this.eventHandlers[e].splice(t, 1);
|
|
80
|
+
}
|
|
68
81
|
}
|
|
69
82
|
}
|
|
70
|
-
class
|
|
83
|
+
class q extends A {
|
|
71
84
|
#t;
|
|
72
85
|
// eslint-disable-next-line no-unused-private-class-members
|
|
73
86
|
#l;
|
|
@@ -88,7 +101,7 @@ class k extends A {
|
|
|
88
101
|
* @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.
|
|
89
102
|
*/
|
|
90
103
|
constructor(e, i, t = {}, c = null) {
|
|
91
|
-
super(), this.scene = e, this.camera = i, this.#t = new
|
|
104
|
+
super(), this.scene = e, this.camera = i, this.#t = new R(), this.#e = null, this.#s = 0, this.#c = 100, this.#o = null, this.setGpsOptions(t), this.#i = null, this.#r = 0, this.#a = 0, this.#n = c;
|
|
92
105
|
}
|
|
93
106
|
/**
|
|
94
107
|
* Set the projection to use.
|
|
@@ -223,7 +236,7 @@ class k extends A {
|
|
|
223
236
|
}), e.coords.accuracy <= this.#c && (this.#e === null ? this.#e = {
|
|
224
237
|
latitude: e.coords.latitude,
|
|
225
238
|
longitude: e.coords.longitude
|
|
226
|
-
} : i = this.#
|
|
239
|
+
} : i = this.#g(this.#e, e.coords), i >= this.#s && (this.#e.longitude = e.coords.longitude, this.#e.latitude = e.coords.latitude, this.#i || (this.#u(
|
|
227
240
|
e.coords.longitude,
|
|
228
241
|
e.coords.latitude
|
|
229
242
|
), this.#n?.sendData("/worldorigin/new", {
|
|
@@ -249,8 +262,8 @@ class k extends A {
|
|
|
249
262
|
*
|
|
250
263
|
* Taken from original A-Frame AR.js location-based components
|
|
251
264
|
*/
|
|
252
|
-
#
|
|
253
|
-
const t =
|
|
265
|
+
#g(e, i) {
|
|
266
|
+
const t = m.MathUtils.degToRad(i.longitude - e.longitude), c = m.MathUtils.degToRad(i.latitude - e.latitude), h = Math.sin(c / 2) * Math.sin(c / 2) + Math.cos(m.MathUtils.degToRad(e.latitude)) * Math.cos(m.MathUtils.degToRad(i.latitude)) * (Math.sin(t / 2) * Math.sin(t / 2));
|
|
254
267
|
return 2 * Math.atan2(Math.sqrt(h), Math.sqrt(1 - h)) * 6371e3;
|
|
255
268
|
}
|
|
256
269
|
/**
|
|
@@ -262,7 +275,7 @@ class k extends A {
|
|
|
262
275
|
return this.#e;
|
|
263
276
|
}
|
|
264
277
|
}
|
|
265
|
-
class
|
|
278
|
+
class k extends A {
|
|
266
279
|
#t;
|
|
267
280
|
/**
|
|
268
281
|
* Create a Webcam.
|
|
@@ -273,7 +286,7 @@ class W extends A {
|
|
|
273
286
|
* undefined), a video element will be created.
|
|
274
287
|
*/
|
|
275
288
|
constructor(e = { video: { facingMode: "environment" } }, i) {
|
|
276
|
-
super(), this.sceneWebcam = new
|
|
289
|
+
super(), this.sceneWebcam = new m.Scene(), i ? this.#t = document.querySelector(i) : (this.#t = document.createElement("video"), this.#t.setAttribute("autoplay", !0), this.#t.setAttribute("playsinline", !0), this.#t.style.display = "none", document.body.appendChild(this.#t)), this.texture = new m.VideoTexture(this.#t), navigator.mediaDevices && navigator.mediaDevices.getUserMedia ? navigator.mediaDevices.getUserMedia(e).then((t) => {
|
|
277
290
|
this.#t.addEventListener("loadedmetadata", () => {
|
|
278
291
|
this.#t.setAttribute("width", this.#t.videoWidth), this.#t.setAttribute("height", this.#t.videoHeight), this.#t.play(), this.emit("webcamstarted", { texture: this.texture });
|
|
279
292
|
}), this.#t.srcObject = t;
|
|
@@ -295,18 +308,19 @@ class W extends A {
|
|
|
295
308
|
this.texture.dispose();
|
|
296
309
|
}
|
|
297
310
|
}
|
|
298
|
-
const b = "locar-device-orientation-permission-modal", D = "locar-device-orientation-permission-button", S = "locar-device-orientation-permission-message", N = "locar-device-orientation-permission-inner", L = "locar-device-orientation-permission-button-inner",
|
|
299
|
-
class V extends
|
|
311
|
+
const b = "locar-device-orientation-permission-modal", D = "locar-device-orientation-permission-button", S = "locar-device-orientation-permission-message", N = "locar-device-orientation-permission-inner", L = "locar-device-orientation-permission-button-inner", T = "This immersive website requires access to your device motion sensors.", O = navigator.userAgent.match(/iPhone|iPad|iPod/i) || /Macintosh/i.test(navigator.userAgent) && navigator.maxTouchPoints != null && navigator.maxTouchPoints > 1, x = new y(0, 0, 1), P = new C(), H = new I(), F = new I(-Math.sqrt(0.5), 0, 0, Math.sqrt(0.5));
|
|
312
|
+
class V extends w {
|
|
300
313
|
/**
|
|
301
314
|
* Create an instance of DeviceOrientationControls.
|
|
302
315
|
* @param {Object} object - the object to attach the controls to
|
|
303
316
|
* (usually your Three.js camera)
|
|
304
|
-
* @param {Object} options - options for DeviceOrientationControls:
|
|
317
|
+
* @param {Object} options - options for DeviceOrientationControls:
|
|
318
|
+
* currently accepts smoothingFactor (< 1), enablePermissionDialog, orientationChangeThreshold (radians)
|
|
305
319
|
*/
|
|
306
320
|
constructor(e, i = {}) {
|
|
307
321
|
super(), this.eventEmitter = new A();
|
|
308
322
|
const t = this;
|
|
309
|
-
this.object = e, this.object.rotation.reorder("YXZ"), this.enabled = !0, this.deviceOrientation = null, this.screenOrientation = 0, this.alphaOffset = 0, this.orientationOffset = 0, this.initialOffset = null, this.lastCompassY = void 0, this.lastOrientation = null, this.TWO_PI = 2 * Math.PI, this.HALF_PI = 0.5 * Math.PI, this.orientationChangeEventName = "ondeviceorientationabsolute" in window ? "deviceorientationabsolute" : "deviceorientation", this.smoothingFactor = i.smoothingFactor || 1, this.enablePermissionDialog = i.enablePermissionDialog ?? !0, this.enableInlineStyling = i.enableStyling ?? !0, this.preferConfirmDialog = i.preferConfirmDialog ?? !1;
|
|
323
|
+
this.object = e, this.object.rotation.reorder("YXZ"), this.enabled = !0, this.deviceOrientation = null, this.screenOrientation = 0, this.alphaOffset = 0, this.orientationOffset = 0, this.initialOffset = null, this.lastCompassY = void 0, this.lastOrientation = null, this.TWO_PI = 2 * Math.PI, this.HALF_PI = 0.5 * Math.PI, this.orientationChangeEventName = "ondeviceorientationabsolute" in window ? "deviceorientationabsolute" : "deviceorientation", this.smoothingFactor = i.smoothingFactor || 1, this.enablePermissionDialog = i.enablePermissionDialog ?? !0, this.enableInlineStyling = i.enableStyling ?? !0, this.preferConfirmDialog = i.preferConfirmDialog ?? !1, this.orientationChangeThreshold = i.orientationChangeThreshold ?? 0;
|
|
310
324
|
const c = function({
|
|
311
325
|
alpha: n,
|
|
312
326
|
beta: s,
|
|
@@ -315,7 +329,7 @@ class V extends R {
|
|
|
315
329
|
}) {
|
|
316
330
|
if (O) {
|
|
317
331
|
const o = 360 - r;
|
|
318
|
-
t.alphaOffset =
|
|
332
|
+
t.alphaOffset = g.degToRad(o - n), t.deviceOrientation = { alpha: n, beta: s, gamma: a, webkitCompassHeading: r };
|
|
319
333
|
} else
|
|
320
334
|
n < 0 && (n += 360), t.deviceOrientation = { alpha: n, beta: s, gamma: a };
|
|
321
335
|
window.dispatchEvent(
|
|
@@ -326,7 +340,7 @@ class V extends R {
|
|
|
326
340
|
}, h = function() {
|
|
327
341
|
t.screenOrientation = window.orientation || 0, O && (t.screenOrientation === 90 ? t.orientationOffset = -t.HALF_PI : t.screenOrientation === -90 ? t.orientationOffset = t.HALF_PI : t.orientationOffset = 0);
|
|
328
342
|
}, E = function(n, s, a, r, o) {
|
|
329
|
-
|
|
343
|
+
P.set(a, s, -r, "YXZ"), n.setFromEuler(P), n.multiply(F), n.multiply(H.setFromAxisAngle(x, -o));
|
|
330
344
|
};
|
|
331
345
|
this.connect = function() {
|
|
332
346
|
h(), window.addEventListener(
|
|
@@ -366,9 +380,9 @@ class V extends R {
|
|
|
366
380
|
if (t.enabled === !1) return;
|
|
367
381
|
const s = t.deviceOrientation;
|
|
368
382
|
if (s) {
|
|
369
|
-
let a = s.alpha ?
|
|
370
|
-
const f = t.screenOrientation ?
|
|
371
|
-
if (t.smoothingFactor < 1)
|
|
383
|
+
let a = s.alpha ? g.degToRad(s.alpha) + t.alphaOffset : 0, r = s.beta ? g.degToRad(s.beta) : 0, o = s.gamma ? g.degToRad(s.gamma) : 0;
|
|
384
|
+
const f = t.screenOrientation ? g.degToRad(t.screenOrientation) : 0;
|
|
385
|
+
if (t.smoothingFactor < 1)
|
|
372
386
|
if (t.lastOrientation) {
|
|
373
387
|
const d = t.smoothingFactor;
|
|
374
388
|
a = t._getSmoothedAngle(
|
|
@@ -387,13 +401,7 @@ class V extends R {
|
|
|
387
401
|
);
|
|
388
402
|
} else
|
|
389
403
|
r += Math.PI, o += t.HALF_PI;
|
|
390
|
-
|
|
391
|
-
alpha: a,
|
|
392
|
-
beta: r,
|
|
393
|
-
gamma: o
|
|
394
|
-
};
|
|
395
|
-
}
|
|
396
|
-
if (O) {
|
|
404
|
+
if (t.lastOrientation && (a = t._calcAngleWithThreshold(a, t.lastOrientation.alpha), r = t._calcAngleWithThreshold(r, t.lastOrientation.beta), o = t._calcAngleWithThreshold(o, t.lastOrientation.gamma)), O) {
|
|
397
405
|
const d = new I();
|
|
398
406
|
E(
|
|
399
407
|
d,
|
|
@@ -402,11 +410,11 @@ class V extends R {
|
|
|
402
410
|
t.smoothingFactor < 1 ? o - Math.PI / 2 : o,
|
|
403
411
|
f
|
|
404
412
|
);
|
|
405
|
-
const u = new
|
|
413
|
+
const u = new C().setFromQuaternion(
|
|
406
414
|
d,
|
|
407
415
|
"YXZ"
|
|
408
416
|
);
|
|
409
|
-
let p =
|
|
417
|
+
let p = g.degToRad(360 - s.webkitCompassHeading);
|
|
410
418
|
t.smoothingFactor < 1 && t.lastCompassY !== void 0 && (p = t._getSmoothedAngle(
|
|
411
419
|
p,
|
|
412
420
|
t.lastCompassY,
|
|
@@ -420,12 +428,19 @@ class V extends R {
|
|
|
420
428
|
t.smoothingFactor < 1 ? o - Math.PI / 2 : o,
|
|
421
429
|
f
|
|
422
430
|
);
|
|
431
|
+
t.lastOrientation = {
|
|
432
|
+
alpha: a,
|
|
433
|
+
beta: r,
|
|
434
|
+
gamma: o
|
|
435
|
+
};
|
|
423
436
|
}
|
|
424
437
|
}, this.getCorrectedHeading = function() {
|
|
425
438
|
const { deviceOrientation: n } = t;
|
|
426
439
|
if (!n) return 0;
|
|
427
440
|
let s = 0;
|
|
428
441
|
return O ? (s = 360 - n.webkitCompassHeading, t.orientationOffset && (s += t.orientationOffset * (180 / Math.PI), s = (s + 360) % 360)) : (n.absolute === !0 || t.orientationChangeEventName, s = n.alpha ? n.alpha : 0, s = (360 - s) % 360, s < 0 && (s += 360)), s;
|
|
442
|
+
}, this._calcAngleWithThreshold = function(n, s) {
|
|
443
|
+
return Math.abs(n - s) < t.orientationChangeThreshold ? s : n;
|
|
429
444
|
}, this._orderAngle = function(n, s, a = t.TWO_PI) {
|
|
430
445
|
return s > n && Math.abs(s - n) < a / 2 || n > s && Math.abs(s - n) > a / 2 ? { left: n, right: s } : { left: s, right: n };
|
|
431
446
|
}, this._getSmoothedAngle = function(n, s, a, r = t.TWO_PI) {
|
|
@@ -439,13 +454,13 @@ class V extends R {
|
|
|
439
454
|
t.disconnect();
|
|
440
455
|
}, this.getAlpha = function() {
|
|
441
456
|
const { deviceOrientation: n } = t;
|
|
442
|
-
return n && n.alpha ?
|
|
457
|
+
return n && n.alpha ? g.degToRad(n.alpha) + t.alphaOffset : 0;
|
|
443
458
|
}, this.getBeta = function() {
|
|
444
459
|
const { deviceOrientation: n } = t;
|
|
445
|
-
return n && n.beta ?
|
|
460
|
+
return n && n.beta ? g.degToRad(n.beta) : 0;
|
|
446
461
|
}, this.getGamma = function() {
|
|
447
462
|
const { deviceOrientation: n } = t;
|
|
448
|
-
return n && n.gamma ?
|
|
463
|
+
return n && n.gamma ? g.degToRad(n.gamma) : 0;
|
|
449
464
|
}, this.createObtainPermissionGestureDialog = function() {
|
|
450
465
|
const n = document.createElement("div");
|
|
451
466
|
n.classList.add(b);
|
|
@@ -512,14 +527,14 @@ class V extends R {
|
|
|
512
527
|
o.style[l] = _[l];
|
|
513
528
|
}
|
|
514
529
|
n.appendChild(s), s.appendChild(a), s.appendChild(r), a.appendChild(
|
|
515
|
-
document.createTextNode(
|
|
530
|
+
document.createTextNode(T)
|
|
516
531
|
);
|
|
517
532
|
const f = () => {
|
|
518
533
|
this.requestOrientationPermissions(), n.style.display = "none";
|
|
519
534
|
};
|
|
520
535
|
o.addEventListener("click", f), o.appendChild(document.createTextNode("OK")), r.appendChild(o), document.body.appendChild(n);
|
|
521
536
|
}, this.obtainPermissionGesture = function() {
|
|
522
|
-
this.preferConfirmDialog === !0 ? window.confirm(
|
|
537
|
+
this.preferConfirmDialog === !0 ? window.confirm(T) && this.requestOrientationPermissions() : this.createObtainPermissionGestureDialog();
|
|
523
538
|
};
|
|
524
539
|
}
|
|
525
540
|
on(e, i) {
|
|
@@ -548,7 +563,7 @@ class j {
|
|
|
548
563
|
* events will be handled.
|
|
549
564
|
*/
|
|
550
565
|
constructor(e) {
|
|
551
|
-
this.raycaster = new
|
|
566
|
+
this.raycaster = new m.Raycaster(), this.normalisedMousePosition = new m.Vector2(null, null), e.domElement.addEventListener("click", (i) => {
|
|
552
567
|
this.normalisedMousePosition.set(
|
|
553
568
|
i.clientX / e.domElement.clientWidth * 2 - 1,
|
|
554
569
|
-(i.clientY / e.domElement.clientHeight * 2) + 1
|
|
@@ -572,13 +587,13 @@ class j {
|
|
|
572
587
|
return [];
|
|
573
588
|
}
|
|
574
589
|
}
|
|
575
|
-
const U = "0.1.
|
|
590
|
+
const U = "0.1.6";
|
|
576
591
|
export {
|
|
577
592
|
j as ClickHandler,
|
|
578
593
|
V as DeviceOrientationControls,
|
|
579
594
|
A as EventEmitter,
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
595
|
+
q as LocationBased,
|
|
596
|
+
R as SphMercProjection,
|
|
597
|
+
k as Webcam,
|
|
583
598
|
U as version
|
|
584
599
|
};
|
package/dist/locar.umd.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(h,c){typeof exports=="object"&&typeof module<"u"?c(exports,require("three")):typeof define=="function"&&define.amd?define(["exports","three"],c):(h=typeof globalThis<"u"?globalThis:h||self,c(h.locar={},h.THREE))})(this,(function(h,c){"use strict";function w(m){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(m){for(const i in m)if(i!=="default"){const e=Object.getOwnPropertyDescriptor(m,i);Object.defineProperty(t,i,e.get?e:{enumerable:!0,get:()=>m[i]})}}return t.default=m,Object.freeze(t)}const p=w(c);class A{constructor(){this.EARTH=4007501668e-2,this.HALF_EARTH=2003750834e-2}project(t,i){return[this.#t(t),this.#l(i)]}unproject(t){return[this.#e(t[0]),this.#s(t[1])]}#t(t){return t/180*this.HALF_EARTH}#l(t){var i=Math.log(Math.tan((90+t)*Math.PI/360))/(Math.PI/180);return i*this.HALF_EARTH/180}#e(t){return t/this.HALF_EARTH*180}#s(t){var i=t/this.HALF_EARTH*180;return i=180/Math.PI*(2*Math.atan(Math.exp(i*Math.PI/180))-Math.PI/2),i}getID(){return"epsg:3857"}}class M{constructor(){this.eventHandlers={}}on(t,i){this.eventHandlers[t]=i}emit(t,...i){this.eventHandlers[t]?.call(this,...i)}}class b extends M{#t;#l;#e;#s;#c;#o;#i;#r;#a;#n;constructor(t,i,e={},l=null){super(),this.scene=t,this.camera=i,this.#t=new A,this.#e=null,this.#s=0,this.#c=100,this.#o=null,this.setGpsOptions(e),this.#i=null,this.#r=0,this.#a=0,this.#n=l}setProjection(t){this.#t=t}setGpsOptions(t={}){t.gpsMinDistance!==void 0&&(this.#s=t.gpsMinDistance),t.gpsMinAccuracy!==void 0&&(this.#c=t.gpsMinAccuracy)}async startGps(){if(this.#n){const i=await(await this.#n.sendData("/gps/start",{gpsMinDistance:this.#s,gpsMinAccuracy:this.#c})).json();this.#a=i.session}return this.#o===null?(this.#o=navigator.geolocation.watchPosition(t=>{this.#h(t)},t=>{this.emit("gpserror",t)},{enableHighAccuracy:!0}),!0):!1}stopGps(){return this.#o!==null?(navigator.geolocation.clearWatch(this.#o),this.#o=null,!0):!1}fakeGps(t,i,e=null,l=0){e!==null&&this.setElevation(e),this.#h({coords:{longitude:t,latitude:i,accuracy:l}})}lonLatToWorldCoords(t,i){const e=this.#t.project(t,i);if(this.#i)e[0]-=this.#i[0],e[1]-=this.#i[1];else throw"No initial position determined";return[e[0],-e[1]]}add(t,i,e,l,g={}){t.properties=g,this.#d(t,i,e,l),this.scene.add(t),this.#n?.sendData("/object/new",{position:t.position,x:t.position.x,z:t.position.z,session:this.#a,properties:g})}#d(t,i,e,l){const g=this.lonLatToWorldCoords(i,e);l!==void 0&&(t.position.y=l),[t.position.x,t.position.z]=g}setElevation(t){this.camera.position.y=t}#u(t,i){this.#i=this.#t.project(t,i)}#h(t){let i=Number.MAX_VALUE;this.#r++,this.#n?.sendData("/gps/new",{gpsCount:this.#r,lat:t.coords.latitude,lon:t.coords.longitude,acc:t.coords.accuracy,session:this.#a}),t.coords.accuracy<=this.#c&&(this.#e===null?this.#e={latitude:t.coords.latitude,longitude:t.coords.longitude}:i=this.#m(this.#e,t.coords),i>=this.#s&&(this.#e.longitude=t.coords.longitude,this.#e.latitude=t.coords.latitude,this.#i||(this.#u(t.coords.longitude,t.coords.latitude),this.#n?.sendData("/worldorigin/new",{gpsCount:this.#r,lat:t.coords.latitude,lon:t.coords.longitude,session:this.#a,initialPosition:this.#i})),this.#d(this.camera,t.coords.longitude,t.coords.latitude),this.#n?.sendData("/gps/accepted",{gpsCount:this.#r,cameraX:this.camera.position.x,cameraZ:this.camera.position.z,session:this.#a,distMoved:i}),this.emit("gpsupdate",{position:t,distMoved:i})))}#m(t,i){const e=p.MathUtils.degToRad(i.longitude-t.longitude),l=p.MathUtils.degToRad(i.latitude-t.latitude),g=Math.sin(l/2)*Math.sin(l/2)+Math.cos(p.MathUtils.degToRad(t.latitude))*Math.cos(p.MathUtils.degToRad(i.latitude))*(Math.sin(e/2)*Math.sin(e/2));return 2*Math.atan2(Math.sqrt(g),Math.sqrt(1-g))*6371e3}getLastKnownLocation(){return this.#e}}class D extends M{#t;constructor(t={video:{facingMode:"environment"}},i){super(),this.sceneWebcam=new p.Scene,i?this.#t=document.querySelector(i):(this.#t=document.createElement("video"),this.#t.setAttribute("autoplay",!0),this.#t.setAttribute("playsinline",!0),this.#t.style.display="none",document.body.appendChild(this.#t)),this.texture=new p.VideoTexture(this.#t),navigator.mediaDevices&&navigator.mediaDevices.getUserMedia?navigator.mediaDevices.getUserMedia(t).then(e=>{this.#t.addEventListener("loadedmetadata",()=>{this.#t.setAttribute("width",this.#t.videoWidth),this.#t.setAttribute("height",this.#t.videoHeight),this.#t.play(),this.emit("webcamstarted",{texture:this.texture})}),this.#t.srcObject=e}).catch(e=>{this.emit("webcamerror",{code:e.name,message:e.message})}):this.emit("webcamerror",{code:"LOCAR_NO_MEDIA_DEVICES_API",message:"Media devices API not supported"})}dispose(){this.texture.dispose()}}const S="locar-device-orientation-permission-modal",T="locar-device-orientation-permission-button",N="locar-device-orientation-permission-message",R="locar-device-orientation-permission-inner",L="locar-device-orientation-permission-button-inner",P="This immersive website requires access to your device motion sensors.",I=navigator.userAgent.match(/iPhone|iPad|iPod/i)||/Macintosh/i.test(navigator.userAgent)&&navigator.maxTouchPoints!=null&&navigator.maxTouchPoints>1,x=new c.Vector3(0,0,1),_=new c.Euler,F=new c.Quaternion,U=new c.Quaternion(-Math.sqrt(.5),0,0,Math.sqrt(.5));class j extends c.EventDispatcher{constructor(t,i={}){super(),this.eventEmitter=new M;const e=this;this.object=t,this.object.rotation.reorder("YXZ"),this.enabled=!0,this.deviceOrientation=null,this.screenOrientation=0,this.alphaOffset=0,this.orientationOffset=0,this.initialOffset=null,this.lastCompassY=void 0,this.lastOrientation=null,this.TWO_PI=2*Math.PI,this.HALF_PI=.5*Math.PI,this.orientationChangeEventName="ondeviceorientationabsolute"in window?"deviceorientationabsolute":"deviceorientation",this.smoothingFactor=i.smoothingFactor||1,this.enablePermissionDialog=i.enablePermissionDialog??!0,this.enableInlineStyling=i.enableStyling??!0,this.preferConfirmDialog=i.preferConfirmDialog??!1;const l=function({alpha:n,beta:s,gamma:a,webkitCompassHeading:r}){if(I){const o=360-r;e.alphaOffset=c.MathUtils.degToRad(o-n),e.deviceOrientation={alpha:n,beta:s,gamma:a,webkitCompassHeading:r}}else n<0&&(n+=360),e.deviceOrientation={alpha:n,beta:s,gamma:a};window.dispatchEvent(new CustomEvent("camera-rotation-change",{detail:{cameraRotation:t.rotation}}))},g=function(){e.screenOrientation=window.orientation||0,I&&(e.screenOrientation===90?e.orientationOffset=-e.HALF_PI:e.screenOrientation===-90?e.orientationOffset=e.HALF_PI:e.orientationOffset=0)},E=function(n,s,a,r,o){_.set(a,s,-r,"YXZ"),n.setFromEuler(_),n.multiply(U),n.multiply(F.setFromAxisAngle(x,-o))};this.connect=function(){g(),window.addEventListener("orientationchange",g),window.addEventListener(e.orientationChangeEventName,l),e.enabled=!0},this.disconnect=function(){window.removeEventListener("orientationchange",g),window.removeEventListener(e.orientationChangeEventName,l),e.enabled=!1,e.initialOffset=!1,e.deviceOrientation=null},this.requestOrientationPermissions=function(){window.DeviceOrientationEvent!==void 0&&typeof window.DeviceOrientationEvent.requestPermission=="function"?window.DeviceOrientationEvent.requestPermission().then(n=>{n==="granted"?this.eventEmitter.emit("deviceorientationgranted",{target:this}):this.eventEmitter.emit("deviceorientationerror",{code:"LOCAR_DEVICE_ORIENTATION_PERMISSION_DENIED",message:"Permission for device orientation denied - AR will not work correctly"})}).catch(function(n){this.eventEmitter.emit("deviceorientationerror",{code:"LOCAR_DEVICE_ORIENTATION_PERMISSION_FAILED",message:"Permission request for device orientation failed - AR will not work correctly",error:JSON.stringify(n,null,2)})}):this.eventEmitter.emit("deviceorientationerror",{code:"LOCAR_DEVICE_ORIENTATION_INTERNAL_ERROR",message:"Internal error: no requestPermission() found although requestOrientationPermissions() was called - please raise an issue on GitHub"})},this.update=function({theta:n=0}={theta:0}){if(e.enabled===!1)return;const s=e.deviceOrientation;if(s){let a=s.alpha?c.MathUtils.degToRad(s.alpha)+e.alphaOffset:0,r=s.beta?c.MathUtils.degToRad(s.beta):0,o=s.gamma?c.MathUtils.degToRad(s.gamma):0;const v=e.screenOrientation?c.MathUtils.degToRad(e.screenOrientation):0;if(e.smoothingFactor<1){if(e.lastOrientation){const u=e.smoothingFactor;a=e._getSmoothedAngle(a,e.lastOrientation.alpha,u),r=e._getSmoothedAngle(r+Math.PI,e.lastOrientation.beta,u),o=e._getSmoothedAngle(o+e.HALF_PI,e.lastOrientation.gamma,u,Math.PI)}else r+=Math.PI,o+=e.HALF_PI;e.lastOrientation={alpha:a,beta:r,gamma:o}}if(I){const u=new c.Quaternion;E(u,a,e.smoothingFactor<1?r-Math.PI:r,e.smoothingFactor<1?o-Math.PI/2:o,v);const f=new c.Euler().setFromQuaternion(u,"YXZ");let O=c.MathUtils.degToRad(360-s.webkitCompassHeading);e.smoothingFactor<1&&e.lastCompassY!==void 0&&(O=e._getSmoothedAngle(O,e.lastCompassY,e.smoothingFactor)),e.lastCompassY=O,f.y=O+(e.orientationOffset||0),u.setFromEuler(f),e.object.quaternion.copy(u)}else E(e.object.quaternion,I?a+e.alphaOffset:a,e.smoothingFactor<1?r-Math.PI:r,e.smoothingFactor<1?o-Math.PI/2:o,v)}},this.getCorrectedHeading=function(){const{deviceOrientation:n}=e;if(!n)return 0;let s=0;return I?(s=360-n.webkitCompassHeading,e.orientationOffset&&(s+=e.orientationOffset*(180/Math.PI),s=(s+360)%360)):(n.absolute===!0||e.orientationChangeEventName,s=n.alpha?n.alpha:0,s=(360-s)%360,s<0&&(s+=360)),s},this._orderAngle=function(n,s,a=e.TWO_PI){return s>n&&Math.abs(s-n)<a/2||n>s&&Math.abs(s-n)>a/2?{left:n,right:s}:{left:s,right:n}},this._getSmoothedAngle=function(n,s,a,r=e.TWO_PI){const o=e._orderAngle(n,s,r),v=o.left,u=o.right;o.left=0,o.right-=v,o.right<0&&(o.right+=r);let f=u==s?(1-a)*o.right+a*o.left:a*o.right+(1-a)*o.left;return f+=v,f>=r&&(f-=r),f},this.updateAlphaOffset=function(){e.initialOffset=!1},this.dispose=function(){e.disconnect()},this.getAlpha=function(){const{deviceOrientation:n}=e;return n&&n.alpha?c.MathUtils.degToRad(n.alpha)+e.alphaOffset:0},this.getBeta=function(){const{deviceOrientation:n}=e;return n&&n.beta?c.MathUtils.degToRad(n.beta):0},this.getGamma=function(){const{deviceOrientation:n}=e;return n&&n.gamma?c.MathUtils.degToRad(n.gamma):0},this.createObtainPermissionGestureDialog=function(){const n=document.createElement("div");n.classList.add(S);const s=document.createElement("div");s.classList.add(R);const a=document.createElement("div");a.classList.add(N);const r=document.createElement("div");r.classList.add(L);const o=document.createElement("button");if(o.classList.add(T),document.body.appendChild(n),this.enableInlineStyling===!0){const u={fontFamily:"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'",display:"flex",position:"fixed",zIndex:1e5,justifyContent:"center",alignItems:"center",backgroundColor:"rgba(0,0,0,0.2)",inset:0,padding:"20px"},f={backgroundColor:"rgba(220, 220, 220, 0.85)",padding:"6px 0",borderRadius:"10px",width:"100%",maxWidth:"400px"},O={padding:"10px 12px",textAlign:"center",fontWeight:400,fontSize:"13px",display:"flex",justifyContent:"center",alignItems:"center"},y={display:"block",textAlign:"center",textDecoration:"none",borderTop:"rgb(180,180,180) solid 1px"},C={display:"block",width:"100%",textAlign:"center",appearance:"none",background:"none",border:"none",outline:"none",padding:"10px",fontWeight:400,fontSize:"16px",color:"#2e7cf1",cursor:"pointer"};for(let d in u)n.style[d]=u[d];for(let d in f)s.style[d]=f[d];for(let d in O)a.style[d]=O[d];for(let d in y)r.style[d]=y[d];for(let d in C)o.style[d]=C[d]}n.appendChild(s),s.appendChild(a),s.appendChild(r),a.appendChild(document.createTextNode(P));const v=()=>{this.requestOrientationPermissions(),n.style.display="none"};o.addEventListener("click",v),o.appendChild(document.createTextNode("OK")),r.appendChild(o),document.body.appendChild(n)},this.obtainPermissionGesture=function(){this.preferConfirmDialog===!0?window.confirm(P)&&this.requestOrientationPermissions():this.createObtainPermissionGestureDialog()}}on(t,i){this.eventEmitter.on(t,i)}init(){window.DeviceOrientationEvent===void 0?this.eventEmitter.emit("deviceorientationerror",{code:"LOCAR_DEVICE_ORIENTATION_NOT_SUPPORTED",message:"Device orientation API not supported"}):window.isSecureContext===!1?this.eventEmitter.emit("deviceorientationerror",{code:"LOCAR_DEVICE_ORIENTATION_NO_HTTPS",message:"DeviceOrientationEvent is only available in secure contexts (https)"}):typeof window.DeviceOrientationEvent.requestPermission=="function"&&this.enablePermissionDialog?this.obtainPermissionGesture():this.eventEmitter.emit("deviceorientationgranted",{target:this})}}class q{constructor(t){this.raycaster=new p.Raycaster,this.normalisedMousePosition=new p.Vector2(null,null),t.domElement.addEventListener("click",i=>{this.normalisedMousePosition.set(i.clientX/t.domElement.clientWidth*2-1,-(i.clientY/t.domElement.clientHeight*2)+1)})}raycast(t,i){if(this.normalisedMousePosition.x!==null&&this.normalisedMousePosition.y!==null){this.raycaster.setFromCamera(this.normalisedMousePosition,t);const e=this.raycaster.intersectObjects(i.children,!1);return this.normalisedMousePosition.set(null,null),e}return[]}}const k="0.1.4";h.ClickHandler=q,h.DeviceOrientationControls=j,h.EventEmitter=M,h.LocationBased=b,h.SphMercProjection=A,h.Webcam=D,h.version=k,Object.defineProperty(h,Symbol.toStringTag,{value:"Module"})}));
|
|
1
|
+
(function(h,c){typeof exports=="object"&&typeof module<"u"?c(exports,require("three")):typeof define=="function"&&define.amd?define(["exports","three"],c):(h=typeof globalThis<"u"?globalThis:h||self,c(h.locar={},h.THREE))})(this,(function(h,c){"use strict";function b(g){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(g){for(const i in g)if(i!=="default"){const t=Object.getOwnPropertyDescriptor(g,i);Object.defineProperty(e,i,t.get?t:{enumerable:!0,get:()=>g[i]})}}return e.default=g,Object.freeze(e)}const p=b(c);class A{constructor(){this.EARTH=4007501668e-2,this.HALF_EARTH=2003750834e-2}project(e,i){return[this.#t(e),this.#l(i)]}unproject(e){return[this.#e(e[0]),this.#s(e[1])]}#t(e){return e/180*this.HALF_EARTH}#l(e){var i=Math.log(Math.tan((90+e)*Math.PI/360))/(Math.PI/180);return i*this.HALF_EARTH/180}#e(e){return e/this.HALF_EARTH*180}#s(e){var i=e/this.HALF_EARTH*180;return i=180/Math.PI*(2*Math.atan(Math.exp(i*Math.PI/180))-Math.PI/2),i}getID(){return"epsg:3857"}}class M{constructor(){this.eventHandlers={}}on(e,i){this.eventHandlers[e]===void 0&&(this.eventHandlers[e]=[]),this.eventHandlers[e].push(i)}emit(e,...i){this.eventHandlers[e]?.forEach(t=>{t(...i)})}off(e,i){if(this.eventHandlers[e]){const t=this.eventHandlers[e].indexOf(i);t>-1&&this.eventHandlers[e].splice(t,1)}}}class w extends M{#t;#l;#e;#s;#c;#o;#i;#r;#a;#n;constructor(e,i,t={},l=null){super(),this.scene=e,this.camera=i,this.#t=new A,this.#e=null,this.#s=0,this.#c=100,this.#o=null,this.setGpsOptions(t),this.#i=null,this.#r=0,this.#a=0,this.#n=l}setProjection(e){this.#t=e}setGpsOptions(e={}){e.gpsMinDistance!==void 0&&(this.#s=e.gpsMinDistance),e.gpsMinAccuracy!==void 0&&(this.#c=e.gpsMinAccuracy)}async startGps(){if(this.#n){const i=await(await this.#n.sendData("/gps/start",{gpsMinDistance:this.#s,gpsMinAccuracy:this.#c})).json();this.#a=i.session}return this.#o===null?(this.#o=navigator.geolocation.watchPosition(e=>{this.#h(e)},e=>{this.emit("gpserror",e)},{enableHighAccuracy:!0}),!0):!1}stopGps(){return this.#o!==null?(navigator.geolocation.clearWatch(this.#o),this.#o=null,!0):!1}fakeGps(e,i,t=null,l=0){t!==null&&this.setElevation(t),this.#h({coords:{longitude:e,latitude:i,accuracy:l}})}lonLatToWorldCoords(e,i){const t=this.#t.project(e,i);if(this.#i)t[0]-=this.#i[0],t[1]-=this.#i[1];else throw"No initial position determined";return[t[0],-t[1]]}add(e,i,t,l,m={}){e.properties=m,this.#d(e,i,t,l),this.scene.add(e),this.#n?.sendData("/object/new",{position:e.position,x:e.position.x,z:e.position.z,session:this.#a,properties:m})}#d(e,i,t,l){const m=this.lonLatToWorldCoords(i,t);l!==void 0&&(e.position.y=l),[e.position.x,e.position.z]=m}setElevation(e){this.camera.position.y=e}#u(e,i){this.#i=this.#t.project(e,i)}#h(e){let i=Number.MAX_VALUE;this.#r++,this.#n?.sendData("/gps/new",{gpsCount:this.#r,lat:e.coords.latitude,lon:e.coords.longitude,acc:e.coords.accuracy,session:this.#a}),e.coords.accuracy<=this.#c&&(this.#e===null?this.#e={latitude:e.coords.latitude,longitude:e.coords.longitude}:i=this.#g(this.#e,e.coords),i>=this.#s&&(this.#e.longitude=e.coords.longitude,this.#e.latitude=e.coords.latitude,this.#i||(this.#u(e.coords.longitude,e.coords.latitude),this.#n?.sendData("/worldorigin/new",{gpsCount:this.#r,lat:e.coords.latitude,lon:e.coords.longitude,session:this.#a,initialPosition:this.#i})),this.#d(this.camera,e.coords.longitude,e.coords.latitude),this.#n?.sendData("/gps/accepted",{gpsCount:this.#r,cameraX:this.camera.position.x,cameraZ:this.camera.position.z,session:this.#a,distMoved:i}),this.emit("gpsupdate",{position:e,distMoved:i})))}#g(e,i){const t=p.MathUtils.degToRad(i.longitude-e.longitude),l=p.MathUtils.degToRad(i.latitude-e.latitude),m=Math.sin(l/2)*Math.sin(l/2)+Math.cos(p.MathUtils.degToRad(e.latitude))*Math.cos(p.MathUtils.degToRad(i.latitude))*(Math.sin(t/2)*Math.sin(t/2));return 2*Math.atan2(Math.sqrt(m),Math.sqrt(1-m))*6371e3}getLastKnownLocation(){return this.#e}}class T extends M{#t;constructor(e={video:{facingMode:"environment"}},i){super(),this.sceneWebcam=new p.Scene,i?this.#t=document.querySelector(i):(this.#t=document.createElement("video"),this.#t.setAttribute("autoplay",!0),this.#t.setAttribute("playsinline",!0),this.#t.style.display="none",document.body.appendChild(this.#t)),this.texture=new p.VideoTexture(this.#t),navigator.mediaDevices&&navigator.mediaDevices.getUserMedia?navigator.mediaDevices.getUserMedia(e).then(t=>{this.#t.addEventListener("loadedmetadata",()=>{this.#t.setAttribute("width",this.#t.videoWidth),this.#t.setAttribute("height",this.#t.videoHeight),this.#t.play(),this.emit("webcamstarted",{texture:this.texture})}),this.#t.srcObject=t}).catch(t=>{this.emit("webcamerror",{code:t.name,message:t.message})}):this.emit("webcamerror",{code:"LOCAR_NO_MEDIA_DEVICES_API",message:"Media devices API not supported"})}dispose(){this.texture.dispose()}}const D="locar-device-orientation-permission-modal",S="locar-device-orientation-permission-button",R="locar-device-orientation-permission-message",N="locar-device-orientation-permission-inner",L="locar-device-orientation-permission-button-inner",_="This immersive website requires access to your device motion sensors.",I=navigator.userAgent.match(/iPhone|iPad|iPod/i)||/Macintosh/i.test(navigator.userAgent)&&navigator.maxTouchPoints!=null&&navigator.maxTouchPoints>1,x=new c.Vector3(0,0,1),P=new c.Euler,F=new c.Quaternion,H=new c.Quaternion(-Math.sqrt(.5),0,0,Math.sqrt(.5));class U extends c.EventDispatcher{constructor(e,i={}){super(),this.eventEmitter=new M;const t=this;this.object=e,this.object.rotation.reorder("YXZ"),this.enabled=!0,this.deviceOrientation=null,this.screenOrientation=0,this.alphaOffset=0,this.orientationOffset=0,this.initialOffset=null,this.lastCompassY=void 0,this.lastOrientation=null,this.TWO_PI=2*Math.PI,this.HALF_PI=.5*Math.PI,this.orientationChangeEventName="ondeviceorientationabsolute"in window?"deviceorientationabsolute":"deviceorientation",this.smoothingFactor=i.smoothingFactor||1,this.enablePermissionDialog=i.enablePermissionDialog??!0,this.enableInlineStyling=i.enableStyling??!0,this.preferConfirmDialog=i.preferConfirmDialog??!1,this.orientationChangeThreshold=i.orientationChangeThreshold??0;const l=function({alpha:n,beta:s,gamma:a,webkitCompassHeading:r}){if(I){const o=360-r;t.alphaOffset=c.MathUtils.degToRad(o-n),t.deviceOrientation={alpha:n,beta:s,gamma:a,webkitCompassHeading:r}}else n<0&&(n+=360),t.deviceOrientation={alpha:n,beta:s,gamma:a};window.dispatchEvent(new CustomEvent("camera-rotation-change",{detail:{cameraRotation:e.rotation}}))},m=function(){t.screenOrientation=window.orientation||0,I&&(t.screenOrientation===90?t.orientationOffset=-t.HALF_PI:t.screenOrientation===-90?t.orientationOffset=t.HALF_PI:t.orientationOffset=0)},E=function(n,s,a,r,o){P.set(a,s,-r,"YXZ"),n.setFromEuler(P),n.multiply(H),n.multiply(F.setFromAxisAngle(x,-o))};this.connect=function(){m(),window.addEventListener("orientationchange",m),window.addEventListener(t.orientationChangeEventName,l),t.enabled=!0},this.disconnect=function(){window.removeEventListener("orientationchange",m),window.removeEventListener(t.orientationChangeEventName,l),t.enabled=!1,t.initialOffset=!1,t.deviceOrientation=null},this.requestOrientationPermissions=function(){window.DeviceOrientationEvent!==void 0&&typeof window.DeviceOrientationEvent.requestPermission=="function"?window.DeviceOrientationEvent.requestPermission().then(n=>{n==="granted"?this.eventEmitter.emit("deviceorientationgranted",{target:this}):this.eventEmitter.emit("deviceorientationerror",{code:"LOCAR_DEVICE_ORIENTATION_PERMISSION_DENIED",message:"Permission for device orientation denied - AR will not work correctly"})}).catch(function(n){this.eventEmitter.emit("deviceorientationerror",{code:"LOCAR_DEVICE_ORIENTATION_PERMISSION_FAILED",message:"Permission request for device orientation failed - AR will not work correctly",error:JSON.stringify(n,null,2)})}):this.eventEmitter.emit("deviceorientationerror",{code:"LOCAR_DEVICE_ORIENTATION_INTERNAL_ERROR",message:"Internal error: no requestPermission() found although requestOrientationPermissions() was called - please raise an issue on GitHub"})},this.update=function({theta:n=0}={theta:0}){if(t.enabled===!1)return;const s=t.deviceOrientation;if(s){let a=s.alpha?c.MathUtils.degToRad(s.alpha)+t.alphaOffset:0,r=s.beta?c.MathUtils.degToRad(s.beta):0,o=s.gamma?c.MathUtils.degToRad(s.gamma):0;const O=t.screenOrientation?c.MathUtils.degToRad(t.screenOrientation):0;if(t.smoothingFactor<1)if(t.lastOrientation){const u=t.smoothingFactor;a=t._getSmoothedAngle(a,t.lastOrientation.alpha,u),r=t._getSmoothedAngle(r+Math.PI,t.lastOrientation.beta,u),o=t._getSmoothedAngle(o+t.HALF_PI,t.lastOrientation.gamma,u,Math.PI)}else r+=Math.PI,o+=t.HALF_PI;if(t.lastOrientation&&(a=t._calcAngleWithThreshold(a,t.lastOrientation.alpha),r=t._calcAngleWithThreshold(r,t.lastOrientation.beta),o=t._calcAngleWithThreshold(o,t.lastOrientation.gamma)),I){const u=new c.Quaternion;E(u,a,t.smoothingFactor<1?r-Math.PI:r,t.smoothingFactor<1?o-Math.PI/2:o,O);const f=new c.Euler().setFromQuaternion(u,"YXZ");let v=c.MathUtils.degToRad(360-s.webkitCompassHeading);t.smoothingFactor<1&&t.lastCompassY!==void 0&&(v=t._getSmoothedAngle(v,t.lastCompassY,t.smoothingFactor)),t.lastCompassY=v,f.y=v+(t.orientationOffset||0),u.setFromEuler(f),t.object.quaternion.copy(u)}else E(t.object.quaternion,I?a+t.alphaOffset:a,t.smoothingFactor<1?r-Math.PI:r,t.smoothingFactor<1?o-Math.PI/2:o,O);t.lastOrientation={alpha:a,beta:r,gamma:o}}},this.getCorrectedHeading=function(){const{deviceOrientation:n}=t;if(!n)return 0;let s=0;return I?(s=360-n.webkitCompassHeading,t.orientationOffset&&(s+=t.orientationOffset*(180/Math.PI),s=(s+360)%360)):(n.absolute===!0||t.orientationChangeEventName,s=n.alpha?n.alpha:0,s=(360-s)%360,s<0&&(s+=360)),s},this._calcAngleWithThreshold=function(n,s){return Math.abs(n-s)<t.orientationChangeThreshold?s:n},this._orderAngle=function(n,s,a=t.TWO_PI){return s>n&&Math.abs(s-n)<a/2||n>s&&Math.abs(s-n)>a/2?{left:n,right:s}:{left:s,right:n}},this._getSmoothedAngle=function(n,s,a,r=t.TWO_PI){const o=t._orderAngle(n,s,r),O=o.left,u=o.right;o.left=0,o.right-=O,o.right<0&&(o.right+=r);let f=u==s?(1-a)*o.right+a*o.left:a*o.right+(1-a)*o.left;return f+=O,f>=r&&(f-=r),f},this.updateAlphaOffset=function(){t.initialOffset=!1},this.dispose=function(){t.disconnect()},this.getAlpha=function(){const{deviceOrientation:n}=t;return n&&n.alpha?c.MathUtils.degToRad(n.alpha)+t.alphaOffset:0},this.getBeta=function(){const{deviceOrientation:n}=t;return n&&n.beta?c.MathUtils.degToRad(n.beta):0},this.getGamma=function(){const{deviceOrientation:n}=t;return n&&n.gamma?c.MathUtils.degToRad(n.gamma):0},this.createObtainPermissionGestureDialog=function(){const n=document.createElement("div");n.classList.add(D);const s=document.createElement("div");s.classList.add(N);const a=document.createElement("div");a.classList.add(R);const r=document.createElement("div");r.classList.add(L);const o=document.createElement("button");if(o.classList.add(S),document.body.appendChild(n),this.enableInlineStyling===!0){const u={fontFamily:"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'",display:"flex",position:"fixed",zIndex:1e5,justifyContent:"center",alignItems:"center",backgroundColor:"rgba(0,0,0,0.2)",inset:0,padding:"20px"},f={backgroundColor:"rgba(220, 220, 220, 0.85)",padding:"6px 0",borderRadius:"10px",width:"100%",maxWidth:"400px"},v={padding:"10px 12px",textAlign:"center",fontWeight:400,fontSize:"13px",display:"flex",justifyContent:"center",alignItems:"center"},y={display:"block",textAlign:"center",textDecoration:"none",borderTop:"rgb(180,180,180) solid 1px"},C={display:"block",width:"100%",textAlign:"center",appearance:"none",background:"none",border:"none",outline:"none",padding:"10px",fontWeight:400,fontSize:"16px",color:"#2e7cf1",cursor:"pointer"};for(let d in u)n.style[d]=u[d];for(let d in f)s.style[d]=f[d];for(let d in v)a.style[d]=v[d];for(let d in y)r.style[d]=y[d];for(let d in C)o.style[d]=C[d]}n.appendChild(s),s.appendChild(a),s.appendChild(r),a.appendChild(document.createTextNode(_));const O=()=>{this.requestOrientationPermissions(),n.style.display="none"};o.addEventListener("click",O),o.appendChild(document.createTextNode("OK")),r.appendChild(o),document.body.appendChild(n)},this.obtainPermissionGesture=function(){this.preferConfirmDialog===!0?window.confirm(_)&&this.requestOrientationPermissions():this.createObtainPermissionGestureDialog()}}on(e,i){this.eventEmitter.on(e,i)}init(){window.DeviceOrientationEvent===void 0?this.eventEmitter.emit("deviceorientationerror",{code:"LOCAR_DEVICE_ORIENTATION_NOT_SUPPORTED",message:"Device orientation API not supported"}):window.isSecureContext===!1?this.eventEmitter.emit("deviceorientationerror",{code:"LOCAR_DEVICE_ORIENTATION_NO_HTTPS",message:"DeviceOrientationEvent is only available in secure contexts (https)"}):typeof window.DeviceOrientationEvent.requestPermission=="function"&&this.enablePermissionDialog?this.obtainPermissionGesture():this.eventEmitter.emit("deviceorientationgranted",{target:this})}}class W{constructor(e){this.raycaster=new p.Raycaster,this.normalisedMousePosition=new p.Vector2(null,null),e.domElement.addEventListener("click",i=>{this.normalisedMousePosition.set(i.clientX/e.domElement.clientWidth*2-1,-(i.clientY/e.domElement.clientHeight*2)+1)})}raycast(e,i){if(this.normalisedMousePosition.x!==null&&this.normalisedMousePosition.y!==null){this.raycaster.setFromCamera(this.normalisedMousePosition,e);const t=this.raycaster.intersectObjects(i.children,!1);return this.normalisedMousePosition.set(null,null),t}return[]}}const j="0.1.6";h.ClickHandler=W,h.DeviceOrientationControls=U,h.EventEmitter=M,h.LocationBased=w,h.SphMercProjection=A,h.Webcam=T,h.version=j,Object.defineProperty(h,Symbol.toStringTag,{value:"Module"})}));
|