|
@@ -33,10 +33,8 @@ module BABYLON {
|
|
|
|
|
|
public attachControl(element: HTMLElement, noPreventDefault?: boolean) {
|
|
|
var engine = this.camera.getEngine();
|
|
|
- var cacheSoloPointer; // cache pointer object for better perf on camera rotation
|
|
|
- var pointers = new StringDictionary<{ x: number, y: number, type: any }>();
|
|
|
- var pointersOrder = new Array<number>(2);
|
|
|
- var curPointerCount = 0;
|
|
|
+ var cacheSoloPointer: { x: number, y: number, pointerId: number, type: any }; // cache pointer object for better perf on camera rotation
|
|
|
+ var pointA: { x: number, y: number, pointerId: number, type: any }, pointB: { x: number, y: number, pointerId: number, type: any };
|
|
|
var previousPinchDistance = 0;
|
|
|
|
|
|
this._pointerInput = (p, s) => {
|
|
@@ -53,8 +51,13 @@ module BABYLON {
|
|
|
this._isRightClick = evt.button === 2;
|
|
|
|
|
|
// manage pointers
|
|
|
- cacheSoloPointer = pointers.add(evt.pointerId.toString(), { x: evt.clientX, y: evt.clientY, type: evt.pointerType });
|
|
|
- pointersOrder[curPointerCount++] = evt.pointerId;
|
|
|
+ cacheSoloPointer = { x: evt.clientX, y: evt.clientY, pointerId: evt.pointerId, type: evt.pointerType };
|
|
|
+ if (pointA === undefined) {
|
|
|
+ pointA = cacheSoloPointer;
|
|
|
+ }
|
|
|
+ else if (pointB === undefined) {
|
|
|
+ pointB = cacheSoloPointer;
|
|
|
+ }
|
|
|
if (!noPreventDefault) {
|
|
|
evt.preventDefault();
|
|
|
}
|
|
@@ -72,9 +75,7 @@ module BABYLON {
|
|
|
//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
|
|
|
//will be ok to put back pointers.remove(evt.pointerId); when iPhone bug corrected
|
|
|
- pointers.clear();
|
|
|
- pointersOrder = new Array<number>();
|
|
|
- curPointerCount = 0;
|
|
|
+ pointA = pointB = undefined;
|
|
|
|
|
|
if (!noPreventDefault) {
|
|
|
evt.preventDefault();
|
|
@@ -84,49 +85,48 @@ module BABYLON {
|
|
|
evt.preventDefault();
|
|
|
}
|
|
|
|
|
|
- switch (pointers.count) {
|
|
|
- case 1: //normal camera rotation
|
|
|
- if (this.panningSensibility !== 0 && ((this._isCtrlPushed && this.camera._useCtrlForPanning) || (!this.camera._useCtrlForPanning && this._isRightClick))) {
|
|
|
- this.camera.inertialPanningX += -(evt.clientX - cacheSoloPointer.x) / this.panningSensibility;
|
|
|
- this.camera.inertialPanningY += (evt.clientY - cacheSoloPointer.y) / this.panningSensibility;
|
|
|
- } else {
|
|
|
- var offsetX = evt.clientX - cacheSoloPointer.x;
|
|
|
- var offsetY = evt.clientY - cacheSoloPointer.y;
|
|
|
- this.camera.inertialAlphaOffset -= offsetX / this.angularSensibilityX;
|
|
|
- this.camera.inertialBetaOffset -= offsetY / this.angularSensibilityY;
|
|
|
- }
|
|
|
- cacheSoloPointer.x = evt.clientX;
|
|
|
- cacheSoloPointer.y = evt.clientY;
|
|
|
- break;
|
|
|
-
|
|
|
- case 2: //pinch
|
|
|
- //if (noPreventDefault) { evt.preventDefault(); } //if pinch gesture, could be usefull to force preventDefault to avoid html page scroll/zoom in some mobile browsers
|
|
|
- var ed = pointers.get(evt.pointerId.toString());
|
|
|
- ed.x = evt.clientX;
|
|
|
- ed.y = evt.clientY;
|
|
|
- var direction = this.pinchInwards ? 1 : -1;
|
|
|
- var p1 = pointers.get(pointersOrder[0].toString());
|
|
|
- var p2 = pointers.get(pointersOrder[1].toString());
|
|
|
- var distX = p1.x - p2.x;
|
|
|
- var distY = p1.y - p2.y;
|
|
|
- var pinchSquaredDistance = (distX * distX) + (distY * distY);
|
|
|
- if (previousPinchDistance === 0) {
|
|
|
- previousPinchDistance = pinchSquaredDistance;
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- if (pinchSquaredDistance !== previousPinchDistance) {
|
|
|
- this.camera.inertialRadiusOffset += (pinchSquaredDistance - previousPinchDistance) / (this.pinchPrecision * ((this.angularSensibilityX + this.angularSensibilityY) / 2) * direction);
|
|
|
- previousPinchDistance = pinchSquaredDistance;
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
- default:
|
|
|
- var ed = pointers.get(evt.pointerId.toString());
|
|
|
- if (ed) {
|
|
|
- ed.x = evt.clientX;
|
|
|
- ed.y = evt.clientY;
|
|
|
- }
|
|
|
+ // One button down
|
|
|
+ if (pointA && pointB === undefined) {
|
|
|
+ if (this.panningSensibility !== 0 &&
|
|
|
+ ((this._isCtrlPushed && this.camera._useCtrlForPanning) ||
|
|
|
+ (!this.camera._useCtrlForPanning && this._isRightClick))) {
|
|
|
+ this.camera
|
|
|
+ .inertialPanningX += -(evt.clientX - cacheSoloPointer.x) / this.panningSensibility;
|
|
|
+ this.camera
|
|
|
+ .inertialPanningY += (evt.clientY - cacheSoloPointer.y) / this.panningSensibility;
|
|
|
+ } else {
|
|
|
+ var offsetX = evt.clientX - cacheSoloPointer.x;
|
|
|
+ var offsetY = evt.clientY - cacheSoloPointer.y;
|
|
|
+ this.camera.inertialAlphaOffset -= offsetX / this.angularSensibilityX;
|
|
|
+ this.camera.inertialBetaOffset -= offsetY / this.angularSensibilityY;
|
|
|
+ }
|
|
|
+ cacheSoloPointer.x = evt.clientX;
|
|
|
+ cacheSoloPointer.y = evt.clientY;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Two buttons down: pinch
|
|
|
+ else if (pointA && pointB) {
|
|
|
+ //if (noPreventDefault) { evt.preventDefault(); } //if pinch gesture, could be usefull to force preventDefault to avoid html page scroll/zoom in some mobile browsers
|
|
|
+ var ed = (pointA.pointerId===evt.pointerId) ? pointA : pointB;
|
|
|
+ ed.x = evt.clientX;
|
|
|
+ ed.y = evt.clientY;
|
|
|
+ var direction = this.pinchInwards ? 1 : -1;
|
|
|
+ var distX = pointA.x - pointB.x;
|
|
|
+ var distY = pointA.y - pointB.y;
|
|
|
+ var pinchSquaredDistance = (distX * distX) + (distY * distY);
|
|
|
+ if (previousPinchDistance === 0) {
|
|
|
+ previousPinchDistance = pinchSquaredDistance;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (pinchSquaredDistance !== previousPinchDistance) {
|
|
|
+ this.camera
|
|
|
+ .inertialRadiusOffset += (pinchSquaredDistance - previousPinchDistance) /
|
|
|
+ (this.pinchPrecision *
|
|
|
+ ((this.angularSensibilityX + this.angularSensibilityY) / 2) *
|
|
|
+ direction);
|
|
|
+ previousPinchDistance = pinchSquaredDistance;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -143,9 +143,7 @@ module BABYLON {
|
|
|
|
|
|
this._onLostFocus = () => {
|
|
|
//this._keys = [];
|
|
|
- pointers.clear();
|
|
|
- pointersOrder = new Array<number>();
|
|
|
- curPointerCount = 0;
|
|
|
+ pointA = pointB = undefined;
|
|
|
previousPinchDistance = 0;
|
|
|
cacheSoloPointer = null;
|
|
|
};
|