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 CHANGED
@@ -1,6 +1,6 @@
1
- import * as g from "three";
2
- import { Vector3 as C, Euler as w, Quaternion as I, EventDispatcher as R, MathUtils as m } from "three";
3
- class T {
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 handler.
64
+ * @param ...params - parameters to pass to the event handlers.
65
65
  */
66
66
  emit(e, ...i) {
67
- this.eventHandlers[e]?.call(this, ...i);
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 k extends A {
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 T(), 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;
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.#m(this.#e, e.coords), i >= this.#s && (this.#e.longitude = e.coords.longitude, this.#e.latitude = e.coords.latitude, this.#i || (this.#u(
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
- #m(e, i) {
253
- const t = g.MathUtils.degToRad(i.longitude - e.longitude), c = g.MathUtils.degToRad(i.latitude - e.latitude), h = Math.sin(c / 2) * Math.sin(c / 2) + Math.cos(g.MathUtils.degToRad(e.latitude)) * Math.cos(g.MathUtils.degToRad(i.latitude)) * (Math.sin(t / 2) * Math.sin(t / 2));
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 W extends A {
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 g.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 g.VideoTexture(this.#t), navigator.mediaDevices && navigator.mediaDevices.getUserMedia ? navigator.mediaDevices.getUserMedia(e).then((t) => {
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", P = "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 C(0, 0, 1), y = new w(), H = new I(), F = new I(-Math.sqrt(0.5), 0, 0, Math.sqrt(0.5));
299
- class V extends R {
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: currently accepts smoothingFactor, enablePermissionDialog
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 = m.degToRad(o - n), t.deviceOrientation = { alpha: n, beta: s, gamma: a, webkitCompassHeading: r };
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
- y.set(a, s, -r, "YXZ"), n.setFromEuler(y), n.multiply(F), n.multiply(H.setFromAxisAngle(x, -o));
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 ? m.degToRad(s.alpha) + t.alphaOffset : 0, r = s.beta ? m.degToRad(s.beta) : 0, o = s.gamma ? m.degToRad(s.gamma) : 0;
370
- const f = t.screenOrientation ? m.degToRad(t.screenOrientation) : 0;
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
- t.lastOrientation = {
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 w().setFromQuaternion(
413
+ const u = new C().setFromQuaternion(
406
414
  d,
407
415
  "YXZ"
408
416
  );
409
- let p = m.degToRad(360 - s.webkitCompassHeading);
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 ? m.degToRad(n.alpha) + t.alphaOffset : 0;
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 ? m.degToRad(n.beta) : 0;
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 ? m.degToRad(n.gamma) : 0;
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(P)
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(P) && this.requestOrientationPermissions() : this.createObtainPermissionGestureDialog();
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 g.Raycaster(), this.normalisedMousePosition = new g.Vector2(null, null), e.domElement.addEventListener("click", (i) => {
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.4";
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
- k as LocationBased,
581
- T as SphMercProjection,
582
- W as Webcam,
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"})}));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "locar",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "Location-based AR from AR.js.",
5
5
  "files": [
6
6
  "dist",