LMQT/Assets/TouchScript/Scripts/Gestures/TransformGestures/Clustered/ClusteredScreenTransformGesture.cs
2024-12-10 09:03:45 +08:00

102 lines
2.7 KiB
C#

/*
* @author Valentin Simonov / http://va.lent.in/
*/
using System.Collections.Generic;
using TouchScript.Utils;
using TouchScript.Pointers;
using UnityEngine;
namespace TouchScript.Gestures.TransformGestures.Clustered
{
/// <summary>
/// ScreenTransformGesture which splits all pointers into 2 clusters and works with them.
/// Should be used for large touch surfaces.
/// </summary>
[AddComponentMenu("TouchScript/Gestures/Clustered/Screen Transform Gesture (Clustered)")]
[HelpURL("http://touchscript.github.io/docs/html/T_TouchScript_Gestures_TransformGestures_Clustered_ClusteredScreenTransformGesture.htm")]
public class ClusteredScreenTransformGesture : ScreenTransformGesture
{
#region Private variables
private Clusters.Clusters2D clusters = new Clusters.Clusters2D();
#endregion
#region Gesture callbacks
/// <inheritdoc />
protected override void pointersPressed(IList<Pointer> pointers)
{
clusters.AddPoints(pointers);
base.pointersPressed(pointers);
}
/// <inheritdoc />
protected override void pointersUpdated(IList<Pointer> pointers)
{
clusters.Invalidate();
base.pointersUpdated(pointers);
}
/// <inheritdoc />
protected override void pointersReleased(IList<Pointer> pointers)
{
clusters.RemovePoints(pointers);
base.pointersReleased(pointers);
}
/// <inheritdoc />
protected override void reset()
{
base.reset();
clusters.RemoveAllPoints();
}
#endregion
#region Protected methods
/// <inheritdoc />
protected override int getNumPoints()
{
if (clusters.HasClusters) return 2;
if (NumPointers > 0) return 1;
return 0;
}
/// <inheritdoc />
protected override bool relevantPointers1(IList<Pointer> pointers)
{
return true;
}
/// <inheritdoc />
protected override bool relevantPointers2(IList<Pointer> pointers)
{
return true;
}
/// <inheritdoc />
protected override Vector2 getPointScreenPosition(int index)
{
if (!clusters.HasClusters) return ClusterUtils.Get2DCenterPosition(activePointers);
return clusters.GetCenterPosition(index);
}
/// <inheritdoc />
protected override Vector2 getPointPreviousScreenPosition(int index)
{
if (!clusters.HasClusters) return ClusterUtils.GetPrevious2DCenterPosition(activePointers);
return clusters.GetPreviousCenterPosition(index);
}
#endregion
}
}