浏览代码

Merge pull request #15604 from dmarcos/fixWebXR

Accomodate Chrome m75 WebXR API changes. Function renaming.
Mr.doob 6 年之前
父节点
当前提交
ad206e904a
共有 3 个文件被更改,包括 35 次插入38 次删除
  1. 9 9
      examples/js/vr/WebVR.js
  2. 4 2
      src/renderers/WebGLRenderer.js
  3. 22 27
      src/renderers/webvr/WebXRManager.js

+ 9 - 9
examples/js/vr/WebVR.js

@@ -81,7 +81,7 @@ var WEBVR = {
 
 				if ( currentSession === null ) {
 
-					device.requestSession( { immersive: true, exclusive: true /* DEPRECATED */ } ).then( onSessionStarted );
+					navigator.xr.requestSession( { mode: 'immersive-vr' } ).then( onSessionStarted );
 
 				} else {
 
@@ -91,7 +91,11 @@ var WEBVR = {
 
 			};
 
-			renderer.vr.setDevice( device );
+			if ( device ) {
+
+				renderer.vr.setDevice( device );
+
+			}
 
 		}
 
@@ -138,13 +142,9 @@ var WEBVR = {
 
 			stylizeElement( button );
 
-			navigator.xr.requestDevice().then( function ( device ) {
-
-				device.supportsSession( { immersive: true, exclusive: true /* DEPRECATED */ } )
-					.then( function () { showEnterXR( device ); } )
-					.catch( showVRNotFound );
-
-			} ).catch( showVRNotFound );
+			navigator.xr.supportsSessionMode( 'immersive-vr' ).then( function () {
+				showEnterXR( );
+			});
 
 			return button;
 

+ 4 - 2
src/renderers/WebGLRenderer.js

@@ -201,7 +201,8 @@ function WebGLRenderer( parameters ) {
 			premultipliedAlpha: _premultipliedAlpha,
 			preserveDrawingBuffer: _preserveDrawingBuffer,
 			powerPreference: _powerPreference,
-			failIfMajorPerformanceCaveat: _failIfMajorPerformanceCaveat
+			failIfMajorPerformanceCaveat: _failIfMajorPerformanceCaveat,
+			xrCompatible: true
 		};
 
 		// event listeners must be registered before WebGL context is created, see #12753
@@ -2411,9 +2412,10 @@ function WebGLRenderer( parameters ) {
 	}
 
 	//
-
 	this.setFramebuffer = function ( value ) {
 
+		if (_framebuffer !== value ) _gl.bindFramebuffer( _gl.FRAMEBUFFER, value );
+
 		_framebuffer = value;
 
 	};

+ 22 - 27
src/renderers/webvr/WebXRManager.js

@@ -78,7 +78,6 @@ function WebXRManager( renderer ) {
 	this.setDevice = function ( value ) {
 
 		if ( value !== undefined ) device = value;
-		if ( value instanceof XRDevice ) gl.setCompatibleXRDevice( value );
 
 	};
 
@@ -99,6 +98,15 @@ function WebXRManager( renderer ) {
 
 	}
 
+	function onRequestFrameOfReference( value ) {
+
+		frameOfReference = value;
+
+		animation.setContext( session );
+		animation.start();
+
+	}
+
 	this.setFramebufferScaleFactor = function ( value ) {
 
 		framebufferScaleFactor = value;
@@ -122,17 +130,9 @@ function WebXRManager( renderer ) {
 			session.addEventListener( 'selectend', onSessionEvent );
 			session.addEventListener( 'end', onSessionEnd );
 
-			session.baseLayer = new XRWebGLLayer( session, gl, { framebufferScaleFactor: framebufferScaleFactor } );
-			session.requestFrameOfReference( frameOfReferenceType ).then( function ( value ) {
-
-				frameOfReference = value;
-
-				renderer.setFramebuffer( session.baseLayer.framebuffer );
-
-				animation.setContext( session );
-				animation.start();
+			session.updateRenderState( {  baseLayer:  new XRWebGLLayer( session, gl ) } );
 
-			} );
+			session.requestReferenceSpace( { type: 'stationary', subtype: 'eye-level' } ).then( onRequestFrameOfReference );
 
 			//
 
@@ -217,18 +217,22 @@ function WebXRManager( renderer ) {
 
 	function onAnimationFrame( time, frame ) {
 
-		pose = frame.getDevicePose( frameOfReference );
+		let session = frame.session;
+
+		pose = frame.getViewerPose( frameOfReference );
 
 		if ( pose !== null ) {
 
-			var layer = session.baseLayer;
-			var views = frame.views;
+			var layer = session.renderState.baseLayer;
+			var views = pose.views;
+
+			renderer.setFramebuffer( session.renderState.baseLayer.framebuffer );
 
 			for ( var i = 0; i < views.length; i ++ ) {
 
 				var view = views[ i ];
 				var viewport = layer.getViewport( view );
-				var viewMatrix = pose.getViewMatrix( view );
+				var viewMatrix = view.transform.inverse().matrix;
 
 				var camera = cameraVR.cameras[ i ];
 				camera.matrix.fromArray( viewMatrix ).getInverse( camera.matrix );
@@ -255,21 +259,12 @@ function WebXRManager( renderer ) {
 
 			if ( inputSource ) {
 
-				var inputPose = frame.getInputPose( inputSource, frameOfReference );
+				var inputPose = frame.getPose( inputSource.targetRaySpace, frameOfReference );
 
 				if ( inputPose !== null ) {
 
-					if ( 'targetRay' in inputPose ) {
-
-						controller.matrix.elements = inputPose.targetRay.transformMatrix;
-
-					} else if ( 'pointerMatrix' in inputPose ) {
-
-						// DEPRECATED
-
-						controller.matrix.elements = inputPose.pointerMatrix;
-
-					}
+					let targetRay = new XRRay(inputPose.transform);
+					controller.matrix.elements = targetRay.matrix;
 
 					controller.matrix.decompose( controller.position, controller.rotation, controller.scale );
 					controller.visible = true;