Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
GestureRecognizerFlick.cs
Go to the documentation of this file.
1 // Copyright (c) 2014 Silicon Studio Corp. (http://siliconstudio.co.jp)
2 // This file is distributed under GPL v3. See LICENSE.md for details.
3 using System;
4 using System.Collections.Generic;
5 
6 using SiliconStudio.Core.Mathematics;
7 
8 namespace SiliconStudio.Paradox.Input
9 {
10  internal sealed class GestureRecognizerFlick : GestureRecognizer
11  {
12  private GestureConfigFlick ConfigFlick { get { return (GestureConfigFlick)Config; } }
13 
14  public GestureRecognizerFlick(GestureConfigFlick config, float screenRatio)
15  : base(config, screenRatio)
16  {
17  }
18 
19  protected override void ProcessDownEventPointer(int id, Vector2 pos)
20  {
21  FingerIdToBeginPositions[id] = pos;
22  FingerIdsToLastPos[id] = pos;
23  HasGestureStarted = (NbOfFingerOnScreen == ConfigFlick.RequiredNumberOfFingers);
24  }
25 
26  protected override void ProcessMoveEventPointers(Dictionary<int, Vector2> fingerIdsToMovePos)
27  {
28  if (!HasGestureStarted)
29  return;
30 
31  foreach (var id in fingerIdsToMovePos.Keys)
32  {
33  var newPos = fingerIdsToMovePos[id];
34 
35  // check that the shape of the flick is respected, stop the gesture if it is not the case
36  if (ConfigFlick.FlickShape != GestureShape.Free)
37  {
38  var compIndex = ConfigFlick.FlickShape == GestureShape.Horizontal? 1:0;
39  if (Math.Abs(newPos[compIndex] - FingerIdToBeginPositions[id][compIndex]) > ConfigFlick.AllowedErrorMargins[compIndex])
40  HasGestureStarted = false;
41  }
42 
43  // Update the last position of the finger
44  FingerIdsToLastPos[id] = newPos;
45  }
46 
47  if (HasGestureStarted)
48  {
49  // trigger the event if the conditions are fulfilled
50  var startPos = ComputeMeanPosition(FingerIdToBeginPositions.Values);
51  var currPos = ComputeMeanPosition(FingerIdsToLastPos.Values);
52  var translDist = (currPos - startPos).Length();
53  if (translDist > ConfigFlick.MinimumFlickLength && translDist / ElapsedSinceBeginning.TotalSeconds > ConfigFlick.MinimumAverageSpeed)
54  {
55  CurrentGestureEvents.Add(new GestureEventFlick(ConfigFlick.RequiredNumberOfFingers, ElapsedSinceBeginning, ConfigFlick.FlickShape, NormalizeVector(startPos), NormalizeVector(currPos)));
56  HasGestureStarted = false;
57  }
58  }
59  }
60 
61  protected override void ProcessUpEventPointer(int id, Vector2 pos)
62  {
63  FingerIdToBeginPositions.Remove(id);
64  FingerIdsToLastPos.Remove(id);
65  HasGestureStarted = (NbOfFingerOnScreen == ConfigFlick.RequiredNumberOfFingers);
66  }
67  }
68 }
Represents a two dimensional mathematical vector.
Definition: Vector2.cs:42
GestureShape
Gesture possible shapes.
Definition: GestureShape.cs:8