2
0

UI.Viewport.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. UI.Viewport = function () {
  2. var _width, _height;
  3. var _isMouseDown = false;
  4. var _snapToAxis = null;
  5. var _HOVERED, _SELECTED;
  6. var _offset = new THREE.Vector3();
  7. //
  8. var _domElement = document.createElement( 'div' );
  9. _domElement.style.position = 'absolute';
  10. _domElement.style.backgroundColor = '#808080';
  11. //
  12. var _camera = new THREE.PerspectiveCamera( 50, 1, 1, 5000 );
  13. _camera.position.x = 500;
  14. _camera.position.y = 250;
  15. _camera.position.z = 500;
  16. _camera.lookAt( new THREE.Vector3() );
  17. var _controls = new THREE.TrackballControls( _camera );
  18. _controls.rotateSpeed = 1.0;
  19. _controls.zoomSpeed = 1.2;
  20. _controls.panSpeed = 0.8;
  21. _controls.noZoom = false;
  22. _controls.noPan = false;
  23. _controls.staticMoving = true;
  24. _controls.dynamicDampingFactor = 0.3;
  25. // guides
  26. var _sceneHelpers = new THREE.Scene();
  27. var _grid = new THREE.Mesh( new THREE.PlaneGeometry( 1000, 1000, 20, 20 ), new THREE.MeshBasicMaterial( { color: 0x606060, wireframe: true, transparent: true } ) );
  28. _sceneHelpers.add( _grid );
  29. //
  30. var _scene = new THREE.Scene();
  31. _scene.add(_camera);
  32. /*
  33. var light = new THREE.AmbientLight( 0x404040 );
  34. _scene.add( light );
  35. var light = new THREE.DirectionalLight( 0xffffff );
  36. light.position.set( 1000, 1000, - 1000 );
  37. light.position.normalize();
  38. _scene.add( light );
  39. */
  40. var _plane = new THREE.Mesh( new THREE.PlaneGeometry( 2000, 2000, 8, 8 ), new THREE.MeshBasicMaterial( { color: 0x000000, opacity: 0.25, transparent: true, wireframe: true } ) );
  41. _plane.visible = false;
  42. _plane.geometry.applyMatrix( new THREE.Matrix4().makeRotationX( Math.PI / 2 ) );
  43. _sceneHelpers.add( _plane );
  44. var _projector = new THREE.Projector();
  45. var _renderer = new THREE.WebGLRenderer();
  46. _renderer.autoClear = false;
  47. _renderer.domElement.addEventListener( 'mousedown', function ( event ) {
  48. event.preventDefault();
  49. _isMouseDown = true;
  50. var vector = new THREE.Vector3( ( event.clientX / _width ) * 2 - 1, - ( event.clientY / _height ) * 2 + 1, 0.5 );
  51. _projector.unprojectVector( vector, _camera );
  52. var ray = new THREE.Ray( _camera.position, vector.subSelf( _camera.position ).normalize() );
  53. var intersects = ray.intersectObjects( _scene.children );
  54. if ( intersects.length ) {
  55. _SELECTED = intersects[ 0 ].object;
  56. _controls.enabled = false;
  57. var intersects = ray.intersectObject( _plane );
  58. _offset.copy( intersects[ 0 ].point ).subSelf( _plane.position );
  59. }
  60. }, false );
  61. _renderer.domElement.addEventListener( 'mousemove', function ( event ) {
  62. event.preventDefault();
  63. var vector = new THREE.Vector3( ( event.clientX / _width ) * 2 - 1, - ( event.clientY / _height ) * 2 + 1, 0.5 );
  64. _projector.unprojectVector( vector, _camera );
  65. var ray = new THREE.Ray( _camera.position, vector.subSelf( _camera.position ).normalize() );
  66. var intersects = ray.intersectObjects( _scene.children );
  67. if ( _SELECTED ) {
  68. var intersects = ray.intersectObject( _plane );
  69. _SELECTED.position.copy( intersects[ 0 ].point.subSelf( _offset ) );
  70. switch ( _snapToAxis ) {
  71. case 'x':
  72. _SELECTED.position.y = _plane.position.y;
  73. _SELECTED.position.z = _plane.position.z;
  74. break;
  75. case 'y':
  76. _SELECTED.position.x = _plane.position.x;
  77. _SELECTED.position.z = _plane.position.z;
  78. break;
  79. case 'z':
  80. _SELECTED.position.x = _plane.position.x;
  81. _SELECTED.position.y = _plane.position.y;
  82. break;
  83. }
  84. _render();
  85. signals.updated.dispatch( _scene );
  86. return;
  87. }
  88. if ( intersects.length ) {
  89. _HOVERED = intersects[ 0 ].object;
  90. _plane.position.set( 0, 0, 0 );
  91. _plane.lookAt( _camera.position );
  92. _plane.position.copy( _HOVERED.position );
  93. } else {
  94. _HOVERED = null;
  95. }
  96. _render();
  97. }, false );
  98. _renderer.domElement.addEventListener( 'mouseup', function ( event ) {
  99. // event.preventDefault();
  100. _isMouseDown = false;
  101. _snapToAxis = null;
  102. _controls.enabled = true;
  103. if ( _SELECTED ) {
  104. _plane.position.copy( _SELECTED.position );
  105. _SELECTED = null;
  106. }
  107. }, false );
  108. /*
  109. _renderer.domElement.addEventListener( 'mousewheel', function ( event ) {
  110. if ( event.wheelDeltaY ) {
  111. event.preventDefault();
  112. var vector = _camera.position.clone();
  113. var amount = event.wheelDeltaY * 0.2;
  114. if ( vector.length() - amount < 10 ) return;
  115. vector.normalize().multiplyScalar( amount );
  116. _camera.position.subSelf( vector );
  117. _render();
  118. }
  119. }, false );
  120. */
  121. document.addEventListener( 'keydown', function ( event ) {
  122. if ( _isMouseDown ) {
  123. // console.log( event.keyCode );
  124. switch ( event.keyCode ) {
  125. case 88: // x
  126. _snapToAxis = 'x';
  127. break;
  128. case 89: // y
  129. _snapToAxis = 'y';
  130. break;
  131. case 90: // z
  132. _snapToAxis = 'z';
  133. break;
  134. }
  135. }
  136. }, false );
  137. _domElement.appendChild( _renderer.domElement );
  138. // signals
  139. signals.added.add( function ( object ) {
  140. _scene.add( object );
  141. _render();
  142. signals.updated.dispatch( _scene );
  143. } );
  144. //
  145. this.getDOMElement = function () {
  146. return _domElement;
  147. };
  148. this.setSize = function ( width, height ) {
  149. _width = width;
  150. _height = height;
  151. _camera.aspect = width / height;
  152. _camera.updateProjectionMatrix();
  153. _renderer.setSize( width, height );
  154. _render();
  155. };
  156. var _render = function () {
  157. _controls.update();
  158. _renderer.clear();
  159. _renderer.render( _sceneHelpers, _camera );
  160. _renderer.render( _scene, _camera );
  161. };
  162. }