瀏覽代碼

Updated builds.

Mr.doob 7 年之前
父節點
當前提交
93f0618ddf
共有 3 個文件被更改,包括 530 次插入306 次删除
  1. 121 10
      build/three.js
  2. 288 286
      build/three.min.js
  3. 121 10
      build/three.module.js

+ 121 - 10
build/three.js

@@ -21417,6 +21417,7 @@
 
 
 		var poseTarget = null;
 		var poseTarget = null;
 
 
+		var controllers = [];
 		var standingMatrix = new Matrix4();
 		var standingMatrix = new Matrix4();
 		var standingMatrixInverse = new Matrix4();
 		var standingMatrixInverse = new Matrix4();
 
 
@@ -21480,13 +21481,108 @@
 
 
 		//
 		//
 
 
+		var isTriggerPressed = false;
+
+		function findGamepad( id ) {
+
+			var gamepads = navigator.getGamepads && navigator.getGamepads();
+
+			for ( var i = 0, j = 0, l = gamepads.length; i < l; i ++ ) {
+
+				var gamepad = gamepads[ i ];
+
+				if ( gamepad && ( gamepad.id === 'Daydream Controller' ||
+					gamepad.id === 'Gear VR Controller' || gamepad.id === 'Oculus Go Controller' ||
+					gamepad.id === 'OpenVR Gamepad' || gamepad.id.startsWith( 'Oculus Touch' ) ||
+					gamepad.id.startsWith( 'Spatial Controller' ) ) ) {
+
+					if ( j === id ) return gamepad;
+
+					j ++;
+
+				}
+
+			}
+
+		}
+
+		function updateControllers() {
+
+			for ( var i = 0; i < controllers.length; i ++ ) {
+
+				var controller = controllers[ i ];
+
+				var gamepad = findGamepad( i );
+
+				if ( gamepad !== undefined && gamepad.pose !== undefined ) {
+
+					if ( gamepad.pose === null ) return;
+
+					//  Pose
+
+					var pose = gamepad.pose;
+
+					if ( pose.hasPosition === false ) controller.position.set( 0.2, - 0.6, - 0.05 );
+
+					if ( pose.position !== null ) controller.position.fromArray( pose.position );
+					if ( pose.orientation !== null ) controller.quaternion.fromArray( pose.orientation );
+					controller.matrix.compose( controller.position, controller.quaternion, controller.scale );
+					controller.matrix.premultiply( standingMatrix );
+					controller.matrix.decompose( controller.position, controller.quaternion, controller.scale );
+					controller.matrixWorldNeedsUpdate = true;
+					controller.visible = true;
+
+					//  Trigger
+
+					var buttonId = gamepad.id === 'Daydream Controller' ? 0 : 1;
+
+					if ( isTriggerPressed !== gamepad.buttons[ buttonId ].pressed ) {
+
+						isTriggerPressed = gamepad.buttons[ buttonId ].pressed;
+
+						if ( isTriggerPressed ) {
+
+							controller.dispatchEvent( { type: 'selectstart' } );
+
+						} else {
+
+							controller.dispatchEvent( { type: 'selectend' } );
+							controller.dispatchEvent( { type: 'select' } );
+
+						}
+
+					}
+
+				} else {
+
+					controller.visible = false;
+
+				}
+
+			}
+
+		}
+
+		//
+
 		this.enabled = false;
 		this.enabled = false;
 		this.userHeight = 1.6;
 		this.userHeight = 1.6;
 
 
 		this.getController = function ( id ) {
 		this.getController = function ( id ) {
 
 
-			console.warn( 'WebVRManager: getController() not yet implemented.' );
-			return new Group();
+			var controller = controllers[ id ];
+
+			if ( controller === undefined ) {
+
+				controller = new Group();
+				controller.matrixAutoUpdate = false;
+				controller.visible = false;
+
+				controllers[ id ] = controller;
+
+			}
+
+			return controller;
 
 
 		};
 		};
 
 
@@ -21628,6 +21724,8 @@
 
 
 			}
 			}
 
 
+			updateControllers();
+
 			return cameraVR;
 			return cameraVR;
 
 
 		};
 		};
