1// 2// 3// 4 5var EventsHandler = function ( 6 state, 7 onclick, 8 onmouseover, 9 onmouseout 10) { 11 "use strict"; 12 13 this.init = function(){ 14 15 let domElement = state.renderer.webglRendererDOMElement; 16 17 domElement.addEventListener('mousedown', onMouseDown, false); 18 domElement.addEventListener('mouseup', onMouseUp, false); 19 domElement.addEventListener('mousemove', onMouseMove, false); 20 domElement.addEventListener("mouseout", onMouseOut, false); 21 22 domElement.addEventListener( 'touchstart', onTouchStart, false ); 23 domElement.addEventListener( 'touchmove', onTouchMove, false ); 24 domElement.addEventListener( 'touchend', onTouchEnd, false ); 25 }; 26 27 this.dispose = function(){ 28 29 let domElement = state.renderer.webglRendererDOMElement; 30 31 domElement.removeEventListener('mousedown', onMouseDown, false); 32 domElement.removeEventListener('mouseup', onMouseUp, false); 33 domElement.removeEventListener('mousemove', onMouseMove, false); 34 domElement.removeEventListener("mouseout", onMouseOut, false); 35 36 domElement.removeEventListener( 'touchstart', onTouchStart, false ); 37 domElement.removeEventListener( 'touchmove', onTouchMove, false ); 38 domElement.removeEventListener( 'touchend', onTouchEnd, false ); 39 }; 40 41 function getIntersections(event, bTouches) { 42 43 const domElement = state.renderer.webglRendererDOMElement; 44 const scene_array = state.renderer.selection_scene; 45 const camera = state.renderer.cameras.getActive(); 46 47 if (!camera) 48 return []; 49 50 let clientX = 0, clientY = 0; 51 52 const rect = domElement.getBoundingClientRect(); 53 54 if (bTouches) // 55 { 56 if (!event.touches.length) 57 return []; 58 59 let touch = event.touches[0]; 60 61 clientX = touch.clientX - rect.left; 62 clientY = touch.clientY - rect.top; 63 } 64 else // 65 { 66 clientX = event.clientX - rect.left; 67 clientY = event.clientY - rect.top; 68 } 69 70 const mouse = new THREE.Vector2(); 71 72 if ( clientX < 0 || clientX > ( domElement.clientWidth + rect.left ) ) 73 return []; 74 if ( clientY < 0 || clientY > ( domElement.clientHeight + rect.top ) ) 75 return []; 76 77 mouse.x = ( clientX / domElement.clientWidth ) * 2 - 1; 78 mouse.y = -( clientY / domElement.clientHeight ) * 2 + 1; 79 80 raycaster.setFromCamera(mouse, camera); 81 82 const intersects = raycaster.intersectObjects(scene_array, true); 83 84 return intersects; 85 } 86 const raycaster = new THREE.Raycaster(); 87 88 function onMouseOut(event) { 89 90 if (onMouseMove.object) 91 { 92 onmouseout(onMouseMove.object); 93 } 94 95 onMouseMove.object = null; 96 97 state.renderer.needRedraw = true; 98 } 99 100 function onMouseDown(event) { 101 102 if (!onMouseDown.mouse) 103 onMouseDown.mouse = {}; 104 105 let button = event.button; 106 107 onMouseDown.mouse[button] = { 108 clientX : event.clientX, 109 clientY : event.clientY 110 }; 111 112 state.renderer.needRedraw = true; 113 } 114 115 function onMouseUp(event) { 116 117 let button = event.button; 118 119 if (button === 0) { 120 121 if (!onMouseDown.mouse) 122 return; 123 124 if (!onMouseDown.mouse[button]) 125 return; 126 127 if (Math.abs(onMouseDown.mouse[button].clientX - event.clientX) > 7 || // click check 128 Math.abs(onMouseDown.mouse[button].clientY - event.clientY) > 7 ) 129 return; 130 131 var intersects = getIntersections(event); 132 133 if (intersects.length > 0) 134 { 135 let intersection = intersects[0]; 136 137 onclick(intersection.object, intersection); 138 } 139 } 140 141 state.renderer.needRedraw = true; 142 } 143 144 function onTouchStart(event) { 145 146 event.preventDefault(); 147 148 if (!event.touches.length) 149 return; 150 151 let touch = event.touches[0]; 152 153 onTouchStart.touch = event; 154 155 delete onTouchMove.touch; 156 157 state.renderer.needRedraw = true; 158 } 159 160 function onTouchMove(event) { 161 162 event.preventDefault(); 163 164 onTouchMove.touch = event; 165 } 166 167 function onTouchEnd(event) { 168 169 if (onTouchStart.touch) { 170 171 let bClickCheck = false;
172 173 if (onTouchMove.touch) 174 { 175 let touch = onTouchMove.touch.touches[0]; 176 177 if (Math.abs(onTouchStart.touch.touches[0].clientX - touch.clientX) < 10 && // click check 178 Math.abs(onTouchStart.touch.touches[0].clientY - touch.clientY) < 10 ) 179 { 180 bClickCheck = true; 181 182 event = onTouchMove.touch; 183 } 184 } 185 else 186 { 187 bClickCheck = true; 188 189 event = onTouchStart.touch; 190 } 191 192 if (bClickCheck) 193 { 194 var intersects = getIntersections(event, true); 195 196 if (intersects.length > 0) 197 { 198 let intersection = intersects[0]; 199 200 onclick(intersection.object, intersection); 201 } 202 } 203 204 delete onTouchStart.touch; 205 delete onTouchMove.touch; 206 } 207 208 state.renderer.needRedraw = true; 209 } 210 211 function onMouseMove(event) { 212 213 if (event.buttons === 0) { // no buttons pressed 214 215 var intersects = getIntersections(event); 216 217 if (intersects.length > 0) // 218 { 219 let intersection = intersects[0]; 220 221 if ( onMouseMove.object !== intersection.object ) 222 { 223 if (onMouseMove.object) 224 onmouseout(onMouseMove.object); 225 226 onmouseover(intersection.object, intersection); 227 228 onMouseMove.object = intersection.object; 229 230 state.renderer.needRedraw = true; 231 } 232 } 233 else // 234 { 235 if (onMouseMove.object) 236 { 237 onmouseout(onMouseMove.object); 238 } 239 240 onMouseMove.object = null; 241 } 242 } 243 } 244 245 return this; 246};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.