babylon.freecamera.input.touch.ts 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. module BABYLON.CameraInputs {
  2. export class FreeCameraTouchInput implements ICameraInput<FreeCamera> {
  3. camera: FreeCamera;
  4. private _offsetX: number = null;
  5. private _offsetY: number = null;
  6. private _pointerCount: number = 0;
  7. private _pointerPressed = [];
  8. private _attachedElement: HTMLElement;
  9. private _onPointerDown: (e: PointerEvent) => any;
  10. private _onPointerUp: (e: PointerEvent) => any;
  11. private _onPointerMove: (e: PointerEvent) => any;
  12. private _onLostFocus: (e: FocusEvent) => any;
  13. @serialize()
  14. public touchAngularSensibility: number = 200000.0;
  15. @serialize()
  16. public touchMoveSensibility: number = 250.0;
  17. attachCamera(camera: FreeCamera) {
  18. this.camera = camera;
  19. }
  20. attachElement(element: HTMLElement, noPreventDefault?: boolean) {
  21. var previousPosition;
  22. if (this._attachedElement) {
  23. return;
  24. }
  25. this._attachedElement = element;
  26. if (this._onPointerDown === undefined) {
  27. this._onLostFocus = (evt) => {
  28. this._offsetX = null;
  29. this._offsetY = null;
  30. }
  31. this._onPointerDown = (evt) => {
  32. if (evt.pointerType === "mouse") {
  33. return;
  34. }
  35. if (!noPreventDefault) {
  36. evt.preventDefault();
  37. }
  38. this._pointerPressed.push(evt.pointerId);
  39. if (this._pointerPressed.length !== 1) {
  40. return;
  41. }
  42. previousPosition = {
  43. x: evt.clientX,
  44. y: evt.clientY
  45. };
  46. };
  47. this._onPointerUp = (evt) => {
  48. if (evt.pointerType === "mouse") {
  49. return;
  50. }
  51. if (!noPreventDefault) {
  52. evt.preventDefault();
  53. }
  54. var index: number = this._pointerPressed.indexOf(evt.pointerId);
  55. if (index === -1) {
  56. return;
  57. }
  58. this._pointerPressed.splice(index, 1);
  59. if (index != 0) {
  60. return;
  61. }
  62. previousPosition = null;
  63. this._offsetX = null;
  64. this._offsetY = null;
  65. };
  66. this._onPointerMove = (evt) => {
  67. if (evt.pointerType === "mouse") {
  68. return;
  69. }
  70. if (!noPreventDefault) {
  71. evt.preventDefault();
  72. }
  73. if (!previousPosition) {
  74. return;
  75. }
  76. var index: number = this._pointerPressed.indexOf(evt.pointerId);
  77. if (index != 0) {
  78. return;
  79. }
  80. this._offsetX = evt.clientX - previousPosition.x;
  81. this._offsetY = -(evt.clientY - previousPosition.y);
  82. };
  83. }
  84. element.addEventListener("blur", this._onLostFocus);
  85. element.addEventListener("pointerdown", this._onPointerDown);
  86. element.addEventListener("pointerup", this._onPointerUp);
  87. element.addEventListener("pointerout", this._onPointerUp);
  88. element.addEventListener("pointermove", this._onPointerMove);
  89. }
  90. detachElement(element: HTMLElement) {
  91. if (this._attachedElement !== element) {
  92. return;
  93. }
  94. element.removeEventListener("blur", this._onLostFocus);
  95. element.removeEventListener("pointerdown", this._onPointerDown);
  96. element.removeEventListener("pointerup", this._onPointerUp);
  97. element.removeEventListener("pointerout", this._onPointerUp);
  98. element.removeEventListener("pointermove", this._onPointerMove);
  99. this._attachedElement = null;
  100. }
  101. checkInputs() {
  102. if (this._offsetX) {
  103. var camera = this.camera;
  104. camera.cameraRotation.y += this._offsetX / this.touchAngularSensibility;
  105. if (this._pointerPressed.length > 1) {
  106. camera.cameraRotation.x += -this._offsetY / this.touchAngularSensibility;
  107. } else {
  108. var speed = camera._computeLocalCameraSpeed();
  109. var direction = new Vector3(0, 0, speed * this._offsetY / this.touchMoveSensibility);
  110. Matrix.RotationYawPitchRollToRef(camera.rotation.y, camera.rotation.x, 0, camera._cameraRotationMatrix);
  111. camera.cameraDirection.addInPlace(Vector3.TransformCoordinates(direction, camera._cameraRotationMatrix));
  112. }
  113. }
  114. }
  115. detach() {
  116. if (this._attachedElement) {
  117. this.detachElement(this._attachedElement);
  118. }
  119. }
  120. getTypeName(): string {
  121. return "freecamera.touch";
  122. }
  123. }
  124. InputTypes["freecamera.touch"] = FreeCameraTouchInput;
  125. }