/// <inheritdoc /> protected override void touchesBegan(IList <ITouch> touches) { base.touchesBegan(touches); if (State != GestureState.Possible) { return; } if (touches.Count == NumTouches) { projectionLayer = activeTouches[0].Layer; updateProjectionPlane(); #if DEBUG drawDebug(projectionLayer.ProjectFrom(cachedTransform.position), activeTouches[0].Position); #endif } }
/// <inheritdoc /> protected override void touchesMoved(IList <ITouch> touches) { base.touchesMoved(touches); var dR = deltaRotation = 0; var dS = deltaScale = 1f; #if DEBUG var worldCenter = cachedTransform.position; var screenCenter = projectionLayer.ProjectFrom(worldCenter); var newScreenPos = getPointScreenPosition(); drawDebug(screenCenter, newScreenPos); #endif if (touchesNumState != TouchesNumState.InRange) { return; } var rotationEnabled = (Type & TransformType.Rotation) == TransformType.Rotation; var scalingEnabled = (Type & TransformType.Scaling) == TransformType.Scaling; if (!rotationEnabled && !scalingEnabled) { return; } if (!relevantTouches(touches)) { return; } #if !DEBUG var theTouch = activeTouches[0]; var worldCenter = cachedTransform.position; var screenCenter = projectionLayer.ProjectFrom(worldCenter); var newScreenPos = theTouch.Position; #endif // Here we can't reuse last frame screen positions because points 0 and 1 can change. // For example if the first of 3 fingers is lifted off. var oldScreenPos = getPointPreviousScreenPosition(); if (rotationEnabled) { if (isTransforming) { dR = doRotation(worldCenter, oldScreenPos, newScreenPos); } else { // Find how much we moved perpendicular to the line (center, oldScreenPos) screenPixelRotationBuffer += TwoD.PointToLineDistance(screenCenter, oldScreenPos, newScreenPos); angleBuffer += doRotation(worldCenter, oldScreenPos, newScreenPos); if (screenPixelRotationBuffer * screenPixelRotationBuffer >= screenTransformPixelThresholdSquared) { isTransforming = true; dR = angleBuffer; } } } if (scalingEnabled) { if (isTransforming) { dS *= doScaling(worldCenter, oldScreenPos, newScreenPos); } else { screenPixelScalingBuffer += (newScreenPos - screenCenter).magnitude - (oldScreenPos - screenCenter).magnitude; scaleBuffer *= doScaling(worldCenter, oldScreenPos, newScreenPos); if (screenPixelScalingBuffer * screenPixelScalingBuffer >= screenTransformPixelThresholdSquared) { isTransforming = true; dS = scaleBuffer; } } } if (dR != 0 || dS != 1) { if (State == GestureState.Possible) { setState(GestureState.Began); } switch (State) { case GestureState.Began: case GestureState.Changed: deltaRotation = dR; deltaScale = dS; setState(GestureState.Changed); break; } } }