PageSourceSearch

https://iticket.uz/imapjs/js/3D/EventsHandler.js?v=

js iticket.uz collected 2026-10-01 13:07:13 UTC 6,384 bytes, 246 lines download raw bytes

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.