@@ -41,10 +41,6 @@ const DEFAULT_STATES = {
41
41
mouseButton : THREE . MOUSE . RIGHT ,
42
42
double : false ,
43
43
finger : 3 ,
44
- up : CONTROL_KEYS . UP ,
45
- bottom : CONTROL_KEYS . BOTTOM ,
46
- left : CONTROL_KEYS . LEFT ,
47
- right : CONTROL_KEYS . RIGHT ,
48
44
_event : 'pan' ,
49
45
} ,
50
46
PANORAMIC : {
@@ -60,28 +56,53 @@ const DEFAULT_STATES = {
60
56
double : true ,
61
57
_event : 'travel_in' ,
62
58
_trigger : true ,
59
+ _direction : 'in' ,
63
60
} ,
64
61
TRAVEL_OUT : {
65
62
enable : false ,
66
63
double : false ,
67
64
_event : 'travel_out' ,
68
65
_trigger : true ,
66
+ _direction : 'out' ,
67
+ } ,
68
+ PAN_UP : {
69
+ enable : true ,
70
+ keyboard : CONTROL_KEYS . UP ,
71
+ double : false ,
72
+ _event : 'pan' ,
73
+ _trigger : true ,
74
+ _direction : 'up' ,
75
+ } ,
76
+ PAN_BOTTOM : {
77
+ enable : true ,
78
+ keyboard : CONTROL_KEYS . BOTTOM ,
79
+ double : false ,
80
+ _event : 'pan' ,
81
+ _trigger : true ,
82
+ _direction : 'bottom' ,
83
+ } ,
84
+ PAN_LEFT : {
85
+ enable : true ,
86
+ keyboard : CONTROL_KEYS . LEFT ,
87
+ double : false ,
88
+ _event : 'pan' ,
89
+ _trigger : true ,
90
+ _direction : 'left' ,
91
+ } ,
92
+ PAN_RIGHT : {
93
+ enable : true ,
94
+ keyboard : CONTROL_KEYS . RIGHT ,
95
+ double : false ,
96
+ _event : 'pan' ,
97
+ _trigger : true ,
98
+ _direction : 'right' ,
69
99
} ,
70
100
} ;
71
101
72
102
73
103
const viewCoords = new THREE . Vector2 ( ) ;
74
104
75
105
76
- function stateToTrigger ( state ) {
77
- if ( ! state ) {
78
- return undefined ;
79
- } else if ( state . keyboard ) {
80
- return 'keydown' ;
81
- }
82
- }
83
-
84
-
85
106
/**
86
107
* @typedef {Object } StateControl~State
87
108
* @property {boolean } enable=true Indicate whether the state is enabled or not.
@@ -120,6 +141,8 @@ function stateToTrigger(state) {
120
141
* Otherwise, it is the center of the screen. It is disabled by default.
121
142
* @property {boolean } enable Defines whether all input will be communicated to the associated `Controls` or not.
122
143
* Default is true.
144
+ * @property {boolean } enableKeys Defines whether keyboard input will be communicated to the associated `Controls` or
145
+ * not. Default is true.
123
146
*/
124
147
class StateControl extends THREE . EventDispatcher {
125
148
constructor ( view , options = { } ) {
@@ -140,6 +163,18 @@ class StateControl extends THREE.EventDispatcher {
140
163
} ,
141
164
} ) ;
142
165
166
+ // Set to true to disable use of the keys
167
+ let enableKeys = true ;
168
+ Object . defineProperty ( this , 'enableKeys' , {
169
+ get : ( ) => enableKeys ,
170
+ set : ( value ) => {
171
+ if ( ! value ) {
172
+ this . onKeyUp ( ) ;
173
+ }
174
+ enableKeys = value ;
175
+ } ,
176
+ } ) ;
177
+
143
178
this . NONE = { } ;
144
179
145
180
let currentState = this . NONE ;
@@ -154,9 +189,10 @@ class StateControl extends THREE.EventDispatcher {
154
189
} ,
155
190
} ) ;
156
191
157
- // TODO : the 3 next properties should be made private when ES6 allows it
192
+ // TODO : the 4 next properties should be made private when ES6 allows it
158
193
this . _clickTimeStamp = 0 ;
159
194
this . _lastMousePressed = { viewCoords : new THREE . Vector2 ( ) } ;
195
+ this . _currentMousePressed = undefined ;
160
196
this . _currentKeyPressed = undefined ;
161
197
162
198
this . _onPointerDown = this . onPointerDown . bind ( this ) ;
@@ -182,30 +218,6 @@ class StateControl extends THREE.EventDispatcher {
182
218
// disable context menu when right-clicking
183
219
this . _domElement . addEventListener ( 'contextmenu' , this . _onContextMenu , false ) ;
184
220
185
- // TODO : this shall be removed when switching keyboard management form Controls to StateControls
186
- this . _handleTravelInEvent = ( event ) => {
187
- if (
188
- this . enabled
189
- && this . TRAVEL_IN === this . inputToState ( event . button , event . keyCode , this . TRAVEL_IN . double )
190
- ) {
191
- this . dispatchEvent ( {
192
- type : 'travel_in' ,
193
- viewCoords : this . _view . eventToViewCoords ( event ) ,
194
- } ) ;
195
- }
196
- } ;
197
- this . _handleTravelOutEvent = ( event ) => {
198
- if (
199
- this . enabled
200
- && this . TRAVEL_OUT === this . inputToState ( event . button , event . keyCode , this . TRAVEL_OUT . double )
201
- ) {
202
- this . dispatchEvent ( {
203
- type : 'travel_out' ,
204
- viewCoords : this . _view . eventToViewCoords ( event ) ,
205
- } ) ;
206
- }
207
- } ;
208
-
209
221
this . setFromOptions ( options ) ;
210
222
}
211
223
@@ -228,7 +240,12 @@ class StateControl extends THREE.EventDispatcher {
228
240
// If the input relates to a state, returns it
229
241
if ( ! state . _trigger ) { return state ; }
230
242
// If the input relates to a trigger (TRAVEL_IN, TRAVEL_OUT), dispatch a relevant event.
231
- this . dispatchEvent ( { type : state . _event , viewCoords } ) ;
243
+ this . dispatchEvent ( {
244
+ type : state . _event ,
245
+ // Dont pass viewCoords if the input is only a keyboard input.
246
+ viewCoords : mouseButton !== undefined && viewCoords ,
247
+ direction : state . _direction ,
248
+ } ) ;
232
249
}
233
250
}
234
251
return this . NONE ;
@@ -271,9 +288,6 @@ class StateControl extends THREE.EventDispatcher {
271
288
* };
272
289
*/
273
290
setFromOptions ( options ) {
274
- this . _domElement . removeEventListener ( stateToTrigger ( this . TRAVEL_IN ) , this . _handleTravelInEvent , false ) ;
275
- this . _domElement . removeEventListener ( stateToTrigger ( this . TRAVEL_OUT ) , this . _handleTravelOutEvent , false ) ;
276
-
277
291
for ( const state in DEFAULT_STATES ) {
278
292
if ( { } . hasOwnProperty . call ( DEFAULT_STATES , state ) ) {
279
293
let newState = { } ;
@@ -290,13 +304,11 @@ class StateControl extends THREE.EventDispatcher {
290
304
// Copy the `_event` and `_trigger` properties
291
305
newState . _event = DEFAULT_STATES [ state ] . _event ;
292
306
newState . _trigger = DEFAULT_STATES [ state ] . _trigger ;
307
+ newState . _direction = DEFAULT_STATES [ state ] . _direction ;
293
308
294
309
this [ state ] = newState ;
295
310
}
296
311
}
297
-
298
- this . _domElement . addEventListener ( stateToTrigger ( this . TRAVEL_IN ) , this . _handleTravelInEvent , false ) ;
299
- this . _domElement . addEventListener ( stateToTrigger ( this . TRAVEL_OUT ) , this . _handleTravelOutEvent , false ) ;
300
312
}
301
313
302
314
@@ -312,6 +324,7 @@ class StateControl extends THREE.EventDispatcher {
312
324
// TODO : add touch event management
313
325
default :
314
326
}
327
+
315
328
this . _domElement . addEventListener ( 'pointermove' , this . _onPointerMove , false ) ;
316
329
this . _domElement . addEventListener ( 'pointerup' , this . _onPointerUp , false ) ;
317
330
this . _domElement . addEventListener ( 'mouseleave' , this . _onPointerUp , false ) ;
@@ -332,6 +345,7 @@ class StateControl extends THREE.EventDispatcher {
332
345
333
346
onPointerUp ( ) {
334
347
if ( ! this . enabled ) { return ; }
348
+ this . _currentMousePressed = undefined ;
335
349
336
350
this . _domElement . removeEventListener ( 'pointermove' , this . _onPointerMove , false ) ;
337
351
this . _domElement . removeEventListener ( 'pointerup' , this . _onPointerUp , false ) ;
@@ -346,16 +360,18 @@ class StateControl extends THREE.EventDispatcher {
346
360
handleMouseDown ( event ) {
347
361
viewCoords . copy ( this . _view . eventToViewCoords ( event ) ) ;
348
362
363
+ this . _currentMousePressed = event . button ;
364
+
349
365
// Detect if the mouse button was pressed less than 500 ms before, and if the cursor has not moved two much
350
366
// since previous click. If so, set dblclick to true.
351
367
const dblclick = event . timeStamp - this . _clickTimeStamp < 500
352
- && this . _lastMousePressed . button === event . button
368
+ && this . _lastMousePressed . button === this . _currentMousePressed
353
369
&& this . _lastMousePressed . viewCoords . distanceTo ( viewCoords ) < 5 ;
354
370
this . _clickTimeStamp = event . timeStamp ;
355
- this . _lastMousePressed . button = event . button ;
371
+ this . _lastMousePressed . button = this . _currentMousePressed ;
356
372
this . _lastMousePressed . viewCoords . copy ( viewCoords ) ;
357
373
358
- this . currentState = this . inputToState ( event . button , this . _currentKeyPressed , dblclick ) ;
374
+ this . currentState = this . inputToState ( this . _currentMousePressed , this . _currentKeyPressed , dblclick ) ;
359
375
}
360
376
361
377
handleMouseMove ( event ) {
@@ -367,13 +383,18 @@ class StateControl extends THREE.EventDispatcher {
367
383
// ---------- KEYBOARD EVENTS : ----------
368
384
369
385
onKeyDown ( event ) {
370
- if ( ! this . enabled ) { return ; }
386
+ if ( ! this . enabled || ! this . enableKeys ) { return ; }
371
387
this . _currentKeyPressed = event . keyCode ;
388
+
389
+ this . inputToState ( this . _currentMousePressed , this . _currentKeyPressed ) ;
372
390
}
373
391
374
392
onKeyUp ( ) {
375
- if ( ! this . enabled ) { return ; }
393
+ if ( ! this . enabled || ! this . enableKeys ) { return ; }
376
394
this . _currentKeyPressed = undefined ;
395
+ if ( this . _currentMousePressed === undefined ) {
396
+ this . currentState = this . NONE ;
397
+ }
377
398
}
378
399
379
400
@@ -403,9 +424,6 @@ class StateControl extends THREE.EventDispatcher {
403
424
404
425
window . removeEventListener ( 'blur' , this . _onBlur ) ;
405
426
this . _domElement . removeEventListener ( 'contextmenu' , this . _onContextMenu , false ) ;
406
-
407
- this . _domElement . removeEventListener ( this . TRAVEL_IN . trigger , this . _handleTravelInEvent , false ) ;
408
- this . _domElement . removeEventListener ( this . TRAVEL_OUT . trigger , this . _handleTravelInEvent , false ) ;
409
427
}
410
428
}
411
429
0 commit comments