babylon.freeCameraMouseInput.ts 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. module BABYLON {
  2. export class FreeCameraMouseInput implements ICameraInput<FreeCamera> {
  3. camera: FreeCamera;
  4. @serialize()
  5. public buttons = [0, 1, 2];
  6. @serialize()
  7. public angularSensibility = 2000.0;
  8. private _pointerInput: (p: PointerInfo, s: EventState) => void;
  9. private _onMouseMove: (e: MouseEvent) => any;
  10. private _observer: Observer<PointerInfo>;
  11. private previousPosition: { x: number, y: number };
  12. constructor(public touchEnabled = true) {
  13. }
  14. attachControl(element: HTMLElement, noPreventDefault?: boolean) {
  15. var engine = this.camera.getEngine();
  16. if (!this._pointerInput) {
  17. this._pointerInput = (p, s) => {
  18. var evt = <PointerEvent>p.event;
  19. if (!this.touchEnabled && evt.pointerType === "touch") {
  20. return;
  21. }
  22. if(p.type !== PointerEventTypes.POINTERMOVE && this.buttons.indexOf(evt.button) === -1){
  23. return;
  24. }
  25. if (p.type === PointerEventTypes.POINTERDOWN) {
  26. try {
  27. evt.srcElement.setPointerCapture(evt.pointerId);
  28. } catch (e) {
  29. //Nothing to do with the error. Execution will continue.
  30. }
  31. this.previousPosition = {
  32. x: evt.clientX,
  33. y: evt.clientY
  34. };
  35. if (!noPreventDefault) {
  36. evt.preventDefault();
  37. element.focus();
  38. }
  39. }
  40. else if (p.type === PointerEventTypes.POINTERUP) {
  41. try {
  42. evt.srcElement.releasePointerCapture(evt.pointerId);
  43. } catch (e) {
  44. //Nothing to do with the error.
  45. }
  46. this.previousPosition = null;
  47. if (!noPreventDefault) {
  48. evt.preventDefault();
  49. }
  50. }
  51. else if (p.type === PointerEventTypes.POINTERMOVE) {
  52. if (!this.previousPosition || engine.isPointerLock) {
  53. return;
  54. }
  55. var offsetX = evt.clientX - this.previousPosition.x;
  56. var offsetY = evt.clientY - this.previousPosition.y;
  57. if (this.camera.getScene().useRightHandedSystem) {
  58. this.camera.cameraRotation.y -= offsetX / this.angularSensibility;
  59. } else {
  60. this.camera.cameraRotation.y += offsetX / this.angularSensibility;
  61. }
  62. this.camera.cameraRotation.x += offsetY / this.angularSensibility;
  63. this.previousPosition = {
  64. x: evt.clientX,
  65. y: evt.clientY
  66. };
  67. if (!noPreventDefault) {
  68. evt.preventDefault();
  69. }
  70. }
  71. }
  72. }
  73. this._onMouseMove = evt => {
  74. if (!engine.isPointerLock) {
  75. return;
  76. }
  77. var offsetX = evt.movementX || evt.mozMovementX || evt.webkitMovementX || evt.msMovementX || 0;
  78. var offsetY = evt.movementY || evt.mozMovementY || evt.webkitMovementY || evt.msMovementY || 0;
  79. if (this.camera.getScene().useRightHandedSystem) {
  80. this.camera.cameraRotation.y -= offsetX / this.angularSensibility;
  81. } else {
  82. this.camera.cameraRotation.y += offsetX / this.angularSensibility;
  83. }
  84. this.camera.cameraRotation.x += offsetY / this.angularSensibility;
  85. this.previousPosition = null;
  86. if (!noPreventDefault) {
  87. evt.preventDefault();
  88. }
  89. };
  90. this._observer = this.camera.getScene().onPointerObservable.add(this._pointerInput, PointerEventTypes.POINTERDOWN | PointerEventTypes.POINTERUP | PointerEventTypes.POINTERMOVE);
  91. element.addEventListener("mousemove", this._onMouseMove, false);
  92. }
  93. detachControl(element: HTMLElement) {
  94. if (this._observer && element) {
  95. this.camera.getScene().onPointerObservable.remove(this._observer);
  96. element.removeEventListener("mousemove", this._onMouseMove);
  97. this._observer = null;
  98. this._onMouseMove = null;
  99. this.previousPosition = null;
  100. }
  101. }
  102. getClassName(): string {
  103. return "FreeCameraMouseInput";
  104. }
  105. getSimpleName() {
  106. return "mouse";
  107. }
  108. }
  109. CameraInputTypes["FreeCameraMouseInput"] = FreeCameraMouseInput;
  110. }