DaydreamController.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. /**
  2. * @author Mugen87 / https://github.com/Mugen87
  3. */
  4. THREE.DaydreamController = function () {
  5. THREE.Object3D.call( this );
  6. var scope = this;
  7. var gamepad;
  8. var axes = [ 0, 0 ];
  9. var touchpadIsPressed = false;
  10. var angularVelocity = new THREE.Vector3();
  11. this.matrixAutoUpdate = false;
  12. function findGamepad() {
  13. // iterate across gamepads as the Daydream Controller may not be
  14. // in position 0
  15. var gamepads = navigator.getGamepads && navigator.getGamepads();
  16. for ( var i = 0; i < 4; i ++ ) {
  17. var gamepad = gamepads[ i ];
  18. if ( gamepad && ( gamepad.id === 'Daydream Controller' ) ) {
  19. return gamepad;
  20. }
  21. }
  22. }
  23. this.getGamepad = function () {
  24. return gamepad;
  25. };
  26. this.getTouchpadState = function () {
  27. return touchpadIsPressed;
  28. };
  29. this.update = function () {
  30. gamepad = findGamepad();
  31. if ( gamepad !== undefined && gamepad.pose !== undefined ) {
  32. var pose = gamepad.pose;
  33. if ( pose === null ) return; // no user action yet
  34. // orientation
  35. if ( pose.orientation !== null ) scope.quaternion.fromArray( pose.orientation );
  36. scope.updateMatrix();
  37. scope.visible = true;
  38. // angular velocity
  39. if ( pose.angularVelocity !== null && ! angularVelocity.equals( pose.angularVelocity ) ) {
  40. angularVelocity.fromArray( pose.angularVelocity );
  41. scope.dispatchEvent( { type: 'angularvelocitychanged', angularVelocity: angularVelocity } );
  42. }
  43. // axes (touchpad)
  44. if ( axes[ 0 ] !== gamepad.axes[ 0 ] || axes[ 1 ] !== gamepad.axes[ 1 ] ) {
  45. axes[ 0 ] = gamepad.axes[ 0 ];
  46. axes[ 1 ] = gamepad.axes[ 1 ];
  47. scope.dispatchEvent( { type: 'axischanged', axes: axes } );
  48. }
  49. // button (touchpad)
  50. if ( touchpadIsPressed !== gamepad.buttons[ 0 ].pressed ) {
  51. touchpadIsPressed = gamepad.buttons[ 0 ].pressed;
  52. scope.dispatchEvent( { type: touchpadIsPressed ? 'touchpaddown' : 'touchpadup' } );
  53. }
  54. // app button not available, reserved for use by the browser
  55. } else {
  56. scope.visible = false;
  57. }
  58. };
  59. // DEPRECATED
  60. this.getTouchPadState = function () {
  61. console.warn( 'THREE.DaydreamController: getTouchPadState() is now getTouchpadState()' );
  62. return touchpadIsPressed;
  63. };
  64. };
  65. THREE.DaydreamController.prototype = Object.create( THREE.Object3D.prototype );
  66. THREE.DaydreamController.prototype.constructor = THREE.DaydreamController;