ProfileTool.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import * as THREE from "../../libs/three.js/build/three.module.js";
  2. import {Profile} from "./Profile.js";
  3. import {Utils} from "../utils.js";
  4. import { EventDispatcher } from "../EventDispatcher.js";
  5. export class ProfileTool extends EventDispatcher {
  6. constructor (viewer) {
  7. super();
  8. this.viewer = viewer;
  9. this.renderer = viewer.renderer;
  10. this.addEventListener('start_inserting_profile', e => {
  11. this.viewer.dispatchEvent({
  12. type: 'cancel_insertions'
  13. });
  14. });
  15. this.scene = new THREE.Scene();
  16. this.scene.name = 'scene_profile';
  17. this.light = new THREE.PointLight(0xffffff, 1.0);
  18. this.scene.add(this.light);
  19. this.viewer.inputHandler.registerInteractiveScene(this.scene);
  20. this.onRemove = e => this.scene.remove(e.profile);
  21. this.onAdd = e => this.scene.add(e.profile);
  22. for(let profile of viewer.scene.profiles){
  23. this.onAdd({profile: profile});
  24. }
  25. viewer.addEventListener("update", this.update.bind(this));
  26. viewer.addEventListener("render.pass.perspective_overlay", this.render.bind(this));
  27. viewer.addEventListener("scene_changed", this.onSceneChange.bind(this));
  28. viewer.scene.addEventListener('profile_added', this.onAdd);
  29. viewer.scene.addEventListener('profile_removed', this.onRemove);
  30. }
  31. onSceneChange(e){
  32. if(e.oldScene){
  33. e.oldScene.removeEventListeners('profile_added', this.onAdd);
  34. e.oldScene.removeEventListeners('profile_removed', this.onRemove);
  35. }
  36. e.scene.addEventListener('profile_added', this.onAdd);
  37. e.scene.addEventListener('profile_removed', this.onRemove);
  38. }
  39. startInsertion (args = {}) {
  40. let domElement = this.viewer.renderer.domElement;
  41. let profile = new Profile();
  42. profile.name = args.name || 'Profile';
  43. this.dispatchEvent({
  44. type: 'start_inserting_profile',
  45. profile: profile
  46. });
  47. this.scene.add(profile);
  48. let cancel = {
  49. callback: null
  50. };
  51. let insertionCallback = (e) => {
  52. if(e.button === THREE.MOUSE.LEFT){
  53. if(profile.points.length <= 1){
  54. let camera = this.viewer.scene.getActiveCamera();
  55. let distance = camera.position.distanceTo(profile.points[0]);
  56. let clientSize = this.viewer.renderer.getSize(new THREE.Vector2());
  57. let pr = Utils.projectedRadius(1, camera, distance, clientSize.width, clientSize.height);
  58. let width = (10 / pr);
  59. profile.setWidth(width);
  60. }
  61. profile.addMarker(profile.points[profile.points.length - 1].clone());
  62. this.viewer.inputHandler.startDragging(
  63. profile.spheres[profile.spheres.length - 1]);
  64. } else if (e.button === THREE.MOUSE.RIGHT) {
  65. cancel.callback();
  66. }
  67. };
  68. cancel.callback = e => {
  69. profile.removeMarker(profile.points.length - 1);
  70. domElement.removeEventListener('mouseup', insertionCallback, false);
  71. this.viewer.removeEventListener('cancel_insertions', cancel.callback);
  72. };
  73. this.viewer.addEventListener('cancel_insertions', cancel.callback);
  74. domElement.addEventListener('mouseup', insertionCallback, false);
  75. profile.addMarker(new THREE.Vector3(0, 0, 0));
  76. this.viewer.inputHandler.startDragging(
  77. profile.spheres[profile.spheres.length - 1]);
  78. this.viewer.scene.addProfile(profile);
  79. return profile;
  80. }
  81. update(){
  82. let camera = this.viewer.scene.getActiveCamera();
  83. let profiles = this.viewer.scene.profiles;
  84. let renderAreaSize = this.viewer.renderer.getSize(new THREE.Vector2());
  85. let clientWidth = renderAreaSize.width;
  86. let clientHeight = renderAreaSize.height;
  87. this.light.position.copy(camera.position);
  88. // make size independant of distance
  89. for(let profile of profiles){
  90. for(let sphere of profile.spheres){
  91. let distance = camera.position.distanceTo(sphere.getWorldPosition(new THREE.Vector3()));
  92. let pr = Utils.projectedRadius(1, camera, distance, clientWidth, clientHeight);
  93. let scale = (15 / pr);
  94. sphere.scale.set(scale, scale, scale);
  95. }
  96. }
  97. }
  98. render(){
  99. this.viewer.renderer.render(this.scene, this.viewer.scene.getActiveCamera());
  100. }
  101. }