2
0
Эх сурвалжийг харах

More fixes to VRControls/VREffect

Based on suggestions by @cvan and @jzitelli
Brandon Jones 9 жил өмнө
parent
commit
d6a5949573

+ 10 - 13
examples/js/controls/VRControls.js

@@ -7,24 +7,25 @@ THREE.VRControls = function ( object, onError ) {
 
 	var scope = this;
 
-	var vrInputs = [];
+	var vrInput;
 
 	function gotVRDevices( devices ) {
 
 		for ( var i = 0; i < devices.length; i ++ ) {
 
-			if ( ('VRDisplay' in window && devices[ i ] instanceof VRDisplay) ||
-				 ('PositionSensorVRDevice' in window && devices[ i ] instanceof PositionSensorVRDevice) ) {
+			if ( ( 'VRDisplay' in window && devices[ i ] instanceof VRDisplay ) ||
+				 ( 'PositionSensorVRDevice' in window && devices[ i ] instanceof PositionSensorVRDevice ) ) {
 
-				vrInputs.push( devices[ i ] );
+				vrInput = devices[ i ];
+				break;  // We keep the first we encounter
 
 			}
 
 		}
 
-		if ( vrInputs.length === 0 ) {
+		if ( !vrInput ) {
 
-			if ( onError ) onError( 'VR inputs not available.' );
+			if ( onError ) onError( 'VR input not available.' );
 
 		}
 
@@ -49,9 +50,7 @@ THREE.VRControls = function ( object, onError ) {
 
 	this.update = function () {
 
-		for ( var i = 0; i < vrInputs.length; i ++ ) {
-
-			var vrInput = vrInputs[ i ];
+		if ( vrInput ) {
 
 			if ( vrInput.getPose ) {
 
@@ -94,9 +93,7 @@ THREE.VRControls = function ( object, onError ) {
 
 	this.resetSensor = function () {
 
-		for ( var i = 0; i < vrInputs.length; i ++ ) {
-
-			var vrInput = vrInputs[ i ];
+		if ( vrInput ) {
 
 			if ( vrInput.resetPose !== undefined ) {
 
@@ -127,7 +124,7 @@ THREE.VRControls = function ( object, onError ) {
 
 	this.dispose = function () {
 
-		vrInputs = [];
+		vrInput = null;
 
 	};
 

+ 59 - 29
examples/js/effects/VREffect.js

@@ -76,7 +76,7 @@ THREE.VREffect = function ( renderer, onError ) {
 
 	document.addEventListener( fullscreenchange, function () {
 
-		if ( deprecatedAPI ) {
+		if ( vrHMD && deprecatedAPI ) {
 
 			isPresenting = document.mozFullScreenElement || document.webkitFullscreenElement;
 
@@ -86,57 +86,72 @@ THREE.VREffect = function ( renderer, onError ) {
 
 	window.addEventListener( 'vrdisplaypresentchange', function () {
 
-		if (vrHMD) {
-
-			isPresenting = vrHMD.isPresenting;
-
-		}
+		isPresenting = vrHMD && vrHMD.isPresenting;
 
 	}, false );
 
 	this.setFullScreen = function ( boolean ) {
 
-		if ( vrHMD === undefined ) return;
-		if ( isPresenting === boolean ) return;
+		return new Promise(function(resolve, reject) {
 
-		if ( !deprecatedAPI ) {
+			if ( vrHMD === undefined ) {
+				reject( new Error( 'No VR hardware found.' ) );
+				return;
+			}
+			if ( isPresenting === boolean ) {
+				resolve();
+				return;
+			}
 
-			if ( boolean ) {
+			if ( !deprecatedAPI ) {
 
-				vrHMD.requestPresent( { source: canvas } );
+				if ( boolean ) {
 
-			} else {
+					resolve( vrHMD.requestPresent( { source: canvas } ) );
 
-				vrHMD.exitPresent();
+				} else {
 
-			}
+					resolve( vrHMD.exitPresent() );
+
+				}
 
-		} else {
+				return;
 
-			if ( canvas.mozRequestFullScreen ) {
+			} else {
 
-				canvas.mozRequestFullScreen( { vrDisplay: vrHMD } );
+				if ( canvas.mozRequestFullScreen ) {
 
-			} else if ( canvas.webkitRequestFullscreen ) {
+					canvas.mozRequestFullScreen( { vrDisplay: vrHMD } );
+					resolve();
 
-				canvas.webkitRequestFullscreen( { vrDisplay: vrHMD } );
+				} else if ( canvas.webkitRequestFullscreen ) {
 
-			} else {
+					canvas.webkitRequestFullscreen( { vrDisplay: vrHMD } );
+					resolve();
 
-				console.error( 'No compatible requestFullscreen method found.' );
+				} else {
+
+					console.error( 'No compatible requestFullscreen method found.' );
+					reject( new Error( 'No compatible requestFullscreen method found.' ) );
+
+				}
 
 			}
 
-		}
+		});
 
 	};
 
 	this.requestPresent = function () {
-		this.setFullScreen( true );
+
+		return this.setFullScreen( true );
+
 	};
 
 	this.exitPresent = function () {
-		this.setFullScreen( false );
+
+		return this.setFullScreen( false );
+
 	};
 
 	// render
@@ -151,20 +166,29 @@ THREE.VREffect = function ( renderer, onError ) {
 
 		if ( vrHMD && isPresenting ) {
 
+			var autoUpdate = scene.autoUpdate;
+
+			if ( autoUpdate ) {
+
+				scene.updateMatrixWorld();
+				scene.autoUpdate = false;
+
+			}
+
 			var eyeParamsL = vrHMD.getEyeParameters( 'left' );
 			var eyeParamsR = vrHMD.getEyeParameters( 'right' );
 
 			if ( !deprecatedAPI ) {
 
-				eyeTranslationL.fromArray(eyeParamsL.offset);
-				eyeTranslationR.fromArray(eyeParamsR.offset);
+				eyeTranslationL.fromArray( eyeParamsL.offset );
+				eyeTranslationR.fromArray( eyeParamsR.offset );
 				eyeFOVL = eyeParamsL.fieldOfView;
 				eyeFOVR = eyeParamsR.fieldOfView;
 
 			} else {
 
-				eyeTranslationL.copy(eyeParamsL.eyeTranslation);
-				eyeTranslationR.copy(eyeParamsR.eyeTranslation);
+				eyeTranslationL.copy( eyeParamsL.eyeTranslation );
+				eyeTranslationR.copy( eyeParamsR.eyeTranslation );
 				eyeFOVL = eyeParamsL.recommendedFieldOfView;
 				eyeFOVR = eyeParamsR.recommendedFieldOfView;
 
@@ -209,7 +233,13 @@ THREE.VREffect = function ( renderer, onError ) {
 
 			renderer.setScissorTest( false );
 
-			if ( isPresenting && !deprecatedAPI ) {
+			if ( autoUpdate ) {
+
+				scene.autoUpdate = true;
+
+			}
+
+			if ( !deprecatedAPI ) {
 
 				vrHMD.submitFrame();