@@ -31,9 +31,11 @@ var warn = utils.debug('core:a-scene:warn');
3131 * @member {object} object3D - Root three.js Scene object.
3232 * @member {object} renderer
3333 * @member {bool} renderStarted
34- * @member ( object) effect - three.js VREffect
34+ * @member { object} effect - three.js VREffect
3535 * @member {object} systems - Registered instantiated systems.
3636 * @member {number} time
37+ * @member {bool} isCanvasPointerLockEnabled - true: set pointerlock on the canvas element in response to/
38+ * false: ignore vrdisplaypointerrestricted event.
3739 */
3840module . exports . AScene = registerElement ( 'a-scene' , {
3941 prototype : Object . create ( AEntity . prototype , {
@@ -56,6 +58,7 @@ module.exports.AScene = registerElement('a-scene', {
5658 this . systems = { } ;
5759 this . systemNames = [ ] ;
5860 this . time = 0 ;
61+ this . isCanvasPointerLockEnabled = true ;
5962 this . init ( ) ;
6063 }
6164 } ,
@@ -119,6 +122,8 @@ module.exports.AScene = registerElement('a-scene', {
119122 this . enterVRBound = function ( ) { self . enterVR ( ) ; } ;
120123 this . exitVRBound = function ( ) { self . exitVR ( ) ; } ;
121124 this . exitVRTrueBound = function ( ) { self . exitVR ( true ) ; } ;
125+ this . pointerRestrictedBound = function ( ) { self . pointerRestricted ( ) ; } ;
126+ this . pointerUnrestrictedBound = function ( ) { self . pointerUnrestricted ( ) ; } ;
122127
123128 // Enter VR on `vrdisplayactivate` (e.g. putting on Rift headset).
124129 window . addEventListener ( 'vrdisplayactivate' , this . enterVRBound ) ;
@@ -131,6 +136,14 @@ module.exports.AScene = registerElement('a-scene', {
131136
132137 // Exit VR on `vrdisplaydisconnect` (e.g. unplugging Rift headset).
133138 window . addEventListener ( 'vrdisplaydisconnect' , this . exitVRTrueBound ) ;
139+
140+ // Register for mouse restricted events while in VR
141+ // (e.g. mouse no longer available on desktop 2D view)
142+ window . addEventListener ( 'vrdisplaypointerrestricted' , this . pointerRestrictedBound ) ;
143+
144+ // Register for mouse unrestricted events while in VR
145+ // (e.g. mouse once again available on desktop 2D view)
146+ window . addEventListener ( 'vrdisplaypointerunrestricted' , this . pointerUnrestrictedBound ) ;
134147 } ,
135148 writable : window . debug
136149 } ,
@@ -178,6 +191,8 @@ module.exports.AScene = registerElement('a-scene', {
178191 window . removeEventListener ( 'vrdisplaydeactivate' , this . exitVRBound ) ;
179192 window . removeEventListener ( 'vrdisplayconnect' , this . enterVRBound ) ;
180193 window . removeEventListener ( 'vrdisplaydisconnect' , this . exitVRTrueBound ) ;
194+ window . removeEventListener ( 'vrdisplaypointerrestricted' , this . pointerRestrictedBound ) ;
195+ window . removeEventListener ( 'vrdisplaypointerunrestricted' , this . pointerUnrestrictedBound ) ;
181196 }
182197 } ,
183198
@@ -202,6 +217,16 @@ module.exports.AScene = registerElement('a-scene', {
202217 }
203218 } ,
204219
220+ /**
221+ * For tests.
222+ */
223+ getPointerLockElement : {
224+ value : function ( ) {
225+ return document . pointerLockElement ;
226+ } ,
227+ writable : window . debug
228+ } ,
229+
205230 /**
206231 * For tests.
207232 */
@@ -317,6 +342,50 @@ module.exports.AScene = registerElement('a-scene', {
317342 writable : window . debug
318343 } ,
319344
345+ enableCanvasPointerLock : {
346+ value : function ( ) {
347+ this . isCanvasPointerLockEnabled = true ;
348+ }
349+ } ,
350+
351+ disableCanvasPointerLock : {
352+ value : function ( ) {
353+ this . isCanvasPointerLockEnabled = false ;
354+ }
355+ } ,
356+
357+ pointerRestricted : {
358+ value : function ( ) {
359+ if ( ! this . isCanvasPointerLockEnabled ) {
360+ return ;
361+ }
362+
363+ if ( this . canvas ) {
364+ var pointerLockElement = this . getPointerLockElement ( ) ;
365+ if ( pointerLockElement && pointerLockElement !== this . canvas && document . exitPointerLock ) {
366+ // Recreate pointer lock on the canvas, if taken on another element.
367+ document . exitPointerLock ( ) ;
368+ }
369+
370+ if ( this . canvas . requestPointerLock ) {
371+ this . canvas . requestPointerLock ( ) ;
372+ }
373+ }
374+ }
375+ } ,
376+
377+ pointerUnrestricted : {
378+ value : function ( ) {
379+ if ( ! this . isCanvasPointerLockEnabled ) {
380+ return ;
381+ }
382+ var pointerLockElement = this . getPointerLockElement ( ) ;
383+ if ( pointerLockElement && pointerLockElement === this . canvas && document . exitPointerLock ) {
384+ document . exitPointerLock ( ) ;
385+ }
386+ }
387+ } ,
388+
320389 /**
321390 * Handle `vrdisplaypresentchange` event for exiting VR through other means than
322391 * `<ESC>` key. For example, GearVR back button on Oculus Browser.
0 commit comments