Home Reference Source

cables_dev/cables_ui/src/ui/elements/canvasoverlays/transformsicon.js

  1. import { gui } from "../../gui.js";
  2. export default class TransformsIcon
  3. {
  4. constructor(cgl, id)
  5. {
  6. this._cgl = cgl;
  7. this._pos = vec3.create();
  8. this._screenPos = vec2.create();
  9. this._id = id;
  10. this.lastUpdate = performance.now();
  11. if (!cgl || !cgl.canvas) return;
  12. const container = cgl.canvas.parentElement;
  13. this._eleCenter = document.createElement("div");
  14. this._eleCenter.classList.add("transformSpot");
  15. container.appendChild(this._eleCenter);
  16. this._eleCenter.addEventListener("click", () =>
  17. {
  18. gui.transformOverlay.click(this._screenPos);
  19. });
  20. }
  21. get id()
  22. {
  23. return this._id;
  24. }
  25. get screenPos()
  26. {
  27. return this._screenPos;
  28. }
  29. update()
  30. {
  31. this.lastUpdate = performance.now();
  32. this._updateScreenPos();
  33. if (this._eleCenter)
  34. {
  35. this._eleCenter.style.left = this._screenPos[0] + "px";
  36. this._eleCenter.style.top = this._screenPos[1] + "px";
  37. }
  38. }
  39. setPos(x, y, z)
  40. {
  41. vec3.set(this._pos, x, y, z);
  42. this.update();
  43. }
  44. _updateScreenPos()
  45. {
  46. if (!this._cgl) return;
  47. this._cgl.pushModelMatrix();
  48. const m = mat4.create();
  49. const pos = vec3.create();
  50. const emptyvec3 = vec3.create();
  51. const trans = vec3.create();
  52. mat4.translate(this._cgl.mvMatrix, this._cgl.mMatrix, this._pos);
  53. mat4.multiply(m, this._cgl.vMatrix, this._cgl.mMatrix);
  54. vec3.transformMat4(pos, emptyvec3, m);
  55. vec3.transformMat4(trans, pos, this._cgl.pMatrix);
  56. this._cgl.popModelMatrix();
  57. if (pos[2] > 0)
  58. {
  59. this._screenPos[0] = -3000;
  60. }
  61. else
  62. {
  63. const vp = this._cgl.getViewPort();
  64. const x = vp[2] - (vp[2] * 0.5 - (trans[0] * vp[2] * 0.5) / trans[2]);
  65. const y = vp[3] - (vp[3] * 0.5 + (trans[1] * vp[3] * 0.5) / trans[2]);
  66. this._screenPos[0] = x / this._cgl.pixelDensity;
  67. this._screenPos[1] = y / this._cgl.pixelDensity;
  68. }
  69. }
  70. dispose()
  71. {
  72. if (this._eleCenter)
  73. this._eleCenter.remove();
  74. }
  75. }