ViveController.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /**
  2. * @author mrdoob / http://mrdoob.com
  3. * @author stewdio / http://stewd.io
  4. */
  5. THREE.ViveController = function( id ) {
  6. THREE.Object3D.call( this );
  7. var
  8. scope = this,
  9. gamepad,
  10. axes = [ 0, 0 ],
  11. thumbpadIsPressed = false,
  12. triggerIsPressed = false,
  13. gripsArePressed = false,
  14. menuIsPressed = false;
  15. function dispatchViveControllerEvent( name, custom ) {
  16. var data = {};
  17. data.id = id;
  18. data.gamepad = gamepad;
  19. data.instance = scope;
  20. if ( custom !== undefined ) Object.assign( data, custom );
  21. window.dispatchEvent( new CustomEvent( 'viveController' + name, { detail: data } ) );
  22. }
  23. this.matrixAutoUpdate = false;
  24. this.standingMatrix = new THREE.Matrix4();
  25. this.getGamepad = function() {
  26. return gamepad;
  27. }
  28. this.getButtonState = function( button ) {
  29. return scope[ button + ( button === 'grips' ? 'ArePressed' : 'IsPressed' ) ];
  30. }
  31. this.update = function() {
  32. var pose;
  33. gamepad = navigator.getGamepads()[ id ];
  34. if ( gamepad !== undefined && gamepad.pose !== null ) {
  35. // Position and orientation.
  36. pose = gamepad.pose;
  37. scope.position.fromArray( pose.position );
  38. scope.quaternion.fromArray( pose.orientation );
  39. scope.matrix.compose( scope.position, scope.quaternion, scope.scale );
  40. scope.matrix.multiplyMatrices( scope.standingMatrix, scope.matrix );
  41. scope.matrixWorldNeedsUpdate = true;
  42. scope.visible = true;
  43. // Thumbpad and Buttons.
  44. if ( axes[ 0 ] !== gamepad.axes[ 0 ] ||
  45. axes[ 1 ] !== gamepad.axes[ 1 ] ) {
  46. axes[ 0 ] = gamepad.axes[ 0 ];// X axis: -1 = Left, +1 = Right.
  47. axes[ 1 ] = gamepad.axes[ 1 ];// Y axis: -1 = Bottom, +1 = Top.
  48. dispatchViveControllerEvent( 'AxisChanged', { axes: axes } );
  49. }
  50. if ( thumbpadIsPressed !== gamepad.buttons[ 0 ].pressed ) {
  51. thumbpadIsPressed = gamepad.buttons[ 0 ].pressed;
  52. dispatchViveControllerEvent( thumbpadIsPressed ? 'ThumbpadPressed' : 'ThumbpadReleased' );
  53. }
  54. if ( triggerIsPressed !== gamepad.buttons[ 1 ].pressed ) {
  55. triggerIsPressed = gamepad.buttons[ 1 ].pressed;
  56. dispatchViveControllerEvent( triggerIsPressed ? 'TriggerPressed' : 'TriggerReleased' );
  57. }
  58. if ( gripsArePressed !== gamepad.buttons[ 2 ].pressed ) {
  59. gripsArePressed = gamepad.buttons[ 2 ].pressed;
  60. dispatchViveControllerEvent( gripsArePressed ? 'GripsPressed' : 'GripsReleased' );
  61. }
  62. if ( menuIsPressed !== gamepad.buttons[ 3 ].pressed ) {
  63. menuIsPressed = gamepad.buttons[ 3 ].pressed;
  64. dispatchViveControllerEvent( menuIsPressed ? 'MenuPressed' : 'MenuReleased' );
  65. }
  66. }
  67. else scope.visible = false;
  68. }
  69. }
  70. THREE.ViveController.prototype = Object.create( THREE.Object3D.prototype );
  71. THREE.ViveController.prototype.constructor = THREE.ViveController;