Reticule.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import * as THREE from "../../libs/three.js/build/three.module.js";
  2. import {transitions, esing, lerp} from '../utils/transitions.js'
  3. let texLoader = new THREE.TextureLoader()
  4. let defaultOpacity = 0.7
  5. //鼠标指示小圆片
  6. export default class Reticule extends THREE.Mesh{
  7. constructor(inputHandler){
  8. var defaultTex = texLoader.load(Potree.config.urls.localTextures+'whiteCircle.png'/* reticule-256x256.png' */)
  9. var crosshairTex = texLoader.load(Potree.config.urls.localTextures+'reticule_cross_hair.png')
  10. super(new THREE.PlaneBufferGeometry(0.15,0.15,1,1),new THREE.MeshBasicMaterial({
  11. side: THREE.DoubleSide ,
  12. map: defaultTex,
  13. transparent:true,
  14. depthTest: !1,
  15. opacity: defaultOpacity,
  16. //depthWrite: !1,
  17. }))
  18. /* new THREE.RawShaderMaterial({
  19. side: THREE.DoubleSide,
  20. depthWrite: !1,
  21. depthTest: !1,
  22. transparent: !0,
  23. vertexShader: shaders.waypoint.vertexShader,
  24. fragmentShader: shaders.waypoint.fragmentShader,
  25. uniforms: uniform,
  26. name: "waypoint",
  27. opacity: 0
  28. })); */
  29. //this.layers.set(0/* RenderLayers.RETICULE */);
  30. this.renderOrder = 0
  31. this.direction = new THREE.Vector3;
  32. this.hidden = !0;
  33. this.mouseLastMoveTime = Date.now();
  34. inputHandler.addInputListener(this);
  35. this.addEventListener('mousemove',this.move.bind(this))
  36. this.addEventListener('measureMovePoint',()=>{
  37. this.material.map = crosshairTex
  38. })
  39. this.addEventListener('endMeasureMove',()=>{
  40. this.material.map = defaultTex
  41. })
  42. }
  43. move(){
  44. this.hidden = false,
  45. this.mouseLastMoveTime = Date.now()
  46. }
  47. hide(){
  48. //console.log("hide Reticule")
  49. this.hidden || (this.hidden = !0,
  50. transitions.start(lerp.property(this.material , "opacity", 0), 500))
  51. }
  52. show(){
  53. //console.log("show Reticule")
  54. this.hidden = !1,
  55. this.material.opacity <= 0 && transitions.start(lerp.property(this.material, "opacity", defaultOpacity), 300)
  56. }
  57. //鼠标静止一段时间它就会消失
  58. updateVisible(){
  59. Date.now() - this.mouseLastMoveTime > 1500 && !this.hidden && this.hide()
  60. }
  61. updatePosition(intersectPoint, cameraPos ){
  62. if (!this.hidden) {
  63. if (!intersectPoint || !intersectPoint.point.normal)
  64. return //this.hide();
  65. var i = intersectPoint.location
  66. , n = cameraPos.distanceTo(i)
  67. , r = 1 + .01 * n;
  68. n < 1 && (r -= 1 - n)
  69. let normal = new THREE.Vector3().fromArray(intersectPoint.point.normal)
  70. this.show();
  71. this.scale.set(r, r, r);
  72. this.direction = this.direction.multiplyScalar(.8);
  73. this.direction.add(normal.clone().multiplyScalar(.2));
  74. this.position.copy(i).add(normal.clone().multiplyScalar(.01));
  75. this.lookAt(this.position.clone().add(this.direction));
  76. }
  77. }
  78. }