|
@@ -14,17 +14,19 @@ module BABYLON {
|
|
public angularSensibilityY = 1000.0;
|
|
public angularSensibilityY = 1000.0;
|
|
|
|
|
|
@serialize()
|
|
@serialize()
|
|
- public pinchPrecision = 6.0;
|
|
|
|
|
|
+ public pinchPrecision = 12.0;
|
|
|
|
|
|
@serialize()
|
|
@serialize()
|
|
- public panningSensibility: number = 3000.0;
|
|
|
|
|
|
+ public panningSensibility: number = 1000.0;
|
|
|
|
|
|
@serialize()
|
|
@serialize()
|
|
public multiTouchPanning: boolean = true;
|
|
public multiTouchPanning: boolean = true;
|
|
|
|
|
|
|
|
+ @serialize()
|
|
|
|
+ public multiTouchPanAndZoom: boolean = true;
|
|
|
|
+
|
|
private _isPanClick: boolean = false;
|
|
private _isPanClick: boolean = false;
|
|
public pinchInwards = true;
|
|
public pinchInwards = true;
|
|
-
|
|
|
|
|
|
|
|
private _pointerInput: (p: PointerInfo, s: EventState) => void;
|
|
private _pointerInput: (p: PointerInfo, s: EventState) => void;
|
|
private _observer: Observer<PointerInfo>;
|
|
private _observer: Observer<PointerInfo>;
|
|
@@ -90,16 +92,34 @@ module BABYLON {
|
|
|
|
|
|
cacheSoloPointer = null;
|
|
cacheSoloPointer = null;
|
|
previousPinchSquaredDistance = 0;
|
|
previousPinchSquaredDistance = 0;
|
|
- previousMultiTouchPanPosition.isPaning = false;
|
|
|
|
- previousMultiTouchPanPosition.isPinching = false;
|
|
|
|
- twoFingerActivityCount = 0;
|
|
|
|
- initialDistance = 0;
|
|
|
|
|
|
+ previousMultiTouchPanPosition.isPaning = false;
|
|
|
|
+ previousMultiTouchPanPosition.isPinching = false;
|
|
|
|
+ twoFingerActivityCount = 0;
|
|
|
|
+ initialDistance = 0;
|
|
|
|
|
|
//would be better to use pointers.remove(evt.pointerId) for multitouch gestures,
|
|
//would be better to use pointers.remove(evt.pointerId) for multitouch gestures,
|
|
//but emptying completly pointers collection is required to fix a bug on iPhone :
|
|
//but emptying completly pointers collection is required to fix a bug on iPhone :
|
|
//when changing orientation while pinching camera, one pointer stay pressed forever if we don't release all pointers
|
|
//when changing orientation while pinching camera, one pointer stay pressed forever if we don't release all pointers
|
|
//will be ok to put back pointers.remove(evt.pointerId); when iPhone bug corrected
|
|
//will be ok to put back pointers.remove(evt.pointerId); when iPhone bug corrected
|
|
- pointA = pointB = undefined;
|
|
|
|
|
|
+ if (engine.badOS) {
|
|
|
|
+ pointA = pointB = undefined;
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ //only remove the impacted pointer in case of multitouch allowing on most
|
|
|
|
+ //platforms switching from rotate to zoom and pan seamlessly.
|
|
|
|
+ if (pointB && pointA && pointA.pointerId == evt.pointerId) {
|
|
|
|
+ pointA = pointB;
|
|
|
|
+ pointB = undefined;
|
|
|
|
+ cacheSoloPointer = { x: pointA.x, y: pointA.y, pointerId: pointA.pointerId, type: evt.pointerType };
|
|
|
|
+ }
|
|
|
|
+ else if (pointA && pointB && pointB.pointerId == evt.pointerId) {
|
|
|
|
+ pointB = undefined;
|
|
|
|
+ cacheSoloPointer = { x: pointA.x, y: pointA.y, pointerId: pointA.pointerId, type: evt.pointerType };
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ pointA = pointB = undefined;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
if (!noPreventDefault) {
|
|
if (!noPreventDefault) {
|
|
evt.preventDefault();
|
|
evt.preventDefault();
|
|
@@ -137,41 +157,66 @@ module BABYLON {
|
|
var distY = pointA.y - pointB.y;
|
|
var distY = pointA.y - pointB.y;
|
|
var pinchSquaredDistance = (distX * distX) + (distY * distY);
|
|
var pinchSquaredDistance = (distX * distX) + (distY * distY);
|
|
var pinchDistance = Math.sqrt(pinchSquaredDistance);
|
|
var pinchDistance = Math.sqrt(pinchSquaredDistance);
|
|
|
|
+
|
|
if (previousPinchSquaredDistance === 0) {
|
|
if (previousPinchSquaredDistance === 0) {
|
|
initialDistance = pinchDistance;
|
|
initialDistance = pinchDistance;
|
|
previousPinchSquaredDistance = pinchSquaredDistance;
|
|
previousPinchSquaredDistance = pinchSquaredDistance;
|
|
|
|
+ previousMultiTouchPanPosition.x = (pointA.x + pointB.x) / 2;
|
|
|
|
+ previousMultiTouchPanPosition.y = (pointA.y + pointB.y) / 2;
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- twoFingerActivityCount++;
|
|
|
|
-
|
|
|
|
- if (previousMultiTouchPanPosition.isPinching || (twoFingerActivityCount < 20 && Math.abs(pinchDistance - initialDistance) > this.camera.pinchToPanMaxDistance)) {
|
|
|
|
|
|
+ if (this.multiTouchPanAndZoom) {
|
|
this.camera
|
|
this.camera
|
|
- .inertialRadiusOffset += (pinchSquaredDistance - previousPinchSquaredDistance) /
|
|
|
|
- (this.pinchPrecision *
|
|
|
|
- ((this.angularSensibilityX + this.angularSensibilityY) / 2) *
|
|
|
|
- direction);
|
|
|
|
- previousMultiTouchPanPosition.isPaning = false;
|
|
|
|
- previousMultiTouchPanPosition.isPinching = true;
|
|
|
|
|
|
+ .inertialRadiusOffset += (pinchSquaredDistance - previousPinchSquaredDistance) /
|
|
|
|
+ (this.pinchPrecision *
|
|
|
|
+ ((this.angularSensibilityX + this.angularSensibilityY) / 2) *
|
|
|
|
+ direction);
|
|
|
|
+
|
|
|
|
+ if (this.panningSensibility !== 0) {
|
|
|
|
+ var pointersCenterX = (pointA.x + pointB.x) / 2;
|
|
|
|
+ var pointersCenterY = (pointA.y + pointB.y) / 2;
|
|
|
|
+ var pointersCenterDistX = pointersCenterX - previousMultiTouchPanPosition.x;
|
|
|
|
+ var pointersCenterDistY = pointersCenterY - previousMultiTouchPanPosition.y;
|
|
|
|
+
|
|
|
|
+ previousMultiTouchPanPosition.x = pointersCenterX;
|
|
|
|
+ previousMultiTouchPanPosition.y = pointersCenterY;
|
|
|
|
+
|
|
|
|
+ this.camera.inertialPanningX += -(pointersCenterDistX) / (this.panningSensibility);
|
|
|
|
+ this.camera.inertialPanningY += (pointersCenterDistY) / (this.panningSensibility);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
else {
|
|
else {
|
|
- if (cacheSoloPointer.pointerId === ed.pointerId && this.panningSensibility !== 0 && this.multiTouchPanning) {
|
|
|
|
- if (!previousMultiTouchPanPosition.isPaning) {
|
|
|
|
- previousMultiTouchPanPosition.isPaning = true;
|
|
|
|
- previousMultiTouchPanPosition.isPinching = false;
|
|
|
|
- previousMultiTouchPanPosition.x = ed.x;
|
|
|
|
- previousMultiTouchPanPosition.y = ed.y;
|
|
|
|
- return;
|
|
|
|
|
|
+ twoFingerActivityCount++;
|
|
|
|
+
|
|
|
|
+ if (previousMultiTouchPanPosition.isPinching || (twoFingerActivityCount < 20 && Math.abs(pinchDistance - initialDistance) > this.camera.pinchToPanMaxDistance)) {
|
|
|
|
+ this.camera
|
|
|
|
+ .inertialRadiusOffset += (pinchSquaredDistance - previousPinchSquaredDistance) /
|
|
|
|
+ (this.pinchPrecision *
|
|
|
|
+ ((this.angularSensibilityX + this.angularSensibilityY) / 2) *
|
|
|
|
+ direction);
|
|
|
|
+ previousMultiTouchPanPosition.isPaning = false;
|
|
|
|
+ previousMultiTouchPanPosition.isPinching = true;
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ if (cacheSoloPointer.pointerId === ed.pointerId && this.panningSensibility !== 0 && this.multiTouchPanning) {
|
|
|
|
+ if (!previousMultiTouchPanPosition.isPaning) {
|
|
|
|
+ previousMultiTouchPanPosition.isPaning = true;
|
|
|
|
+ previousMultiTouchPanPosition.isPinching = false;
|
|
|
|
+ previousMultiTouchPanPosition.x = ed.x;
|
|
|
|
+ previousMultiTouchPanPosition.y = ed.y;
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ this.camera.inertialPanningX += -(ed.x - previousMultiTouchPanPosition.x) / (this.panningSensibility);
|
|
|
|
+ this.camera.inertialPanningY += (ed.y - previousMultiTouchPanPosition.y) / (this.panningSensibility);
|
|
}
|
|
}
|
|
-
|
|
|
|
- this.camera.inertialPanningX += -(ed.x - previousMultiTouchPanPosition.x) / (this.panningSensibility * 0.5);
|
|
|
|
- this.camera.inertialPanningY += (ed.y - previousMultiTouchPanPosition.y) / (this.panningSensibility * 0.5);
|
|
|
|
}
|
|
}
|
|
- }
|
|
|
|
|
|
|
|
- if (cacheSoloPointer.pointerId === evt.pointerId) {
|
|
|
|
- previousMultiTouchPanPosition.x = ed.x;
|
|
|
|
- previousMultiTouchPanPosition.y = ed.y;
|
|
|
|
|
|
+ if (cacheSoloPointer.pointerId === evt.pointerId) {
|
|
|
|
+ previousMultiTouchPanPosition.x = ed.x;
|
|
|
|
+ previousMultiTouchPanPosition.y = ed.y;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
previousPinchSquaredDistance = pinchSquaredDistance;
|
|
previousPinchSquaredDistance = pinchSquaredDistance;
|
|
@@ -193,11 +238,11 @@ module BABYLON {
|
|
//this._keys = [];
|
|
//this._keys = [];
|
|
pointA = pointB = undefined;
|
|
pointA = pointB = undefined;
|
|
previousPinchSquaredDistance = 0;
|
|
previousPinchSquaredDistance = 0;
|
|
- previousMultiTouchPanPosition.isPaning = false;
|
|
|
|
- previousMultiTouchPanPosition.isPinching = false;
|
|
|
|
- twoFingerActivityCount = 0;
|
|
|
|
- cacheSoloPointer = null;
|
|
|
|
- initialDistance = 0;
|
|
|
|
|
|
+ previousMultiTouchPanPosition.isPaning = false;
|
|
|
|
+ previousMultiTouchPanPosition.isPinching = false;
|
|
|
|
+ twoFingerActivityCount = 0;
|
|
|
|
+ cacheSoloPointer = null;
|
|
|
|
+ initialDistance = 0;
|
|
};
|
|
};
|
|
|
|
|
|
this._onMouseMove = evt => {
|
|
this._onMouseMove = evt => {
|