|
@@ -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 );
|