11var Class = require ( '../../utils/Class' ) ;
2+ var Features = require ( '../../device/Features' ) ;
3+ var MouseEvents = require ( './events' ) ;
24
35// https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent
46// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md
@@ -19,6 +21,12 @@ var MouseManager = new Class({
1921 this . target ;
2022
2123 this . handler ;
24+
25+ /**
26+ * @property {boolean } locked - If the mouse has been pointer locked successfully this will
27+ * be set to true.
28+ */
29+ this . locked = false ;
2230 } ,
2331
2432 boot : function ( )
@@ -55,6 +63,52 @@ var MouseManager = new Class({
5563 return this ;
5664 } ,
5765
66+ /**
67+ * If the browser supports it, you can request that the pointer be locked to the browser window.
68+ * This is classically known as 'FPS controls', where the pointer can't leave the browser until
69+ * the user presses an exit key. If the browser successfully enters a locked state, a
70+ * 'POINTER_LOCK_CHANGE_EVENT' will be dispatched - from the game's input manager - with an
71+ * `isPointerLocked` property.
72+ * It is important to note that pointer lock can only be enabled after an 'engagement gesture',
73+ * see: https://w3c.github.io/pointerlock/#dfn-engagement-gesture.
74+ */
75+ requestPointerLock : function ( )
76+ {
77+ if ( Features . pointerLock )
78+ {
79+ var element = this . target ;
80+ element . requestPointerLock = element . requestPointerLock || element . mozRequestPointerLock || element . webkitRequestPointerLock ;
81+ element . requestPointerLock ( ) ;
82+ }
83+ } ,
84+
85+ /**
86+ * Internal pointerLockChange handler.
87+ *
88+ * @param {Event } event - The native event from the browser.
89+ */
90+ pointerLockChange : function ( event )
91+ {
92+ var element = this . target ;
93+ this . locked = document . pointerLockElement === element || document . mozPointerLockElement === element || document . webkitPointerLockElement === element
94+ ? true : false ;
95+ this . manager . queue . push ( event ) ;
96+ } ,
97+
98+ /**
99+ * If the browser supports pointer lock, this will request that the pointer lock is released. If
100+ * the browser successfully enters a locked state, a 'POINTER_LOCK_CHANGE_EVENT' will be
101+ * dispatched - from the game's input manager - with an `isPointerLocked` property.
102+ */
103+ releasePointerLock : function ( )
104+ {
105+ if ( Features . pointerLock )
106+ {
107+ document . exitPointerLock = document . exitPointerLock || document . mozExitPointerLock || document . webkitExitPointerLock ;
108+ document . exitPointerLock ( ) ;
109+ }
110+ } ,
111+
58112 startListeners : function ( )
59113 {
60114 var queue = this . manager . queue ;
@@ -82,13 +136,28 @@ var MouseManager = new Class({
82136 this . target . addEventListener ( 'mousemove' , handler , false ) ;
83137 this . target . addEventListener ( 'mousedown' , handler , false ) ;
84138 this . target . addEventListener ( 'mouseup' , handler , false ) ;
139+
140+ if ( Features . pointerLock )
141+ {
142+ this . pointerLockChange = this . pointerLockChange . bind ( this ) ;
143+ document . addEventListener ( 'pointerlockchange' , this . pointerLockChange , true ) ;
144+ document . addEventListener ( 'mozpointerlockchange' , this . pointerLockChange , true ) ;
145+ document . addEventListener ( 'webkitpointerlockchange' , this . pointerLockChange , true ) ;
146+ }
85147 } ,
86148
87149 stopListeners : function ( )
88150 {
89151 this . target . removeEventListener ( 'mousemove' , this . handler ) ;
90152 this . target . removeEventListener ( 'mousedown' , this . handler ) ;
91153 this . target . removeEventListener ( 'mouseup' , this . handler ) ;
154+
155+ if ( Features . pointerLock )
156+ {
157+ document . removeEventListener ( 'pointerlockchange' , this . pointerLockChange , true ) ;
158+ document . removeEventListener ( 'mozpointerlockchange' , this . pointerLockChange , true ) ;
159+ document . removeEventListener ( 'webkitpointerlockchange' , this . pointerLockChange , true ) ;
160+ }
92161 }
93162
94163} ) ;
0 commit comments