babylon.freeCameraKeyboardMoveInput.ts 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. module BABYLON {
  2. export class FreeCameraKeyboardMoveInput implements ICameraInput<FreeCamera> {
  3. camera: FreeCamera;
  4. private _keys = [];
  5. private _onKeyDown: (e: KeyboardEvent) => any;
  6. private _onKeyUp: (e: KeyboardEvent) => any;
  7. @serialize()
  8. public keysUp = [38];
  9. @serialize()
  10. public keysDown = [40];
  11. @serialize()
  12. public keysLeft = [37];
  13. @serialize()
  14. public keysRight = [39];
  15. attachControl(element : HTMLElement, noPreventDefault?: boolean) {
  16. if (!this._onKeyDown) {
  17. element.tabIndex = 1;
  18. this._onKeyDown = evt => {
  19. if (this.keysUp.indexOf(evt.keyCode) !== -1 ||
  20. this.keysDown.indexOf(evt.keyCode) !== -1 ||
  21. this.keysLeft.indexOf(evt.keyCode) !== -1 ||
  22. this.keysRight.indexOf(evt.keyCode) !== -1) {
  23. var index = this._keys.indexOf(evt.keyCode);
  24. if (index === -1) {
  25. this._keys.push(evt.keyCode);
  26. }
  27. if (!noPreventDefault) {
  28. evt.preventDefault();
  29. }
  30. }
  31. };
  32. this._onKeyUp = evt => {
  33. if (this.keysUp.indexOf(evt.keyCode) !== -1 ||
  34. this.keysDown.indexOf(evt.keyCode) !== -1 ||
  35. this.keysLeft.indexOf(evt.keyCode) !== -1 ||
  36. this.keysRight.indexOf(evt.keyCode) !== -1) {
  37. var index = this._keys.indexOf(evt.keyCode);
  38. if (index >= 0) {
  39. this._keys.splice(index, 1);
  40. }
  41. if (!noPreventDefault) {
  42. evt.preventDefault();
  43. }
  44. }
  45. };
  46. element.addEventListener("keydown", this._onKeyDown, false);
  47. element.addEventListener("keyup", this._onKeyUp, false);
  48. Tools.RegisterTopRootEvents([
  49. { name: "blur", handler: this._onLostFocus }
  50. ]);
  51. }
  52. }
  53. detachControl(element : HTMLElement) {
  54. if (this._onKeyDown) {
  55. element.removeEventListener("keydown", this._onKeyDown);
  56. element.removeEventListener("keyup", this._onKeyUp);
  57. Tools.UnregisterTopRootEvents([
  58. { name: "blur", handler: this._onLostFocus }
  59. ]);
  60. this._keys = [];
  61. this._onKeyDown = null;
  62. this._onKeyUp = null;
  63. }
  64. }
  65. public checkInputs() {
  66. if (this._onKeyDown){
  67. var camera = this.camera;
  68. // Keyboard
  69. for (var index = 0; index < this._keys.length; index++) {
  70. var keyCode = this._keys[index];
  71. var speed = camera._computeLocalCameraSpeed();
  72. if (this.keysLeft.indexOf(keyCode) !== -1) {
  73. camera._localDirection.copyFromFloats(-speed, 0, 0);
  74. } else if (this.keysUp.indexOf(keyCode) !== -1) {
  75. camera._localDirection.copyFromFloats(0, 0, speed);
  76. } else if (this.keysRight.indexOf(keyCode) !== -1) {
  77. camera._localDirection.copyFromFloats(speed, 0, 0);
  78. } else if (this.keysDown.indexOf(keyCode) !== -1) {
  79. camera._localDirection.copyFromFloats(0, 0, -speed);
  80. }
  81. if (camera.getScene().useRightHandedSystem) {
  82. camera._localDirection.z *= -1;
  83. }
  84. camera.getViewMatrix().invertToRef(camera._cameraTransformMatrix);
  85. Vector3.TransformNormalToRef(camera._localDirection, camera._cameraTransformMatrix, camera._transformedDirection);
  86. camera.cameraDirection.addInPlace(camera._transformedDirection);
  87. }
  88. }
  89. }
  90. getClassName(): string {
  91. return "FreeCameraKeyboardMoveInput";
  92. }
  93. public _onLostFocus(e: FocusEvent): void {
  94. this._keys = [];
  95. }
  96. getSimpleName(){
  97. return "keyboard";
  98. }
  99. }
  100. CameraInputTypes["FreeCameraKeyboardMoveInput"] = FreeCameraKeyboardMoveInput;
  101. }