babylon.freecamera.input.mouse.ts 5.0 KB

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