protected virtual FingerGestures.IFingerList GetTouches(T gesture)
    {
        if (SupportFingerClustering && ClusterManager)
        {
            FingerClusterManager.Cluster cluster = ClusterManager.FindClusterById(gesture.ClusterId);
            return((cluster != null) ? cluster.Fingers : EmptyFingerList);
        }

        return(FingerGestures.Touches);
    }
    protected override TapGesture MatchActiveGestureToCluster(FingerClusterManager.Cluster cluster)
    {
        if (IsMultiTap)
        {
            TapGesture gesture = FindClosestPendingGesture(cluster.Fingers.GetAveragePosition());

            if (gesture != null)
            {
                return(gesture);
            }
        }

        return(base.MatchActiveGestureToCluster(cluster));
    }
    protected override TapGesture MatchActiveGestureToCluster(FingerClusterManager.Cluster cluster)
    {
        if (IsMultiTap)
        {
            TapGesture gesture = FindClosestPendingGesture(cluster.Fingers.GetAveragePosition());

            if (gesture != null)
            {
                // Debug.Log( "Using existing tap gesture for new cluster" );
                return(gesture);
            }
        }

        return(base.MatchActiveGestureToCluster(cluster));
    }
    void UpdateUsingClusters()
    {
        // force cluster manager to update now (ensures we have most up to date finger state)
        ClusterManager.Update();

        foreach (FingerClusterManager.Cluster cluster in ClusterManager.Clusters)
        {
            ProcessCluster(cluster);
        }

        foreach (T g in gestures)
        {
            FingerClusterManager.Cluster cluster = ClusterManager.FindClusterById(g.ClusterId);
            FingerGestures.IFingerList   touches = (cluster != null) ? cluster.Fingers : EmptyFingerList;
            UpdateGesture(g, touches);
        }
    }
    protected virtual void ProcessCluster(FingerClusterManager.Cluster cluster)
    {
        // this cluster already has a gesture associated to it
        if (FindGestureByCluster(cluster) != null)
        {
            return;
        }

        // only consider clusters that match our gesture's required finger count
        if (cluster.Fingers.Count != RequiredFingerCount)
        {
            return;
        }

        // give a chance to an active gesture to claim that cluster
        T gesture = MatchActiveGestureToCluster(cluster);

        // found an active gesture to rebind the cluster to
        if (gesture != null)
        {
            //Debug.Log( "Gesture " + gesture + " claimed finger cluster #" + cluster.Id );

            // reassign cluster id
            gesture.ClusterId = cluster.Id;
        }
        else
        {
            // no claims - find an inactive gesture
            gesture = FindFreeGesture();

            // out of gestures
            if (gesture == null)
            {
                return;
            }

            // did we recognize the beginning a valid gesture?
            if (!CanBegin(gesture, cluster.Fingers))
            {
                return;
            }

            Begin(gesture, cluster.Id, cluster.Fingers);
        }
    }
    // use the finger clusters as touch list sources (used for handling simultaneous multi-finger gestures)
    void UpdateUsingClusters()
    {
        // force cluster manager to update now (ensures we have most up to date finger state)
        ClusterManager.Update();

        for (int i = 0; i < ClusterManager.Clusters.Count; ++i)
        {
            ProcessCluster(ClusterManager.Clusters[i]);
        }

        for (int i = 0; i < gestures.Count; ++i)
        {
            T g = gestures[i];
            FingerClusterManager.Cluster cluster = ClusterManager.FindClusterById(g.ClusterId);
            FingerGestures.IFingerList   touches = (cluster != null) ? cluster.Fingers : EmptyFingerList;
            UpdateGesture(g, touches);
        }
    }
 protected virtual T MatchActiveGestureToCluster(FingerClusterManager.Cluster cluster)
 {
     return(null);
 }
 protected virtual T FindGestureByCluster(FingerClusterManager.Cluster cluster)
 {
     return(gestures.Find(g => g.ClusterId == cluster.Id));
 }