Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

aframe-scan-gimmick-for-encantar.js 3.4KB

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