label.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. class Label2D extends THREE.EventDispatcher {
  2. constructor(o = {}) {
  3. super()
  4. this.title = o.title
  5. this.position = o.position
  6. this.elem = $(`<div class="room-label ${o.labeltype ? o.labeltype : ''} ${o.posi == 'right' ? 'right' : ''}" >
  7. <a><p>
  8. <span>${o.title}</span>
  9. ${o.labeltype ? `
  10. <div class="sline"></div>
  11. <span class="enspan">${o.entitle}</span>` : ''}
  12. </p></a>
  13. ${o.labeltype ? `<div class="picdetail">
  14. <div class="header">
  15. <span>${o.title}</span>
  16. <img data-type="close" src="images/close.svg" alt="">
  17. </div>
  18. <div class="pinfo">
  19. <img src="images/image_${o.imgsrc}.jpg" alt="">
  20. <p>${o.infodesc}</p>
  21. </div>
  22. </div>`: ''}
  23. </div>`);
  24. $(".widgets-doll-labels").append(this.elem)
  25. this.pos2d = new THREE.Vector3
  26. this.wenli = o.imgsrc
  27. this.emissiveTexture = texLoader.load(`model/${o.imgsrc}.jpg`);
  28. this.elem.css({ position: 'absolute', 'z-index': 999 })
  29. this.clickFun = o.clickFun;
  30. this.clickFun && this.elem.on('click', this.clickFun.bind(this, {
  31. ...o,
  32. elem: this.elem,
  33. emissiveTexture: this.emissiveTexture
  34. }))
  35. {
  36. let update = (e) => {
  37. this.update(e)
  38. }
  39. let updateShelter = () => {
  40. if (this.shelterByModel) {
  41. if (convertTool.ifShelter(this.position, this.pos2d, viewer.camera, viewer.model.children, 0.05)) {
  42. this.sheltered = true
  43. this.elem.css('display', 'none');
  44. } else {
  45. this.sheltered = false
  46. this.update()
  47. }
  48. }
  49. }
  50. viewer.addEventListener("view.changed", update)
  51. viewer.addEventListener("delayUpdate", updateShelter)
  52. this.addEventListener('dispose', (e) => {
  53. viewer.removeEventListener("view.changed", update)
  54. viewer.removeEventListener("delayUpdate", updateShelter)
  55. })
  56. }
  57. this.visible = true
  58. this.shelterByModel = o.shelterByModel
  59. this.update()
  60. }
  61. update(e = {}) {
  62. if (!this.position || !this.visible || this.sheltered) return
  63. var p = convertTool.getPos2d(this.position, viewer.camera, $("#player")[0]);
  64. this.pos2d = p.vector;
  65. if (this.pos2d.x > 0) {
  66. this.elem.addClass('right')
  67. } else {
  68. this.elem.removeClass('right')
  69. }
  70. if (!p || !p.trueSide) {
  71. this.elem.css('display', 'none'); return;
  72. }
  73. //判断label是否被模型遮挡,遮挡则消失(如果是漫游模式最好提前计算visiblePanos)
  74. /* if (e.changeSlightly) {//防卡: 画面要停止转动时才执行
  75. if (this.shelterByModel && convertTool.ifShelter(this.position, p.vector, viewer.camera, viewer.model.children, 0.05)) {
  76. this.sheltered = true
  77. this.elem.css('display', 'none'); return;
  78. } else {
  79. this.sheltered = false
  80. }
  81. } else {
  82. //console.log('!changeSlightly')
  83. } */
  84. this.elem.css({
  85. left: p.pos.x + 'px',
  86. top: p.pos.y + 'px'
  87. })
  88. this.elem.css('display', 'block');
  89. }
  90. setVisible(visi, reason, level = 0, type) {
  91. convertTool.updateVisible(this, reason, visi, level, type)
  92. if (!this.visible) {
  93. this.elem.css('display', 'none');
  94. } else {
  95. this.update()
  96. }
  97. }
  98. setTitle(title) {
  99. this.title = title || ''
  100. this.elem.html(`<a><p><span>${this.title}</span></p></a>`)
  101. }
  102. setPos(pos) {
  103. this.position = pos;
  104. this.update()
  105. }
  106. dispose() {
  107. this.elem.remove();
  108. this.dispatchEvent({ type: 'dispose' })
  109. this._listeners = {}
  110. }
  111. }