@@ -31,7 +31,7 @@ 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
3737 */
@@ -119,6 +119,8 @@ module.exports.AScene = registerElement('a-scene', {
119119 this . enterVRBound = function ( ) { self . enterVR ( ) ; } ;
120120 this . exitVRBound = function ( ) { self . exitVR ( ) ; } ;
121121 this . exitVRTrueBound = function ( ) { self . exitVR ( true ) ; } ;
122+ this . pointerRestrictedBound = function ( ) { self . pointerRestricted ( ) ; } ;
123+ this . pointerUnrestrictedBound = function ( ) { self . pointerUnrestricted ( ) ; } ;
122124
123125 // Enter VR on `vrdisplayactivate` (e.g. putting on Rift headset).
124126 window . addEventListener ( 'vrdisplayactivate' , this . enterVRBound ) ;
@@ -131,6 +133,14 @@ module.exports.AScene = registerElement('a-scene', {
131133
132134 // Exit VR on `vrdisplaydisconnect` (e.g. unplugging Rift headset).
133135 window . addEventListener ( 'vrdisplaydisconnect' , this . exitVRTrueBound ) ;
136+
137+ // Register for mouse restricted events while in VR
138+ // (e.g. mouse no longer available on desktop 2D view)
139+ window . addEventListener ( 'vrdisplaypointerrestricted' , this . pointerRestrictedBound ) ;
140+
141+ // Register for mouse unrestricted events while in VR
142+ // (e.g. mouse once again available on desktop 2D view)
143+ window . addEventListener ( 'vrdisplaypointerunrestricted' , this . pointerUnrestrictedBound ) ;
134144 } ,
135145 writable : window . debug
136146 } ,
@@ -178,6 +188,8 @@ module.exports.AScene = registerElement('a-scene', {
178188 window . removeEventListener ( 'vrdisplaydeactivate' , this . exitVRBound ) ;
179189 window . removeEventListener ( 'vrdisplayconnect' , this . enterVRBound ) ;
180190 window . removeEventListener ( 'vrdisplaydisconnect' , this . exitVRTrueBound ) ;
191+ window . removeEventListener ( 'vrdisplaypointerrestricted' , this . pointerRestrictedBound ) ;
192+ window . removeEventListener ( 'vrdisplaypointerunrestricted' , this . pointerUnrestrictedBound ) ;
181193 }
182194 } ,
183195
@@ -202,6 +214,16 @@ module.exports.AScene = registerElement('a-scene', {
202214 }
203215 } ,
204216
217+ /**
218+ * For tests.
219+ */
220+ getPointerLockElement : {
221+ value : function ( ) {
222+ return document . pointerLockElement ;
223+ } ,
224+ writable : window . debug
225+ } ,
226+
205227 /**
206228 * For tests.
207229 */
@@ -317,6 +339,31 @@ module.exports.AScene = registerElement('a-scene', {
317339 writable : window . debug
318340 } ,
319341
342+ pointerRestricted : {
343+ value : function ( ) {
344+ if ( this . canvas ) {
345+ var pointerLockElement = this . getPointerLockElement ( ) ;
346+ if ( pointerLockElement && pointerLockElement !== this . canvas && document . exitPointerLock ) {
347+ // Recreate pointer lock on the canvas, if taken on another element.
348+ document . exitPointerLock ( ) ;
349+ }
350+
351+ if ( this . canvas . requestPointerLock ) {
352+ this . canvas . requestPointerLock ( ) ;
353+ }
354+ }
355+ }
356+ } ,
357+
358+ pointerUnrestricted : {
359+ value : function ( ) {
360+ var pointerLockElement = this . getPointerLockElement ( ) ;
361+ if ( pointerLockElement && pointerLockElement === this . canvas && document . exitPointerLock ) {
362+ document . exitPointerLock ( ) ;
363+ }
364+ }
365+ } ,
366+
320367 /**
321368 * Handle `vrdisplaypresentchange` event for exiting VR through other means than
322369 * `<ESC>` key. For example, GearVR back button on Oculus Browser.
0 commit comments