Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

ar-scan-gimmick.js 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. /*!
  2. * A-Frame scan gimmick for encantar.js
  3. * @version 1.2.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.registerPrimitive('ar-scan-gimmick', {
  10. defaultComponents: {
  11. 'ar-scan-gimmick': { },
  12. },
  13. mappings: {
  14. src: 'ar-scan-gimmick.src',
  15. opacity: 'ar-scan-gimmick.opacity',
  16. },
  17. });
  18. AFRAME.registerComponent('ar-scan-gimmick', {
  19. schema: {
  20. /** URL of an image */
  21. 'src': { type: 'string', default: '' },
  22. /** opacity of the image */
  23. 'opacity': { type: 'number', default: 1.0 }
  24. },
  25. init()
  26. {
  27. const scene = this.el.sceneEl;
  28. const ar = scene.systems.ar;
  29. this._ar = ar;
  30. this._img = null;
  31. this._hadGizmos = false;
  32. this._onTargetFound = this._onTargetFound.bind(this);
  33. this._onTargetLost = this._onTargetLost.bind(this);
  34. this._registerEvents();
  35. scene.addEventListener('arready', () => {
  36. this._validate();
  37. const session = ar.session;
  38. this._hadGizmos = session.gizmos.visible;
  39. const img = this._createImage();
  40. this.el.parentNode.appendChild(img);
  41. this._img = img;
  42. });
  43. },
  44. remove()
  45. {
  46. if(this._img === null)
  47. return;
  48. this._unregisterEvents();
  49. this.el.parentNode.removeChild(this._img);
  50. this._img = null;
  51. },
  52. _registerEvents()
  53. {
  54. const scene = this.el.sceneEl;
  55. scene.addEventListener('artargetfound', this._onTargetFound);
  56. scene.addEventListener('artargetlost', this._onTargetLost);
  57. },
  58. _unregisterEvents()
  59. {
  60. const scene = this.el.sceneEl;
  61. scene.removeEventListener('artargetlost', this._onTargetLost);
  62. scene.removeEventListener('artargetfound', this._onTargetFound);
  63. },
  64. _onTargetFound(event)
  65. {
  66. const ar = this._ar;
  67. const img = this._img;
  68. ar.session.gizmos.visible = false;
  69. img.style.display = 'none';
  70. },
  71. _onTargetLost(event)
  72. {
  73. const ar = this._ar;
  74. const img = this._img;
  75. ar.session.gizmos.visible = this._hadGizmos;
  76. img.style.display = 'inline-block';
  77. },
  78. _createImage()
  79. {
  80. const img = document.createElement('img');
  81. const src = this.data.src !== '' ? this.data.src : DEFAULT_IMAGE;
  82. img.src = src;
  83. img.draggable = false;
  84. img.style.width = '100%';
  85. img.style.height = '100%';
  86. img.style.objectFit = 'contain';
  87. img.style.display = 'inline-block';
  88. img.style.opacity = this.data.opacity;
  89. if(src === DEFAULT_IMAGE)
  90. img.style.imageRendering = 'pixelated';
  91. return img;
  92. },
  93. _validate()
  94. {
  95. if(!this.el.parentNode.getAttribute('ar-hud'))
  96. console.error('a-entity with ar-scan-gimmick must be a direct child of ar-hud');
  97. },
  98. });
  99. })();