You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ar-scan-gimmick.js 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. /*!
  2. * A-Frame scan gimmick for encantar.js
  3. * @version 1.1.0
  4. * @author Alexandre Martins (https://encantar.dev)
  5. * @license LGPL-3.0-or-later
  6. */
  7. (function() {
  8. const DEFAULT_IMAGE = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAVklEQVRYR+2WMQ4AIAgD4f+PVlzFYGSpw3UlQHOaBjexXLzfMJAIjFD1LB6q6q/9RwO3Jd1/s8ztszEAAQiQhBCAAARIQghA4E8C0rO8e3J3+4hiOYEJMwaAIT1kBDMAAAAASUVORK5CYII=';
  9. AFRAME.registerComponent('ar-scan-gimmick', {
  10. schema: {
  11. /** URL of an image */
  12. 'src': { type: 'string', default: DEFAULT_IMAGE },
  13. /** opacity of the image */
  14. 'opacity': { type: 'number', default: 1.0 }
  15. },
  16. init()
  17. {
  18. const scene = this.el.sceneEl;
  19. const ar = scene.systems.ar;
  20. this._ar = ar;
  21. this._img = null;
  22. this._hadGizmos = false;
  23. this._onTargetFound = this._onTargetFound.bind(this);
  24. this._onTargetLost = this._onTargetLost.bind(this);
  25. this._registerEvents();
  26. scene.addEventListener('arready', () => {
  27. this._validate();
  28. const session = ar.session;
  29. this._hadGizmos = session.gizmos.visible;
  30. const img = this._createImage();
  31. this.el.parentNode.appendChild(img);
  32. this._img = img;
  33. });
  34. },
  35. remove()
  36. {
  37. if(this._img === null)
  38. return;
  39. this._unregisterEvents();
  40. this.el.parentNode.removeChild(this._img);
  41. this._img = null;
  42. },
  43. _registerEvents()
  44. {
  45. const scene = this.el.sceneEl;
  46. scene.addEventListener('artargetfound', this._onTargetFound);
  47. scene.addEventListener('artargetlost', this._onTargetLost);
  48. },
  49. _unregisterEvents()
  50. {
  51. const scene = this.el.sceneEl;
  52. scene.removeEventListener('artargetlost', this._onTargetLost);
  53. scene.removeEventListener('artargetfound', this._onTargetFound);
  54. },
  55. _onTargetFound(event)
  56. {
  57. const ar = this._ar;
  58. const img = this._img;
  59. ar.session.gizmos.visible = false;
  60. img.style.display = 'none';
  61. },
  62. _onTargetLost(event)
  63. {
  64. const ar = this._ar;
  65. const img = this._img;
  66. ar.session.gizmos.visible = this._hadGizmos;
  67. img.style.display = 'inline-block';
  68. },
  69. _createImage()
  70. {
  71. const img = document.createElement('img');
  72. img.src = this.data.src;
  73. img.draggable = false;
  74. img.style.width = '100%';
  75. img.style.height = '100%';
  76. img.style.objectFit = 'contain';
  77. img.style.display = 'inline-block';
  78. img.style.opacity = this.data.opacity;
  79. if(img.src == DEFAULT_IMAGE)
  80. img.style.imageRendering = 'pixelated';
  81. return img;
  82. },
  83. _validate()
  84. {
  85. if(!this.el.parentNode.getAttribute('ar-hud'))
  86. throw new Error('a-entity with ar-scan-gimmick must be a direct child of ar-hud');
  87. },
  88. });
  89. })();