private void PanGestureUpdated(GestureRecognizer r) { if (TransformToRotate == null) { return; } if (r.State == GestureRecognizerState.Executing) { rotationVelocity = Vector2.zero; ApplyRotation(DeviceInfo.PixelsToUnits(r.DeltaX) * RotationSpeed, DeviceInfo.PixelsToUnits(r.DeltaY) * RotationSpeed); } else if (r.State == GestureRecognizerState.Ended) { rotationVelocity = new Vector2(DeviceInfo.PixelsToUnits(r.VelocityX) * RotationSpeed * 0.01f, DeviceInfo.PixelsToUnits(r.VelocityY) * RotationSpeed * 0.01f); } }
private void ProcessMouseWheel() { // if the mouse is not setup or the user doesn't want the mouse treated as touches, return right away if (!UnityEngine.Input.mousePresent || !TreatMousePointerAsFinger) { return; } // the mouse wheel will act as a rotate and pinch / zoom Vector2 delta = UnityEngine.Input.mouseScrollDelta; float scrollDelta = (delta.y == 0.0f ? delta.x : delta.y) * MouseWheelDeltaMultiplier; float threshold = DeviceInfo.UnitsToPixels(MouseDistanceInUnitsForScaleAndRotate * 0.5f); // add type 1 = moved, 2 = begin, 3 = ended, 4 = none int addType1 = 4; int addType2 = 4; // left or right control initial down means begin if (!RequireControlKeyForMouseZoom) { if (delta == Vector2.zero) { if (lastMouseWheelTime != System.DateTime.MinValue) { if ((System.DateTime.UtcNow - lastMouseWheelTime).TotalSeconds < 1.0f) { // continue zooming pinchScale = Mathf.Max(0.35f, pinchScale + scrollDelta); addType1 = 1; } else { // stop zooming lastMouseWheelTime = System.DateTime.MinValue; addType1 = 3; } } } else if (lastMouseWheelTime == System.DateTime.MinValue) { // start zooming addType1 = 2; lastMouseWheelTime = System.DateTime.UtcNow; } else { // continue zooming pinchScale = Mathf.Max(0.35f, pinchScale + scrollDelta); addType1 = 1; lastMouseWheelTime = System.DateTime.UtcNow; } } else if (UnityEngine.Input.GetKeyDown(KeyCode.LeftControl) || UnityEngine.Input.GetKeyDown(KeyCode.RightControl)) { // initial start of scale addType1 = 2; } // left or right control still down means move else if (UnityEngine.Input.GetKey(KeyCode.LeftControl) || UnityEngine.Input.GetKey(KeyCode.RightControl)) { pinchScale = Mathf.Max(0.35f, pinchScale + scrollDelta); addType1 = 1; } // left or right control initial up means end else if (UnityEngine.Input.GetKeyUp(KeyCode.LeftControl) || UnityEngine.Input.GetKeyUp(KeyCode.RightControl)) { addType1 = 3; } // left or right shift initial down means begin if (UnityEngine.Input.GetKeyDown(KeyCode.LeftShift) || UnityEngine.Input.GetKeyDown(KeyCode.RightShift)) { addType2 = 2; } // left or right shift still down means move else if (UnityEngine.Input.GetKey(KeyCode.LeftShift) || UnityEngine.Input.GetKey(KeyCode.RightShift)) { rotateAngle += scrollDelta; addType2 = 1; } // left or right shift initial up means end else if (UnityEngine.Input.GetKeyUp(KeyCode.LeftShift) || UnityEngine.Input.GetKeyUp(KeyCode.RightShift)) { addType2 = 3; } // use the minimum add type so that moves are preferred over begins and begins are preferred over ends int addType = Mathf.Min(addType1, addType2); // no begins, moves or ends, set defaults and end if (addType == 4) { pinchScale = 1.0f; rotateAngle = 0.0f; return; } // calculate rotation float x = UnityEngine.Input.mousePosition.x; float y = UnityEngine.Input.mousePosition.y; float xRot1 = x - threshold; float yRot1 = y; float xRot2 = x + threshold; float yRot2 = y; float distance = threshold * pinchScale; xRot1 = x - distance; yRot1 = y; xRot2 = x + distance; yRot2 = y; RotateAroundPoint(ref xRot1, ref yRot1, x, y, rotateAngle); RotateAroundPoint(ref xRot2, ref yRot2, x, y, rotateAngle); #if DEBUG if (scrollDelta != 0.0f) { //Debug.LogFormat("Mouse delta: {0}", scrollDelta); } #endif // calculate rotation and zoom based on mouse values if (addType == 1) { // moved rotatePinch1 = new GestureTouch(int.MaxValue - 5, xRot1, yRot1, rotatePinch1.X, rotatePinch1.Y, 0.0f, null, TouchPhase.Moved); rotatePinch2 = new GestureTouch(int.MaxValue - 6, xRot2, yRot2, rotatePinch2.X, rotatePinch2.Y, 0.0f, null, TouchPhase.Moved); FingersProcessTouch(ref rotatePinch1); FingersProcessTouch(ref rotatePinch2); } else if (addType == 2) { // begin rotatePinch1 = new GestureTouch(int.MaxValue - 5, xRot1, yRot1, xRot1, yRot1, 0.0f, null, TouchPhase.Began); rotatePinch2 = new GestureTouch(int.MaxValue - 6, xRot2, yRot2, xRot2, yRot2, 0.0f, null, TouchPhase.Began); FingersProcessTouch(ref rotatePinch1); FingersProcessTouch(ref rotatePinch2); } else if (addType == 3) { // end rotatePinch1 = new GestureTouch(int.MaxValue - 5, xRot1, yRot1, xRot1, yRot1, 0.0f, null, TouchPhase.Ended); rotatePinch2 = new GestureTouch(int.MaxValue - 6, xRot2, yRot2, xRot2, yRot2, 0.0f, null, TouchPhase.Ended); FingersProcessTouch(ref rotatePinch1); FingersProcessTouch(ref rotatePinch2); } }