@@ -21680,10 +21778,11 @@
 		var session = null;
 		var session = null;
 
 
 		var frameOfRef = null;
 		var frameOfRef = null;
-		var inputSources = [];
 
 
 		var pose = null;
 		var pose = null;
-		var controllers = {};
+
+		var controllers = [];
+		var inputSources = [];
 
 
 		function isPresenting() {
 		function isPresenting() {
 
 
@@ -21718,6 +21817,7 @@
 
 
 				controller = new Group();
 				controller = new Group();
 				controller.matrixAutoUpdate = false;
 				controller.matrixAutoUpdate = false;
+				controller.visible = false;
 
 
 				controllers[ id ] = controller;
 				controllers[ id ] = controller;
 
 
@@ -21891,19 +21991,30 @@
 
 
 			//
 			//
 
 
-			for ( var i = 0; i < inputSources.length; i ++ ) {
+			for ( var i = 0; i < controllers.length; i ++ ) {
+
+				var controller = controllers[ i ];
 
 
 				var inputSource = inputSources[ i ];
 				var inputSource = inputSources[ i ];
-				var inputPose = frame.getInputPose( inputSource, frameOfRef );
 
 
-				if ( inputPose !== null && controllers[ i ] ) {
+				if ( inputSource ) {
+
+					var inputPose = frame.getInputPose( inputSource, frameOfRef );
 
 
-					var controller = controllers[ i ];
-					controller.matrix.elements = inputPose.gripMatrix;
-					controller.matrix.decompose( controller.position, controller.rotation, controller.scale );
+					if ( inputPose !== null ) {
+
+						controller.matrix.elements = inputPose.gripMatrix;
+						controller.matrix.decompose( controller.position, controller.rotation, controller.scale );
+						controller.visible = true;
+
+						continue;
+
+					}
 
 
 				}
 				}
 
 
+				controller.visible = false;
+
 			}
 			}
 
 
 			if ( onAnimationFrameCallback ) onAnimationFrameCallback( time );
 			if ( onAnimationFrameCallback ) onAnimationFrameCallback( time );

File diff suppressed because it is too large
+ 288 - 286
build/three.min.js


+ 121 - 10
build/three.module.js

@@ -21411,6 +21411,7 @@ function WebVRManager( renderer ) {
 
 
 	var poseTarget = null;
 	var poseTarget = null;
 
 
+	var controllers = [];
 	var standingMatrix = new Matrix4();
 	var standingMatrix = new Matrix4();
 	var standingMatrixInverse = new Matrix4();
 	var standingMatrixInverse = new Matrix4();
 
 
@@ -21474,13 +21475,108 @@ function WebVRManager( renderer ) {
 
 
 	//
 	//
 
 
+	var isTriggerPressed = false;
+
+	function findGamepad( id ) {
+
+		var gamepads = navigator.getGamepads && navigator.getGamepads();
+
+		for ( var i = 0, j = 0, l = gamepads.length; i < l; i ++ ) {
+
+			var gamepad = gamepads[ i ];
+
+			if ( gamepad && ( gamepad.id === 'Daydream Controller' ||
+				gamepad.id === 'Gear VR Controller' || gamepad.id === 'Oculus Go Controller' ||
+				gamepad.id === 'OpenVR Gamepad' || gamepad.id.startsWith( 'Oculus Touch' ) ||
+				gamepad.id.startsWith( 'Spatial Controller' ) ) ) {
+
+				if ( j === id ) return gamepad;
+
+				j ++;
+
+			}
+
+		}
+
+	}
+
+	function updateControllers() {
+
+		for ( var i = 0; i < controllers.length; i ++ ) {
+
+			var controller = controllers[ i ];
+
+			var gamepad = findGamepad( i );
+
+			if ( gamepad !== undefined && gamepad.pose !== undefined ) {
+
+				if ( gamepad.pose === null ) return;
+
+				//  Pose
+
+				var pose = gamepad.pose;
+
+				if ( pose.hasPosition === false ) controller.position.set( 0.2, - 0.6, - 0.05 );
+
+				if ( pose.position !== null ) controller.position.fromArray( pose.position );
+				if ( pose.orientation !== null ) controller.quaternion.fromArray( pose.orientation );
+				controller.matrix.compose( controller.position, controller.quaternion, controller.scale );
+				controller.matrix.premultiply( standingMatrix );
+				controller.matrix.decompose( controller.position, controller.quaternion, controller.scale );
+				controller.matrixWorldNeedsUpdate = true;
+				controller.visible = true;
+
+				//  Trigger
+
+				var buttonId = gamepad.id === 'Daydream Controller' ? 0 : 1;
+
+				if ( isTriggerPressed !== gamepad.buttons[ buttonId ].pressed ) {
+
+					isTriggerPressed = gamepad.buttons[ buttonId ].pressed;
+
+					if ( isTriggerPressed ) {
+
+						controller.dispatchEvent( { type: 'selectstart' } );
+
+					} else {
+
+						controller.dispatchEvent( { type: 'selectend' } );
+						controller.dispatchEvent( { type: 'select' } );
+
+					}
+
+				}
+
+			} else {
+
+				controller.visible = false;
+
+			}
+
+		}
+
+	}
+
+	//
+
 	this.enabled = false;
 	this.enabled = false;
 	this.userHeight = 1.6;
 	this.userHeight = 1.6;
 
 
 	this.getController = function ( id ) {
 	this.getController = function ( id ) {
 
 
-		console.warn( 'WebVRManager: getController() not yet implemented.' );
-		return new Group();
+		var controller = controllers[ id ];
+
+		if ( controller === undefined ) {
+
+			controller = new Group();
+			controller.matrixAutoUpdate = false;
+			controller.visible = false;
+
+			controllers[ id ] = controller;
+
+		}
+
+		return controller;
 
 
 	};
 	};
 
 
@@ -21622,6 +21718,8 @@ function WebVRManager( renderer ) {
 
 
 		}
 		}
 
 
+		updateControllers();
+
 		return cameraVR;
 		return cameraVR;
 
 
 	};
 	};
@@ -21674,10 +21772,11 @@ function WebXRManager( renderer ) {
 	var session = null;
 	var session = null;
 
 
 	var frameOfRef = null;
 	var frameOfRef = null;
-	var inputSources = [];
 
 
 	var pose = null;
 	var pose = null;
-	var controllers = {};
+
+	var controllers = [];
+	var inputSources = [];
 
 
 	function isPresenting() {
 	function isPresenting() {
 
 
@@ -21712,6 +21811,7 @@ function WebXRManager( renderer ) {
 
 
 			controller = new Group();
 			controller = new Group();
 			controller.matrixAutoUpdate = false;
 			controller.matrixAutoUpdate = false;
+			controller.visible = false;
 
 
 			controllers[ id ] = controller;
 			controllers[ id ] = controller;
 
 
@@ -21885,19 +21985,30 @@ function WebXRManager( renderer ) {
 
 
 		//
 		//
 
 
-		for ( var i = 0; i < inputSources.length; i ++ ) {
+		for ( var i = 0; i < controllers.length; i ++ ) {
+
+			var controller = controllers[ i ];
 
 
 			var inputSource = inputSources[ i ];
 			var inputSource = inputSources[ i ];
-			var inputPose = frame.getInputPose( inputSource, frameOfRef );
 
 
-			if ( inputPose !== null && controllers[ i ] ) {
+			if ( inputSource ) {
+
+				var inputPose = frame.getInputPose( inputSource, frameOfRef );
 
 
-				var controller = controllers[ i ];
-				controller.matrix.elements = inputPose.gripMatrix;
-				controller.matrix.decompose( controller.position, controller.rotation, controller.scale );
+				if ( inputPose !== null ) {
+
+					controller.matrix.elements = inputPose.gripMatrix;
+					controller.matrix.decompose( controller.position, controller.rotation, controller.scale );
+					controller.visible = true;
+
+					continue;
+
+				}
 
 
 			}
 			}
 
 
+			controller.visible = false;
+
 		}
 		}
 
 
 		if ( onAnimationFrameCallback ) onAnimationFrameCallback( time );
 		if ( onAnimationFrameCallback ) onAnimationFrameCallback( time );

Some files were not shown because too many files changed in this diff